9.1 k8s pod版本更新流程及命令行實現升級與回滾


1.創建 Deployment

root@k8-deploy:~/k8s-yaml/controllers/deployments# vim nginx-deployment.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

在該例中:

  • 創建名為 nginx-deployment(由 .metadata.name 字段標明)的 Deployment。
  • 該 Deployment 創建三個(由 replicas 字段標明)Pod 副本。
  • selector 字段定義 Deployment 如何查找要管理的 Pods。 在這里,你選擇在 Pod 模板中定義的標簽(app: nginx), 在 API 版本 apps/v1 中,Deployment 標簽選擇算符在創建后是不可變的。

說明:

  • spec.selector.matchLabels 字段是 {key,value} 鍵值對映射。 在 matchLabels 映射中的每個 {key,value} 映射等效於 matchExpressions 中的一個元素, 即其 key 字段是 “key”,operator 為 “In”,values 數組僅包含 “value”。 在 matchLabels 和 matchExpressions 中給出的所有條件都必須滿足才能匹配。

template 字段包含以下子字段:

  • Pod 被使用 labels 字段打上 app: nginx 標簽。
  • Pod 模板規約(即 .template.spec 字段)指示 Pods 運行一個 nginx 容器, 該容器運行版本為 1.14.2 的 nginx Docker Hub鏡像。
  • 創建一個容器並使用 name 字段將其命名為 nginx。

通過運行以下命令創建 Deployment

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl apply -f nginx-deployment.yaml 
deployment.apps/nginx-deployment created

說明: 你可以設置 --record 標志將所執行的命令寫入資源注解中。 這對於以后的檢查是有用的。例如,要查看針對每個 Deployment 修訂版本所執行過的命令。

檢查 Deployment 是否已創建

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   0/3     3            0           9s

在檢查集群中的 Deployment 時,所顯示的字段有:

  1. NAME 列出了集群中 Deployment 的名稱。
  2. READY 顯示應用程序的可用的 副本 數。顯示的模式是“就緒個數/期望個數”。
  3. UP-TO-DATE 顯示為了達到期望狀態已經更新的副本數。
  4. AVAILABLE 顯示應用可供用戶使用的副本數。
  5. AGE 顯示應用程序運行的時間。
  6. 請注意期望副本數是根據 .spec.replicas 字段設置 3。

幾秒鍾后再次運行 kubectl get deployments

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           45s

要查看 Deployment 創建的 ReplicaSet(rs)

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get rs 
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-66b6c48dd5   3         3         3       11m

ReplicaSet 輸出中包含以下字段:

NAME 列出名字空間中 ReplicaSet 的名稱;

  1. DESIRED 顯示應用的期望副本個數,即在創建 Deployment 時所定義的值。 此為期望狀態;
  2. CURRENT 顯示當前運行狀態中的副本個數;
  3. READY 顯示應用中有多少副本可以為用戶提供服務;
  4. AGE 顯示應用已經運行的時間長度。
  5. 注意 ReplicaSet 的名稱始終被格式化為[Deployment名稱]-[隨機字符串]。 其中的隨機字符串是使用 pod-template-hash 作為種子隨機生成的。

查看每個 Pod 自動生成的標簽

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get pods --show-labels
NAME                                READY   STATUS    RESTARTS   AGE   LABELS
nginx-deployment-66b6c48dd5-hdxlg   1/1     Running   0          44m   app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-hnmgw   1/1     Running   0          44m   app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-p28z2   1/1     Running   0          44m   app=nginx,pod-template-hash=66b6c48dd5

說明:

  • 你必須在 Deployment 中指定適當的選擇算符和 Pod 模板標簽(在本例中為 app: nginx)。 標簽或者選擇算符不要與其他控制器(包括其他 Deployment 和 StatefulSet)重疊。 Kubernetes 不會阻止你這樣做,但是如果多個控制器具有重疊的選擇算符,它們可能會發生沖突 執行難以預料的操作。
  • Deployment 控制器將 pod-template-hash 標簽添加到 Deployment 所創建或收留的 每個 ReplicaSet 。
    此標簽可確保 Deployment 的子 ReplicaSets 不重疊。 標簽是通過對 ReplicaSet 的 PodTemplate 進行哈希處理。 所生成的哈希值被添加到 ReplicaSet 選擇算符、Pod 模板標簽,並存在於在 ReplicaSet 可能擁有的任何現有 Pod 中。

2.更新 Deployment

說明:

  • 僅當 Deployment Pod 模板(即 .spec.template)發生改變時,例如模板的標簽或容器鏡像被更新, 才會觸發 Deployment 上線。 其他更新(如對 Deployment 執行擴縮容的操作)不會觸發上線動作。

更新nginx Pod的鏡像版本,比如從nginx:1.14.2升級到nginx:1.16.1

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record
deployment.apps/nginx-deployment image updated

監控更新過程

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl rollout status deployment/nginx-deployment
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 2 out of 3 new replicas have been updated...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
Waiting for deployment "nginx-deployment" rollout to finish: 1 old replicas are pending termination...
deployment "nginx-deployment" successfully rolled out

在上線成功后,查看deployment

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           72m

查看 Deployment控制的ReplicaSet

可以看出Deployment通過創建新的 ReplicaSet 並將其擴容到 3 個副本並將舊 ReplicaSet 縮容到 0 個副本完成了 Pod 的更新操作

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-559d658b74   3         3         3       5m
nginx-deployment-66b6c48dd5   0         0         0       74m

查看更新后的pod

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get pod --show-labels
NAME                                READY   STATUS    RESTARTS   AGE     LABELS
nginx-deployment-559d658b74-4npbn   1/1     Running   0          6m29s   app=nginx,pod-template-hash=559d658b74
nginx-deployment-559d658b74-4wqbp   1/1     Running   0          6m17s   app=nginx,pod-template-hash=559d658b74
nginx-deployment-559d658b74-9wrpj   1/1     Running   0          6m41s   app=nginx,pod-template-hash=559d658b74

說明:

  • Deployment 可確保在更新時僅關閉一定數量的 Pod。默認情況下,它確保至少所需 Pods 75% 處於運行狀態(最大不可用比例為 25%)。
  • Deployment 還確保僅所創建 Pod 數量只可能比期望 Pods 數高一點點。 默認情況下,它可確保啟動的 Pod 個數比期望個數最多多出 25%(最大峰值 25%)。

獲取 Deployment 的更多信息

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl describe deployments
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Wed, 29 Sep 2021 16:01:55 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 2
                        kubernetes.io/change-cause: kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.16.1
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-559d658b74 (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  9m11s  deployment-controller  Scaled up replica set nginx-deployment-559d658b74 to 1
  Normal  ScalingReplicaSet  8m59s  deployment-controller  Scaled down replica set nginx-deployment-66b6c48dd5 to 2
  Normal  ScalingReplicaSet  8m59s  deployment-controller  Scaled up replica set nginx-deployment-559d658b74 to 2
  Normal  ScalingReplicaSet  8m47s  deployment-controller  Scaled down replica set nginx-deployment-66b6c48dd5 to 1
  Normal  ScalingReplicaSet  8m47s  deployment-controller  Scaled up replica set nginx-deployment-559d658b74 to 3
  Normal  ScalingReplicaSet  8m25s  deployment-controller  Scaled down replica set nginx-deployment-66b6c48dd5 to 0

3.回滾 Deployment

說明

  • Deployment 被觸發上線時,系統就會創建 Deployment 的新的修訂版本。 這意味着僅當 Deployment 的 Pod 模板(.spec.template)發生更改時,才會創建新修訂版本 -- 例如,模板的標簽或容器鏡像發生變化。 其他更新,如 Deployment 的擴縮容操作不會創建 Deployment 修訂版本。 這是為了方便同時執行手動縮放或自動縮放。 換言之,當你回滾到較早的修訂版本時,只有 Deployment 的 Pod 模板部分會被回滾。

查看更新的歷史記錄

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true

查看某個版本的更詳細的更加記錄信息

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2
deployment.apps/nginx-deployment with revision #2
Pod Template:
  Labels:       app=nginx
        pod-template-hash=559d658b74
  Annotations:  kubernetes.io/change-cause: kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true
  Containers:
   nginx:
    Image:      nginx:1.16.1
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

回滾到之前的版本

kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=1
deployment.apps/nginx-deployment rolled back

查看回滾后的deployment

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl get deployment nginx-deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           91m

查看deploymne的詳細信息

root@k8-deploy:~/k8s-yaml/controllers/deployments# kubectl describe deployment nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Wed, 29 Sep 2021 16:01:55 +0800
Labels:                 app=nginx
Annotations:            deployment.kubernetes.io/revision: 3
Selector:               app=nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.14.2
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-66b6c48dd5 (3/3 replicas created)
Events:
  Type    Reason             Age                From                   Message
  ----    ------             ----               ----                   -------
  Normal  ScalingReplicaSet  22m                deployment-controller  Scaled up replica set nginx-deployment-559d658b74 to 1
  Normal  ScalingReplicaSet  22m                deployment-controller  Scaled down replica set nginx-deployment-66b6c48dd5 to 2
  Normal  ScalingReplicaSet  22m                deployment-controller  Scaled up replica set nginx-deployment-559d658b74 to 2
  Normal  ScalingReplicaSet  21m                deployment-controller  Scaled down replica set nginx-deployment-66b6c48dd5 to 1
  Normal  ScalingReplicaSet  21m                deployment-controller  Scaled up replica set nginx-deployment-559d658b74 to 3
  Normal  ScalingReplicaSet  21m                deployment-controller  Scaled down replica set nginx-deployment-66b6c48dd5 to 0
  Normal  ScalingReplicaSet  17s                deployment-controller  Scaled up replica set nginx-deployment-66b6c48dd5 to 1
  Normal  ScalingReplicaSet  15s                deployment-controller  Scaled down replica set nginx-deployment-559d658b74 to 2
  Normal  ScalingReplicaSet  15s                deployment-controller  Scaled up replica set nginx-deployment-66b6c48dd5 to 2
  Normal  ScalingReplicaSet  13s (x2 over 91m)  deployment-controller  Scaled up replica set nginx-deployment-66b6c48dd5 to 3
  Normal  ScalingReplicaSet  13s                deployment-controller  Scaled down replica set nginx-deployment-559d658b74 to 1
  Normal  ScalingReplicaSet  11s                deployment-controller  Scaled down replica set nginx-deployment-559d658b74 to 0

4.擴縮容Deployment

root@k8-deploy:~# kubectl scale deployment.v1.apps/nginx-deployment --replicas=10
deployment.apps/nginx-deployment scaled

root@k8-deploy:~# kubectl get deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   10/10   10           10          97m

root@k8-deploy:~# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-559d658b74   0         0         0       27m
nginx-deployment-66b6c48dd5   10        10        10      97m

root@k8-deploy:~# kubectl get pod -o wide --show-labels
NAME                                READY   STATUS    RESTARTS   AGE     IP               NODE           NOMINATED NODE   READINESS GATES   LABELS
nginx-deployment-66b6c48dd5-7tl82   1/1     Running   0          6m33s   10.100.112.5     192.168.2.19   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-b8wvd   1/1     Running   0          69s     10.100.172.196   192.168.2.17   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-cqmzm   1/1     Running   0          6m31s   10.100.112.6     192.168.2.19   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-h9bhf   1/1     Running   0          69s     10.100.224.71    192.168.2.18   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-jzhkt   1/1     Running   0          69s     10.100.224.72    192.168.2.18   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-kdvss   1/1     Running   0          6m29s   10.100.112.7     192.168.2.19   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-kxsvq   1/1     Running   0          69s     10.100.172.197   192.168.2.17   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-tlckf   1/1     Running   0          69s     10.100.112.8     192.168.2.19   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-wfvmh   1/1     Running   0          69s     10.100.224.73    192.168.2.18   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-zmsfm   1/1     Running   0          69s     10.100.112.9     192.168.2.19   <none>           <none>            app=nginx,pod-template-hash=66b6c48dd5

暫停、恢復 Deployment

你可以在觸發一個或多個更新之前暫停 Deployment,然后再恢復其執行。
這樣做使得你能夠在暫停和恢復執行之間應用多個修補程序,而不會觸發不必要的上線操作

查看現有的deplymnet集群 rs

root@k8-deploy:~# kubectl get deployment
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           4s
root@k8-deploy:~# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-66b6c48dd5   3         3         3       7s

執行暫停

root@k8-deploy:~# kubectl rollout pause deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment paused

對deploymnet執行多項修改中的一項,比如修改pod鏡像版本

root@k8-deploy:~# kubectl set image deployment.v1.apps/nginx-deployment nginx=nginx:1.17.10
deployment.apps/nginx-deployment image updated

在暫停期間對deploymnet的修改不會立即觸發更新

root@k8-deploy:~# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>

繼續對deploymnet鏡像修改,比如對pod使用的資源進行限制

root@k8-deploy:~# kubectl set resources deployment.v1.apps/nginx-deployment -c=nginx --limits=cpu=200m,memory=512Mi
deployment.apps/nginx-deployment resource requirements updated

# 此時deployment仍然不會觸發更新
root@k8-deploy:~# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none

恢復 Deployment 執行

root@k8-deploy:~# kubectl rollout resume deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment resumed

觀察新的 ReplicaSet 的創建過程,其中包含了所應用的所有更新

root@k8-deploy:~# kubectl get rs -w
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-66b6c48dd5   2         2         2       6m26s
nginx-deployment-fcfbff66c    2         2         1       6s
nginx-deployment-fcfbff66c    2         2         2       16s
nginx-deployment-66b6c48dd5   1         2         2       6m36s
nginx-deployment-fcfbff66c    3         2         2       16s
nginx-deployment-66b6c48dd5   1         2         2       6m36s
nginx-deployment-fcfbff66c    3         2         2       16s
nginx-deployment-fcfbff66c    3         3         2       16s
nginx-deployment-66b6c48dd5   1         1         1       6m36s
nginx-deployment-fcfbff66c    3         3         3       28s
nginx-deployment-66b6c48dd5   0         1         1       6m48s
nginx-deployment-66b6c48dd5   0         1         1       6m48s
nginx-deployment-66b6c48dd5   0         0         0       6m48s

root@k8-deploy:~# kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-66b6c48dd5   0         0         0       7m55s
nginx-deployment-fcfbff66c    3         3         3       95s

root@k8-deploy:~# kubectl rollout history deployment.v1.apps/nginx-deployment
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         <none>
2         <none>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM