自动节点修复

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

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

健康状况不佳的节点条件

节点自动修复会检查每个节点的健康状况,以确定其是否需要修复。如果节点报告 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 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:要将节点池连接到的集群的名称
  • INSTANCE_TYPE:此节点池所需的 AWS 机器实例类型,例如 m5.large
  • ROOT_VOLUME_SIZE:每个节点的根卷的所需大小(以 GB 为单位)
  • NODEPOOL_PROFILE:适用于节点池虚拟机的 IAM 实例配置文件
  • NODE_VERSION:要在节点池中的每个节点上安装的 Kubernetes 版本(例如,“1.29.3-gke.600”)
  • MIN_NODES:节点池可以包含的最小节点数
  • MAX_NODES:节点池可以包含的最大节点数
  • MAX_PODS_PER_NODE:可以在池中的任何单个节点上创建的 pod 数上限
  • GOOGLE_CLOUD_LOCATION:将管理此节点池的 Google Cloud 位置的名称
  • NODEPOOL_SUBNET:节点池将在其中运行的子网的 ID。
    • 集群的 Pod/Service IP 范围和节点池子网网络之间不得存在任何重叠。如需详细了解如何为集群选择 Pod 和 Service IP 范围,请参阅为集群选择 CIDR 范围
    • 如果此子网位于 VPC 主要 CIDR 块之外,则需要执行一些额外的步骤。如需了解详情,请参阅安全群组
  • SSH_KEY_PAIR_NAME:为 SSH 访问创建的 AWS SSH 密钥对的名称(可选)
  • CONFIG_KMS_KEY_ARN:对用户数据进行加密的 AWS KMS 密钥的 Amazon 资源名称 (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 会执行正常节点自动修复停用。为现有节点池停用节点自动修复时,GKE on AWS 会启动更新节点池操作。该操作会等待所有现有节点修复完成,然后才会继续。

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

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

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

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