如何使用 Kubectl 優(yōu)雅的滾動更新應(yīng)用
Pod 的重啟方式也有不少,比如常見刪除正在運(yùn)行的 Pod 讓其創(chuàng)建新的 Pod 實(shí)例(單個 Pod 無法直接使用該方式)。以下羅列出幾種常見的方式僅供備忘:
方法1:滾動重啟方法[推薦]
自 Kubernetes 1.15 版本就開始支持滾動重啟部署。這是 Kubernetes 中最快的重啟機(jī)制,因?yàn)樗切略龅?。下面給出的命令會一個一個地關(guān)閉并重新啟動部署中的每個 Pod。
$ kubectl rollout restart deployment nginx-deploy
- 提示:由于大多數(shù)容器仍在運(yùn)行,因此整個過程是縱享絲滑--無感知的。
方法2:環(huán)境變量方法
這種方式就是給運(yùn)行的容器分配一個新的環(huán)境變量,來強(qiáng)制 Pod 重新啟動。例如: 增加一個容器部署日期(實(shí)際可能未使用到該變量)
$ kubectl set env deployment nginx-deploy DEPLOY_DATE="$(date)"
- 提示:在上面的場景中,使用了set env 修改了環(huán)境變量,deployment [deployment name] 選擇了你的 deployment,DEPLOY DATE="$(date)" 修改了deployment date 并導(dǎo)致pod 更新。這種方式也是無感知的。
方法3:副本擴(kuò)/縮容
當(dāng)副本數(shù)量設(shè)置為 0 時,Kubernetes 會消除它不再需要的副本。設(shè)置大于 0 后,Kubernetes 會生成新的副本。
$ kubectl scale --replicas=0 deployment nginx-deploy
$ kubectl scale --replicas=N deployment nginx-deploy
以上方式會中斷業(yè)務(wù),我們也可以使用不中斷業(yè)務(wù)的方式來重啟應(yīng)用。比如記錄當(dāng)前的 Pod 副本數(shù)量,使用 scale --replicas 命令來分配一個大于當(dāng)前的副本數(shù)值的值,使用 kubectl delete pod 方式刪除舊 Pod,最后將使用scale --replicas 還原成正常的副本數(shù)量。
- 提示:不建議使用這種方式來重啟應(yīng)用。
結(jié)論
Kubernetes 是一個非常牛X的編排系統(tǒng),然而只要是系統(tǒng),就一定會出現(xiàn)問題。當(dāng)出現(xiàn)問題時,可以利用上述 3 種方式快速安全地讓您的應(yīng)用程序恢復(fù)并運(yùn)行,而不會影響用戶體驗(yàn)。
參考引用
- [1] https://linuxhint.com/kubectl-rollout-restart/
- [2] https://kubernetes.io/zh/docs/reference/kubectl/cheatsheet/