自動修復節點

節點自動修復功能會持續監控節點集區中每個節點的健康狀態。如果節點健康狀態不良,節點自動修復功能會自動修復。這項功能可降低叢集發生中斷和效能下降的機率,並盡量減少叢集的手動維護需求。

建立或更新節點集區時,您可以啟用節點自動修復功能。請注意,您是在節點集區上啟用或停用這項功能,而不是在個別節點上。

健康狀態不良的節點

節點自動修復功能會檢查每個節點的健康狀態,判斷是否需要修復。如果節點回報 Ready 狀態,系統就會將其判定為健康狀態良好。否則,如果節點在特定時間內持續回報健康狀態不佳,系統就會啟動修復程序。

如果連續檢查約 15 分鐘後,發現節點處於 NotReady 狀態,就會出現健康狀態不佳的情況。或者,健康狀態不佳可能是因為開機磁碟空間不足,且這種情況持續約 30 分鐘。

您可以隨時執行 kubectl get nodes 指令,手動檢查節點的健康狀態信號。

節點修復策略

節點自動修復功能會採用特定策略,確保叢集的整體健康狀態,以及應用程式在修復期間的可用性。本節說明節點自動修復功能如何遵守 PodDisruptionBudget 設定、尊重 Pod Termination Grace Period,以及採取其他措施,在修復節點時盡量減少叢集的中斷。

榮耀 PodDisruptionBudget 30 分鐘

如果節點需要修復,系統不會立即排除並重新建立節點。節點自動修復功能會遵守 PodDisruptionBudget (PDB) 設定最多 30 分鐘,之後會刪除節點上的所有 Pod。(PDB 設定定義的內容包括特定 Pod 的備用資源數量下限,確保隨時都有足夠的備用資源)。

節點自動修復功能會遵守 PodDisruptionBudget 約 30 分鐘,提供 Pod 安全地重新排程,並在叢集中其他健全節點之間重新分配的機會。這有助於在修復過程中維持所需的應用程式可用性。

超過 30 分鐘的時間限制後,節點自動修復功能會繼續進行修復程序,即使這表示違反 PodDisruptionBudget 也是如此。如果沒有時間限制,且 PodDisruptionBudget 設定會阻止維修所需的逐出作業,維修程序可能會無限期停滯。

遵守 Pod 終止寬限期

節點自動修復功能也會遵守約 30 分鐘的 Pod 終止寬限期。Pod 終止寬限期可讓 Pod 在終止期間安全關機。在寬限期間,節點上的 kubelet 負責執行清理工作,並釋放與該節點上 Pod 相關聯的資源。節點自動修復功能最多會等待 30 分鐘,讓 kubelet 完成這項清理作業。如果超過 30 分鐘,系統就會強制終止節點,無論 Pod 是否已正常終止。

其他節點修復策略

節點自動修復功能也會實作下列策略:

  • 如果有多個節點需要修復,系統會一次修復一個節點,以減少叢集服務中斷的情況,並保護工作負載。
  • 如果在修復過程中停用節點自動修復功能,系統仍會繼續修復,直到修復作業成功或失敗為止。

如何啟用及停用節點自動修復功能

建立或更新節點集區時,您可以啟用或停用節點自動修復功能。您可以在節點集區上啟用或停用這項功能,而不是在個別節點上。

為新節點集區啟用自動修復功能

gcloud container aws node-pools create NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --instance-type INSTANCE_TYPE \
   --root-volume-size ROOT_VOLUME_SIZE \
   --iam-instance-profile NODEPOOL_PROFILE \
   --node-version NODE_VERSION \
   --min-nodes MIN_NODES \
   --max-nodes MAX_NODES \
   --max-pods-per-node MAX_PODS_PER_NODE \
   --location GOOGLE_CLOUD_LOCATION \
   --subnet-id NODEPOOL_SUBNET \
   --ssh-ec2-key-pair SSH_KEY_PAIR_NAME \
   --config-encryption-kms-key-arn CONFIG_KMS_KEY_ARN \
   --tags "Name=CLUSTER_NAME-NODE_POOL_NAME" \
   --enable-autorepair

更改下列內容:

  • NODE_POOL_NAME:您為節點集區選擇的名稱。 如要取得節點集區名稱,請執行 gcloud container aws node-pools list --cluster CLUSTER_NAME --location GOOGLE_CLOUD_LOCATION 指令:
  • CLUSTER_NAME:要將節點集區附加至的叢集名稱
  • :這個節點集區所需的 AWS 機器執行個體類型,例如 m5.largeINSTANCE_TYPE
  • ROOT_VOLUME_SIZE:每個節點根磁碟區的所需大小 (單位為 Gb)
  • NODEPOOL_PROFILE:節點集區 VM 的 IAM 執行個體設定檔
  • NODE_VERSION:要在節點集區中每個節點上安裝的 Kubernetes 版本 (例如 「1.32.4-gke.200」)
  • MIN_NODES:節點集區可包含的節點數量下限
  • MAX_NODES:節點集區可包含的節點數量上限
  • MAX_PODS_PER_NODE:集區中任何單一節點可建立的 Pod 數量上限
  • GOOGLE_CLOUD_LOCATION:管理這個節點集區的 Google Cloud位置名稱
  • NODEPOOL_SUBNET:節點集區將在其中執行的子網路 ID。
    • 叢集的 Pod/Service IP 範圍和節點集區子網路網路不得重疊。如要進一步瞭解如何為叢集選取 Pod 和 Service IP 範圍,請參閱「為叢集選取 CIDR 範圍」一文。
    • 如果這個子網路不在虛擬私有雲主要 CIDR 區塊內,則需要執行一些額外步驟。詳情請參閱安全性群組
  • SSH_KEY_PAIR_NAME:為 SSH 存取權建立的 AWS SSH 金鑰組名稱 (選用)
  • CONFIG_KMS_KEY_ARN:用於加密使用者資料的 AWS KMS 金鑰 Amazon Resource Name (ARN)

為現有節點集區啟用自動修復功能

如要為現有節點集區啟用節點自動修復功能,請執行下列指令:

gcloud container aws node-pools update NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --enable-autorepair

更改下列內容:

  • NODE_POOL_NAME:節點集區的專屬名稱,例如 node-pool-1
  • CLUSTER_NAME:叢集名稱
  • GOOGLE_CLOUD_LOCATION:管理叢集的 Google Cloud 區域

停用現有節點集區的自動修復功能

gcloud container aws node-pools update NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --no-enable-autorepair

更改下列內容:

  • NODE_POOL_NAME:節點集區的專屬名稱,例如 node-pool-1
  • CLUSTER_NAME:叢集名稱
  • GOOGLE_CLOUD_LOCATION:管理叢集的 Google Cloud 區域

請注意,GKE on AWS 會以正常程序停用節點自動修復功能。停用現有節點集區的節點自動修復功能時,AWS 上的 GKE 會啟動更新節點集區作業。作業會等待現有節點修復作業完成,再繼續進行。

檢查是否已啟用節點自動修復功能

執行下列指令,檢查節點自動修復功能是否已啟用:

gcloud container aws node-pools describe NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION

更改下列內容:

  • NODE_POOL_NAME:節點集區的專屬名稱,例如 node-pool-1
  • CLUSTER_NAME:叢集名稱
  • GOOGLE_CLOUD_LOCATION:管理叢集的 Google Cloud 區域

節點修復記錄

如要查看節點集區的修復記錄,請執行下列指令:

gcloud container aws operations list \
   --location GOOGLE_CLOUD_LOCATION \
   --filter="metadata.verb=repair AND metadata.target=projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/awsClusters/CLUSTER_NAME/awsNodePools/NODEPOOL_NAME

更改下列內容:

  • GOOGLE_CLOUD_LOCATION:管理叢集的支援 Google Cloud 區域,例如 us-west1
  • PROJECT_ID:您的 Google Cloud 專案
  • CLUSTER_NAME:叢集名稱
  • NODE_POOL_NAME:節點集區的專屬名稱,例如 node-pool-1

節點集區健康狀態摘要

啟用節點自動修復功能後,您可以執行下列指令,產生節點集區健康狀態摘要:

gcloud container aws node-pools describe NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION

節點集區健康狀態摘要類似於以下範例:

{
  "name": "some-np-name",
  "version": "some-version",
  "state": "RUNNING",

  ...

  "errors": [
    {
      "message": "1 node(s) is/are identified as unhealthy among 2 total node(s) in the node pool. No node is under repair."
    }
  ],
}

節點集區健康狀態摘要可協助您瞭解節點集區的目前狀態。在本範例中,摘要包含錯誤訊息,指出節點集區中的其中一個節點狀況不佳。並回報目前沒有任何節點正在進行修復程序。