节点状态
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 。 |
注意
如果您使用命令行工具打印已被封锁(cordoned)的节点详细信息,该条件将包含SchedulingDisabled
。SchedulingDisabled
并非 Kubernetes API 中的一个条件;而是,被封锁的节点在其 spec 中被标记为 Unschedulable。在 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
持续 Unknown
或 False
的时间超过 kube-controller-manager 的 NodeMonitorGracePeriod
(默认为 50 秒)时,就会发生这种情况。这会导致向 Node 添加 node.kubernetes.io/unreachable
污点(对于 Unknown
状态)或 node.kubernetes.io/not-ready
污点(对于 False
状态)。
这些污点会影响待处理的 Pod,因为调度程序在将 Pod 分配到 Node 时会考虑 Node 的污点。应用 NoExecute
污点可能会导致已调度到该节点的现有 Pod 被驱逐。Pod 也可能具有 容忍(tolerations),使其能够在具有特定污点的 Node 上进行调度并继续运行。
有关更多详细信息,请参阅 基于污点的驱逐 和 按条件污点化节点。
容量和可分配资源
描述了节点上的可用资源:CPU、内存以及可以调度到该节点上的最大 Pod 数量。
capacity 块中的字段表示 Node 的总资源量。allocatable 块表示 Node 上可供普通 Pod 消耗的资源量。
您可以在学习如何 在 Node 上预留计算资源 时,阅读有关容量和可分配资源的内容。
信息
描述了关于节点的常规信息,例如内核版本、Kubernetes 版本(kubelet 和 kube-proxy 版本)、容器运行时详细信息以及节点使用的操作系统。kubelet 从节点收集此信息并将其发布到 Kubernetes API。
心跳(Heartbeats)
Kubernetes 节点发送的心跳有助于您的集群确定每个节点的可访问性,并在检测到故障时采取相应措施。
节点有两种形式的心跳:
与 Node 的 .status
更新相比,Lease 是一种轻量级资源。使用 Lease 进行心跳可以减少这些更新对大型集群的性能影响。
kubelet 负责创建和更新 Node 的 .status
,以及更新其相关的 Lease。
- kubelet 会在状态发生更改时,或者如果一段时间内没有更新,则会以配置的间隔更新节点的
.status
。节点.status
更新的默认间隔是 5 分钟,远长于 40 秒的默认不可访问节点超时时间。 - kubelet 每 10 秒(默认更新间隔)创建并更新其 Lease 对象。Lease 更新独立于 Node 的
.status
更新。如果 Lease 更新失败,kubelet 会重试,使用指数退避策略,起始延迟为 200 毫秒,最高上限为 7 秒。