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