將工作負載遷移至不同的機器類型

本教學課程示範如何在不造成應用程式停機的狀況下,將在 GKE 叢集上執行的工作負載遷移到同個叢集中的一組新節點。如果您想要將工作負載遷移到使用不同機器類型的節點,這是很實用的做法。

背景

節點集區是具有相同配置的一小組機器,這些配置包括機器類型 (CPU 和記憶體) 授權範圍。節點集區代表叢集中的一小群節點;一個容器叢集可以包含一或多個節點集區。

當您需要變更 Compute Engine 叢集的機器設定檔時,您可以建立一個新的節點集區,然後將您的工作負載遷移到這個新的節點集區。

要在不停機的狀況下遷移您的工作負載,您必須:

  • 將現有的節點集區標示為不可排程。
  • 清空在現有的節點集區上執行的工作負載。
  • 刪除現有的節點集區。

Kubernetes 是 GKE 叢集的叢集自動化調度管理系統,會在清空現有節點集區的同時,自動將撤出的 Pod 重新排入新節點集區中執行。

事前準備

請依照下列步驟啟用 Kubernetes Engine API:
  1. 造訪 Google Cloud Platform 主控台的 Kubernetes Engine 頁面
  2. 建立或選取專案。
  3. 等待 API 和相關服務完成啟用。這可能需要幾分鐘的時間。
  4. 請確認您已啟用 Google Cloud Platform 專案的計費功能。

    瞭解如何啟用計費功能

請安裝下列指令列工具,我們將在本教學課程中使用這些工具:

  • gcloud 可用來建立和刪除 Kubernetes Engine 叢集。gcloud會包含在 Google Cloud SDK 中。
  • kubectl 可用於管理 Kubernetes,這是 Kubernetes Engine 使用的叢集自動化調度管理系統。您可以使用 gcloud 來安裝 kubectl
    gcloud components install kubectl

設定 gcloud 指令列工具的預設設定

為了節省您在 gcloud 指令列工具中輸入專案 IDCompute Engine 區域選項的時間,您可以設定下列預設值:
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

步驟 1:建立 GKE 叢集

第一步是建立一個容器叢集以執行應用程式工作負載。下列指令會建立一個新叢集,叢集中有五個使用預設機器類型 (n1-standard-1) 的節點:

gcloud container clusters create migration-tutorial --num-nodes=5

步驟 2:執行備用的應用程式部署

以下指令將會為範例網路應用程式容器映像檔建立六個備用資源部署:

kubectl run web --image=gcr.io/google-samples/hello-app:1.0 \
  --replicas=6 --limits='cpu=100m,memory=80Mi'

您可以執行以下指令來擷取已啟動的 Pod 清單:

kubectl get pods
輸出:
NAME                   READY     STATUS    RESTARTS   AGE
web-2212180648-80q72   1/1       Running   0          10m
web-2212180648-jwj0j   1/1       Running   0          10m
web-2212180648-pf67q   1/1       Running   0          10m
web-2212180648-pqz73   1/1       Running   0          10m
web-2212180648-rrd3b   1/1       Running   0          10m
web-2212180648-v3b18   1/1       Running   0          10m

步驟 3:使用大型機器類型建立一個節點集區

根據預設,GKE 會為每個新叢集建立一個名為 default-pool 的節點集區:

gcloud container node-pools list --cluster migration-tutorial
輸出:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.5.7

若要引進不同配置 (例如不同機器類型或不同驗證範圍的執行個體,您必須建立一個新的節點集區

下列指令會建立一個名為 larger-pool 的新節點集區,內含機器類型n1-highmem-2 的五個高記憶體執行個體:

gcloud container node-pools create larger-pool --cluster=migration-tutorial \
  --machine-type=n1-highmem-2 --num-nodes=5

您的容器叢集現在應該有兩個節點集區:

gcloud container node-pools list --cluster migration-tutorial
輸出:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
default-pool  n1-standard-1  100           1.5.7
larger-pool   n1-highmem-2   100           1.5.7

您會看到新節點集區的執行個體已新增至您的 GKE 叢集:

kubectl get nodes
輸出:
NAME                                                STATUS    AGE       VERSION
gke-migration-tutorial-default-pool-56e3af9a-059q   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-0ng4   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-k6jm   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-lkrv   Ready     40m       v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-p9j4   Ready     40m       v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-2rhk    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-4bb2    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-7fl0    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-cx9q    Ready     4m        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-hs6p    Ready     4m        v1.5.7

步驟 4:遷移工作負載

建立新節點集區之後,工作負載仍然在 default-pool 上執行。只要 Pod 在執行中且可供使用,Kubernetes 就不會重新排程這些 Pod。

執行以下指令以查看 Pod 目前在哪個節點上執行 (請見 NODE 欄):

kubectl get pods -o=wide
輸出:
NAME                          READY     STATUS    IP         NODE
web-2212180648-80q72          1/1       Running   10.8.3.4   gke-migration-tutorial-default-pool-56e3af9a-k6jm
web-2212180648-jwj0j          1/1       Running   10.8.2.5   gke-migration-tutorial-default-pool-56e3af9a-0ng4
web-2212180648-pf67q          1/1       Running   10.8.4.4   gke-migration-tutorial-default-pool-56e3af9a-lkrv
web-2212180648-pqz73          1/1       Running   10.8.2.6   gke-migration-tutorial-default-pool-56e3af9a-0ng4
web-2212180648-rrd3b          1/1       Running   10.8.4.3   gke-migration-tutorial-default-pool-56e3af9a-lkrv
web-2212180648-v3b18          1/1       Running   10.8.1.4   gke-migration-tutorial-default-pool-56e3af9a-p9j4

若要將這些 Pod 遷移到新的節點集區,您必須執行下列步驟:

  1. 隔離現有節點集區:此作業會將現有節點集區 (default-pool) 中的節點標示為「不可排程」。當節點被標示為「不可排程」時,Kubernetes 即會停止將新 Pod 排入這些節點中。

  2. 清空現有節點集區:此作業會正常清空在現有節點集區 (default-pool) 的節點上執行的工作負載。

以上步驟會正常終止在現有節點集區中執行的 Pod,接著 Kubernetes 會將 Pod 重新排程到其他可用的節點上。在本範例中,可用的節點是在步驟 3 中建立的 larger-pool 中的節點。

為確保 Kubernetes 會正常終止您的應用程式,您的容器需處理 SIGTERM 信號。此信號可用來關閉連到用戶端的作用中連線,並乾淨地執行或取消資料庫交易。在 Pod 資訊清單中,您可以用 spec.terminationGracePeriodSeconds 欄位來指定 Kubernetes 在刪除 Pod 中的容器之前要等待多長時間。預設為 30 秒。請參閱 Kubernetes 說明文件,進一步瞭解終止 Pod

首先,隔離 default-pool 中的節點。您可以執行以下指令來取得此節點集區中的節點清單:

kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool

接著,執行 kubectl cordon NODE 指令 (將 NODE 換成在上個指令取得的名稱),隔離每個節點。以下指令會查看每個節點,並將節點標示為不可排程:

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl cordon "$node";
done
輸出:
node "gke-migration-tutorial-default-pool-56e3af9a-059q" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-0ng4" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-k6jm" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-lkrv" cordoned
node "gke-migration-tutorial-default-pool-56e3af9a-p9j4" cordoned

現在,您應該會在節點清單中看見 default-pool 節點的狀態變成了 SchedulingDisabled

kubectl get nodes
輸出:
NAME                                                STATUS                     AGE       VERSION
gke-migration-tutorial-default-pool-56e3af9a-059q   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-0ng4   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-k6jm   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-lkrv   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-default-pool-56e3af9a-p9j4   Ready,SchedulingDisabled   1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-2rhk    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-4bb2    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-7fl0    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-cx9q    Ready                      1h        v1.5.7
gke-migration-tutorial-larger-pool-b8ec62a6-hs6p    Ready                      1h        v1.5.7

接下來,正常清空每個節點上的 Pod。如要執行清空作業,您可以使用 kubectl drain 指令將每個節點上的 Pod 清空。

您可以將 NODE 換成傳送至 kubectl cordon 指令的相同名稱清單,以執行 kubectl drain --force NODE

以下殼層指令會查看並清空 default-pool 中的每個節點,方法是在 10 秒的終止寬限期後移除 Pod:

for node in $(kubectl get nodes -l cloud.google.com/gke-nodepool=default-pool -o=name); do
  kubectl drain --force --ignore-daemonsets --delete-local-data --grace-period=10 "$node";
done

指令完成後,您應該會看見 Pod 現在已在 larger-pool 節點上執行:

kubectl get pods -o=wide
輸出:
NAME                   READY     STATUS    IP         NODE
web-2212180648-3n9hz   1/1       Running   10.8.9.4   gke-migration-tutorial-larger-pool-b8ec62a6-cx9q
web-2212180648-88q1c   1/1       Running   10.8.7.4   gke-migration-tutorial-larger-pool-b8ec62a6-2rhk
web-2212180648-dlmjc   1/1       Running   10.8.9.3   gke-migration-tutorial-larger-pool-b8ec62a6-cx9q
web-2212180648-hcv46   1/1       Running   10.8.5.4   gke-migration-tutorial-larger-pool-b8ec62a6-hs6p
web-2212180648-n0nht   1/1       Running   10.8.6.4   gke-migration-tutorial-larger-pool-b8ec62a6-7fl0
web-2212180648-s51jb   1/1       Running   10.8.8.4   gke-migration-tutorial-larger-pool-b8ec62a6-4bb2

步驟 5:刪除舊節點集區

等到 Kubernetes 將 web 部署中的所有 Pod 都重新排程到 larger-pool 中執行後,您就可以放心刪除用不到的 default-pool。執行以下指令,以刪除 default-pool

gcloud container node-pools delete default-pool --cluster migration-tutorial

此作業完成後,您的容器叢集應該就只留下了 larger-pool 這個節點集區:

gcloud container node-pools list --cluster migration-tutorial
輸出:
NAME          MACHINE_TYPE   DISK_SIZE_GB  NODE_VERSION
larger-pool   n1-highmem-2   100           1.5.7

清除

如何避免系統向您的 Google Cloud Platform 帳戶收取在本教學課程中使用資源的相關費用:

  • 刪除容器叢集:此步驟會刪除組成容器叢集的資源,例如運算執行個體、磁碟和網路資源。

    gcloud container clusters delete migration-tutorial

後續步驟

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

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

這個網頁
Kubernetes Engine 教學課程