节点状态
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 。 |
PID 压力 (PIDPressure) | 如果进程存在压力,即节点上的进程过多,则为 True ;否则为 False 。 |
网络不可用 (NetworkUnavailable) | 如果节点的网络配置不正确,则为 True ;否则为 False 。 |
注意
如果您使用命令行工具打印被隔离的节点的详细信息,则状况会包括SchedulingDisabled
。SchedulingDisabled
不是 Kubernetes API 中的一个状况;相反,被隔离的节点在其规范中被标记为 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 控制平面会自动创建与影响节点的状况相匹配的污点。一个例子是当 Ready 状况的 status
保持 Unknown
或 False
的时间长于 kube-controller-manager 的 NodeMonitorGracePeriod
时,默认值为 50 秒。这将导致为 Unknown
状态添加 node.kubernetes.io/unreachable
污点,或者为 False
状态添加 node.kubernetes.io/not-ready
污点到节点上。
这些污点会影响待处理的 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 秒。