k8s
Its like Docker-Compose for multiple machines.
It's an open-source project. It's just a collection of concepts and a collection of software you could say, which together can be used with any cloud provider.
- Pod(Container+required resources like volumes) // 我最喜欢的可以自动重启 Container 哦!
- Proxy / Config
- Master Node: Has a scheduler, which is responsible for distributing the Pods across worker Nodes
- Worker Node: runs the containers of your application. "Node" are your machines / virtual instances.
- Cluster: A set of Node machines which are running of the Containerized Application(Worker Nodes) or control other Nodes(Master Node).
- Objects
- Service: Exposes Pods to the Cluster or Externally
- Pod have an dynamic internal IP by default
- Services group Pods with a shared IP
- Services can allow external access to Pods
commands
-
查看 node 节点情况:kubectl describe node
-
kubectl cluster-info
-
查看配置文件:KUBECONFIG
- 查看 config:
kubectl config view
- kubectl config get-contexts
- kubectl config current-context # display the current-context
- kubectl config use-context my-cluster-name
- 查看集群中的节点:
kubectl get nodes
- kubectl create deployment first-app --image=kub-first-app (command is running in a virtual machine)
- kubectl delete deployment first-app
- 列出你的 Deployment:
kubectl get deployments
- 查看 pod:
kubectl get pods
- 查看该 pod 下的内容:
kubectl describe pods $podName
- 还可以通过标签:
kubectl get pods -l app=byteox-message
- 查看容器日志:
kubectl logs $podName $containerName
- 在容器上执行命令:
kubectl exec byteox-users-deployment-5b5fd44f4f-9k7xp --container byteox-users -it -- /bin/bash
- 查看 configMap:
- 列表:
kubectl get configmaps
kubectl describe configmap/byteox-message-filebeat-config
== Imperative approach
- 列表:
=== service
- kubectl expose deployment first-app --type=LoadBalancer --port=8080
- ClusterIP(default): Only reachable internally
- NodePort
-
LoadBalancer: Note that needs platform support, like on AWS or Minikube
-
kubectl get services
- minikube service --url first-app
- kubectl delete service first-app // 一般先 delete service, 再 delete deployment
=== scaling
- kubectl scale deployment/first-app --replicas=3
=== updating
- docker build -t vikki77/kub-first-app:2 .
- docker push vikki77/kub-first-app:2
- kubectl set image deployment/first-app kub-first-app=vikki77/kub-first-app:2
- kubectl rollout status deployment/first-app // 查看刚刚的版本更新有无成功 old pod will not be shut down until the new pod is ready
=== undo
- kubectl rollout history deployment/first-app
- kubectl rollout history deployment/first-app --revision=2
- kubectl rollout undo deployment/first-app --to-revision=2
Declarative resource file
kubectl apply -f config.yaml
如果有问题,通过 kubectl decribe pod xx 和 kubectl descirbe service xx 进行排查
deployment
https://kubernetes.io/docs/concepts/workloads/controllers/deployment/
https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/deployment-v1/
---
# service.yaml better be created first
apiVersion: v1
kind: Service
metadata:
name: backend
spec:
selector:
app: myapp
ports:
- protocol: 'TCP'
port: 80 # outside
targetPort: 8080 # in the container
type: LoadBalancer # 默认是 internal 所以要记得定义哦
---
# deployment.yaml
apiVersion: apps/v1
kind: Deployment # k8s object
metadata:
name: first-app
spec: # sepcification of the deployment
replicas: 1
selector:
matchLabels:
app: myapp
# matchExpressions:
# - {key: app, operator: NotIn, values: [a, b]}
template: # object
metadata:
# kind: Pod # can be omitted
labels: # image
app: myapp # kv
spec: # sepecification of the pod
containers:
- name: second-container
image: vikki77/kub-first-app:2
# liveness Probes..
env: # process env
- name: STORY_FOLDER
value: story
- name: STORY_FOLDER1 # 这么全面又复杂的设置方式 我表示有点佩服
valueFrom:
configMapKeyRef: # 见 configMap
name: data-store-env
key: story
kubectl delete -f=xxx.yaml -f=xxx.yaml
kubectl delete deployments,services -l key=value // delete by label
data/state
volume
- emptyDir: pod specific.每个 pod 内部,适用于 1 replica 的情况
yaml
...
containers:
- name: story
image: vikki77/kub-data-demo:v2
volumeMounts:
- mountPath: /app/story
name: story-volume
volumes:
- name: story-volume
emptyDir: {}
- hostPath
yaml
- name: story-volume
hostPath:
path: /data
type: DirectoryOrCreate
- CSI: ContainerStorageInterface for different storage provider
persistent volume
真的好麻烦哦!!
# deployment
volumes:
- name: story-volume
persistentVolumeClaim:
claimName: host-pvc
# pv
apiVersion: v1
kind: PersistentVolume
metadata:
name: host-pv
spec:
capacity:
storage: 1Gi
volumeMode: Filesystem
storageClassName: standard
accessModes:
- ReadWriteOnce # pods will run on a only node
hostPath:
path: /data
type: DirectoryOrCreate
# pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: host-pvc
spec:
volumeName: host-pv
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
configMap
apiVersion: v1
kind: ConfigMap
metadata:
name: data-store-env
data:
folder: 'story'
network
- Pod-internal containers: localhost
- Pod-to-pod:
process.env.SERVICE_NAME_HOST
(kubernetes automatically generates)- builtin CoreDNS: "serviceName.namespaceName" - "auth-service.default"
其余背景知识
Flannel 网络:让集群中的不同节点主机创建的Docker容器都具有全集群唯一的虚拟IP地址
Containerd深度剖析-CRI篇-containerd cri
本机 develop
minikube
Install docker-cli&k8s&minikube
minikube start --driver=hyperkit --container-runtime=docker --insecure-registry "120.26.48.180:5000" "jenkins-dev.ztleyouhub.com:5000" --extra-config=apiserver.service-node-port-range=1-65535
- eval $(minikube docker-env)
- $(minikube ip):5000
intellij 调试
-
remote 云端:
-
以 debug 模式运行 java 服务:
yaml ["java", "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005","xxx.jar"]
-
转发端口到 k8s:
shell kubectl port-forward --address 0.0.0.0 byteox-house-deployment-69b579d587-bwc5h 5005:5005
-
验证服务器防火墙设置
-
云服务器开放 5005 端口
-
Intellij config
本地连接远程 cluster
通过 echo $KUBECONFIG 找到配置文件地址,在本地新增配置。
kubectl config get-contexts
kubectl config use-context kubernetes-admin@kubernetes
服务器初体验
安装三件套
参考 Kubernetes野外生存指南之安装 - OrcHome
Install and Set Up kubectl on Linux | Kubernetes
kubelet kubeadm kubectl 国内镜像源
kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock \
--apiserver-advertise-address=47.114.178.206 \
--image-repository registry.aliyuncs.com/google_containers
kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock \
--apiserver-advertise-address=172.20.189.94 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--image-repository registry.aliyuncs.com/google_containers\
--ignore-preflight-errors=Port-2379 --ignore-preflight-errors=Port-2380
Container-runtime: docker + cri-docker 文档 国内
kubeadm init --config ./init-config.yaml --ignore-preflight-errors=Port-2379 --ignore-preflight-errors=Port-2380
# reset
kubeadm reset --cri-socket unix:///var/run/cri-dockerd.sock
我的报错和这里一样:Can't initialize Kubernetes-Cluster with cri-dockerd · Issue #179 · Mirantis/cri-dockerd
journalctl -xefu kubelet
kubectl get pods --namespace dev-byteox
( kubectl config set-context --current --namespace=dev-byteox )