在真實的世界中,user期望他使用到的服務永遠不會中斷,而開發人員則希望不論何時部署版本都沒有問題,而在k8s中是透過滾動式更新(Rolling updates)來達成,滾動式更新允許你的Deployment在更新時透過新增Pods instance,以實現zero dowmtime,而新增出來的Pods則會去尋找可用的Nodes資源
在k8s中的任何更新都是版本化的,可以回復到以前的版本
以下這段真的翻不出來,放上原文
In the previous module we scaled our application to run multiple instances. This is a requirement for performing updates without affecting application availability. By default, the maximum number of Pods that can be unavailable during the update and the maximum number of new Pods that can be created, is one. Both options can be configured to either numbers or percentages (of Pods). In Kubernetes, updates are versioned and any Deployment update can be reverted to a previous (stable) version.
Deployment近似於app scaling,當Deployment是公開的,則Service會在update期間進行負載平衡將流量輸送到可用Pods,這代表了在更新期間用戶會訪問到這些可用的Pods
滾動式更新有以下的特點
取得deployment list kubectl get deployments
列出正在運行的Pods kubectl get pods
將app image版本更新到version 2,使用 set image
將會通知Deployment使用不一樣的image給你的app,並開使rolling update kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=jocatalin/kubernetes-bootcamp:v2
,並使用 kubectl get pods
觀察滾動式更新的情形
使用 describe service
找出運行中的app,以及app的NodePort & IP kubectl describe services/kubernetes-bootcamp
導出為環境變數 export NODE_PORT=$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}') echo NODE_PORT=$NODE_PORT
用curl訪問API,每次都會從不同的Pod得到response,並這時的版本是v2 curl $(minikube ip):$NODE_PORT
使用 kubectl rollout status deployments/kubernetes-bootcamp
查看滾動式更新狀況
最後查看Pods的image資訊會是v2 kubectl describe pods
使用另一個v10版本更新 kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10
查看deployment的狀況 kubectl get deployments
查看Pods的狀況 kubectl get pods
此時會發現拉取image失敗的訊息『ImagePullBackOff』,並在 Events
的部分可以查看到錯誤訊息
使用 kubectl rollout undo deployments/kubernetes-bootcamp
回復到上一個版本(v2)
查看Pods狀況 kubectl get pods
可以看到正常運行
最後查看Pods的詳細資訊,會使用v2版本運作中 kubectl describe pods
翻譯文件去看英文真的是蠻累的,至少花了三倍的時間,因為還要製作文章
然後來回比對去查看不太懂的地方,不過到後來速度有起來,有比較熟練,算是很值得
而且說實在的一開始的教學是k8s的整個基本面,只能硬啃
後面有一些load-balance或是一些部署的東西就是擅長的地方,加上前面的練習就是如魚得水
所以一天直接產出兩篇XD
後續的話會根據k8s實際的需求、應用、管理、優化、實際案例這幾個方向去著手進行
把積了兩年的東西給學掉有一種如釋負重的感覺