节点状态

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

节点状态字段

节点的状态包含以下信息

您可以使用 kubectl 查看节点的状态和其他详细信息

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

下面将介绍输出的每个部分。

地址

这些字段的使用方式根据您的云提供商或裸机配置而有所不同。

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

条件

conditions 字段描述了所有 Running 节点状态。条件的示例包括

节点条件及其适用时的描述。
节点条件描述
就绪如果节点健康且可以接收 Pod,则为 True;如果节点不健康且不接收 Pod,则为 False;如果节点控制器在过去 node-monitor-grace-period(默认值为 40 秒)内没有收到来自节点的消息,则为 Unknown
磁盘压力如果磁盘大小存在压力,即磁盘容量不足,则为 True;否则为 False
内存压力如果节点内存存在压力,即节点内存不足,则为 True;否则为 False
PID 压力如果进程存在压力,即节点上的进程过多,则为 True;否则为 False
网络不可用如果节点的网络配置不正确,则为 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 控制平面会自动创建污点,这些污点与影响节点的条件相匹配。例如,当 Ready 条件的 status 在 kube-controller-manager 的 NodeMonitorGracePeriod(默认值为 40 秒)之后仍然为 UnknownFalse 时。这会导致 node.kubernetes.io/unreachable 污点(对于 Unknown 状态)或 node.kubernetes.io/not-ready 污点(对于 False 状态)被添加到节点中。

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

有关更多详细信息,请参阅基于污点的驱逐通过条件标记节点

容量和可分配

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

容量块中的字段指示节点拥有的资源总量。可分配块指示节点上可供普通 Pod 使用的资源量。

您可以在学习如何保留节点上的计算资源时,详细了解容量和可分配资源。

信息

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

心跳

由 Kubernetes 节点发送的心跳可以帮助您的集群确定每个节点的可用性,并在检测到故障时采取措施。

对于节点,心跳有两种形式

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

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

kubelet 负责创建和更新节点的 .status,以及更新其相关的租约。

  • kubelet 在节点状态发生变化时或在配置的间隔时间内没有更新时,会更新节点的 .status。更新节点的 .status 的默认间隔时间为 5 分钟,这远大于不可达节点的 40 秒默认超时时间。
  • kubelet 每 10 秒(默认更新间隔时间)创建并更新其租约对象。租约更新独立于对节点 .status 的更新进行。如果租约更新失败,kubelet 会重试,使用从 200 毫秒开始并以 7 秒为上限的指数退避。
最后修改时间:2023 年 8 月 20 日,下午 9:34,太平洋标准时间:清理节点状态中的第一个段落 (4cf9403e83)