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