如何使用 Kubectl 優雅的滾動更新應用

Kubernetes 中的 Pod 通常應該是 "Running" 狀態,然而有時候我們需要針對正在運行的 Pod 調度到其它的節點或是基於其它特殊的原因,將正常運行的 Pod 進行重啓。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 種方式快速安全地讓您的應用程序恢復並運行,而不會影響用戶體驗。

參考引用

本文轉載自:「 枯惠 」,原文:https://tinyurl.com/yse2usy9 ,版權歸原作者所有。歡迎投稿,投稿郵箱: editor@hi-linux.com。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/2fx_8tEmKyjMwSdpoZT3JQ