執行滾動式更新程序

本頁說明 Google Kubernetes Engine 中的應用程式如何執行滾動式更新。

總覽

您可以執行滾動式更新來更新映像檔、設定、標籤、註解和叢集中工作負載的資源限制/要求。滾動式更新會逐步將資源的 Pod 換成新的 Pod,然後在具有可用資源的節點上排程。滾動式更新可讓您在零停機的情況下更新工作負載。

以下物件代表 Kubernetes 工作負載。您可以更新這些工作負載的 Pod 範本,以在工作負載上觸發滾動式更新:

  • DaemonSets
  • Deployments
  • StatefulSets

以上每種物件都有一個 Pod 範本,在物件的資訊清單中以 spec: template 欄位表示。Pod 範本欄位包含了控制器所建立的 Pod 規格,以實現預期的狀態或行為。您可以更新物件的 spec: template 來觸發更新「發佈」。

Pod 範本包含以下欄位:

如要進一步瞭解 Pod 範本,請參閱 PodTemplateSpec 說明文件。

在 Pod 範本以外的地方調度資源或更新欄位不會觸發發佈。

事前準備

如要準備這項工作,請執行下列步驟:

  • 確認您已啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 確認您已安裝 Cloud SDK
  • 設定預設的專案 ID
    gcloud config set project [PROJECT_ID]
  • 如果您使用區域叢集,請設定預設的運算區域
    gcloud config set compute/zone [COMPUTE_ZONE]
  • 如果您使用地區叢集,請設定預設的運算地區
    gcloud config set compute/region [COMPUTE_REGION]
  • gcloud 更新到最新版本:
    gcloud components update

更新應用程式

下節說明如何使用 Google Cloud Platform 主控台或 kubectl 更新應用程式。

kubectl 集

您可以使用 kubectl set 來變更物件的 imageresources (CPU 和記憶體等運算資源) 或 selector 欄位。

例如,若要將部署從 nginx 版本 1.7.9 更新到 1.9.1,請執行以下指令:

kubectl set image deployment nginx nginx=nginx:1.9.1

kubectl set image 指令會逐一更新部署的 Pod 的 nginx 映像檔。

又例如,若要設定部署的資源要求和限制:

kubectl set resources deployment nginx --limits cpu=200m,memory=512Mi --requests cpu=100m,memory=256Mi

或者,若要移除部署的資源要求:

kubectl set resources deployment nginx --limits cpu=0,memory=0 --requests cpu=0,memory=0

kubectl 套用

您可以使用 kubectl apply,透過「套用」新的或更新的資訊清單檔案來更新物件。

要套用新的資訊清單檔案,請執行以下指令:

kubectl apply -f [MANIFEST]

其中 [MANIFEST] 是更新的資訊清單檔案。

主控台

如要編輯應用程式的即時設定,請執行以下步驟:

  1. 造訪 GCP 主控台中的 Google Kubernetes Engine「工作負載」選單。

    造訪「Workloads」(工作負載) 選單

  2. 選取需要的工作負載。

  3. 按一下 [編輯]

  4. 使用編輯器對物件的標籤或 Pod 範本進行您要的變更。

  5. 按一下 [儲存]

管理更新發佈

您可以使用 kubectl rollout 執行下列動作:在發佈的同時檢查發佈、暫停或繼續更新發佈、復原更新、查看物件的發佈記錄。

使用 kubectl rollout status 檢查發佈

您可以使用 kubectl rollout status 指令來檢查發佈的狀態。

例如,您可以執行以下指令來檢查 nginx 部署的發佈:

kubectl rollout status deployment nginx

此指令會輸出類似以下的結果:

Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
deployment "nginx" successfully rolled out

發佈成功後,請執行 kubectl get deployment nginx 來確認所有的 Pod 都在運作中。此指令會輸出類似以下的結果:

NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
nginx              3         3         3            3           36s

暫停和繼續發佈

您可以使用 kubectl rollout pause 來暫停發佈。

例如,若要暫停 nginx 部署的發佈,請執行以下指令:

kubectl rollout pause deployment nginx

若要繼續,請執行下列指令:

kubectl rollout resume deployment nginx

使用 kubectl rollout history 查看發佈記錄

您可以使用 kubectl rollout history 來查看物件的發佈記錄。

例如,若要查看 nginx 部署的發佈記錄,請執行以下指令:

kubectl rollout history deployment nginx

若要查看第三次修訂的記錄,請執行以下指令:

kubectl rollout history deployment nginx --revision 3

使用 kubectl rollout undo 復原更新

您可以使用 kubectl rollout undo 指令來復原物件的發佈。

例如,若要將 nginx 部署復原為前一個版本,請執行以下指令:

kubectl rollout undo deployments nginx

或者,又例如,若要復原為部署的第三次修訂,請執行以下指令:

kubectl rollout undo deployment nginx --to-revision 3

StatefulSet 和 DaemonSet 的注意事項

Kubernetes 1.7 以後的 StatefulSet 和 Kubernetes 1.6 以後的 DaemonSet 使用「更新策略」來設定及停用容器、標籤、資源要求/限制的自動化滾動式更新,以及 Pod 的註解。此更新策略可使用 updateStrategy 欄位進行設定。

updateStrategy 欄位接受 OnDeleteRollingUpdate 值。

未指定 updateStrategy 時,預設的行為是 OnDeleteOnDelete 可防止控制器自動更新 Pod。您必須手動刪除 Pod,使控制器建立新的 Pod 來反映您的變更。如果您偏好手動更新 Pod,OnDelete 會是很實用的指令。

RollingUpdate 會為 StatefulSet 中的 Pod 實作自動化滾動式更新。RollingUpdate 會使控制器逐一刪除及重新建立 Pod,並且會等到新的 Pod 都在運作中且準備就緒後,才會更新舊的 Pod。

StatefulSet 控制器會以相反的順序更新所有 Pod,並遵守 StatefulSet 的保證。

使用 RollingUpdate 策略

您可以使用 RollingUpdate 策略來自動更新 StatefulSet 或 DaemonSet 中的所有 Pod。

例如,若要修補 web StatefulSet 以套用 RollingUpdate 策略,請執行以下指令:

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"rollingUpdate"}}}'

接下來,對 StatefulSet 的 spec.template 進行變更。例如,您可以使用 kubectl set 來變更容器映像檔。在下面的範例中,web StatefulSet 設定為讓 nginx 容器執行 nginx-slim:0.7 映像檔:

kubectl set image statefulset web nginx=nginx-slim:0.7

若要檢查 StatefulSet 中執行 nginx 容器的 Pod 是否正在更新,請執行以下指令:

kubectl get pods -l app=nginx -w

此指令會輸出類似以下的結果:

NAME      READY     STATUS    RESTARTS   AGE
web-0     1/1       Running   0          7m
web-1     1/1       Running   0          7m
web-2     1/1       Running   0          8m
web-2     1/1       Terminating   0         8m
web-2     1/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Terminating   0         8m
web-2     0/1       Pending   0         0s
web-2     0/1       Pending   0         0s
web-2     0/1       ContainerCreating   0         0s
web-2     1/1       Running   0         19s
web-1     1/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Terminating   0         8m
web-1     0/1       Pending   0         0s
web-1     0/1       Pending   0         0s
web-1     0/1       ContainerCreating   0         0s
web-1     1/1       Running   0         6s
web-0     1/1       Terminating   0         7m
web-0     1/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Terminating   0         7m
web-0     0/1       Pending   0         0s
web-0     0/1       Pending   0         0s
web-0     0/1       ContainerCreating   0         0s
web-0     1/1       Running   0         10s

StatefulSet 中的 Pod 會以相反的順序進行更新。StatefulSet 控制器會終止 Pod,並等到 Pod 在運作中且準備就緒後,才會繼續更新下一個 Pod。

分割 RollingUpdate

您可以為 StatefulSet 的 RollingUpdate 欄位指定一個 partition 參數。

若您指定了 partition,將更新序數大於或等於 partition 值的 Pod,而序數小於 partition 值的 Pod 則不會更新,即使在刪除後也會以之前的版本重新建立。

如果 partition 值大於 replicas 的數目,則更新不會推送到 Pod。如果您想要暫存更新、發佈初期測試版,或執行階段式發佈,分割是很實用的做法。

例如,若要分割 web StatefulSet,請執行以下指令:

kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":3}}}}'

此指令將更新序數大於或等於 3 的 Pod。

DaemonSet 的 maxUnavailable 參數

DaemonSet 的選用參數 maxUnavailable 是其 rollingUpdate 欄位的子項。

maxUnavailable 可決定更新期間最多可停用多少 DaemonSet Pod。如未填寫此欄位,則預設值為 1。此值不可為 0,但可以是一個絕對值或百分比。

使用 OnDelete 策略進行更新

如果您偏好手動更新 StatefulSet 或 DaemonSet,您可以略過 updateStrategy 欄位,指示控制器使用 OnDelete 策略。

若要更新使用 OnDelete 策略的控制器,您必須在變更 Pod 範本後,手動刪除 Pod。

例如,您可以將 web StatefulSet 設為使用 nginx-slim:0.7 映像檔:

kubectl set image statefulset web nginx=nginx-slim:0.7

然後,執行以下指令來刪除第一個 web Pod:

kubectl delete pod web-0

如要觀察 StatefulSet 重新建立 Pod,以及狀態變成運作中且準備就緒的過程,請執行以下指令:

kubectl get pod web-0 -w

此指令會輸出類似以下的結果:

NAME      READY     STATUS               RESTARTS   AGE
web-0     1/1       Running              0          54s
web-0     1/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Terminating          0         1m
web-0     0/1       Pending              0         0s
web-0     0/1       Pending              0         0s
web-0     0/1       ContainerCreating    0         0s
web-0     1/1       Running              0         3s

更新工作

在您更新工作的設定之後,新的工作及其 Pod 便會以新的設定執行。更新工作之後,您必須手動刪除舊的工作及/或工作的 Pod。

若要刪除工作「及工作所有的 Pod」,請執行以下指令:

kubectl delete job my-job

若要刪除工作但讓 Pod 繼續執行,請指定 --cascade false 標記:

kubectl delete job my-job --cascade false

您也可以執行 kubectl describe deployment nginx,它會提供更多有關部署的資訊。

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Kubernetes Engine 說明文件