1. 程式人生 > >Kubernetes K8S之資源控制器RC、RS、Deployment詳解

Kubernetes K8S之資源控制器RC、RS、Deployment詳解

 

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 版本。

操作步驟如下:

檢查 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^-) !

&n