节点状态
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 (默认值为 40 秒)内未收到来自节点的消息,则为 Unknown |
DiskPressure | 如果磁盘大小存在压力(即磁盘容量不足),则为 True ;否则为 False |
MemoryPressure | 如果节点内存存在压力(即节点内存不足),则为 True ;否则为 False |
PIDPressure | 如果进程存在压力(即节点上的进程过多),则为 True ;否则为 False |
NetworkUnavailable | 如果节点的网络配置不正确,则为 True ;否则为 False |
注意
如果您使用命令行工具打印已隔离节点的详细信息,则条件将包含SchedulingDisabled
。SchedulingDisabled
不是 Kubernetes API 中的条件;相反,已隔离的节点在其规范中被标记为不可调度。在 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
持续保持 Unknown
或 False
超过 kube-controller-manager 的 NodeMonitorGracePeriod
(默认为 40 秒)时,就会发生这种情况。这将导致在节点上添加 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
的更新相比,租约是一种轻量级资源。使用租约进行心跳可以减少这些更新对大型集群的性能影响。
kubelet 负责创建和更新节点的 .status
,以及更新其相关的租约。
- kubelet 在状态发生变化时或在配置的间隔内没有更新时,会更新节点的
.status
。节点的.status
更新的默认间隔为 5 分钟,这远大于不可达节点的 40 秒默认超时时间。 - kubelet 每 10 秒(默认更新间隔)创建并更新其租约对象。租约更新独立于对节点的
.status
的更新。如果租约更新失败,kubelet 会重试,使用从 200 毫秒开始并以 7 秒为上限的指数回退。