k8s--deployment 控制器、擴縮容、升級策略


介紹

Deployment 表示用戶對 K8S 集群的一次更新操作。Deployment 是一個比 RS( Replica Set, RS) 應用模型更廣的 API 對象,可以是創建一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。滾動升級一個服務,實際是創建一個新的 RS,然后逐漸將新 RS 中副本數增加到理想狀態,將舊 RS 中的副本數減少到 0 的復合操作。

這樣一個復合操作用一個 RS 是不好描述的,所以用一個更通用的 Deployment 來描述。以 K8S 的發展方向,未來對所有長期伺服型的業務的管理,都會通過 Deployment來管理。

Deployment主要功能有下面幾個:

  • 支持 ReplicaSet 的所有功能
  • 支持發布的停止、繼續
  • 支持滾動升級和回滾版本

Deployment 的資源清單文件:

apiVersion: apps/v1 # 版本號
kind: Deployment # 類型       
metadata: # 元數據
  name: # rs名稱 
  namespace: # 所屬命名空間 
  labels: #標簽
    controller: deploy
spec: # 詳情描述
  replicas: 3 # 副本數量
  revisionHistoryLimit: 3 # 保留歷史版本
  paused: false # 暫停部署,默認是false
  progressDeadlineSeconds: 600 # 部署超時時間(s),默認是600
  strategy: # 策略
    type: RollingUpdate # 滾動更新策略
    rollingUpdate: # 滾動更新
      maxSurge: 30% # 最大額外可以存在的副本數,可以為百分比,也可以為整數
      maxUnavailable: 30% # 最大不可用狀態的 Pod 的最大值,可以為百分比,也可以為整數
  selector: # 選擇器,通過它指定該控制器管理哪些pod
    matchLabels:      # Labels匹配規則
      app: nginx-pod
    matchExpressions: # Expressions匹配規則
      - {key: app, operator: In, values: [nginx-pod]}
  template: # 模板,當副本數量不足時,會根據下面的模板創建pod副本
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.17.1
        ports:
        - containerPort: 80

創建 deployment

創建 pc-deployment.yaml,內容如下:

apiVersion: apps/v1
kind: Deployment # 類型為 deployment 
metadata:
  name: pc-deployment # deployment 的名稱
  namespace: zouzou
spec: 
  replicas: 3 # 副本數為 3 
  selector:  # 選擇器,和 template 的對應
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14

創建 pod

# 創建 deployment,--record=true 表示將命令記錄到版本里面
[root@dce-10-6-215-215 tmp]# kubectl create -f pc-deployment.yaml --record=true
deployment.apps/pc-deployment created

# 查看 deployment,deploy 是 deployment 的簡寫
# UP-TO-DATE:最新版本的 pod 的數量
# AVAILABLE:當前可用的 pod 的數量,pc-deployment 就是 yaml 里寫的 name
[root@dce-10-6-215-215 tmp]# kubectl get deploy pc-deployment -n zouzou
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
pc-deployment   3/3     3            3           23s

# 查看 rs,發現 rs 的名稱是在原來的 deployment 的名字后面添加了一個 10 位數的隨機串
[root@dce-10-6-215-215 tmp]# kubectl get rs -n zouzou
NAME                       DESIRED   CURRENT   READY   AGE
nginx3-c5d7c9466           1         1         1       62m
pc-deployment-5db6b86685   3         3         3       33s

# 查看 pod,pod 是在 rs 的名稱后面添加了 5 位隨機數
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                             READY   STATUS    RESTARTS   AGE
nginx3-c5d7c9466-vnt9c           1/1     Running   0          59m
pc-deployment-5db6b86685-6rhsd   1/1     Running   0          46s
pc-deployment-5db6b86685-w9g25   1/1     Running   0          46s
pc-deployment-5db6b86685-z2ktw   1/1     Running   0          46s

擴縮容

deployment 的擴縮容和 rs 的擴縮容一樣,參考:https://www.cnblogs.com/zouzou-busy/p/16153136.html

1.使用命令的方式

# 變更副本數為 5 個,注意,擴縮的時候寫的是控制器的名稱,不是 pod
[root@dce-10-6-215-215 tmp]# kubectl scale deploy pc-deployment --replicas=5 -n zouzou
deployment.apps/pc-deployment scaled

# 查看 deployment
[root@dce-10-6-215-215 tmp]# kubectl get deploy pc-deployment -n zouzou
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
pc-deployment   5/5     5            5           10m

# 查看 pod
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                             READY   STATUS    RESTARTS   AGE
nginx3-c5d7c9466-vnt9c           1/1     Running   0          69m
pc-deployment-5db6b86685-6rhsd   1/1     Running   0          10m
pc-deployment-5db6b86685-9sbnj   1/1     Running   0          30s
pc-deployment-5db6b86685-cc5kt   1/1     Running   0          30s
pc-deployment-5db6b86685-w9g25   1/1     Running   0          10m
pc-deployment-5db6b86685-z2ktw   1/1     Running   0          10m

2.通過編輯的方式

# 編輯 deployment 的副本數量,改為兩個
[root@dce-10-6-215-215 tmp]# kubectl edit deploy pc-deployment -n zouzou
deployment.apps/pc-deployment edited

# 查看 pod 數量,有些 pod 正在停止
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                             READY   STATUS        RESTARTS   AGE
nginx3-c5d7c9466-vnt9c           1/1     Running       0          72m
pc-deployment-5db6b86685-6rhsd   1/1     Running       0          13m
pc-deployment-5db6b86685-9sbnj   0/1     Terminating   0          3m38s
pc-deployment-5db6b86685-cc5kt   1/1     Running       0          3m38s
pc-deployment-5db6b86685-w9g25   0/1     Terminating   0          13m
pc-deployment-5db6b86685-z2ktw   0/1     Terminating   0          13m

# 查看 pod,只有兩個在運行了
[root@dce-10-6-215-215 tmp]# kubectl get pod -n zouzou
NAME                             READY   STATUS    RESTARTS   AGE
nginx3-c5d7c9466-vnt9c           1/1     Running   0          72m
pc-deployment-5db6b86685-6rhsd   1/1     Running   0          14m
pc-deployment-5db6b86685-cc5kt   1/1     Running   0          3m46s

3.通過修改 yaml 文件的方式,在 apply 一下,不做演示

鏡像升級

升級: 假設從版本為1.14 升級到 1.15 ,這就叫應用的升級【升級可以保證服務不中斷】

deployment 支持兩種更新策略,重建更新和滾動更新,可以通過 strategy 指定策略類型,支持兩個屬性

strategy: # 指定新的 pod 替換舊的 pod 的策略,支持兩個屬性
    type: # 指定策略類型,支持兩種策略
        Recreate: # 重建更新,在創建出新的 pod 之前會先殺掉所有已經存在的 pod
        RollingUpdate: # 滾動更新,就是殺死一部分,就啟動一部分,在更新過程中,存在兩個版本的 pod
    rollingUpdate: # 用來指定在升級過程中不可用 pod 的最大數量,默認為 25%
    maxSurge: # 用來指定在升級過程中可以超過期望的 pod 的最大數量,默認為 25%
重建更新

編輯 pc-deployment.yaml,在 spec 節點下添加更新策略

apiVersion: apps/v1
kind: Deployment # 類型為 deployment
metadata:
  name: pc-deployment # deployment 的名稱
  namespace: zouzou
spec:
  strategy: # 更新策略
    type: Recreate # 重建更新
  replicas: 3 # 副本數為 3
  selector:  # 選擇器,和 template 的對應
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14

在 apply 一下

kubectl apply -f pc-deployment.yaml

修改鏡像,將鏡像從 1.14 改為 1.15

kubectl set image deployment pc-deployment nginx=nginx:1.15 -n zouzou

為了觀察方便,我們可以在開一個窗口,使用 -w 參數動態監聽

從下面的結果可以看出,一下子三個 pod 都停止了,然后重新創建了三個 pod,在運行

[root@dce-10-6-215-215 ~]#  kubectl get pods -n zouzou -w
NAME                             READY   STATUS    RESTARTS   AGE
nginx3-c5d7c9466-vnt9c           1/1     Running   0          96m
pc-deployment-5db6b86685-6rhsd   1/1     Running   0          37m
pc-deployment-5db6b86685-cc5kt   1/1     Running   0          27m
pc-deployment-5db6b86685-cw5l6   1/1     Running   0          2m1s
pc-deployment-5db6b86685-cw5l6   1/1     Terminating   0          2m57s
pc-deployment-5db6b86685-cc5kt   1/1     Terminating   0          27m
pc-deployment-5db6b86685-6rhsd   1/1     Terminating   0          38m
pc-deployment-5db6b86685-cw5l6   0/1     Terminating   0          3m
pc-deployment-5db6b86685-cc5kt   0/1     Terminating   0          28m
pc-deployment-5db6b86685-6rhsd   0/1     Terminating   0          38m
pc-deployment-5db6b86685-cw5l6   0/1     Terminating   0          3m1s
pc-deployment-5db6b86685-cw5l6   0/1     Terminating   0          3m1s
pc-deployment-5db6b86685-6rhsd   0/1     Terminating   0          38m
pc-deployment-5db6b86685-6rhsd   0/1     Terminating   0          38m
pc-deployment-5db6b86685-cc5kt   0/1     Terminating   0          28m
pc-deployment-5db6b86685-cc5kt   0/1     Terminating   0          28m
pc-deployment-78d879f8b6-2d5fx   0/1     Pending       0          0s
pc-deployment-78d879f8b6-2d5fx   0/1     Pending       0          0s
pc-deployment-78d879f8b6-ntvb9   0/1     Pending       0          0s
pc-deployment-78d879f8b6-qpscz   0/1     Pending       0          0s
pc-deployment-78d879f8b6-ntvb9   0/1     Pending       0          0s
pc-deployment-78d879f8b6-qpscz   0/1     Pending       0          0s
pc-deployment-78d879f8b6-ntvb9   0/1     ContainerCreating   0          0s
pc-deployment-78d879f8b6-2d5fx   0/1     ContainerCreating   0          0s
pc-deployment-78d879f8b6-qpscz   0/1     ContainerCreating   0          0s
pc-deployment-78d879f8b6-2d5fx   0/1     ContainerCreating   0          3s
pc-deployment-78d879f8b6-qpscz   0/1     ContainerCreating   0          3s
pc-deployment-78d879f8b6-ntvb9   0/1     ContainerCreating   0          3s
pc-deployment-78d879f8b6-2d5fx   0/1     ContainerCreating   0          3s
pc-deployment-78d879f8b6-qpscz   0/1     ContainerCreating   0          3s
pc-deployment-78d879f8b6-ntvb9   0/1     ContainerCreating   0          3s
pc-deployment-78d879f8b6-ntvb9   1/1     Running             0          5s
pc-deployment-78d879f8b6-2d5fx   1/1     Running             0          5s
pc-deployment-78d879f8b6-qpscz   1/1     Running             0          5s

滾動更新

編輯 pc-deployment.yaml,修改更新策略,改為滾動更新

apiVersion: apps/v1
kind: Deployment # 類型為 deployment
metadata:
  name: pc-deployment # deployment 的名稱
  namespace: zouzou
spec:
  strategy: # 更新策略
    type: RollingUpdate # 滾動更新策略
    rollingUpdate:
      maxSurge: 25% 
      maxUnavailable: 25%
  replicas: 3 # 副本數為 3
  selector:  # 選擇器,和 template 的對應
    matchLabels:
      app: nginx-pod
  template:
    metadata:
      labels:
        app: nginx-pod
    spec:
      containers:
      - name: nginx
        image: nginx:1.14

在 apply 一下,這時候的鏡像還是 1.14

kubectl apply -f pc-deployment.yaml

修改鏡像,將鏡像從 1.14 改為 1.15

kubectl set image deployment pc-deployment nginx=nginx:1.15 -n zouzou

為了觀察方便,我們可以在開一個窗口,使用 -w 參數動態監聽

從下面的結果可以看出,先創建一個容器,創建成功了在停止一個容器,依次更新

在我們執行完命令后,能看到升級的過程

  • 首先是開始的 nginx 1.14 版本的 Pod 在運行,然后 1.15 版本的在創建
  • 然后在 1.15 版本創建完成后,就會暫停1.14版本
  • 最后把 1.14 版本的 Pod 移除,完成我們的升級

我們在下載 1.15版本,容器就處於 ContainerCreating 狀態,然后下載完成后,就用 1.15 版本去替換 1.14 版本了,這么做的好處就是:升級可以保證服務不中斷

[root@dce-10-6-215-215 ~]# kubectl get pods -n zouzou -w
NAME                             READY   STATUS    RESTARTS   AGE
nginx3-c5d7c9466-vnt9c           1/1     Running   0          106m
pc-deployment-5db6b86685-fjz46   1/1     Running   0          2m39s
pc-deployment-5db6b86685-hdmvd   1/1     Running   0          2m34s
pc-deployment-5db6b86685-j7v8f   1/1     Running   0          2m44s
pc-deployment-78d879f8b6-crn8s   0/1     Pending   0          0s
pc-deployment-78d879f8b6-crn8s   0/1     Pending   0          0s
pc-deployment-78d879f8b6-crn8s   0/1     ContainerCreating   0          0s
pc-deployment-78d879f8b6-crn8s   0/1     ContainerCreating   0          2s
pc-deployment-78d879f8b6-crn8s   0/1     ContainerCreating   0          2s
pc-deployment-78d879f8b6-crn8s   1/1     Running             0          4s
pc-deployment-5db6b86685-hdmvd   1/1     Terminating         0          2m48s
pc-deployment-78d879f8b6-r8wbx   0/1     Pending             0          0s
pc-deployment-78d879f8b6-r8wbx   0/1     Pending             0          0s
pc-deployment-78d879f8b6-r8wbx   0/1     ContainerCreating   0          0s
pc-deployment-78d879f8b6-r8wbx   0/1     ContainerCreating   0          3s
pc-deployment-5db6b86685-hdmvd   0/1     Terminating         0          2m51s
pc-deployment-78d879f8b6-r8wbx   0/1     ContainerCreating   0          3s
pc-deployment-78d879f8b6-r8wbx   1/1     Running             0          5s
pc-deployment-5db6b86685-fjz46   1/1     Terminating         0          2m58s
pc-deployment-78d879f8b6-djg6c   0/1     Pending             0          0s
pc-deployment-78d879f8b6-djg6c   0/1     Pending             0          0s
pc-deployment-78d879f8b6-djg6c   0/1     ContainerCreating   0          0s
pc-deployment-78d879f8b6-djg6c   0/1     ContainerCreating   0          3s
pc-deployment-5db6b86685-fjz46   0/1     Terminating         0          3m1s
pc-deployment-78d879f8b6-djg6c   0/1     ContainerCreating   0          3s
pc-deployment-5db6b86685-fjz46   0/1     Terminating         0          3m2s
pc-deployment-5db6b86685-fjz46   0/1     Terminating         0          3m2s
pc-deployment-78d879f8b6-djg6c   1/1     Running             0          5s
pc-deployment-5db6b86685-j7v8f   1/1     Terminating         0          3m8s
pc-deployment-5db6b86685-hdmvd   0/1     Terminating         0          2m59s
pc-deployment-5db6b86685-hdmvd   0/1     Terminating         0          2m59s
pc-deployment-5db6b86685-j7v8f   0/1     Terminating         0          3m11s
pc-deployment-5db6b86685-j7v8f   0/1     Terminating         0          3m12s
pc-deployment-5db6b86685-j7v8f   0/1     Terminating         0          3m12s

滾動更新的過程如下圖所示:

  

查看 RS 的變化

查看 RS 。發現原來的 RS 依舊存在,只是 pod 的數量變為了 0,而后又新產生了一個 RS,pod 的數量為 3 ,為什么會這樣呢?想一下,當我們升級了版本之后,如果這個版本有 bug 怎么辦?是不是要馬上回滾到上一個版本,這就是 deployment 的高明之處,不會刪除之前的 RS

# 查看 rs,發現原來的 rs 依舊存在,只是 pod 數量變為了 0,而后又新產生了一個 rs,pod數量為 3
# 其實這就是 deployment 能夠進行版本回退的奧妙所在,后面會詳細解釋
[root@dce-10-6-215-215 ~]# kubectl get rs -n zouzou
NAME                       DESIRED   CURRENT   READY   AGE
nginx3-c5d7c9466           1         1         1       111m
pc-deployment-5db6b86685   0         0         0       49m
pc-deployment-78d879f8b6   3         3         3       11m

查看更新狀態

可以通過下面的命令查看更新的狀態

# pc-deployment 是 deployment 的名稱
kubectl rollout status deployment pc-deployment -n zouzou

 


免責聲明!

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



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