tencent cloud

文档反馈

健康状态检测

最后更新时间:2023-06-01 11:22:54
    边缘场景下的弱网络会触发 Kubernetes 驱逐机制,引起不符合预期的 Pod 驱逐动作。边缘计算情景下,边缘节点与云端的网络环境十分复杂,网络质量无法保证,容易出现 API Server 和节点连接中断等问题。如果不加改造直接使用原生 Kubernetes,节点状态会经常出现异常,引起 Kubernetes 驱逐机制生效,导致 Pod 的驱逐和 EndPoint 的缺失,最终造成服务的中断和波动。
    为解决这个问题,边缘容器服务 首创分布式节点状态判定机制。该机制可以更好地识别驱逐时机,保障系统在弱网络下正常运转,避免服务中断和波动。

    需求痛点

    原生 Kubernetes 处理方式

    云边弱网络是影响了运行在边缘节点上的 kubelet 与云端 APIServer 之间通信,云端 APIServer 无法收到 kubelet 的心跳或者进行续租,无法准确获取该节点和节点上 Pod 的运行情况,如果持续时间超过设置的阈值, APIServer 会认为该节点不可用,并做出如下作:
    失联的节点状态被置为 NotReady 或者 Unknown 状态,并被添加 NoSchedule 和 NoExecute 的 taints。
    失联的节点上的 Pod 被驱逐,并在其他节点上进行重建。
    失联的节点上的 Pod 从 Service 的 Endpoint 列表中移除。

    解决方案

    设计原则

    在边缘计算场景中,仅依赖边缘端和 APIServer 的连接情况来判断节点是否正常并不合理,为了让系统更健壮,需要引入额外的判断机制。
    相较于云端和边缘端,边缘端节点之间的网络更稳定,可利用更稳定的基础设施提高准确性。边缘容器服务首创了边缘健康分布式节点状态判定机制,除了考虑节点与 APIServer 的连接情况,还引入了边缘节点作为评估因子,以便对节点进行更全面的状态判断。经过测试及大量的实践证明,该机制在云边弱网络情况下提高了系统在节点状态判断上的准确性,为服务稳定运行保驾护航。该机制的主要原理如下:
    每个节点定期探测其他节点健康状态
    集群内所有节点定期投票决定各节点的状态
    云端和边缘端节点共同决定节点状态
    首先,节点内部之间进行探测和投票,共同决定具体某个节点是否存在状态异常,保证大多数节点的一致判断才能决定节点的具体状态。其次,即使节点之间的网络状态通常情况下优于云边网络,但也应该考虑边缘节点复杂的网络情况,其网络并非100%可靠。因此,也不能完全信赖节点之间的网络,节点的状态不能只由节点自行决定,云边共同决定才更为可靠。基于这个考虑,做出如下设计:
    节点内网判定
    云端判定正常
    云端判定异常
    节点内网判定正常
    最终判定正常
    K8s 显示 NotReady,但是行为和标准 K8s 流程不同:不再调度新的 Pod 到该节点,但是并不驱逐 pod 以及处理 svc。
    节点内网判定异常
    最终判定正常
    K8s 显示 NotReady,行为和标准 K8s 流程一致:驱逐存量 Pod;从 EndPoint 列表摘除;不再调度新的 Pod 到该节点。

    前提条件

    该功能需要打开节点的51005端口,以便节点之间进行分布式智能健康探测。

    操作步骤

    注意
    边缘检查和多地域检查功能需要一定的部署和配置时间,并非即时生效。

    开启边缘检查功能

    边缘检查功能默认关闭,请参考以下步骤手动开启:
    2. 集群列表页面,选择目标边缘集群 ID,进入集群详情页面。
    3. 选择左侧菜单栏中的组件管理,进入组件管理页面。
    4. 单击新建,进入新建组件页面。
    5. 勾选 edge-health,如下图所示:
    
    
    
    在参数配置中您可以根据业务需求选择开启全局节点离线免驱逐使用多地域。如下图所示:
    
    
    
    6. 单击完成即可部署组件到目标边缘集群。

    开启全局节点离线免驱逐

    开启此功能后,会通过 webhook 机制拦截全部的节点驱逐标志即 NoExecute 的 taint,从而防止节点频繁断网重连导致的 Pod 驱逐和重新调度,此功能和多地域检查互斥,开启免驱逐则不会在边缘实际探测节点健康状态。

    开启多地域检查功能

    这里的多地域在 edge-health 中实际上是 NodeUnit 概念,通过 NodeUnit 才区分不同的节点地域属性,详情请参见 NodeUnit 文档开启 Edge Health 能力会在所有边缘节点上部署 edge-health 健康监测 Pod。如果这个时候,不使能开启多地域,会默认互相检测所有节点的状态,此时并没有多地域概念,可以将所有节点看作同一地域下的节点进行互相检测。
    如果想要在不同的地域内部独立进行节点间的健康状态互检,则需要使能开启多地域,此时会修改一个 edge-health-config的 ConfigMap,通知 K8s 要处理多地域的健康检测能力。开启后,节点会根据节点上的 <nodeunit-name>: nodeunits.superedge.io 标签来区分地域。例如,beijing: nodeunits.superedge.io 表明将节点划分到 NodeUnit beijng。标签取值相同的节点视为同一个 NodeUnit。开启多地域功能时,同一个地域内的节点会相互探测和投票。
    注意
    如果使能开启多地域能力后,节点不属于任何一个 NodeUnit,该节点不会进行健康检查。
    如果没有使能开启多地域能力,则一个集群内的所有节点会进行相互检查,即使节点属于 NodeUnit。

    在 NodeUnit 上开启健康状态检测

    下面给出一个示例,说明健康状态检测的实际效果:
    2. 在集群管理页,单击需要远程登录节点的集群 ID,进入该集群详情页。
    3. 选择"节点管理">"边缘节点池", 可以看到开关"使能健康状态检查"
    
    
    
    4. 您可以选择所需的 NodeUnit 并启用“边缘健康检查”开关。这时,您可以在每个节点的边缘健康状态中查看,NodeUnit 下的所有节点将相互进行探测。
    
    
    
    5. 这个时候就完整使能了多地域健康状态能力,使用gz-3节点模拟测试如下:
    可以使用iptables规则模拟和 apiserver 断连:
    iptables -I INPUT -s xxx.xxx.xxx.xxx -j DROP # 这里为云端 apiserver 的 IP 地址
    过一段时间后,观察gz-3节点为 NotReady 状态,但是Taint并没有添加node.kubernetes.io/unreachable:NoExecute,所以此节点上的 Pod 并不会被 evict,此节点已经不会被调度新的 Pod 了。.
    
    
    
    
    
    
    关闭gz-3节点,模拟云端和内网检测均失败的场景,观察节点状态,这个时候为 Kubernetes 标准的节点失效状态,会迁移节点上的 Pod。
    
    
    联系我们

    联系我们,为您的业务提供专属服务。

    技术支持

    如果你想寻求进一步的帮助,通过工单与我们进行联络。我们提供7x24的工单服务。

    7x24 电话支持