執行滾動更新

目標

使用 kubectl 執行滾動更新。

更新應用程式

使用者期望應用程式始終可用,而開發人員則期望每天多次部署新版本。在 Kubernetes 中,這透過滾動更新完成。滾動更新允許 Deployment 更新在零停機時間內完成。它透過以增量方式用新 Pod 替換當前 Pod 來實現。新 Pod 會排程到具有可用資源的節點上,並且 Kubernetes 會等待這些新 Pod 啟動,然後再移除舊 Pod。

在之前的模組中,我們將應用程式擴充套件為執行多個例項。這是在不影響應用程式可用性的情況下執行更新的要求。預設情況下,更新期間不可用的最大 Pod 數量以及可以建立的新 Pod 的最大數量均為一。這兩個選項都可以配置為數字或百分比(Pod 的百分比)。在 Kubernetes 中,更新是版本化的,任何 Deployment 更新都可以回滾到以前的(穩定)版本。

滾動更新概述

與應用程式擴縮類似,如果 Deployment 公開暴露,則 Service 將在更新期間僅將流量負載均衡到可用的 Pod。可用的 Pod 是應用程式使用者的可用例項。

滾動更新允許以下操作

  • 將應用程式從一個環境提升到另一個環境(透過容器映象更新)
  • 回滾到以前的版本
  • 持續整合和持續交付應用程式,零停機時間

在下面的互動式教程中,我們將應用程式更新到新版本,並執行回滾。

更新應用程式版本

要列出你的 Deployment,請執行 get deployments 子命令

kubectl get deployments

要列出正在執行的 Pod,請執行 get pods 子命令

kubectl get pods

要檢視應用程式的當前映象版本,請執行 describe pods 子命令並查詢 Image 欄位

kubectl describe pods

要將應用程式的映象更新到版本 2,請使用 set image 子命令,後跟 Deployment 名稱和新映象版本

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=docker.io/jocatalin/kubernetes-bootcamp:v2

該命令通知 Deployment 為你的應用程式使用不同的映象,並啟動了滾動更新。使用 get pods 子命令檢查新 Pod 的狀態,並檢視舊 Pod 正在終止

kubectl get pods

驗證更新

首先,檢查 Service 是否正在執行,因為你可能在之前的教程步驟中將其刪除,執行 describe services/kubernetes-bootcamp。如果缺少,你可以再次建立它:

kubectl expose deployment/kubernetes-bootcamp --type="NodePort" --port 8080

建立一個名為 NODE_PORT 的環境變數,其值為分配的節點埠

export NODE_PORT="$(kubectl get services/kubernetes-bootcamp -o go-template='{{(index .spec.ports 0).nodePort}}')"
echo "NODE_PORT=$NODE_PORT"

接下來,對公開的 IP 和埠執行 curl 命令

curl http://"$(minikube ip):$NODE_PORT"

每次執行 curl 命令時,你都會訪問不同的 Pod。請注意,所有 Pod 現在都執行最新版本(v2)。

你還可以透過執行 rollout status 子命令來確認更新

kubectl rollout status deployments/kubernetes-bootcamp

要檢視應用程式的當前映象版本,請執行 describe pods 子命令

kubectl describe pods

在輸出的 Image 欄位中,驗證你正在執行最新的映象版本(v2)。

回滾更新

讓我們執行另一次更新,並嘗試部署標記為 v10 的映象

kubectl set image deployments/kubernetes-bootcamp kubernetes-bootcamp=gcr.io/google-samples/kubernetes-bootcamp:v10

使用 get deployments 檢視 Deployment 的狀態

kubectl get deployments

請注意,輸出中未列出所需的可用 Pod 數量。執行 get pods 子命令以列出所有 Pod

kubectl get pods

請注意,某些 Pod 的狀態為 ImagePullBackOff

要更深入地瞭解問題,請執行 describe pods 子命令

kubectl describe pods

在受影響 Pod 的輸出的 Events 部分,請注意儲存庫中不存在 v10 映象版本。

要將 Deployment 回滾到上一個工作版本,請使用 rollout undo 子命令

kubectl rollout undo deployments/kubernetes-bootcamp

rollout undo 命令將 Deployment 恢復到上一個已知狀態(映象的 v2)。更新是版本化的,你可以回滾到 Deployment 的任何以前的已知狀態。

使用 get pods 子命令再次列出 Pod

kubectl get pods

要檢查正在執行的 Pod 上部署的映象,請使用 describe pods 子命令

kubectl describe pods

Deployment 再次使用應用程式的穩定版本(v2)。回滾成功。

請記住清理你的本地叢集。

kubectl delete deployments/kubernetes-bootcamp services/kubernetes-bootcamp

下一步

上次修改於 2025 年 4 月 19 日太平洋標準時間晚上 8:36:在教程中用短程式碼替換 html-inline (c4d31da65b)