自动节点修复

节点自动修复功能会持续监控节点池中每个节点的健康状况。如果某个节点运行状况不佳,则该节点自动修复功能会自动对其进行修复。此功能可降低集群发生中断和性能下降的可能性,并最大限度减少手动维护集群的需求。

您可以在创建或更新节点池时启用节点自动修复。请注意,您可以在节点池(而非单个节点)上启用或停用此功能。

健康状况不佳的节点条件

节点自动修复会检查每个节点的健康状况,以确定其是否需要修复。如果节点报告 Ready 状态,则会被视为健康状况良好。否则,如果在特定时段内连续报告运行状况不佳状态,则会启动修复。

在 15 分钟左右的连续检查中检测到 NotReady 状态,则会出现运行状况不佳的状态。或者,运行状况不佳状态的原因可能是启动磁盘空间不足,可在大约 30 分钟内确定。

您可以随时运行 kubectl get nodes 命令来手动检查节点的运行状况信号。

节点修复策略

节点自动修复功能遵循特定策略,以确保修复过程中集群的整体运行状况以及应用的可用性。本部分介绍节点自动修复功能如何支持 PodDisruptionBudget 配置、遵循 Pod Termination Grace Period,并采取其他措施以在修复节点时尽可能缩短集群中断时间。

支持 PodDisruptionBudget 长达 30 分钟

如果某节点需要修复,它不会立即清空并重新创建。相反,节点自动修复功能会在长达 30 分钟内支持 PodDisruptionBudget (PDB) 配置,之后该节点上的所有 Pod 都将删除。(除了其他内容,PDB 配置还定义了在任何给定时间都必须可用的特定 Pod 的最小副本数)。

通过在长达 30 分钟内支持 PodDisruptionBudget,节点自动修复功能提供了一个时机,让 Pod 可以在集群中其他运行状况良好的节点间重新调度并重新分发。这有助于在修复过程中让应用保持所需的可用性水平。

30 分钟时间限制后,即使节点自动修复违反了 PodDisruptionBudget,也会继续修复过程。若没有时间限制,如果 PodDisruptionBudget 配置阻止修复所需的逐出操作,修复过程可能会无限期地停滞。

支持 Pod 终止宽限期

节点自动修复功能还支持大约 30 分钟的 Pod 终止宽限期。Pod 终止宽限期为 Pod 提供了一个时段,用于终止期间的安全关闭。在宽限期内,节点上的 kubelet 负责执行清理任务并释放与该节点上的 Pod 关联的资源。节点自动修复功能最多留出 30 分钟以供 kubelet 完成此清理。在分配的 30 分钟过后,无论 Pod 是否正常终止,系统都会强制终止节点。

其他节点修复策略

节点自动修复还实施了以下策略:

  • 如果多个节点需要修复,则一次修复一个节点,以限制集群中断并保护工作负载。
  • 如果您在修复过程中停用节点自动修复,则正在进行的修复仍会继续,直到修复操作成功或失败为止。

如何启用和停用自动节点修复

您可以在创建或更新节点池时启用或停用节点自动修复。您可以在节点池(而非各个节点)上启用或停用此功能。

为新节点池启用自动修复

gcloud container azure node-pools create NODE_POOL_NAME \
   --cluster CLUSTER_NAME \
   --location GOOGLE_CLOUD_LOCATION \
   --node-version 1.29.4-gke.200 \
   --vm-size VM_SIZE \
   --max-pods-per-node 110 \
   --min-nodes MIN_NODES \
   --max-nodes MAX_NODES \
   --azure-availability-zone AZURE_ZONE \
   --ssh-public-key SSH_PUBLIC_KEY" \
   --subnet-id SUBNET_ID \
   --enable-autorepair

请替换以下内容:

  • NODE_POOL_NAME:节点池的唯一名称,例如 node-pool-1
  • CLUSTER_NAME:GKE on Azure 集群的名称
  • GOOGLE_CLOUD_LOCATION:管理集群的 Google Cloud 位置
  • NODE_VERSION:要在节点池中的每个节点上安装的 Kubernetes 版本(例如,“1.29.4-gke.200”)
  • VM_SIZE受支持的 Azure 虚拟机大小
  • MIN_NODES:节点池中的节点数下限;如需了解详情,请参阅集群自动扩缩器
  • MAX_NODES:节点池中的节点数上限。
  • AZURE_ZONE:GKE on Azure 在其中启动节点池的 Azure 可用区,例如 3
  • SSH_PUBLIC_KEY:您的 SSH 公钥文本。
  • SUBNET_ID:节点池子网的 ID。

为现有节点池启用自动修复功能

如需为现有节点池启用节点自动修复,请运行以下命令:

gcloud container azure 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 azure 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 Azure 会执行安全节点自动修复停用。为现有节点池停用节点自动修复时,GKE on Azure 会启动更新节点池操作。该操作会等待所有现有节点修复完成,然后才会执行。

检查是否启用了节点自动修复

运行以下命令以检查是否启用了节点自动修复:

gcloud container azure 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 azure operations list \
   --location GOOGLE_CLOUD_LOCATION \
   --filter="metadata.verb=repair AND metadata.target=projects/PROJECT_ID/locations/GOOGLE_CLOUD_LOCATION/azureClusters/CLUSTER_NAME/azureNodePools/NODEPOOL_NAME

请替换以下内容:

  • GOOGLE_CLOUD_LOCATION:管理集群的受支持的 Google Cloud 区域,例如 us-west1
  • PROJECT_ID:您的 Google Cloud 项目
  • CLUSTER_NAME:您的集群的名称
  • NODE_POOL_NAME:节点池的唯一名称,例如 node-pool-1

节点池健康状况摘要

启用节点自动修复后,您可以通过运行以下命令来生成节点池健康状况摘要:

gcloud container azure 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."
    }
  ],
}

节点池健康状况摘要可帮助您了解节点池的当前状态。在此示例中,摘要包含错误消息,指出节点池中的两个节点之一运行状况不佳。它还会报告当前没有节点正在进行修复过程。