Kubernetes的資源控制器ReplicationController(RC)、ReplicaSet(RS)、Deployment(Deploy)詳解與示例
主機配置規划
服務器名稱(hostname) | 系統版本 | 配置 | 內網IP | 外網IP(模擬) |
---|---|---|---|---|
k8s-master | CentOS7.7 | 2C/4G/20G | 172.16.1.110 | 10.0.0.110 |
k8s-node01 | CentOS7.7 | 2C/4G/20G | 172.16.1.111 | 10.0.0.111 |
k8s-node02 | CentOS7.7 | 2C/4G/20G | 172.16.1.112 | 10.0.0.112 |
什么是控制器
kubernetes中內建了很多controller(控制器),這些相當於一個狀態機,用來控制pod的具體狀態和行為。
- ReplicationController 和 ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job/CronJob
- HorizontalPodAutoscaler
ReplicationController 和 ReplicaSet
ReplicationController (RC)用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的pod來替代;而異常多出來的容器也會自動回收。
在新版的Kubernetes中建議使用ReplicaSet (RS)來取代ReplicationController。ReplicaSet跟ReplicationController沒有本質的不同,只是名字不一樣,但ReplicaSet支持集合式selector。
雖然 ReplicaSets 可以獨立使用,但如今它主要被Deployments 用作協調 Pod 的創建、刪除和更新的機制。當使用 Deployment 時,你不必擔心還要管理它們創建的 ReplicaSet,Deployment 會擁有並管理它們的 ReplicaSet。
ReplicaSet 是下一代的 Replication Controller。 ReplicaSet 和 Replication Controller 的唯一區別是選擇器的支持。ReplicaSet 支持新的基於集合的選擇器需求,這在標簽用戶指南中有描述。而 Replication Controller 僅支持基於相等選擇器的需求。
Deployments
Deployment 控制器為 Pods和 ReplicaSets提供描述性的更新方式。用來替代以前的ReplicationController以方便管理應用。
- 定義Deployment來創建Pod和ReplicaSet
- 滾動升級和回滾應用
- 擴容和縮容
- 暫停和繼續Deployment
ReplicaSet示例
yaml文件
1 [root@k8s-master controller]# pwd 2 /root/k8s_practice/controller 3 [root@k8s-master controller]# cat ReplicaSet-01.yaml 4 apiVersion: apps/v1 5 kind: ReplicaSet 6 metadata: 7 name: frontend 8 spec: 9 replicas: 3 10 selector: 11 matchLabels: 12 tier: frontend 13 template: 14 metadata: 15 labels: 16 tier: frontend 17 spec: 18 containers: 19 - name: nginx 20 image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 21 imagePullPolicy: IfNotPresent 22 ports: 23 - name: httpd 24 containerPort: 80
創建ReplicaSet,並查看rs狀態與詳情
1 [root@k8s-master controller]# kubectl apply -f ReplicaSet-01.yaml 2 replicaset.apps/frontend created 3 [root@k8s-master controller]# kubectl get rs -o wide # 查看狀態 4 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR 5 frontend 3 3 3 2m12s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 tier=frontend 6 [root@k8s-master controller]# 7 [root@k8s-master controller]# kubectl describe rs frontend # 查看詳情 8 Name: frontend 9 Namespace: default 10 Selector: tier=frontend 11 Labels: <none> 12 Annotations: kubectl.kubernetes.io/last-applied-configuration: 13 {"apiVersion":"apps/v1","kind":"ReplicaSet","metadata":{"annotations":{},"name":"frontend","namespace":"default"},"spec":{"replicas":3,"se... 14 Replicas: 3 current / 3 desired 15 Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed 16 Pod Template: 17 Labels: tier=frontend 18 Containers: 19 nginx: 20 Image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 21 Port: 80/TCP 22 Host Port: 0/TCP 23 Environment: <none> 24 Mounts: <none> 25 Volumes: <none> 26 Events: 27 Type Reason Age From Message 28 ---- ------ ---- ---- ------- 29 Normal SuccessfulCreate 10m replicaset-controller Created pod: frontend-kltwp 30 Normal SuccessfulCreate 10m replicaset-controller Created pod: frontend-76dbn 31 Normal SuccessfulCreate 10m replicaset-controller Created pod: frontend-jk8td
查看pod狀態信息
1 [root@k8s-master controller]# kubectl get pod -o wide --show-labels 2 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 3 frontend-76dbn 1/1 Running 0 5m15s 10.244.4.31 k8s-node01 <none> <none> tier=frontend 4 frontend-jk8td 1/1 Running 0 5m15s 10.244.2.35 k8s-node02 <none> <none> tier=frontend 5 frontend-kltwp 1/1 Running 0 5m15s 10.244.2.34 k8s-node02 <none> <none> tier=frontend
刪除一個pod,然后再次查看
1 [root@k8s-master controller]# kubectl delete pod frontend-kltwp 2 pod "frontend-kltwp" deleted 3 [root@k8s-master controller]# 4 [root@k8s-master controller]# kubectl get pod -o wide --show-labels # 可見重新創建了一個pod 5 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 6 frontend-76dbn 1/1 Running 0 7m27s 10.244.4.31 k8s-node01 <none> <none> tier=frontend 7 frontend-jk8td 1/1 Running 0 7m27s 10.244.2.35 k8s-node02 <none> <none> tier=frontend 8 frontend-mf79k 1/1 Running 0 16s 10.244.4.32 k8s-node01 <none> <none> tier=frontend
由上可見,rs又新建了一個pod,保證了pod數總是為3.
Deployment示例
創建 Deployment
yaml文件
1 [root@k8s-master controller]# pwd 2 /root/k8s_practice/controller 3 [root@k8s-master controller]# cat nginx-deployment-1.17.1.yaml 4 apiVersion: apps/v1 5 kind: Deployment 6 metadata: 7 name: nginx-deployment 8 labels: 9 app: nginx 10 spec: 11 replicas: 3 12 # 重點關注該字段 13 selector: 14 matchLabels: 15 app: nginx 16 template: 17 metadata: 18 labels: 19 app: nginx 20 spec: 21 containers: 22 - name: nginx 23 image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 24 ports: 25 - containerPort: 80 26 [root@k8s-master controller]# 27 [root@k8s-master controller]# cat nginx-deployment-1.17.5.yaml 28 apiVersion: apps/v1 29 kind: Deployment 30 metadata: 31 name: nginx-deployment 32 labels: 33 app: nginx 34 spec: 35 replicas: 3 36 # 重點關注該字段 37 selector: 38 matchLabels: 39 app: nginx 40 template: 41 metadata: 42 labels: 43 app: nginx 44 spec: 45 containers: 46 - name: nginx 47 image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 48 ports: 49 - containerPort: 80
selector 字段定義 Deployment 如何查找要管理的 Pods。 在這種情況下,會選擇在 template(Pod)模板中定義的標簽labels(app: nginx)。但更復雜的選擇規則是可能的,只要 template (Pod) 模板本身滿足規則。
啟動deployment,並查看狀態
1 [root@k8s-master controller]# kubectl apply -f nginx-deployment-1.17.1.yaml --record 2 deployment.apps/nginx-deployment created 3 [root@k8s-master controller]# 4 [root@k8s-master controller]# kubectl get deployment -o wide 5 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR 6 nginx-deployment 2/3 3 2 10s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx 7 8 # --record 參數可以記錄命令,通過 kubectl rollout history deployment/nginx-deployment 可查詢
參數說明:
- NAME:列出集群中 Deployments 的名稱
- READY:已就緒副本數/期望副本數
- UP-TO-DATE:顯示已更新和正在更新中的副本數
- AVAILABLE:顯示應用程序可供用戶使用的副本數
- AGE:顯示運行的時間
查看ReplicaSet狀態
1 [root@k8s-master controller]# kubectl get rs -o wide 2 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR 3 nginx-deployment-76b9d6bcf5 3 3 2 17s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx,pod-template-hash=76b9d6bcf5
參數說明:
- NAME:列出集群中 ReplicaSet的名稱
- DESIRED:期望副本數
- CURRENT:當前副本數
- READY:已就緒副本數
- AGE:運行時間
查看pod狀態
1 [root@k8s-master controller]# kubectl get pod -o wide 2 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES 3 nginx-deployment-76b9d6bcf5-ngpg5 1/1 Running 0 26s 10.244.2.43 k8s-node02 <none> <none> 4 nginx-deployment-76b9d6bcf5-rw827 1/1 Running 0 26s 10.244.2.44 k8s-node02 <none> <none> 5 nginx-deployment-76b9d6bcf5-ttf4j 0/1 ContainerCreating 0 26s <none> k8s-node01 <none> <none>
過一會兒狀態說明
1 [root@k8s-master controller]# kubectl get deployment -o wide --show-labels 2 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS 3 nginx-deployment 3/3 3 3 23m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx app=nginx 4 [root@k8s-master controller]# 5 [root@k8s-master controller]# kubectl get rs -o wide --show-labels 6 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS 7 nginx-deployment-76b9d6bcf5 3 3 3 23m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx,pod-template-hash=76b9d6bcf5 app=nginx,pod-template-hash=76b9d6bcf5 8 [root@k8s-master controller]# 9 [root@k8s-master controller]# kubectl get pod -o wide --show-labels 10 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 11 nginx-deployment-76b9d6bcf5-ngpg5 1/1 Running 0 23m 10.244.2.43 k8s-node02 <none> <none> app=nginx,pod-template-hash=76b9d6bcf5 12 nginx-deployment-76b9d6bcf5-rw827 1/1 Running 0 23m 10.244.2.44 k8s-node02 <none> <none> app=nginx,pod-template-hash=76b9d6bcf5 13 nginx-deployment-76b9d6bcf5-ttf4j 1/1 Running 0 23m 10.244.4.37 k8s-node01 <none> <none> app=nginx,pod-template-hash=76b9d6bcf5
1、ReplicaSet 的名稱始終被格式化為[DEPLOYMENT-NAME]-[RANDOM-STRING]
。隨機字符串是隨機生成,並使用 pod-template-hash 作為選擇器和標簽。
2、Deployment 控制器將 pod-template-hash 標簽添加到 Deployment 創建或使用的每個 ReplicaSet 。此標簽可確保 Deployment 的子 ReplicaSets 不重疊。因此不可修改。
3、注意Deployment、ReplicaSet和Pod三者的名稱關系
更新 Deployment
Deployment 可確保在更新時僅關閉一定數量的 Pods。默認情況下,它確保至少 75%所需 Pods 運行(25%最大不可用)。
Deployment 更新過程中還確保僅創建一定數量的 Pods 且高於期望的 Pods 數。默認情況下,它可確保最多增加 25% 期望 Pods 數(25%最大增量)。
備注:實際操作中如果更新Deployment,那么最好通過yaml文件更新,這樣回滾到任何版本都非常便捷,而且更容易追述;而不是通過命令行。
如下Deployment示例,由於只有3個副本。因此更新時不會先刪除舊的pod,而是先新建一個pod。新pod運行時,才會刪除對應老的pod。一切的前提都是為了滿足上述的條件。
需求:更新 nginx Pods,從當前的1.17.1版本改為1.17.5版本。
1 # 方式一 2 kubectl edit deployment/nginx-deployment # 然后修改 image 鏡像信息 【不推薦】 3 # 上述方法不會記錄命令,通過kubectl rollout history deployment/nginx-deployment 無法查詢 4 5 # 方式二如下【可使用】: 6 kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 --record 7 8 # 方式三如下【推薦★★★★★】 9 kubectl apply -f nginx-deployment-1.17.5.yaml --record 10 11 # --record 參數可以記錄命令,通過 kubectl rollout history deployment/nginx-deployment 可查詢
要查看更新狀態
1 [root@k8s-master controller]# kubectl rollout status deployment/nginx-deployment 2 # 如沒有更新完成,則顯示更新過程直到更新成功 3 Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated... 4 Waiting for deployment "nginx-deployment" rollout to finish: 1 out of 3 new replicas have been updated... 5 Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated... 6 Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated... 7 Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated... 8 Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination... 9 Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination... 10 deployment "nginx-deployment" successfully rolled out 11 # 如已更新完畢,直接顯示更新成功 12 deployment "nginx-deployment" successfully rolled out
更新中的Deployment、ReplicaSet、Pod信息
1 [root@k8s-master controller]# kubectl get deployment -o wide --show-labels 2 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS 3 nginx-deployment 3/3 1 3 12m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx app=nginx 4 [root@k8s-master controller]# 5 [root@k8s-master controller]# kubectl get rs -o wide --show-labels 6 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS 7 nginx-deployment-56d78686f5 1 1 0 23s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx,pod-template-hash=56d78686f5 app=nginx,pod-template-hash=56d78686f5 8 nginx-deployment-76b9d6bcf5 3 3 3 12m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx,pod-template-hash=76b9d6bcf5 app=nginx,pod-template-hash=76b9d6bcf5 9 [root@k8s-master controller]# 10 [root@k8s-master controller]# kubectl get pod -o wide --show-labels 11 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 12 nginx-deployment-56d78686f5-4kn4c 0/1 ContainerCreating 0 30s <none> k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 13 nginx-deployment-76b9d6bcf5-7lcr9 1/1 Running 0 12m 10.244.4.41 k8s-node01 <none> <none> app=nginx,pod-template-hash=76b9d6bcf5 14 nginx-deployment-76b9d6bcf5-jbb5h 1/1 Running 0 12m 10.244.2.48 k8s-node02 <none> <none> app=nginx,pod-template-hash=76b9d6bcf5 15 nginx-deployment-76b9d6bcf5-rt4m7 1/1 Running 0 12m 10.244.4.42 k8s-node01 <none> <none> app=nginx,pod-template-hash=76b9d6bcf5
更新成功后的Deployment、ReplicaSet、Pod信息
1 [root@k8s-master controller]# kubectl get deployment -o wide --show-labels 2 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS 3 nginx-deployment 3/3 3 3 15m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx app=nginx 4 [root@k8s-master controller]# 5 [root@k8s-master controller]# kubectl get rs -o wide --show-labels 6 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS 7 nginx-deployment-56d78686f5 3 3 3 3m23s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx,pod-template-hash=56d78686f5 app=nginx,pod-template-hash=56d78686f5 8 nginx-deployment-76b9d6bcf5 0 0 0 15m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx,pod-template-hash=76b9d6bcf5 app=nginx,pod-template-hash=76b9d6bcf5 9 [root@k8s-master controller]# 10 [root@k8s-master controller]# kubectl get pod -o wide --show-labels 11 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 12 nginx-deployment-56d78686f5-4kn4c 1/1 Running 0 3m25s 10.244.2.49 k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 13 nginx-deployment-56d78686f5-khsnm 1/1 Running 0 100s 10.244.2.50 k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 14 nginx-deployment-56d78686f5-t24qw 1/1 Running 0 2m44s 10.244.4.43 k8s-node01 <none> <none> app=nginx,pod-template-hash=56d78686f5
通過查詢Deployment詳情,知曉pod替換過程
1 [root@k8s-master controller]# kubectl describe deploy nginx-deployment 2 Name: nginx-deployment 3 Namespace: default 4 CreationTimestamp: Thu, 28 May 2020 00:04:09 +0800 5 Labels: app=nginx 6 Annotations: deployment.kubernetes.io/revision: 2 7 kubectl.kubernetes.io/last-applied-configuration: 8 {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"kubernetes.io/change-cause":"kubectl apply --filename=nginx-deploy... 9 kubernetes.io/change-cause: 10 kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 --record=true 11 Selector: app=nginx 12 Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable 13 StrategyType: RollingUpdate 14 MinReadySeconds: 0 15 RollingUpdateStrategy: 25% max unavailable, 25% max surge 16 Pod Template: 17 Labels: app=nginx 18 Containers: 19 nginx: 20 Image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 21 Port: 80/TCP 22 Host Port: 0/TCP 23 Environment: <none> 24 Mounts: <none> 25 Volumes: <none> 26 Conditions: 27 Type Status Reason 28 ---- ------ ------ 29 Available True MinimumReplicasAvailable 30 Progressing True NewReplicaSetAvailable 31 OldReplicaSets: <none> 32 NewReplicaSet: nginx-deployment-56d78686f5 (3/3 replicas created) 33 Events: 34 Type Reason Age From Message 35 ---- ------ ---- ---- ------- 36 Normal ScalingReplicaSet 93s deployment-controller Scaled up replica set nginx-deployment-76b9d6bcf5 to 3 37 Normal ScalingReplicaSet 38s deployment-controller Scaled up replica set nginx-deployment-56d78686f5 to 1 38 Normal ScalingReplicaSet 37s deployment-controller Scaled down replica set nginx-deployment-76b9d6bcf5 to 2 39 Normal ScalingReplicaSet 37s deployment-controller Scaled up replica set nginx-deployment-56d78686f5 to 2 40 Normal ScalingReplicaSet 35s deployment-controller Scaled down replica set nginx-deployment-76b9d6bcf5 to 1 41 Normal ScalingReplicaSet 35s deployment-controller Scaled up replica set nginx-deployment-56d78686f5 to 3 42 Normal ScalingReplicaSet 34s deployment-controller Scaled down replica set nginx-deployment-76b9d6bcf5 to 0
多 Deployment 動態更新
當 Deployment 正在展開進行更新時,Deployment 會為每個更新創建一個新的 ReplicaSet 並開始向上擴展,之前的 ReplicaSet 會被添加到舊 ReplicaSets 隊列並開始向下擴展。
例如,假設創建一個 Deployment 以創建 nginx:1.7.9 的 5 個副本,然后更新 Deployment 以創建 5 個 nginx:1.9.1 的副本,而此時只有 3 個nginx:1.7.9 的副本已創建。在這種情況下, Deployment 會立即開始殺死3個 nginx:1.7.9 Pods,並開始創建 nginx:1.9.1 Pods。它不等待 nginx:1.7.9 的 5 個副本完成后再更新為nginx:1.9.1。
回滾 Deployment
yaml文件方式
針對應用的每個鏡像版本,都有對應deploy的yaml文件。不管是升級還是回滾都已輕松應對。如下
1 nginx-deployment-1.15.6.yaml 2 nginx-deployment-1.17.yaml 3 nginx-deployment-1.17.1.yaml 4 nginx-deployment-1.17.5.yaml
yaml文件中的信息,參考上文即可。
命令行方式
假設在更新 Deployment 時犯了一個拼寫錯誤,將鏡像名稱命名為了 nginx:1.1710 而不是 nginx:1.17.10
1 [root@k8s-master controller]# kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.1710 --record 2 deployment.apps/nginx-deployment image updated
查看Deployment、ReplicaSet、Pod信息
1 [root@k8s-master controller]# kubectl get deploy -o wide --show-labels 2 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS 3 nginx-deployment 3/3 1 3 14m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.1710 app=nginx app=nginx 4 [root@k8s-master controller]# 5 [root@k8s-master controller]# kubectl get rs -o wide --show-labels 6 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS 7 nginx-deployment-55c7bdfb86 3 3 3 9m19s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 app=nginx,pod-template-hash=55c7bdfb86 app=nginx,pod-template-hash=55c7bdfb86 8 nginx-deployment-56d78686f5 0 0 0 12m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx,pod-template-hash=56d78686f5 app=nginx,pod-template-hash=56d78686f5 9 nginx-deployment-76b9d6bcf5 0 0 0 13m nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx,pod-template-hash=76b9d6bcf5 app=nginx,pod-template-hash=76b9d6bcf5 10 nginx-deployment-844d7bbb7f 1 1 0 64s nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.1710 app=nginx,pod-template-hash=844d7bbb7f app=nginx,pod-template-hash=844d7bbb7f 11 [root@k8s-master controller]# 12 [root@k8s-master controller]# kubectl get pod -o wide --show-labels 13 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 14 nginx-deployment-55c7bdfb86-bwzk9 1/1 Running 0 10m 10.244.4.49 k8s-node01 <none> <none> app=nginx,pod-template-hash=55c7bdfb86 15 nginx-deployment-55c7bdfb86-cmvzg 1/1 Running 0 10m 10.244.2.55 k8s-node02 <none> <none> app=nginx,pod-template-hash=55c7bdfb86 16 nginx-deployment-55c7bdfb86-kjrrw 1/1 Running 0 10m 10.244.2.56 k8s-node02 <none> <none> app=nginx,pod-template-hash=55c7bdfb86 17 nginx-deployment-844d7bbb7f-pctwr 0/1 ImagePullBackOff 0 2m3s 10.244.4.51 k8s-node01 <none> <none> app=nginx,pod-template-hash=844d7bbb7f
操作步驟如下:
檢查 Deployment 修改歷史
1 [root@k8s-master controller]# kubectl rollout history deployment/nginx-deployment 2 deployment.apps/nginx-deployment 3 REVISION CHANGE-CAUSE 4 1 kubectl apply --filename=nginx-deployment.yaml --record=true 5 2 kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 --record=true 6 3 kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 --record=true 7 4 kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.1710 --record=true
查看修改歷史的詳細信息,運行
1 [root@k8s-master controller]# kubectl rollout history deployment/nginx-deployment --revision=3 2 deployment.apps/nginx-deployment with revision #3 3 Pod Template: 4 Labels: app=nginx 5 pod-template-hash=55c7bdfb86 6 Annotations: kubernetes.io/change-cause: 7 kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 --record=true 8 Containers: 9 nginx: 10 Image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 11 Port: 80/TCP 12 Host Port: 0/TCP 13 Environment: <none> 14 Mounts: <none> 15 Volumes: <none>
回滾到上一次修改(即版本 3)或指定版本
現在已決定撤消當前更新並回滾到以前的版本
1 # 回滾到上一版本 2 [root@k8s-master controller]# kubectl rollout undo deployment/nginx-deployment 3 deployment.apps/nginx-deployment rolled back 4 # 回滾到指定歷史版本 5 [root@k8s-master controller]# kubectl rollout undo deployment/nginx-deployment --to-revision=2 6 deployment.apps/nginx-deployment rolled back
檢查回滾是否成功、 Deployment 是否正在運行
1 [root@k8s-master controller]# kubectl get deploy -o wide --show-labels 2 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS 3 nginx-deployment 3/3 3 3 17h nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx app=nginx
獲取 Deployment 描述信息
1 [root@k8s-master controller]# kubectl describe deployment 2 Name: nginx-deployment 3 Namespace: default 4 CreationTimestamp: Thu, 28 May 2020 00:04:09 +0800 5 Labels: app=nginx 6 Annotations: deployment.kubernetes.io/revision: 7 7 kubectl.kubernetes.io/last-applied-configuration: 8 {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{"kubernetes.io/change-cause":"kubectl apply --filename=nginx-deploy... 9 kubernetes.io/change-cause: 10 kubectl set image deployment/nginx-deployment nginx=registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 --record=true 11 Selector: app=nginx 12 Replicas: 3 desired | 3 updated | 3 total | 3 available | 0 unavailable 13 StrategyType: RollingUpdate 14 MinReadySeconds: 0 15 RollingUpdateStrategy: 25% max unavailable, 25% max surge 16 Pod Template: 17 Labels: app=nginx 18 Containers: 19 nginx: 20 Image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 21 Port: 80/TCP 22 Host Port: 0/TCP 23 Environment: <none> 24 Mounts: <none> 25 Volumes: <none> 26 Conditions: 27 Type Status Reason 28 ---- ------ ------ 29 Available True MinimumReplicasAvailable 30 Progressing True NewReplicaSetAvailable 31 OldReplicaSets: <none> 32 NewReplicaSet: nginx-deployment-56d78686f5 (3/3 replicas created) 33 Events: 34 Type Reason Age From Message 35 ---- ------ ---- ---- ------- 36 ……………… 37 Normal ScalingReplicaSet 107s deployment-controller Scaled up replica set nginx-deployment-56d78686f5 to 1 38 Normal ScalingReplicaSet 104s deployment-controller Scaled down replica set nginx-deployment-55c7bdfb86 to 2 39 Normal ScalingReplicaSet 104s deployment-controller Scaled up replica set nginx-deployment-56d78686f5 to 2 40 Normal ScalingReplicaSet 103s deployment-controller Scaled down replica set nginx-deployment-55c7bdfb86 to 1 41 Normal ScalingReplicaSet 103s deployment-controller Scaled up replica set nginx-deployment-56d78686f5 to 3 42 Normal ScalingReplicaSet 102s deployment-controller Scaled down replica set nginx-deployment-55c7bdfb86 to 0
擴容/縮容Deployment
操作過程如下
1 [root@k8s-master controller]# kubectl scale deployment/nginx-deployment --replicas=10 2 deployment.apps/nginx-deployment scaled 3 [root@k8s-master controller]# kubectl get deploy -o wide --show-labels 4 NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR LABELS 5 nginx-deployment 10/10 10 10 17h nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx app=nginx 6 [root@k8s-master controller]# 7 [root@k8s-master controller]# kubectl get rs -o wide --show-labels 8 NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR LABELS 9 nginx-deployment-55c7bdfb86 0 0 0 17h nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 app=nginx,pod-template-hash=55c7bdfb86 app=nginx,pod-template-hash=55c7bdfb86 10 nginx-deployment-56d78686f5 10 10 10 17h nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.5 app=nginx,pod-template-hash=56d78686f5 app=nginx,pod-template-hash=56d78686f5 11 nginx-deployment-76b9d6bcf5 0 0 0 17h nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17.1 app=nginx,pod-template-hash=76b9d6bcf5 app=nginx,pod-template-hash=76b9d6bcf5 12 nginx-deployment-844d7bbb7f 0 0 0 17h nginx registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.1710 app=nginx,pod-template-hash=844d7bbb7f app=nginx,pod-template-hash=844d7bbb7f 13 [root@k8s-master controller]# 14 [root@k8s-master controller]# kubectl get pod -o wide --show-labels 15 NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS 16 nginx-deployment-56d78686f5-4v5mj 1/1 Running 0 44s 10.244.2.64 k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 17 nginx-deployment-56d78686f5-8m7mx 1/1 Running 0 44s 10.244.4.60 k8s-node01 <none> <none> app=nginx,pod-template-hash=56d78686f5 18 nginx-deployment-56d78686f5-c7wlb 1/1 Running 0 44s 10.244.4.59 k8s-node01 <none> <none> app=nginx,pod-template-hash=56d78686f5 19 nginx-deployment-56d78686f5-jg5lt 1/1 Running 0 44s 10.244.2.63 k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 20 nginx-deployment-56d78686f5-jj58d 1/1 Running 0 11m 10.244.4.56 k8s-node01 <none> <none> app=nginx,pod-template-hash=56d78686f5 21 nginx-deployment-56d78686f5-k2kts 1/1 Running 0 11m 10.244.4.57 k8s-node01 <none> <none> app=nginx,pod-template-hash=56d78686f5 22 nginx-deployment-56d78686f5-qltkv 1/1 Running 0 44s 10.244.2.61 k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 23 nginx-deployment-56d78686f5-r7vmm 1/1 Running 0 11m 10.244.2.60 k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 24 nginx-deployment-56d78686f5-rxlpm 1/1 Running 0 44s 10.244.2.62 k8s-node02 <none> <none> app=nginx,pod-template-hash=56d78686f5 25 nginx-deployment-56d78686f5-vlzrf 1/1 Running 0 44s 10.244.4.58 k8s-node01 <none> <none> app=nginx,pod-template-hash=56d78686f5
清理策略Policy
可以在 Deployment 中設置 .spec.revisionHistoryLimit,以指定保留多少該 Deployment 的 ReplicaSets數量。其余的將在后台進行垃圾回收。默認情況下,是10。
注意:此字段設置為 0 將導致清理 Deployment 的所有歷史記錄,因此 Deployment 將無法通過命令行回滾。
相關閱讀
1、Kubernetes K8S之kubectl命令詳解及常用示例
完畢!
———END———
如果覺得不錯就關注下唄 (-^O^-) !