节点自动修复功能会持续监控节点池中每个节点的健康状况。如果某个节点运行状况不佳,则该节点自动修复功能会自动对其进行修复。此功能可降低集群发生中断和性能下降的可能性,并最大限度减少手动维护集群的需求。
您可以在创建或更新节点池时启用节点自动修复。请注意,您可以在节点池(而非单个节点)上启用或停用此功能。
健康状况不佳的节点条件
节点自动修复会检查每个节点的健康状况,以确定其是否需要修复。如果节点报告 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." } ], }
节点池健康状况摘要可帮助您了解节点池的当前状态。在此示例中,摘要包含错误消息,指出节点池中的两个节点之一运行状况不佳。它还会报告当前没有节点正在进行修复过程。