介紹
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