版本回退
接着上面的文章繼續: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 命名空間