自动节点修复和健康检查

在 VMware (GKE On-Prem) 上的 Anthos 集群中,健康检查和自动节点修复均为默认启用。

节点自动修复功能会持续检测并修复集群中运行状况不佳的节点。

定期健康检查每 15 分钟运行一次。这些检查与 gkectl diagnose cluster 执行的检查相同。结果在管理员集群中显示为 Cluster 对象的日志和事件。

运行状况不佳条件

以下条件表明节点的运行状况不佳:

  • 节点条件 NotReady 处于 true 大约 10 分钟。

  • 成功创建后 10 分钟左右,机器处于 Unavailable 状态。

  • 虚拟机创建后 30 分钟左右,机器处于 Available 状态。

  • 没有与机器对应的节点对象(nodeRef 为 nil)处于 Available 状态大约 10 分钟。

  • 节点条件 DiskPressure 处于 true 大约 30 分钟。

修复策略

如果节点满足上述列表中的至少一个条件,Anthos clusters on VMware 将对节点启动修复。

修复操作会排空运行状况不佳的节点并创建一个新的虚拟机。如果节点排空失败一个小时,则修复操作会强制排空并安全分离所连接 Kubernetes 托管的磁盘。

如果同一 MachineDeployment 中有多个运行状况不佳的节点,则一次只能对其中一个节点执行修复操作。

为一个新集群启用节点修复和健康检查

管理员用户集群配置文件中,将 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 标志的 gkectl 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

手动修复节点

如果自动修复逻辑未涵盖节点问题,或者您未启用节点自动修复功能,则可以手动修复节点。此操作会删除并重新创建节点。

获取与节点对应的机器对象的名称:

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