kubernetes-deployment運用部署
deployment
Deployment是新一代用於Pod管理的對象,與Replication Controller相比,它提供了更加完善的功能,使用起來更加簡單方便。
kubernetes開發了deployment,replicaset、daemonset、statefuleset、job等多種controller。
查看狀態
[root@master ~]# kubectl describe deployments.apps nginx-deployment Name: nginx-deployment Namespace: default CreationTimestamp: Tue, 14 Jul 2020 14:56:39 +0800 Labels: run=nginx-deployment Annotations: deployment.kubernetes.io/revision: 1 Selector: run=nginx-deployment Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: run=nginx-deployment Containers: nginx-deployment: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available True MinimumReplicasAvailable Progressing True NewReplicaSetAvailable OldReplicaSets: <none> NewReplicaSet: nginx-deployment-6c94df7599 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 2m15s deployment-controller Scaled up replica set nginx-deployment-6c94df7599 to 2
查看詳細信息
[root@master ~]# kubectl describe replicasets.apps nginx-deployment-6c94df7599 Name: nginx-deployment-6c94df7599 Namespace: default Selector: pod-template-hash=6c94df7599,run=nginx-deployment Labels: pod-template-hash=6c94df7599 run=nginx-deployment Annotations: deployment.kubernetes.io/desired-replicas: 2 deployment.kubernetes.io/max-replicas: 3 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/nginx-deployment Replicas: 2 current / 2 desired Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: pod-template-hash=6c94df7599 run=nginx-deployment Containers: nginx-deployment: Image: nginx Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulCreate 5m1s replicaset-controller Created pod: nginx-deployment-6c94df7599-bm8pd Normal SuccessfulCreate 5m1s replicaset-controller Created pod: nginx-deployment-6c94df7599-pwpph
查看更加詳細的信息
[root@master ~]# kubectl describe pod nginx-deployment-6c94df7599-bm8pd Name: nginx-deployment-6c94df7599-bm8pd Namespace: default Priority: 0 Node: node2/192.168.172.136 Start Time: Tue, 14 Jul 2020 14:57:00 +0800 Labels: pod-template-hash=6c94df7599 run=nginx-deployment Annotations: <none> Status: Running IP: 10.244.2.7 IPs: IP: 10.244.2.7 Controlled By: ReplicaSet/nginx-deployment-6c94df7599 Containers: nginx-deployment: Container ID: docker://eb72829dc2fcf1631469f33248c9fc861e0c9093c4142cb2c8e340b3612d7887 Image: nginx Image ID: docker-pullable://nginx@sha256:a93c8a0b0974c967aebe868a186e5c205f4d3bcb5423a56559f2f9599074bbcd Port: <none> Host Port: <none> State: Running Started: Tue, 14 Jul 2020 14:57:17 +0800 Ready: True Restart Count: 0 Environment: <none> Mounts: /var/run/secrets/kubernetes.io/serviceaccount from default-token-ptz8b (ro) Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True Volumes: default-token-ptz8b: Type: Secret (a volume populated by a Secret) SecretName: default-token-ptz8b Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s node.kubernetes.io/unreachable:NoExecute for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 7m20s default-scheduler Successfully assigned default/nginx-deployment-6c94df7599-bm8pd to node2 Normal Pulling 7m19s kubelet, node2 Pulling image "nginx" Normal Pulled 7m2s kubelet, node2 Successfully pulled image "nginx" Normal Created 7m2s kubelet, node2 Created container nginx-deployment Normal Started 7m2s kubelet, node2 Started container nginx-deployment
events記錄了pod的啟動過程,如果操作失敗,也能在這里查看到原因;
過程:
1.用戶通過kubectl創建deployment。
2.deployment創建replicaset。
3.replicaset創建pod。
k8s創建資源的兩種方式:
1.直接用命令創建。
2.通過配置文件和kubectl apply創建,要完成前面同樣的工作,可以執行命令。
兩種方式的區別
基於命令的方式:
1.簡單直觀快捷,上手快。
2.適合臨時測試和實驗
基於配置文件方式:
1.配置文件描述了what,即應用最終要達到的狀態。
2.配置文件提供了創建資源的模板,能夠重復部署。
3.可以像管理代碼一樣管理部署。
4.適合正式的、跨環境的、規模化部署。
5.這種方式要求熟悉配置文件的語法、有一定難度。
以下為兩種方式:
1.命令
[root@master ~]# kubectl create deployment test --image=nginx --dry-run -o yaml apiVersion: apps/v1 kind: Deployment metadata: creationTimestamp: null labels: app: test name: test spec: replicas: 1 selector: matchLabels: app: test strategy: {} template: metadata: creationTimestamp: null labels: app: test spec: containers: - image: nginx name: nginx resources: {} status: {}
kubectl create deployment test --image=nginx --dry-run -o yaml > nginx1.yml ##配置文件內容較多 語句也比較多 也可以用這個方式獲得模板
創鍵一個deployment 名字叫dis 鏡像是nginx 現在不執行 保存的格式為yaml
保存到nginx.yml這個文件里
2.配置文件:
[root@master ~]# cat nginx1.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: test name: test spec: replicas: 2 ##收縮副本的話,調整這里就可以了,然后重新執行kubectl apply -f nginx1.yml selector: matchLabels: app: test template: metadata: creationTimestamp: null labels: app: test spec: containers: - image: nginx name: nginx
[root@master ~]# kubectl apply -f nginx1.yml
deployment.apps/test created
查看
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-jz2mw 1/1 Running 1 45h 10.244.1.7 node1 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 45h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 60m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-pwpph 1/1 Running 0 60m 10.244.1.9 node1 <none> <none> test-57d9864f4f-k62hd 1/1 Running 0 5m8s 10.244.1.10 node1 <none> <none> test-57d9864f4f-pt7g9 1/1 Running 0 5m8s 10.244.2.8 node2 <none> <none>
出於安全考慮,默認配置下kubernetes不會pod調度到master節點,如果希望master也當做node節點使用、
執行
kubectl taint node master node-role.kubernetes.io/master-
恢復master不充作節點,執行如下命令:
kubectl taint node master node-role.kubernetes.io/master="":NoSchedule
K8s的故障轉移:
關掉node1
查看 [root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-jz2mw 1/1 Terminating 1 46h 10.244.1.7 node1 <none> <none> caoyi-c6c994756-q4r44 1/1 Running 0 12m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 89m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-pwpph 1/1 Terminating 0 89m 10.244.1.9 node1 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 12m 10.244.2.9 node2 <none> <none> test-57d9864f4f-c8nxl 1/1 Running 0 12m 10.244.2.11 node2 <none> <none> test-57d9864f4f-k62hd 1/1 Terminating 0 34m 10.244.1.10 node1 <none> <none> test-57d9864f4f-pt7g9 1/1 Running 0 34m 10.244.2.8 node2 <none> <none>
再開啟node1
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-q4r44 1/1 Running 0 18m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 95m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 18m 10.244.2.9 node2 <none> <none> test-57d9864f4f-c8nxl 1/1 Running 0 18m 10.244.2.11 node2 <none> <none> test-57d9864f4f-pt7g9 1/1 Running 0 40m 10.244.2.8 node2 <none> <none>
可以看到node1的節點的pod已經停止了
當node1再次上線后停掉的pod會被刪除,不會再次回到node1上了
用標簽控制pod所在的節點:
添加標簽:
[root@master ~]# kubectl label nodes node1 test=caoyi
node/node1 labeled
查看:
[root@master ~]# kubectl get nodes --show-labels NAME STATUS ROLES AGE VERSION LABELS master Ready master 4d22h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master,kubernetes.io/os=linux,node-role.kubernetes.io/master= node1 Ready <none> 4d22h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node1,kubernetes.io/os=linux,test=caoyi node2 Ready <none> 4d22h v1.17.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node2,kubernetes.io/os=linux
將標簽添加到nginx1.yml文件里控制pod所在節點:
[root@master ~]# cat nginx1.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: test name: test spec: replicas: 2 selector: matchLabels: app: test template: metadata: creationTimestamp: null labels: app: test spec: containers: - image: nginx name: nginx nodeSelector: test: caoyi
[root@master ~]# kubectl apply -f nginx1.yml
deployment.apps/test configured
查看pod所在節點 是否所有pod在node1上:
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-q4r44 1/1 Running 0 26m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 104m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 26m 10.244.2.9 node2 <none> <none> test-6f9575d5ff-c2bp7 1/1 Running 0 21s 10.244.1.12 node1 <none> <none> test-6f9575d5ff-gplfk 1/1 Running 0 41s 10.244.1.11 node1 <none> <none>
把nginx1.yml里指定標簽的語句去掉pod就會在node1和node2上了
[root@master ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES caoyi-c6c994756-q4r44 1/1 Running 0 34m 10.244.2.12 node2 <none> <none> caoyi-c6c994756-t24n5 1/1 Running 1 46h 10.244.2.6 node2 <none> <none> nginx-deployment-6c94df7599-bm8pd 1/1 Running 0 112m 10.244.2.7 node2 <none> <none> nginx-deployment-6c94df7599-s68fl 1/1 Running 0 34m 10.244.2.9 node2 <none> <none> test-57d9864f4f-776c5 1/1 Running 0 17s 10.244.2.13 node2 <none> <none> test-57d9864f4f-gf97m 1/1 Running 0 5m35s 10.244.0.5 master <none> <none> test-57d9864f4f-l2jzm 1/1 Running 0 5m52s 10.244.1.13 node1 <none> <none>