节点异常问题排查
重要:
本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文介绍关于节点异常问题的诊断流程、排查思路、常见问题及解决方案。
诊断流程

-
查看节点是否处于异常状态。具体操作,请参见检查节点的状态。
-
若节点处于未就绪状态,可参考如下步骤进行排查:
- 检查节点状态信息,查看PIDPressure、DiskPressure、MemoryPressure等节点类型的状态是否为True。若某一节点类型的状态为True,则根据相应异常状态关键字进行排查。具体操作,请参见下方的Dockerd异常处理-RuntimeOffline、节点内存不足-MemoryPressure和节点索引节点不足-InodesPressure等进行解决。
-
检查节点的关键组件和日志。
-
Kubelet
- 检查Kubelet的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Kubelet存在异常,请参见Kubelet异常处理操作。
-
Dockerd
- 检查Dockerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Dockerd存在异常,请参见Dockerd异常处理-RuntimeOffline操作。
-
containerd
- 检查containerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若containerd存在异常,请参见containerd异常处理-RuntimeOffline操作。
-
- 采集并检查节点的诊断日志,请参见采集节点的诊断日志。
- 检查节点的监控,查看节点CPU、内存、网络等资源负载情况是否存在异常。具体操作,请参见检查节点的监控。若节点负载异常,请参见节点CPU不足和节点内存不足-MemoryPressure等解决。
-
若节点处于未知状态,可参考如下步骤进行排查。
- 检查节点BCC实例状态是否为运行中。
-
检查节点的关键组件。
-
Kubelet
- 检查Kubelet的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Kubelet存在异常,请参见Kubelet异常处理操作。
-
Dockerd
- 检查Dockerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Dockerd存在异常,请参见Dockerd异常处理-RuntimeOffline操作。
-
containerd
- 检查containerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若containerd存在异常,请参见containerd异常处理-RuntimeOffline操作。
-
- 检查节点的网络连通性。具体操作,请参见检查节点的安全组。若节点网络存在异常,请参见节点网络异常解决。
- 采集并检查节点诊断日志,请参见采集节点的诊断日志。
- 检查节点的监控,查看节点CPU、内存、网络等资源负载情况是否存在异常。具体操作,请参见检查节点的监控。若节点负载异常,请参见节点CPU不足和节点内存不足-MemoryPressure解决。
-
-
节点NotReady常见排查思路:
- 获取集群与节点状态
- 使用集群的
kubeconfig文件登录中控机,执行以下命令查看节点状态:确认哪些节点处于NotReady状态。 - 从第一个
NotReady的节点开始进行排查,重点关注Conditions字段,查看是哪个 Condition 先出现异常。 -
若节点本身存在问题
-
检查节点 Condition 状态
- 查看
MemoryPressure、DiskPressure、PIDPressure等是否为True。 - 若为
True,请参考相应异常处理文档(如 节点内存不足 - MemoryPressure、磁盘空间不足 - DiskPressure)。
- 查看
- 检查 BCC 实例状态
- 检查节点连通性
- 通过实例对应的 Floating IP 尝试 SSH 登录节点。
- 若无法登录,测试是否能
ping通,若不能ping通,说明机器本身存在问题,请提交工单协助排查。。 - 若能
ping通但无法 SSH 登录,可怀疑实例系统层异常,请联系提交工单协助排查。 - 登录节点后进一步检查
-
查看 kubelet 状态与日志:
Plain Text1journalctl -u kubelet.service --no-pager -
查看 containerd 状态与日志:
Plain Text1journalctl -u containerd.service - 分析日志中是否存在启动失败、证书错误、磁盘空间不足等问题
-
-
若 Condition 显示为容器网络组件异常
-
检查节点上的网络组件 Pod
- 确认
network-agent等容器网络组件的 Pod 是否处于Running状态但未Ready。
- 确认
-
检查子网资源是否充足
- 登录云平台查看节点所在子网的可用 IP 数量。
- 若 IP 已耗尽,需扩容子网或迁移节点。
- 若日志无明显问题,请联系提交工单协助排查。
-
- 若根据诊断流程未能排查问题,请使用容器服务CCE提供的故障诊断功能进行排查。具体操作,请参见节点故障诊断。
常见排查方法
节点故障诊断
当节点出现故障时,您可以使用容器服务CCE提供的故障诊断功能,一键诊断节点异常。
- 登录CCE容器引擎控制台,在左侧导航栏选择集群列表。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点,查看故障节点
- 在左侧导航栏巡检与诊断中选择故障诊断。
- 在弹出的面板单击发起诊断,然后在控制台页面查看诊断结果以及对应的修复建议。
检查节点的详情
- 登录CCE容器引擎控制台,在左侧导航栏选择集群列表。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点。
- 在节点页面,单击目标节点名称,查看节点的详情。
检查节点的状态
- 登录CCE容器引擎控制台,在左侧导航栏选择集群列表。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点。
-
在节点页面,可查看对应节点的状态。
- 若节点状态为可用,说明节点运行正常。
- 若节点状态不是可用,可单击目标节点名称,查看异常状态节点的详情。
检查节点的事件
- 登录CCE容器引擎控制台,在左侧导航栏选择集群列表。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点。
- 在节点页面,单击目标节点名称,查看节点的详情。在节点详情左侧导航栏,可查看节点事件信息。
检查节点的关键组件
- 查看Kubelet状态登录对应节点,在节点上执行如下命令,查看Kubelet进程状态。
Plain Text
1``` 2systemctl status kubelet 3```预期输出:
- 查看Kubelet日志
登录对应节点,在节点上执行如下命令,可查看Kubelet日志信息。关于更多查看Kubelet日志的方式,请参见采集节点的诊断日志。
Plain Text1``` 2journalctl -u kubelet.service --no-pager 3``` - 查看Kubelet配置
登录对应节点,在节点上执行如下命令,可查看Kubelet配置信息。
Plain Text
1``` 2cat /etc/kubernetes/kubelet-config.json 3```
- 检查Dockerd
查看Dockerd状态登录对应节点,在节点上执行如下命令,查看Dockerd进程状态。Plain Text1 ``` 2 systemctl status docker 3 ``` - 查看Dockerd日志
登录对应节点,在节点上执行如下命令,可查看Dockerd的日志信息。关于更多查看Dockerd日志的方式,请参见采集节点的诊断日志。
Plain Text1 ``` 2 journalctl -u docker 3 ``` - 查看Dockerd配置
登录对应节点,在节点上执行如下命令,可查看Dockerd配置信息。
Plain Text1 ``` 2 cat /etc/docker/daemon.json 3 ``` - 检查containerd
登录对应节点,在节点上执行如下命令,可查看containerd配置信息。
Plain Text1 ``` 2 cat /etc/containerd/config.toml 3 ```登录对应节点,在节点上执行如下命令,查看containerd进程状态。
Plain Text1 ``` 2 systemctl status containerd 3 ```预期输出:
- 查看containerd日志
登录对应节点,在节点上执行如下命令,可查看containerd日志信息。关于更多查看containerd日志的方式,请参见采集节点的诊断日志 。
Plain Text1 ``` 2 journalctl -u containerd.service --no-pager 3 ```
检查节点的监控
- BCM云监控百度云容器服务CCE集群集成了监控服务,可登录云监控制台查看对应BCC实例的基本监控信息,关于云监控节点的使用方式,请参见BCM使用文档。
-
Prometheus监控
- 登录CCE容器引擎控制台,在左侧导航栏选择集群列表。
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理>Prometheus 监控。
- 在Prometheus 监控页面,单击节点监控页签,然后再单击集群节点监控详情页签。
- 在集群节点监控详情页面选择待查看的节点,可查看对应节点的CPU、内存、磁盘等监控信息。
Kubelet异常处理
问题原因
通常是Kubelet进程异常、运行时异常、Kubelet配置有误等原因导致。
问题现象
Kubelet状态为inactive。
解决方案
-
执行如下命令重启Kubelet。重启Kubelet不会影响运行中的容器。
Plain Text1 ``` 2 systemctl restart kubelet 3 ```
-
Kubelet重启后,登录节点执行以下命令,再次查看kubelet状态是否恢复正常。
Plain Text1``` 2systemctl status kubelet 3``` -
若Kubelet重启后状态仍异常,请登录节点执行以下命令查看Kubelet日志。
Plain Text1 ``` 2 journalctl -u kubelet.service 3 ```- 若日志中有明确的异常信息,请根据异常关键字进行排查。
Dockerd异常处理-RuntimeOffline
问题原因
通常是Dockerd配置异常、进程负载异常、节点负载异常等原因导致。
问题现象
- Dockerd状态为inactive。
- Dockerd状态为active (running),但未正常工作,导致节点异常。通常有
docker ps、docker exec等命令执行失败的现象。 - 若集群配置了集群节点异常报警,则节点Dockerd异常时可收到相关报警。集群异常事件告警
解决方案
-
执行如下命令重启Dockerd。
Plain Text1 ``` 2 systemctl restart docker 3 ```
-
Dockerd重启后,登录节点执行以下命令,再次查看Dockerd状态是否恢复正常。
Plain Text1``` 2systemctl status docker 3``` -
若Dockerd重启后状态仍异常,请登录节点执行以下命令查看Dockerd日志。
Plain Text1``` 2journalctl -u docker 3```
containerd异常处理-RuntimeOffline
问题原因
通常是Dockerd配置异常、进程负载异常、节点负载异常等原因导致。
问题现象
- 通常是containerd配置异常、进程负载异常、节点负载异常等原因导致。
- containerd状态为inactive。
- 节点状态中RuntimeOffline为True。
- 若集群配置了集群节点异常报警,则节点containerd异常时可收到相关报警。关于配置报警,请参见容器服务报警管理。
解决方案
-
执行如下命令重启containerd。
Plain Text1 ``` 2 systemctl restart containerd 3 ```
-
containerd重启后,登录节点执行以下命令,再次查看containerd状态是否恢复正常。
Plain Text1``` 2systemctl status containerd 3``` -
若containerd重启后状态仍异常,请登录节点执行以下命令查看containerd日志。
Plain Text1``` 2journalctl -u containerd.service 3```
节点PLEG异常-PLEG is not healthy
问题原因
Pod生命周期事件生成器PLEG(Pod Lifecycle Event Generator)会记录Pod生命周期中的各种事件,如容器的启动、终止等。PLEG is not healthy异常通常是由于节点上的运行时进程异常或者节点Systemd版本缺陷导致。
问题现象
- 节点状态NotReady。
-
在Kubelet日志中,可看到如下日志。
Plain Text1 ``` 2 I0729 11:20:59.245243 9575 kubelet.go:1823] skipping pod synchronization - PLEG is not healthy: pleg was last seen active 3m57.138893648s ago; threshold is 3m0s. 3 ```
解决方案
- 依次重启节点关键组件Dockerd/Contatinerd、Kubelet,重启后查看节点是否恢复正常。
- 若节点关键组件重启后节点仍未恢复正常,可尝试重启异常节点。
警告
- 重启节点可能会导致您的业务中断,请谨慎操作。
节点调度资源不足
问题原因
通常是集群中的节点资源不足导致。
问题现象
当集群中的节点调度资源不足时,会导致Pod调度失败,出现以下常见错误信息:
- 集群CPU资源不足:0/2 nodes are available: 2 Insufficient cpu
- 集群内存资源不足:0/2 nodes are available: 2 Insufficient memory
- 集群临时存储不足:0/2 nodes are available: 2 Insufficient ephemeral-storage
- 子网IP资源不足: 0/3 nodes are available: 3 Insufficient eni ip
其中调度器判定节点资源不足的计算方式为:
- 集群节点CPU资源不足的判定方式:当前Pod请求的CPU资源总量>(节点可分配的CPU资源总量-节点已分配的CPU资源总量)
- 集群节点内存资源不足的判定方式:当前Pod请求的内存资源总量>(节点可分配的内存资源总量-节点已分配的内存资源总量)
- 集群节点临时存储不足的判定方式:当前Pod请求的临时存储总量>(节点可分配的临时存储总量-节点已分配的临时存储总量)
如果当前Pod请求的资源总量大于节点可分配的资源总量减去节点已分配的资源总量,Pod就不会调度到当前节点。
执行以下命令,查看节点的资源分配信息:
1```
2kubectl describe node [$nodeName]
3```
关注输出中的如下部分:

其中:
- Allocatable:表示本节点可分配的(CPU/内存/临时存储)资源总量。
- Allocated resources:表示本节点已经分配的(CPU/内存/临时存储)资源总量。
解决方案
当节点调度资源不足时,需降低节点负载,方法如下:
- 删除或减少不必要的Pod,降低节点的负载。
- 根据自身业务情况,限制Pod的资源配置。
- 在集群中添加新的节点。
- 为节点进行升配。
更多信息,请参见节点CPU不足、节点内存不足-MemoryPressure和节点磁盘空间不足-DiskPressure。
节点CPU不足
问题原因
通常是节点上的容器占用CPU过多导致节点的CPU不足。
问题现象
- 当节点CPU不足时,可能会导致节点状态异常。
解决方案
- 通过节点的监控查看CPU增长曲线,确认异常出现时间点,检查节点上的进程是否存在CPU占用过高的现象。
- 降低节点的负载,具体操作,请参见节点调度资源不足。
- 如需重启节点,可尝试重启异常节点。
警告:
- 重启节点可能会导致您的业务中断,请谨慎操作。
节点内存不足-MemoryPressure
问题原因
通常是节点上的容器占用内存过多导致节点的内存不足。
问题现象
- 当节点的可用内存低于
memory.available配置项时,则节点状态中MemoryPressure为True,同时该节点上的容器被驱逐。关于节点驱逐,请参见节点压力驱逐。 -
当节点内存不足时,会有以下常见错误信息: 节点状态中MemoryPressure为True。 当节点上的容器被驱逐时: 在被驱逐的容器事件中可看到关键字The node was low on resource: memory。 在节点事件中可看到关键字attempting to reclaim memory。
Plain Text1* 可能会导致系统OOM异常,当出现系统OOM异常时,节点事件中可看到关键字**System OOM**。
解决方案
- 通过节点的监控查看内存增长曲线,确认异常出现时间点,检查节点上的进程是否存在内存泄露现象。
- 降低节点的负载,具体操作,请参见节点调度资源不足。
- 如需重启节点,可尝试重启异常节点。
警告:
- 重启节点可能会导致您的业务中断,请谨慎操作。
节点索引节点不足-InodesPressure
问题原因
通常是节点上的容器占用索引节点过多导致节点的索引节点不足。
问题现象
- 当节点的可用索引节点低于
inodesFree配置项时,则节点状态中InodesPressure为True,同时该节点上的容器被驱逐。关于节点驱逐,请参见节点压力驱逐。 - 当节点索引点不足时,通常会有以下常见错误信息:
节点状态中InodesPressure为True。
当节点上的容器被驱逐时:
被驱逐的容器事件中可看到关键字The node was low on resource: inodes。
节点事件中可看到关键字attempting to reclaim inodes。
解决方案
- 检查节点上的进程是否存在占用索引节点过多现象。
节点PID不足-NodePIDPressure
问题原因
通常是节点上的容器占用PID过多导致节点的PID不足。
问题现象
- 当节点的可用PID低于
pid.available配置项时,则节点状态中NodePIDPressure为True,同时该节点上的容器被驱逐。关于节点驱逐,请参见节点压力驱逐。
解决方案
-
执行如下命令,查看节点的最大PID数和节点当前的最大PID。
Plain Text1 ``` 2 sysctl kernel.pid_max #查看最大PID数。 3 ps -eLf|awk '{print $2}' | sort -rn| head -n 1 #查看当前的最大PID。 4 ``` -
执行如下命令,查看占用PID最多的前5个进程。
Plain Text1 ``` 2 ps -elT | awk '{print $4}' | sort | uniq -c | sort -k1 -g | tail -5 3 ``` 4预期输出:
Plain Text1 ``` 2 13 24816 3 14 24533 4 14 24769 5 14 24833 6 87 690447 7 ``` - 根据进程号找到对应进程和所属的Pod,分析占用PID过多的原因并优化对应代码。
- 降低节点的负载。
- 如需重启节点,可尝试重启异常节点。
警告: 重启节点可能会导致您的业务中断,请谨慎操作。
节点磁盘空间不足-DiskPressure
问题原因
通常是节点上的容器占用磁盘过多、镜像文件过大导致节点的磁盘空间不足。
问题现象
- 当节点的可用磁盘空间低于
imagefs.available配置项时,则节点状态中DiskPressure为True。 - 当可用磁盘空间低于
nodefs.available配置项时,则该节点上的容器全部被驱逐。关于节点驱逐,请参见节点压力驱逐。 - 当磁盘空间不足时,通常会有以下常见错误信息:
节点状态中DiskPressure为True。
当触发镜像回收策略后,磁盘空间仍然不足以达到健康阈值,在节点事件中可看到关键字failed to garbage collect required amount of images。
当节点上的容器被驱逐时:
被驱逐的容器事件中可看到关键字The node was low on resource: [DiskPressure]。
* 节点事件中可看到关键字attempting to reclaim ephemeral-storage或attempting to reclaim nodefs。
解决方案
- 通过节点的监控查看磁盘增长曲线,确认异常出现时间点,检查节点上的进程是否存在占用磁盘空间过多的现象。
- 若有大量文件在磁盘上未清理,请清理文件。
- 根据自身业务情况,限制Pod的
ephemeral-storage资源配置。 - 建议使用百度云存储产品,尽量避免使用HostPath数据卷。
- 节点磁盘扩容。
- 降低节点的负载。
节点IP资源不足-CCESubnetUnavailable
问题原因
通常是节点上的容器数过多导致IP资源不足。
问题现象
- cce-network-operator日志中的错误:
Plain Text
1 ``` 2 Failed to allocate ENI: insufficient IP addresses in subnet 3 ``` - 节点事件中的错误(通过 kubectl describe node 查看):
Plain Text
1 ``` 2 NodeNetworkUnavailable: failed to allocate ENI: no available IPs in subnet 3 ```
解决方案
降低节点上的容器数量。
节点网络异常
问题原因
通常是节点运行状态异常、安全组配置有误或网络负载过高导致。
问题现象
- 节点无法登录。
- 节点状态NotReady。
解决方案
-
若节点无法登录,请参考以下步骤进行排查:
- 检查节点实例状态是否为运行中。
- 检查节点的安全组配置。
-
若节点的网络负载过高,请参考以下步骤进行排查:
- 通过节点的监控查节点网络增长曲线,检查节点上的Pod是否存在占用网络带宽过多的现象。
节点异常重启
问题原因
通常是节点负载异常等原因导致。
问题现象
- 节点状态在Ready和NotReady之间频繁切换。
解决方案
-
执行以下命令,查看节点重启时间。
Plain Text1 ``` 2 last reboot 3 ```预期输出:
- 查看节点的监控,根据重启时间排查出现异常的资源。
- 查看节点的内核日志,根据重启时间排查异常日志。
