节点异常状态与污点
NotReady 节点状态为 NotReady 的原因
0. 常见原因:Kubelet 挂掉
- 判断方法:
- 登录到节点:
ssh root@11.127.211.13
- 检查 Kubelet 进程:
ps -ef | grep 'kubelet'
- 登录到节点:
1. 网络问题
-
网络连接中断:
- 节点与 API 服务器之间的网络连接不稳定或中断,会导致节点无法正常向 API 服务器汇报状态。
- 例如,网络设备故障、网络配置错误等,使得 Kubelet 无法与 API 服务器进行通信。
-
网络插件故障:
- Kubernetes 的网络插件(如 Calico、Flannel 等)出现问题,会影响节点之间的网络通信以及 Pod 的网络功能。
- 例如,网络插件配置错误、网络插件服务崩溃等,都可能导致节点状态变为
NotReady
。
2. Kubelet 服务问题
-
Kubelet 未运行:
- Kubelet 是节点上负责管理 Pod 的核心组件,如果 Kubelet 服务未启动或异常停止,节点将无法正常与 API 服务器交互,从而显示为
NotReady
。
- Kubelet 是节点上负责管理 Pod 的核心组件,如果 Kubelet 服务未启动或异常停止,节点将无法正常与 API 服务器交互,从而显示为
-
Kubelet 配置错误:
- Kubelet 的配置文件(通常是
/etc/kubernetes/kubelet.conf
)存在错误,可能会导致 Kubelet 无法正常工作。 - 例如,配置的 API 服务器地址错误、认证信息错误等。
- Kubelet 的配置文件(通常是
-
Kubelet 资源不足:
- 如果节点上的资源(如 CPU、内存)严重不足,Kubelet 可能无法正常运行,进而影响节点状态。
3. 节点硬件问题
-
磁盘空间不足:
- 节点上的磁盘空间被占满,会导致 Kubelet 无法正常写入日志、存储容器镜像等,从而使节点状态变为
NotReady
。 - 可以通过
df -h
命令查看节点磁盘使用情况。
- 节点上的磁盘空间被占满,会导致 Kubelet 无法正常写入日志、存储容器镜像等,从而使节点状态变为
-
内存不足:
- 节点内存耗尽,会影响 Kubelet 及其他系统进程的正常运行,导致节点状态异常。
- 可以使用
free -m
命令查看节点内存使用情况。
-
硬件故障:
- 节点的硬件设备(如硬盘、网卡、内存等)出现故障,也会导致节点无法正常工作,显示为
NotReady
。
- 节点的硬件设备(如硬盘、网卡、内存等)出现故障,也会导致节点无法正常工作,显示为
4. 节点系统问题
-
操作系统异常:
- 节点的操作系统出现问题,如内核崩溃、系统服务故障等,会影响 Kubelet 的正常运行,使节点状态变为
NotReady
。
- 节点的操作系统出现问题,如内核崩溃、系统服务故障等,会影响 Kubelet 的正常运行,使节点状态变为
-
系统时间不同步:
- 节点的系统时间与 API 服务器的时间差异过大,可能会导致认证和通信问题,从而影响节点状态。
SchedulingDisabled 节点状态为 SchedulingDisabled 的原因
1. 手动设置
- 管理员可以使用
kubectl cordon <node-name>
命令将节点标记为不可调度,这样新的 Pod 将不会被调度到该节点上,节点状态会显示为SchedulingDisabled
。 - 这通常用于在进行节点维护、升级等操作前,避免新的 Pod 被调度到该节点。
# 设置节点不可调度
kubectl cordon <node-name>
# 解除不可调度状态
kubectl uncordon <node-name>
2. 节点健康检查失败
- 当节点的健康检查(如节点的心跳检查、资源可用性检查等)持续失败时,Kubernetes 可能会自动将节点标记为不可调度,以防止新的 Pod 被调度到可能存在问题的节点上。
- 这种情况通常伴随着节点状态变为
NotReady
。
3. 资源耗尽
- 如果节点上的资源(如 CPU、内存、磁盘等)严重不足,Kubernetes 可能会将节点标记为不可调度,避免新的 Pod 被调度到该节点,导致资源进一步紧张。
重新认识污点
在 Kubernetes 中,污点(Taints)是应用于节点上的一种属性,它可以防止 Pod 被调度到具有特定污点的节点上,除非该 Pod 具有与之匹配的容忍度(Tolerations)。
1. node.kubernetes.io/unreachable:NoExecute
-
污点键(Key):
node.kubernetes.io/unreachable
是一个预定义的污点键,通常表示节点处于不可达状态。- 这可能是由于网络问题、节点故障或其他原因导致 Kubernetes 控制平面无法与该节点进行通信。
-
污点效果(Effect):
NoExecute
是一种比较严格的污点效果,它有两个主要作用:- 阻止调度:如果一个 Pod 没有容忍这个污点,它将不会被调度到具有该污点的节点上。
- 驱逐已有 Pod:如果一个节点被标记为
node.kubernetes.io/unreachable:NoExecute
且一个正在运行的 Pod 没有容忍这个污点,那么该 Pod 会被从节点上驱逐。
- 不过,Kubernetes 会有一个默认的宽限期(通常是 5 分钟),在宽限期内如果节点恢复正常,Pod 不会被驱逐。
2. node.kubernetes.io/unreachable:NoSchedule
-
污点键(Key):
- 同样是
node.kubernetes.io/unreachable
,表示节点不可达。
- 同样是
-
污点效果(Effect):
NoSchedule
意味着如果一个 Pod 没有容忍这个污点,它将不会被调度到具有该污点的节点上。- 与
NoExecute
不同的是,NoSchedule
不会影响已经在该节点上运行的 Pod,它只对新的调度决策起作用。
3. node.kubernetes.io/unschedulable:NoSchedule
-
污点键(Key):
node.kubernetes.io/unschedulable
是一个表示节点不可调度的预定义污点键。- 通常,当管理员使用
kubectl cordon
命令将节点标记为不可调度时,会自动给节点添加这个污点。
-
污点效果(Effect):
NoSchedule
表明如果一个 Pod 没有容忍这个污点,它将不会被调度到具有该污点的节点上。- 已经在该节点上运行的 Pod 不会受到影响。
节点状态与污点的关系
节点状态 NotReady
与三种污点的关系
1. 节点因不可达导致 NotReady
- 当节点由于网络故障、Kubelet 服务异常等原因变得不可达时,Kubernetes 控制平面会给节点添加
node.kubernetes.io/unreachable:NoExecute
和node.kubernetes.io/unreachable:NoSchedule
污点。 - 这种情况下,节点状态通常会变为
NotReady
,因为不可达意味着控制平面无法准确获取节点的状态信息,也不能保证节点能够正常运行 Pod。NoExecute
污点不仅会阻止新 Pod 调度到该节点,还会驱逐节点上没有容忍此污点的现有 Pod。NoSchedule
污点则主要阻止新 Pod 调度到该节点,但不影响已在节点上运行的 Pod。
2. 其他原因导致 NotReady
- 节点
NotReady
也可能由其他因素引起,如磁盘空间不足、内存耗尽、硬件故障等。 - 在这些情况下,节点可能不会被添加
node.kubernetes.io/unreachable
相关的污点,但可能会被添加node.kubernetes.io/unschedulable:NoSchedule
污点,以防止新的 Pod 被调度到可能存在问题的节点上。
节点状态 SchedulingDisabled
与三种污点的关系
1. 手动设置导致 SchedulingDisabled
- 当管理员使用
kubectl cordon <node-name>
命令手动将节点标记为不可调度时,Kubernetes 会给节点添加node.kubernetes.io/unschedulable:NoSchedule
污点,节点状态会变为SchedulingDisabled
。 - 这是一种主动的操作,目的是在进行节点维护、升级等操作前,避免新的 Pod 被调度到该节点。
2. 节点健康问题导致 SchedulingDisabled
- 如果节点因为出现严重的健康问题(如不可达、资源耗尽等),Kubernetes 可能会自动将节点标记为不可调度,添加
node.kubernetes.io/unschedulable:NoSchedule
污点或node.kubernetes.io/unreachable
相关污点,从而使节点状态变为SchedulingDisabled
。 - 这样可以防止新的 Pod 被调度到可能无法正常工作的节点上,保障集群的稳定性。
通过以上内容,您可以更好地理解 Kubernetes 中节点状态与污点的关系,并能够根据实际情况进行排查和处理。