文章目錄
傳統的網站升級更新,一般是將服務所有下線,業務中止後再更新版本和配置,而後從新啓動並提供服務。這樣的模式已經徹底不能知足發展需求了。
高併發、高可用系統普及的今天, 服務的升級更新至少要作到「業務不中斷」。而滾動更新(Rolling-update)恰是知足這一需求的一種系統更新升級方案。
滾動更新就是針對多實例服務的一種不中斷服務的更新升級方式。通常狀況,對於多實例服務,滾動更新採用對各個實例逐個進行單獨更新而非同一時刻對全部實例進行所有更新的方式。
kubernetes在kubectl cli工具中僅提供了對Replication Controller的rolling-update支持,經過kubectl -help查看指令信息;nginx
Kubernetes POD 容器升級實戰
一、查看各pod容器組的容器更新狀況
注:這個命令通常在滾動更新時,會時刻使用查看。docker
kubectl get deployment -n default #default爲默認的命名空間,通常來講企業中會指定地域做爲命名空間
- DESIRED 最終指望處於READY狀態的副本數;
- CURRENT 當前的副本總數;
- UP-TO-DATE 當前完成更新的副本數;
- AVAILABLE 當前可用的副本數;
指定命名空間:
能夠編輯yaml文件修改上面的參數值,而後kubectl建立。還能夠:
點擊建立,點擊高級選項,能夠建立命名空間。shell
二、查看pod組運行狀況
kubectl get pod -n default
三、查看部署的信息效果
kubectl describe deployment registry-wujincheng-com -n default
四、容器升級更新
倉庫源中提早製做最新更新的鏡像,執行以下指令,升級鏡像版本便可;(升級以前必定要保證倉庫源中有最新提交的鏡像)tomcat
kubectl set image deployment/tomcat-wujincheng-com tomcat-wujincheng-com=docker.io/nginx -n default
五、查看容器升級更新進程
kubectl -n default rollout status deployment/tomcat-wujincheng-com
注:通常來講咱們更新默認都是一個一個更新的。併發
注:首先說明tomcat這個pod組裏只有4個容器,DESIRED從更新開始到結束都等於pod組裏的容器數,表示最終應該有多少個容器處於READY狀態,當前更新完成的容器爲2,當前可用容器數爲3,一個一個更新,因此只會有一個處於不可用狀態,因此更新過程當中,這個狀態一直都爲3.
上面我把更新過程當中的各個狀態的變化都表達出來了。
下一點注意一下爲啥CURRENT超出了4,變成了5。高併發
六、滾動更新過程詳解
結合下圖理解下方過程詳解:
2+3等於當前副本總數5.
滾動更新的過程:
注意這裏說的是每次更新一個容器的狀況。工具
- 建立了一個新的副本集,併爲其分配2個新版本的容器,銷燬1箇舊版本的容器,使副本總數達到5,一切正常。
- 通知新副本集,建立並運行一個容器,使可用副本總數保持到3,一塊兒正常。
- 當1箇舊副本又銷燬成功後,通知新副本集,建立並運行一個新版本容器,使新版本容器總數達到4,一切正常。
- 當新版本容器總數達到DESIRED數時,便再也不建立容器,銷燬一箇舊副本容器,便運行一個新版本容器便可。
總結:其實滾動更新,就是原來那個副本集不斷銷燬容器,直到銷燬完。建立新的副本集不斷增長容器(副本),直到達到DESIRED數。只是銷燬和建立運行之間相關聯
而已!網站
七、容器版本回滾
回滾到更新前的版本(上一個版本):spa
kubectl rollout undo deployments/tomcat-wujincheng-com -n default
八、查看是否回滾
kubectl -n default rollout status deployments/nginx-v1
最開始咱們是把tomcat變nginx,回滾後應該就是tomcat了。
kubectl describe pod/tomcat-wujincheng-com-3184522042-0jh7q -n default
回滾成功!
重點命令搭配總結:.net
kubectl get pod -n default kubectl describe pod/tomcat-wujincheng-com-3184522042-0jh7q -n default
kubectl get deployment -n default kubectl describe deployment/tomcat-wujincheng-com -n default
kubectl get svc -n default kubectl describe svc/kubernetes -n default
九、pod容器組採用的鏡像歷史版本
(1)查看曾經部署過的版本
kubectl rollout history deploy/tomcat-wujincheng-com
(2)查看某個版本詳細信息
kubectl rollout history deployment/tomcat-wujincheng-com --revision=8
(3)k8s完美支持回滾至某個版本
kubectl rollout undo deployment/tomcat-wujincheng-com --to-revision=2 -n default
十、設置每次更新的容器數目
k8s精確地控制着整個發佈過程,分批次有序地進行着滾動更新,直到把全部舊的副本所有更新到新版本。實際上k8s是經過兩個參數來精確地控制着每次滾動的pod數量:
- maxSurge,滾動更新過程當中運行操做指望副本數的最大pod數,能夠爲絕對數值(eg:5),但不能爲0,也能夠爲百分數(eg:10%),默認爲25%;
- maxUnavailable,滾動更新過程當中不可用的最大pod數,能夠爲絕對數值(eg:5),但不能爲0,也能夠爲百分數(eg:10%),默認爲25%;
注:通常這兩個值相同!
若是未指定這兩個可選參數,則k8s會使用默認配置,查找默認配置指令以下:
kubectl get deployment tomcat-wujincheng-com -o yaml -n default
修改maxSurge、maxUnavailable值:
成功!
十一、刪除不正常狀態的容器
怎樣刪除?
這樣子刪除不掉的!
kubectl delete pod tomcat-wujincheng-com-4175885076-j1vnz –grace-period=0 --force -n default
一條命令搞定:
for i in `kubectl get pod -n default|awk '{print $1}'|grep tomcat-wujincheng-com-4175885076`;do kubectl delete pod $i –grace-period=0 --force -n default;done
若是這個容器組還有用的話,這樣刪除以後,會從新起來相應臺容器。
刪除容器組名爲tomcat-wujincheng-com裏的全部容器命令:
for i in `kubectl get pod -n default|awk '{print $1}'|grep tomcat-wujincheng-com`;do kubectl delete pod $i –grace-period=0 --force -n default;done
完全刪除這個容器組的話,須要先把對應的部署、服務、副本集所有刪除,這個在k8s界面上點擊刪除按鈕便可,只有刪除容器組中的容器才須要命令,才能完全刪除。
注意:照上面作了還有該容器組的容器起來的話,繼續瘋狂執行上條命令!
成功刪除tomcat-wujincheng-com容器組!