节点自动修复功能会持续监控节点池中每个节点的健康状况。如果某个节点运行状况不佳,则该节点自动修复功能会自动对其进行修复。此功能可降低集群发生中断和性能下降的可能性,并最大限度减少手动维护集群的需求。
您可以在创建或更新节点池时启用节点自动修复。请注意,您可以在节点池(而非单个节点)上启用或停用此功能。
健康状况不佳的节点条件
节点自动修复会检查每个节点的健康状况,以确定其是否需要修复。如果节点报告 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_LOCATIONCLUSTER_NAME:要将节点池连接到的集群的名称INSTANCE_TYPE:此节点池所需的 AWS 机器实例类型,例如m5.largeROOT_VOLUME_SIZE:每个节点的根卷的所需大小(以 GB 为单位)NODEPOOL_PROFILE:适用于节点池虚拟机的 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 范围
- 如果此子网位于 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-1CLUSTER_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-1CLUSTER_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-1CLUSTER_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-west1PROJECT_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."
}
],
}
节点池健康状况摘要可帮助您了解节点池的当前状态。在此示例中,摘要包含错误消息,指出节点池中的两个节点之一运行状况不佳。它还会报告当前没有节点正在进行修复过程。