在 GKE on VMware 中,定期健康检查和自动节点修复默认处于启用状态。
节点自动修复功能会持续检测并修复集群中运行状况不佳的节点。
定期健康检查每 15 分钟运行一次。这些检查与 gkectl diagnose cluster
执行的检查相同。结果在管理员集群中显示为 Cluster 对象的日志和事件。
请确保您的管理员集群和用户集群各有一个额外的 IP 地址,可用于自动节点修复。
健康状况不佳的节点条件
以下条件表明节点的运行状况不佳:
节点条件
NotReady
处于true
大约 10 分钟。成功创建后 10 分钟左右,机器处于
Unavailable
状态。虚拟机创建后 30 分钟左右,机器处于
Available
状态。没有与机器对应的节点对象(nodeRef 为
nil
)处于Available
状态大约 10 分钟。节点条件
DiskPressure
处于true
大约 30 分钟。
节点修复策略
如果节点满足上述列表中的至少一个条件,则 GKE on VMware 会对节点启动修复。
修复操作会排空运行状况不佳的节点并创建一个新的虚拟机。如果节点排空失败一个小时,则修复操作会强制排空并安全分离所连接 Kubernetes 托管的磁盘。
如果同一 MachineDeployment 中有多个运行状况不佳的节点,则一次只能对其中一个节点执行修复操作。
节点池每小时的修复次数限制为以下最大值:
- 3
- 节点池中节点数的 10%
为一个新集群启用节点修复和健康检查
在admin或用户集群配置文件中,将 autoRepair.enabled
设置为 true
:
autoRepair: enabled: true
为一个现有用户集群启用节点修复和健康检查
在用户集群配置文件中,将 autoRepair.enabled
设置为 true
:
更新集群:
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
替换以下内容:
ADMIN_CLUSTER_KUBECONFIG:管理员集群 kubeconfig 文件的路径
USER_CLUSTER_CONFIG:用户集群配置文件的路径
为一个现有管理员集群启用节点修复和健康检查
在管理员集群配置文件中,将 autoRepair.enabled
设置为 true
:
更新集群:
gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG
将 ADMIN_CLUSTER_CONFIG 替换为管理员集群配置文件的路径。
通过健康检查工具查看日志
列出管理员集群中的所有健康检查程序 Pod:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get pods --all-namespaces | grep cluster-health-controller
输出类似于以下内容:
kube-system cluster-health-controller-6c7df455cf-zlfh7 2/2 Running my-user-cluster cluster-health-controller-5d5545bb75-rtz7c 2/2 Running
若要查看来自特定健康检查程序的日志,请获取其中一个 Pod 内的 cluster-health-controller
容器的日志。例如,要获取上述输出中显示的 my-user-cluster
的日志:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace my-user-cluster logs \ cluster-health-controller-5d5545bb75-rtz7c cluster-health-controller
通过健康检查工具查看事件
列出您的管理员集群中的所有 Cluster 对象:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get clusters --all-namespaces
输出类似于以下内容:
default gke-admin-ldxh7 2d15h my-user-cluster my-user-cluster 2d12h
如需查看特定集群的事件,请运行带有 --show-events
标志的 kubectl describe cluster
。例如,要查看针对上述输出中显示的 my-user-cluster
的事件:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG --namespace my-user-cluster \ describe --show-events cluster my-user-cluster
输出示例:
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning ValidationFailure 17s cluster-health-periodics-controller validator for Pod returned with status: FAILURE, reason: 1 pod error(s).
为一个用户集群停用节点修复和健康检查
在用户集群配置文件中,将 autoRepair.enabled
设置为 false
:
更新集群:
gkectl update cluster --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config USER_CLUSTER_CONFIG
为一个管理员集群停用节点修复和健康检查
在管理员集群配置文件中,将 autoRepair.enabled
设置为 false
:
更新集群:
gkectl update admin --kubeconfig ADMIN_CLUSTER_KUBECONFIG --config ADMIN_CLUSTER_CONFIG
调试节点自动修复功能
您可以通过在管理员集群中描述机器和节点对象来调查节点自动修复功能的问题。示例如下:
列出机器对象:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get machines
输出示例:
default gke-admin-master-wcbrj default gke-admin-node-7458969ff8-5cg8d default gke-admin-node-7458969ff8-svqj7 default xxxxxx-user-cluster-41-25j8d-567f9c848f-fwjqt
描述其中一个机器对象:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG describe machine gke-admin-master-wcbrj
在输出中,查找来自 cluster-health-controller
的事件。
同样,您可以列出和描述节点对象。例如:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG get nodes ... kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG describe node gke-admin-master-wcbrj
手动修复节点
管理员控制平面节点
管理员控制平面节点有专用的修复命令,因为正常的手动修复不适用于它。
使用 gkectl repair admin-master
修复管理员控制平面节点。
Controlplane V2 用户集群控制平面节点
Controlplane V2 用户集群控制平面节点的管理方式与其他节点不同。
与 kubeception 用户集群类似,Controlplane V2 用户集群的控制平面 Machine 对象位于管理员集群中。节点自动修复功能在管理员集群节点自动修复功能的涵盖范围内。
如果管理员集群节点自动修复逻辑未涵盖节点问题,或者您未启用管理员集群节点自动修复功能,则可以手动修复节点。此操作会删除并重新创建节点。
获取与节点对应的机器对象的名称:
kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get machines
替换以下内容:
ADMIN_CLUSTER_KUBECONFIG
:管理员 kubeconfig 文件的路径。USER_CLUSTER_NAME
:目标用户集群名称。
向机器对象添加
repair
注解:kubectl annotate --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true
将
MACHINE_NAME
替换为机器对象的名称。删除 Machine 对象:
kubectl delete --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME machine MACHINE_NAME
为高可用性控制平面逐个重新创建节点,否则可能会意外中断控制平面。
其他节点
如果自动修复逻辑未涵盖节点问题,或者您未启用节点自动修复功能,则可以手动修复节点。此操作会删除并重新创建节点。
获取与节点对应的机器对象的名称:
kubectl --kubeconfig CLUSTER_KUBECONFIG get machines
将 CLUSTER_KUBECONFIG 替换为管理员或用户集群 kubeconfig 文件的路径。
向机器对象添加 repair
注解:
kubectl annotate --kubeconfig CLUSTER_KUBECONFIG machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true
将 MACHINE_NAME 替换为机器对象的名称。
删除 Machine 对象:
kubectl delete --kubeconfig CLUSTER_KUBECONFIG machine MACHINE_NAME