K8S學習筆錄 - Deployment的升級和回滾

原文連接nginx

當集羣中某個服務須要升級時,咱們可能須要中止目前與該服務相關的全部Pod,而後下載新版本鏡像並建立新的Pod。 然而這個升級/回滾方案在集羣較大的時候代價是巨大的,會致使較長時間的服務不可用。K8S提供了滾動升級功能來解決這些問題。git

不一樣的管理對象的更新配置和操做是不一樣的github

對於Deployment來說,更新的過程以下json

  1. Deployment的ReplicaSet本來有3個Pod副本api

  2. 在更新開始前,建立一個新的ReplicaSet對象,配置與舊的ReplicaSet一致bash

  3. 根據更新規則,逐漸擴容新的RS、縮容舊的RS,直到新的RS容量與舊的一致、舊的RS容量爲0markdown

  4. 根據存儲歷史版本配置決定是否刪除超出存儲數量的歷史ReplicaSetapp

deployment-update.png

配置

type DeploymentSpec struct {
    // Deployment對於已經存在的Pod的替換策略
    Strategy DeploymentStrategy `json:"strategy,omitempty"`

    // 存儲的歷史版本數量,用於回滾,默認是10
    RevisionHistoryLimit *int32 `json:"revisionHistoryLimit,omitempty"`
}

type DeploymentStrategy struct {
    // 替換策略,值爲Recreate或RollingUpdate,默認爲RollingUpate
    // Recreate會先中止全部的舊Pod,而後建立新的
    Type DeploymentStrategyType `json:"type,omitempty"`

    // 更新回滾配置參數,只在RollingUpdate下生效
    RollingUpdate *RollingUpdateDeployment `json:"rollingUpdate,omitempty"`
}

type RollingUpdateDeployment struct {
    // 滾動升級過程當中,容許不可用的Pod數量或比例
    // 默認爲25%,此時升級過程當中可用的Pod數量始終爲75%
    // 每成功升級一個,則容許開始升級下一個
    // MaxUnavailable爲0時,MaxSurge不能爲0
    MaxUnavailable *intstr.IntOrString `json:"maxUnavailable,omitempty"`

    // 滾動升級過程當中,容許最多同時建立Pod的數量或比例
    // 默認爲25%,此時升級過程當中新舊Pod數量總和最多爲正常值的125%
    // 每刪除一箇舊的Pod則容許建立一個新的
    // MaxSurge爲0時,MaxUnavailable不能爲0
    MaxSurge *intstr.IntOrString `json:"maxSurge,omitempty"`
}
複製代碼

升級

當前擁有一個名爲nginx-deployment的Deployment對象oop

apiVersion: apps/v1
kind: Deployment
metadata:
 name: nginx-deployment
spec:
 replicas: 3
 selector:
 matchLabels:
 app: nginx
 template:
 metadata:
 labels:
 app: nginx
 spec:
 containers:
 - name: nginx
 image: nginx:1.13.0
 ports:
 - containerPort: 80
複製代碼

假如要將其nginx版本從1.13.0升級到最新的1.14.0post

有兩種方案能夠進行升級,效果同樣

  1. 經過執行 kubectl edit (RESOURCE/NAME | -f FILENAME) [options]

    具體用法能夠經過 kubectl edit --help 查看

  2. 經過執行 kubectl set SUBCOMMAND [options]

    具體用法能夠經過 kubectl set --help 查看

咱們使用第二種方案進行升級

$ kubectl set image deployment/nginx-deployment nginx=nginx:1.14.0
deployment.apps/nginx-deployment image updated

$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-58cdcbb467   3         3         3       8m32s
nginx-deployment-7f555c9b4b   1         1         0       9s

$ kubectl describe deployment nginx-deployment
Name:                   nginx-deployment
Namespace:              default
CreationTimestamp:      Sat, 28 Dec 2019 21:58:02 +0800
Labels:                 <none>
Annotations:            deployment.kubernetes.io/revision: 2
                        kubernetes.io/change-cause: kubectl create --filename=nginx-old.yaml --record=true
Selector:               app=nginx
Replicas:               3 desired | 2 updated | 4 total | 3 available | 1 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=nginx
  Containers:
   nginx:
    Image:        nginx:1.14.0
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    ReplicaSetUpdated
OldReplicaSets:  nginx-deployment-58cdcbb467 (2/2 replicas created)
NewReplicaSet:   nginx-deployment-7f555c9b4b (2/2 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  8m53s  deployment-controller  Scaled up replica set nginx-deployment-58cdcbb467 to 3
  Normal  ScalingReplicaSet  30s    deployment-controller  Scaled up replica set nginx-deployment-7f555c9b4b to 1
  Normal  ScalingReplicaSet  17s    deployment-controller  Scaled down replica set nginx-deployment-58cdcbb467 to 2
  Normal  ScalingReplicaSet  17s    deployment-controller  Scaled up replica set nginx-deployment-7f555c9b4b to 2
複製代碼

咱們能夠根據上面的信息看到

  1. Annotations: deployment.kubernetes.io/revision: 2

    當前Deployment的版本是2

  2. RollingUpdateStrategy: 25% max unavailable, 25% max surge

    此Deployment對象的滾動升級策略爲最多25%不可用,最多同時升級25%的Pod,Events信息中的行爲與配置要求行爲徹底一致

  3. Replicas: 3 desired | 2 updated | 4 total | 3 available | 1 unavailable

    當前的更新進度,也能夠經過 kubectl rollout status deployments nginx-deployment 來監聽

  4. Conditions:

    當前Deployment可用,正在進行ReplicaSet升級

  5. OldReplicaSets: ... NewReplicaSet: ... 存在的新舊ReplicaSets信息

  6. Events: ...

    當前Deployment對象發生的事件

最終狀態下,原來的 nginx-deployment-7f555c9b4b 中Pod的數量將會變成0,而新的 nginx-deployment-58cdcbb467 中的Pod數量將會變爲3

因爲Deployment的配置中保留歷史版本數使用了默認的10,因此舊的RS會與新的同時存在,用於回滾

$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-58cdcbb467   0         0         0       15m
nginx-deployment-7f555c9b4b   3         3         3       6m43s
複製代碼

回滾

可使用 kubectl rollout 命令來對Deployment進行回滾,經過 kubectl rollout --help 查看具體用法

在回滾版本前,能夠經過 kubectl rollout history 來查看當前存在的版本

若是在建立Deployment的時候,使用了 --record 參數,每次Deployment被修改的時候,還會記錄下來修改的命令

$ kubectl rollout history deployment/nginx-deployment
deployment.apps/nginx-deployment
REVISION  CHANGE-CAUSE
1         kubectl create --filename=nginx-old.yaml --record=true
2         kubectl create --filename=nginx-old.yaml --record=true
複製代碼

此處能夠看到當前有兩個版本,能夠在後面加參數 --revision=<REVISION> 來查看指定版本的PotTemplate

$ kubectl rollout history deployment/nginx-deployment --revision=1
deployment.apps/nginx-deployment with revision #1
Pod Template:
  Labels:       app=nginx
        pod-template-hash=58cdcbb467
  Annotations:  kubernetes.io/change-cause: kubectl create --filename=nginx-old.yaml --record=true
  Containers:
   nginx:
    Image:      nginx:1.13.0
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
    Volumes:      <none>
複製代碼

在回滾的時候有兩種方案

  1. 回滾到上一版本 kubectl rollout undo (TYPE NAME | TYPE/NAME)
  2. 回滾到制定版本 kubectl rollout undo (TYPE NAME | TYPE/NAME) --to-revision=<REVISION>

使用第2中方法進行回滾,回滾到1個版本

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

$ kubectl get rs
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-58cdcbb467   3         3         3       30m
nginx-deployment-7f555c9b4b   0         0         0       22m

$ kubectl describe deployment nginx-deployment
OldReplicaSets:  <none>
NewReplicaSet:   nginx-deployment-58cdcbb467 (3/3 replicas created)
Events:
  Type    Reason             Age               From                   Message
  ----    ------             ----              ----                   -------
  Normal  ScalingReplicaSet  22m               deployment-controller  Scaled up replica set nginx-deployment-7f555c9b4b to 1
  Normal  ScalingReplicaSet  22m               deployment-controller  Scaled down replica set nginx-deployment-58cdcbb467 to 2
  Normal  ScalingReplicaSet  22m               deployment-controller  Scaled up replica set nginx-deployment-7f555c9b4b to 2
  Normal  ScalingReplicaSet  22m               deployment-controller  Scaled down replica set nginx-deployment-58cdcbb467 to 1
  Normal  ScalingReplicaSet  22m               deployment-controller  Scaled up replica set nginx-deployment-7f555c9b4b to 3
  Normal  ScalingReplicaSet  21m               deployment-controller  Scaled down replica set nginx-deployment-58cdcbb467 to 0
  Normal  ScalingReplicaSet  14s               deployment-controller  Scaled up replica set nginx-deployment-58cdcbb467 to 1
  Normal  ScalingReplicaSet  10s               deployment-controller  Scaled down replica set nginx-deployment-7f555c9b4b to 2
  Normal  ScalingReplicaSet  10s               deployment-controller  Scaled up replica set nginx-deployment-58cdcbb467 to 2
  Normal  ScalingReplicaSet  7s (x2 over 30m)  deployment-controller  Scaled up replica set nginx-deployment-58cdcbb467 to 3
  Normal  ScalingReplicaSet  7s                deployment-controller  Scaled down replica set nginx-deployment-7f555c9b4b to 1
  Normal  ScalingReplicaSet  3s                deployment-controller  Scaled down replica set nginx-deployment-7f555c9b4b to 0
複製代碼

信息上能夠看到,經過縮容和擴容的操做,已經逐步切換到舊版本 nginx-deployment-58cdcbb467 上了

而且沒有更舊的版本了 OldReplicaSets: <none>

暫停

當有比較複雜的修改需求的時候,能夠先暫停Deployment的更新能力,在對Deployment進行修改完成以後,從新啓用更新,從而避免Deployment進行屢次更新

  1. 暫停更新 kubectl rolout pause (TYPE NAME | TYPE/NAME)
  2. 修改Deployment
  3. 恢復更新 kubectl rolout resume (TYPE NAME | TYPE/NAME)
相關文章
相關標籤/搜索