自动节点修复和健康检查

在 Google Distributed Cloud 中,系统会默认启用定期健康检查和自动节点修复。

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

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

请确保您的管理员集群和用户集群各有一个额外的 IP 地址,可用于自动节点修复。

健康状况不佳的节点条件

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

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

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

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

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

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

节点修复策略

如果某个节点满足上述列表中的至少一个条件,Google Distributed Cloud 就会在该节点上启动修复。

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

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

节点池每小时的修复次数限制为以下最大值:

  • 3
  • 节点池中节点数的 10%

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

admin用户集群配置文件中,将 autoRepair.enabled 设置为 true

autoRepair:
  enabled: true

继续执行创建admin用户集群的步骤。

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

用户集群配置文件中,将 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 对象位于管理员集群中。节点自动修复功能在管理员集群节点自动修复功能的涵盖范围内。

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

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

    kubectl --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME get machines
    

    请替换以下内容:

    • ADMIN_CLUSTER_KUBECONFIG:管理员 kubeconfig 文件的路径。
    • USER_CLUSTER_NAME:目标用户集群名称。
  2. 向机器对象添加 repair 注解:

    kubectl annotate --kubeconfig ADMIN_CLUSTER_KUBECONFIG -n USER_CLUSTER_NAME machine MACHINE_NAME onprem.cluster.gke.io/repair-machine=true
    

    MACHINE_NAME 替换为机器对象的名称。

  3. 删除 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