本页面介绍如何为 GKE On-Prem 集群启用节点自动修复功能。
节点自动修复功能会持续检测并修复集群中运行状况不佳的节点。此功能默认处于停用状态。您可以在管理员或用户集群创建期间启用该功能。您还可以为现有用户集群启用此功能,但不为现有管理员集群启用该功能。
运行状况不佳条件
以下条件表明节点的运行状况不佳:
节点条件
NotReady
处于true
大约 10 分钟。成功创建后 10 分钟左右,机器处于
Unavailable
状态。虚拟机创建后 30 分钟左右,机器处于
Available
状态。没有与机器对应的节点对象(nodeRef 为 nil)处于
Available
状态大约 10 分钟。
修复策略
如果节点至少满足上述列表中的一个条件,则 GKE On-Prem 会在节点上启动修复。
修复操作会排空运行状况不佳的节点并创建一个新的虚拟机。如果节点排空失败一个小时,则修复操作会强制排空并安全分离所连接 Kubernetes 托管的磁盘。
如果同一 MachineDeployment 中有多个运行状况不佳的节点,则一次只能对其中一个节点执行修复操作。
v1 集群配置文件
如需启用节点自动修复功能,您必须使用 v1 配置文件(v1 管理员集群配置文件或 v1 用户集群配置文件)。v0 配置文件不支持节点自动修复功能。
为新集群启用节点自动修复功能
在管理员或用户集群配置文件中,将 autoRepair.enabled
设置为 true
:
autoRepair: enabled: true
为现有用户集群启用节点自动修复功能:
在用户集群配置文件中,将 autoRepair.enabled
设置为 true
:
autoRepair: enabled: true
更新集群:
gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_KUBECONFIG
替换以下内容:
USER_CLUSTER_CONFIG:用户集群配置文件的路径
ADMIN_KUBECONFIG:管理员集群 kubeconfig 文件的路径
为用户集群停用节点自动修复功能
在用户集群配置文件中,将 autoRepair.enabled
设置为 false
:
autoRepair: enabled: false
更新集群:
gkectl update cluster --config USER_CLUSTER_CONFIG --kubeconfig ADMIN_KUBECONFIG
为管理员集群停用节点自动修复功能
如需为管理员集群停用节点自动修复功能,请删除 cluster-health-controller
部署:
kubectl --kubeconfig ADMIN_KUBECONFIG] delete deployment cluster-health-controller --namespace kube-system
调试节点自动修复功能
您可以通过在管理员集群中描述机器和节点对象来调查节点自动修复功能的问题。示例如下:
列出机器对象:
kubectl --kubeconfig kubeconfig get machines
输出:
default gke-admin-master-wc default gke-admin-node-7458969ff8-5cg8d default gke-admin-node-7458969ff8-svqj7 default xxxxxx-user-cluster-41-25j8d-567f9c848f-fwjqt
描述其中一个机器对象:
kubectl --kubeconfig kubeconfig describe machine gke-admin-master-wcbrj
在输出中,查找来自 cluster-health-controller
的事件。
同样,您可以列出和描述节点对象。例如:
kubectl --kubeconfig kubeconfig get nodes ... kubectl --kubeconfig kubeconfig describe node gke-admin-master-wcbrj
手动修复节点
如果自动修复逻辑未涵盖节点问题,或者您未启用节点自动修复功能,则可以手动修复节点。此操作会删除并重新创建节点。
获取与节点对应的机器对象的名称:
kubectl --kubeconfig KUBECONFIG get machines
将 KUBECONFIG 替换为管理员或用户集群 kubeconfig 文件的路径。
向机器对象添加 repair
注释:
kubectl annotate --kubeconfig KUBECONFIG machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true
将 MACHINE_NAME 替换为机器对象的名称。
删除 Machine 对象:
kubectl delete --kubeconfig KUBECONFIG machine MACHINE_NAME