节点状态

Kubernetes 中节点的状态是管理 Kubernetes 集群的关键方面。在本文中,我们将介绍监控和维护节点状态的基础知识,以确保集群健康稳定。

节点状态字段

节点状态包含以下信息

你可以使用 kubectl 查看节点状态及其他详细信息

kubectl describe node <insert-node-name-here>

输出中的每个部分都在下面描述。

地址

这些字段的使用取决于你的云厂商或裸金属配置。

  • HostName: 节点内核报告的主机名。可以通过 kubelet 的 --hostname-override 参数来覆盖。
  • ExternalIP: 通常是节点的外部可路由 IP 地址(可从集群外部访问)。
  • InternalIP: 通常是节点的仅限集群内部可路由 IP 地址。

状况

conditions 字段描述所有处于 Running 状态的节点的状况。状况示例如下:

节点状况,以及每种状况适用时的描述。
节点状况描述
Ready如果节点健康并准备好接受 Pod,则为 True;如果节点不健康且不接受 Pod,则为 False;如果在上一个 node-monitor-grace-period(默认值为 50 秒)内节点控制器未收到来自节点的消息,则为 Unknown
DiskPressure如果磁盘空间存在压力(即磁盘容量低),则为 True;否则为 False
MemoryPressure如果节点内存存在压力(即节点内存低),则为 True;否则为 False
PIDPressure如果进程存在压力(即节点上的进程太多),则为 True;否则为 False
NetworkUnavailable如果节点的网络配置不正确,则为 True;否则为 False

在 Kubernetes API 中,节点的状况表示为 Node 资源的 .status 的一部分。例如,以下 JSON 结构描述了一个健康的节点:

"conditions": [
  {
    "type": "Ready",
    "status": "True",
    "reason": "KubeletReady",
    "message": "kubelet is posting ready status",
    "lastHeartbeatTime": "2019-06-05T18:38:35Z",
    "lastTransitionTime": "2019-06-05T11:41:27Z"
  }
]

当节点出现问题时,Kubernetes 控制平面会自动创建与影响节点的状况相匹配的污点(taints)。例如,当 Ready 状况的 status 保持 UnknownFalse 超过 kube-controller-manager 的 NodeMonitorGracePeriod(默认值为 50 秒)时,就会发生这种情况。这将导致在节点上添加 node.kubernetes.io/unreachable 污点(针对 Unknown 状态)或 node.kubernetes.io/not-ready 污点(针对 False 状态)。

这些污点会影响待处理的 Pod,因为调度器在将 Pod 分配给节点时会考虑节点的污点。由于应用了 NoExecute 污点,调度到该节点的现有 Pod 可能会被驱逐。Pod 也可能具有容忍度(tolerations),即使节点具有特定污点,这些容忍度也允许 Pod 调度到该节点并在其上继续运行。

有关更多详细信息,请参见基于污点的驱逐按状况给节点添加污点

容量和可分配量

描述节点上可用的资源:CPU、内存以及可调度到节点上的最大 Pod 数量。

capacity 块中的字段表示节点拥有的资源总量。allocatable 块表示节点上可供正常 Pod 使用的资源量。

你可以在学习如何预留计算资源时了解更多关于 capacity 和 allocatable 资源的信息。

信息

描述节点的常规信息,例如内核版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、容器运行时详情以及节点使用的操作系统。kubelet 从节点收集这些信息并将其发布到 Kubernetes API 中。

心跳

Kubernetes 节点发送的心跳有助于你的集群确定每个节点的可用性,并在检测到故障时采取行动。

节点有两种形式的心跳:

  • 更新节点的 .status
  • 位于 kube-node-lease 命名空间中的 Lease(租约)对象。每个节点都有一个关联的 Lease 对象。

与更新节点的 .status 相比,Lease 是一种轻量级资源。对大型集群而言,使用 Lease 作为心跳可减少这些更新的性能影响。

kubelet 负责创建和更新节点的 .status,以及更新其关联的 Lease。

  • kubelet 会在状态发生变化时或在配置的时间间隔内没有更新时更新节点的 .status。节点 .status 的默认更新间隔是 5 分钟,这比不可达节点的默认超时时间 40 秒要长得多。
  • kubelet 每 10 秒(默认更新间隔)创建并更新其 Lease 对象。Lease 更新与节点 .status 的更新是独立进行的。如果 Lease 更新失败,kubelet 会重试,使用从 200 毫秒开始、上限为 7 秒的指数退避策略。
最后修改于 2024 年 11 月 26 日太平洋时间晚上 9:30:修复 node-monitor-grace-period (6685c008b5)