k8s--deployment 控制器、版本回退、金絲雀發布


版本回退

接着上面的文章繼續:https://www.cnblogs.com/zouzou-busy/p/16153612.html

前面我們已經對版本進行了升級, 通過查看 rs,發現有兩個 rs,一個是 pc-deployment-5db6b86685,這個是老的,也就是 nginx:1.14 的版本。還有一個 pc-deployment-78d879f8b6,這個就是我們升級后的版本,當前有 3 個 pod 在運行

deployment 支持版本升級過程中的暫停、繼續功能以及版本回退等。

kubectl rollout 支持下面的選項

  • status:顯示當前升級狀態
  • history:顯示升級歷史記錄
  • pause:暫停版本升級過程
  • resume:繼續以及暫停的版本升級過程
  • restart:重啟版本升級過程
  • undo:回滾到上一級版本(可以使用 --to-revision 回滾到指定版本)
查看當前版本升級的狀態

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

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

查看升級歷史記錄

如果你的 CHANGE-CAUSE 為空的話,是因為你執行命令的時候沒有加  --record 參數

kubectl create -f pc-deployment.yaml --record=true

查看歷史版本

[root@dce-10-6-215-215 ~]# kubectl rollout history deploy pc-deployment -n zouzou
deployment.apps/pc-deployment
REVISION  CHANGE-CAUSE
3         kubectl create --filename=pc-deployment.yaml --record=true
4         kubectl create --filename=pc-deployment.yaml --record=true

可以看到,有 3 和 4 兩個版本,那為啥是 3 和 4 呢?1 和 2 版本去哪了?因為之前我們最早版本是 1,對應的鏡像是 1.14,后面我們進行了升級,這時候版本為 2,鏡像為1.15。在后面我們又把鏡像從 1.15 改為了 1.14,這時候版本為 3,但版本 3 和版本 1 版本內容是一樣的,所以 3 就是對應的 1 版本。在后面,我們又把鏡像從 1.14 改為了 1.15,這時候版本為 4,但版本 4 和版本 2 的版本是一樣的。所以就只有版本 3 和版本 4 了

這時候查看鏡像是 1.15

版本回退

回到上一個版本

# 不加 --to-revision 就是回滾到上一個版本
kubectl rollout undo deployment pc-deployment -n zouzou

指定 --to-revision 就是回滾到某個版本

# 回退到 3 版本,這里直接使用 --to-revision=3 回滾到了 3 版本,如果省略這個選項,就是回退到上個版本
[root@dce-10-6-215-215 ~]# kubectl rollout undo deployment pc-deployment --to-revision=3 -n zouzou
deployment.apps/pc-deployment rolled back

# 查看發現,nginx 的鏡像回到了 1.14,之前是 1.15 
[root@dce-10-6-215-215 ~]# kubectl get deploy -n zouzou -o wide
NAME            READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES       SELECTOR
nginx3          1/1     1            1           28h    nginx        nginx:1.14   app=nginx3
pc-deployment   4/3     3            4           113m   nginx        nginx:1.14   app=nginx-pod

# 查看 rs 發現,舊的 rs pc-deployment-5db6b86685 已經有三個 pod 在運行了,新的 rs pc-deployment-78d879f8b6 的 pod 為 0 了
# 其實 deployment 之所以實現版本的回滾,就是通過記錄下歷史 rs 來實現的
# 一旦想回滾到哪個版本,只需要將當前版本 pod 數量降為 0,然后將回滾版本的 pod 提升為目標數量就可以了
[root@dce-10-6-215-215 ~]# kubectl get rs -n zouzou
NAME                       DESIRED   CURRENT   READY   AGE
nginx3-c5d7c9466           1         1         1       175m
pc-deployment-5db6b86685   3         3         3       113m
pc-deployment-78d879f8b6   0         0         0       75m

# 在查看版本,發現 3 版本沒了,多了版本 5,其實版本 3 和版本 5 是一樣的
[root@dce-10-6-215-215 ~]# kubectl rollout history deploy pc-deployment -n zouzou
deployment.apps/pc-deployment
REVISION  CHANGE-CAUSE
4         kubectl create --filename=pc-deployment.yaml --record=true
5         kubectl create --filename=pc-deployment.yaml --record=true

總結:其實 deployment 之所以實現版本的回滾,就是通過記錄下歷史 rs 來實現的,一旦想回滾到哪個版本,只需要將當前版本 pod 數量降為 0,然后將回滾版本的 pod 提升為目標數量就可以了

金絲雀發布

金絲雀發布,即灰度發布,是一種 Pod 的發布方式。金絲雀發布采取先添加、再刪除的方式,保證 Pod 的總量不低於期望值。並且在更新部分 Pod 后,暫停更新,當確認新 Pod 版本運行正常后再進行其他版本的 Pod 的更新

deployment 控制器支持控制更新過程中的控制,如“暫停(pause)”或“繼續(resume)”操作

比如有一批新的 pod 資源創建完成后立即暫停更新過程,此時,僅存在一部分新版本的應用,主體部分還是舊的版本。然后,在篩選一小部分的用戶請求路由到新版本的 pod 應用中,繼續觀察能否穩定的按期望的方式運行。確定沒問題之后在繼續完成剩下的 pod 資源滾動更新,否則立即回滾更新操作,這就是所謂的金絲雀發布。

先來查看下當前的 nginx 的版本

# nginx 的版本是 1.14
[root@dce-10-6-215-215 ~]# kubectl get deploy -n zouzou -o wide
NAME            READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES       SELECTOR
nginx3          1/1     1            1           29h    nginx        nginx:1.14   app=nginx3
pc-deployment   3/3     3            3           168m   nginx        nginx:1.14   app=nginx-pod

 在來看下 rs

# 可以看到,目前 rs 是用的 pc-deployment-5db6b86685 控制器
[root@dce-10-6-215-215 ~]# kubectl get rs -n zouzou -o wide
NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
nginx3-c5d7c9466           1         1         1       3h50m   nginx        nginx:1.14   app=nginx3,pod-template-hash=c5d7c9466
pc-deployment-5db6b86685   3         3         3       169m    nginx        nginx:1.14   app=nginx-pod,pod-template-hash=5db6b86685
pc-deployment-78d879f8b6   0         0         0       130m    nginx        nginx:1.15   app=nginx-pod,pod-template-hash=78d879f8b6

接下來我們就進行金絲雀發布

# 更新 deployment 的版本,並配置暫停 deployment
[root@dce-10-6-215-215 ~]# kubectl set image deploy pc-deployment nginx=nginx:1.15 -n zouzou && kubectl rollout pause deployment pc-deployment  -n zouzou
deployment.apps/pc-deployment image updated
deployment.apps/pc-deployment paused

執行完上面的命令之后,在來查看 deployment,從下面可以看到,nginx 的鏡像為 1.15 了,但 READY 的有 4/3,其中的 4 表示我們有 4 個可以對外提供服務的 pod,3 表示我們期望的是三個,UP-TO-DATE 為 1 ,表示最新版本的 pod 數量為 1 個,AVAILABLE 為 4 ,表示當前可用的 pod 數量為 4 個

[root@dce-10-6-215-215 ~]# kubectl get deploy -n zouzou -o wide
NAME            READY   UP-TO-DATE   AVAILABLE   AGE    CONTAINERS   IMAGES       SELECTOR
nginx3          1/1     1            1           29h    nginx        nginx:1.14   app=nginx3
pc-deployment   4/3     1            4           172m   nginx        nginx:1.15   app=nginx-pod

在來看下 rs,從下面的結果可以看到,之前的三個 pod 還是正常運行的,之前沒有 pod 的 pc-deployment-78d879f8b6 有一個可以用的,所以總共是有 4 個 pod,三個 鏡像為 1.14 的,一個鏡像為 1.15 的。因為我們升級的鏡像是 1.15,如果升級一個之前沒有用過的,就會在增加一個 pc-deployment-xxxxxxxxx。

監控更新的過程,可以看到已經新增了一個資源,但是並未按照預期的狀態去刪除一個舊的資源,就是因為使用了pause暫停命令

[root@dce-10-6-215-215 ~]# kubectl get rs -n zouzou -o wide
NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES       SELECTOR
nginx3-c5d7c9466           1         1         1       3h57m   nginx        nginx:1.14   app=nginx3,pod-template-hash=c5d7c9466
pc-deployment-5db6b86685   3         3         3       176m    nginx        nginx:1.14   app=nginx-pod,pod-template-hash=5db6b86685
pc-deployment-78d879f8b6   1         1         1       137m    nginx        nginx:1.15   app=nginx-pod,pod-template-hash=78d879f8b6

觀察一下更新狀態,從下面的結果里可以看到,三分之一的 pod 已更新。

[root@dce-10-6-215-215 ~]# kubectl rollout status deploy pc-deployment -n zouzou
Waiting for deployment "pc-deployment" rollout to finish: 1 out of 3 new replicas have been updated...

假如經過了一段時間,發現新的應用是沒有問題的,這時候我們就可以進行全部升級了

# 繼續升級
[root@dce-10-6-215-215 ~]# kubectl rollout resume deploy pc-deployment -n zouzou
deployment.apps/pc-deployment resumed

在來查看下 nginx 的版本和 rs

kubectl get deploy -n zouzou -o wide
kubectl get rs -n zouzou -o wide

刪除 deployment

# 刪除deployment,其下的rs和pod也將被刪除
[root@dce-10-6-215-215 ~]# kubectl delete -f pc-deployment.yaml
deployment.apps "pc-deployment" deleted

或者使用下面的命令

kubectl delete deployment deployment的名稱 -n 命名空間

 


免責聲明!

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



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