链接复制成功!
节点异常问题排查
通过NPD插件排查
CCE提供节点故障检测NPD插件,NPD插件从1.16.0版本开始增加了大量检查项,能对节点上各种资源和组件的状态检测,帮助发现节点故障。
强烈建议您安装该插件,如已安装请查看插件版本并升级到1.16.0及以上版本。
安装NPD插件后,当节点出现异常时,控制台上可以查看到指标异常。
您还可以在节点事件中查看到NPD上报的事件,根据事件信息可以定位故障。
故障事件 |
说明 |
---|---|
OOMKilling |
检查oom事件发生并上报。 处理建议:排查项一:节点负载过高。 |
TaskHung |
检查taskHung事件发生并上报 |
KernelOops |
检查内核0指针panic错误 |
ConntrackFull |
检查连接跟踪表是否满 |
FrequentKubeletRestart |
检测kubelet频繁重启 |
FrequentDockerRestart |
检测docker频繁重启 |
FrequentContainerdRestart |
检测containerd频繁重启 |
CRIProblem |
检查容器CRI组件状态 |
KUBELETProblem |
检查Kubelet状态 |
NTPProblem |
检查ntp服务状态 |
PIDProblem |
检查PID是否充足 |
FDProblem |
检查文件句柄数是否充足 |
MemoryProblem |
检查节点整体内存是否充足 |
CNIProblem |
检查容器CNI组件状态 |
KUBEPROXYProblem |
检查Kube-proxy状态 |
ReadonlyFilesystem |
检查系统内核是否有Remount root filesystem read-only错误。 可能原因:用户在ECS侧误操作卸载数据盘、节点vdb盘被删除。 处理建议: |
DiskReadonly |
检查系统盘、docker盘、kubelet盘是否只读 可能原因:用户在ECS侧误操作卸载数据盘、节点vdb盘被删除。 处理建议: |
DiskProblem |
检查磁盘使用量与关键逻辑磁盘挂载 检查系统盘、docker盘、kubelet盘磁盘使用率,检查docker盘、kubelet盘是否正常挂载在虚拟机上。 |
PIDPressure |
检查PID是否充足。 处理建议:PID不足时可调整PID上限,请参见修改节点进程 ID数量上限kernel.pid_max。 |
MemoryPressure |
检查容器可分配空间(allocable)内存是否充足 |
DiskPressure |
检查kubelet盘和docker盘的磁盘使用量及inodes使用量。 处理建议:扩容数据盘,请参见节点磁盘扩容。 |
自主排查流程
- 登录CCE控制台。
- 单击集群名称进入集群,在左侧选择“节点管理”,切换至“节点”页签。
- 单击节点操作栏中的“更多 > 查看YAML”,查看节点的Status字段。
- 查看节点的状态信息,是否存在PIDPressure、DiskPressure、MemoryPressure等节点状态是否为True。如果节点存在任一状态为True,则基于异常的关键词,查找相应的解决方案。
- 检查节点上的关键组件,及关键组件上的日志。节点上的关键组件为Kubelet及其运行时组件(Docker/Containerd),详细操作请参见检查节点的关键组件。
- Kubelet组件
检查Kubelet的状态、日志等是否存在异常。若存在异常则参考Kubelet异常处理。
- 运行时组件(Docker/Conatinerd)
- 检查节点的运行时组件,若不确定节点的运行时组件具体是Docker还是Containerd,请登录CCE控制台,查看节点的运行时信息。
- 如果存在异常,则参考节点运行时异常处理-RuntimeOffline。
- NTP组件
- 检查NTP服务的状态、日志、配置等是否存在异常。
- 若NTP服务存在异常,则参考NTP异常处理-NTPProblem。
- Kubelet组件
- 检查节点的监控,查看节点的CPU、内存、网络等资源负载情况是否存在异常。如果节点负载情况存在异常,请参考节点MemoryPressure等进行解决。
节点状态为Unknown状态
- 登录ECS界面,查看节点是否存在。
- 需确认节点是否处于运行中状态。
- 检查节点上的关键组件,及关键组件上的日志。节点上的关键组件为Kubelet及其运行时组件(Docker/Containerd),详细操作请参见检查节点的关键组件。
- Kubelet组件
- 检查Kubelet的状态、日志等是否存在异常。若存在异常则参考Kubelet异常处理。
- Kubelet组件
- 检查节点的网络连通性。
常见问题排查方法
检查节点的状态
- 登录CCE服务控制台。
- 在界面中选择需要检查节点所在的集群。
- 在集群列表页面单击“节点管理”,切换到“节点”一栏,查看不可用节点的状态。(如果已安装NPD 1.6.10及以上的插件版本,则在不可用下面会展示指标异常提示,将鼠标光标移动至上方即可看到具体的问题项,若未安装请参考排查项继续排查)。
检查节点事件
- 登录CCE服务控制台。
- 在界面中选择需要检查节点所在的集群。
- 在集群列表页面单击“节点管理”,切换到“节点”一栏,在异常节点所在行单击“事件”。即可查看是否有节点异常的事件上报(需安装NPD插件)。
弹性云服务器是否删除或故障
- 登录CCE服务控制台,进入集群,查看不可用节点的名称。
- 进入ECS控制台,搜索该节点,查看对应的云服务器状态。
- 若弹性云服务器状态为“已删除”:请在CCE中删除对应节点,再重新创建节点。
- 若弹性云服务器状态为“关机”或“冻结”:请先恢复弹性云服务器,约3分钟后集群节点可自行恢复。
- 若弹性云服务器出现故障:请先重启弹性云服务器,恢复故障。
- 若弹性云服务器状态为“可用”:请参考检查节点的关键组件进行排查。
节点的安全组检查
- 节点的安全组被修改导致异常
- 登录VPC控制台,在左侧栏目树中单击“访问控制 > 安全组”,找到集群控制节点的安全组。
- 控制节点安全组名称为:集群名称-cce-control-编号。您可以通过集群名称查找安全组,再进一步在名称中区分“-cce-control-”字样,即为本集群安全组。
- 排查安全组中规则是否被修改,关于安全组的详细说明请参见集群安全组规则配置。
- 检查安全组规则中是否包含Master和Node互通的安全组策略
节点的DNS地址配置错误
- 登录节点,在日志/var/log/cloud-init-output.log中查看是否有域名解析失败相关的报错。可以执行如下指令:
cat /var/log/cloud-init-output.log | grep resolv
如果回显结果包含如下类似内容则说明无法解析该域名。
Could not resolve host: xxx ; Unknown error
- 在节点上ping无法解析的域名,例如:
ping xxx
如果不能,则说明DNS无法解析该地址。请确认/etc/resolv.conf文件中的DNS地址与配置在VPC的子网上的DNS地址是否一致,通常是因为DNS地址配置错误导致无法正常解析域名。
排查是否为包周期节点退订
- 如果该节点是否为包周期节点。
- 节点退订后,订单处理需要一定时间。在此期间节点将处于不可用状态,预计5~10分钟后自动清理该节点,无需做额外处理。
常见问题解决方案
节点PIDPressure
问题根因
节点上的容器占用PID过多导致节点的PID不足。CCE默认留给分配Pod使用的可用PID数的百分比为10%。
问题现象
当节点的可用PID低于pid.available配置项时,则节点状态中PIDPressure为True,同时该节点上的容器被驱逐。关于节点驱逐,可参考社区文档节点压力驱逐。
解决方案
- 执行如下命令,查看节点的最大PID数和节点当前的最大PID。
sysctl kernel.pid_max #查看最大PID数 ps -eLf|awk '{print $2}' | sort -rn| head -n 1 #查看当前的最大PID
- 执行如下命令,查看占用PID最多的前5个进程。
ps -elT | awk '{print $4}' | sort | uniq -c | sort -k1 -g | tail -5
预期输出结果:
17 1211619 18 3739112 18 5299 24 964 25 3739756
第一列为进程占用的PID数,第二列为当前进程号,根据进程号找到对应进程和所属Pod,分析占用PID过多的原因并优化对应的代码。
- 降低节点的负载。
- 如需重启节点,可在ECS界面尝试重启异常节点。(注意:重启节点可能会导致您的业务中断,请谨慎操作。)
节点MemoryPressure
问题根因
节点上的容器占用内存过多导致节点的内存不足。CCE默认节点可用内存值为100 Mi。
问题现象
- 当节点的可用内存低于memory.available配置项时,则节点状态中MemoryPressure为True,同时该节点上的容器被驱逐。关于节点驱逐,可参考社区文档节点压力驱逐。
- 当节点内存不足时,会有以下常见错误信息:
- 节点状态中MemoryPressure为True。
- 当节点上的容器被驱逐时:
- 在被驱逐的容器事件中可看到关键字The node was low on resource: memory。
- 在节点时间中可看到关键字attempting to reclaim memory。
- 可能会导致系统OOM异常,当出现系统OOM异常时,节点时间中可看到关键字Syetem OOM。
解决方案
- 通过节点的监控查看内存增长曲线,确认异常出现时间点,检查节点上的进程是否存在内存泄露现象。具体操作请参见检查节点监控。
- 降低节点上的负载。
- 如需重启节点,可在ECS界面尝试重启异常节点。(注意:重启节点可能会导致您的业务中断,请谨慎操作。)
节点DiskPressure
问题根因
参数名称 |
中文名称 |
默认值 |
---|---|---|
nodefs.available |
Kubelet 使用的文件系统的可用容量的百分比 |
10% |
nodefs.inodesFree |
Kubelet 使用的文件系统的可用inodes数的百分比 |
5% |
imagefs.available |
容器运行时存放镜像等资源的文件系统的可用容量的百分比 |
10% |
imagefs.inodesFree |
容器运行时存放镜像等资源的文件系统的可用inodes数的百分比 |
5% |
问题现象
- 当节点的可用磁盘空间低于imagefs.available配置项时,则节点状态中DiskPressure为True。
- 当可用磁盘空间低于nodefs.available配置项时,则该节点上的容器全部被驱逐。关于节点驱逐,可参考社区文档节点压力驱逐。
- 当磁盘空间不足时,通常会有以下常见错误信息:
- 节点状态中DiskPressure为True。
- 当触发镜像回收策略后,磁盘空间仍然不足以达到健康阈值(默认为80%),在节点事件中可看到关键字failed to garbage collect required amount of images。
- 当节点上的容器被驱逐时:
- 被驱逐的容器事件中可看到关键字The node was low on resource: [DiskPressure]。
- 节点事件中可看到关键字attempting to reclaim ephemeral-storage或attempting to reclaim nodefs。
解决方案
Kubelet异常处理
问题根因
通常是kubelet进程异常、kubelet配置有误导致。通常情况下,CCE已默认为kubelet配置了健康检查,因此配置有误导致起不来的可能性更大。
问题现象
Kubelet状态为inactive。
解决方案
- 登录出现异常的节点,执行如下命令重启Kubelet。重启Kubelet不会影响运行中的容器。
systemctl restart kubelet
- 输入以下指令查看Kubelet状态是否恢复正常。
systemctl status kubelet
- 若kubelet重启后状态仍异常,请登录节点执行以下命令查看kubelet的日志。
journalctl -u kubelet
- 若日志中有明确的错误信息,请根据发生错误时的关键字进行排查。
- 若确认是kubelet配置异常,请在节点所属的节点池,单击“配置管理”,在kubelet组件配置栏,对kubelet配置进行修改。
节点运行时异常处理-RuntimeOffline
问题根因
通常Docker/Containerd的配置、进程异常等原因导致。
问题现象
- Docker组件
- Docker的状态为inactive。
- Docker的状态为active(running),但是节点未正常工作,导致节点异常。此时通过docker ps 或者 docker exec等命令出现执行失败的现象。
- 节点状态中的RuntimeOffline为True。
- Containerd组件
- Containerd的状态为inactive。
- 节点状态中的RuntimeOffline为True。
解决方案
- 登录异常的节点。
- 执行如下命令重启运行时。
# Docker systemctl restart docker # Containerd systemctl restart containerd
- 待命令执行完毕之后,查看运行时状态是否正常。
# Docker systemctl status docker # Containerd systemctl status containerd
- 若重启运行时,组件的状态仍然异常,请执行如下命令查看组件日志。
# Docker journalctl -u docker # containerd journalctl -u containerd
NTP异常处理-NTPProblem
问题根因
NTP进程状态异常导致。
问题现象
- Chronyd状态为inactive。
- 节点状态中NTPProblem为True。
解决方案
- 登录异常节点,执行如下命令重启Chronyd。
systemctl restart chronyd
- Chronyd重启之后,执行以下命令,查看Chronyd的状态是否恢复正常。
systemctl status chronyd
- 若Chronyd重启之后状态仍然异常,请登录节点执行以下命令查看Chronyd日志。
journalctl -u chronyd
节点异常重启
问题根因
通常是节点负载异常等原因导致。
问题现象
节点重启的过程中,节点状态为NotReady。
解决方案
- 执行如下命令,查看节点重启时间。
last reboot
预期输出:
- 查看节点的监控,根据节点重启时间排查出现异常的资源。具体操作请参见检查节点监控。
- 查看节点的内核日志,根据重启时间排查异常日志。
节点网络异常
问题根因
通常是节点运行状态异常、安全组配置有误或网络负载过高导致。
问题现象
- 节点无法登录。
- 节点状态Unknown。
解决方案
- 若节点无法登录,请参考以下步骤排查:
- 在ECS侧检查节点实例状态是否为运行中。
- 参考是否为ECS的cloud-init执行失败导致。具体操作,可参考弹性云服务是否能够登录。
- 检查节点的安全组配置。具体操作,可参考节点的安全组检查。
- 若节点的网络负载过高,请参考以下步骤进行排查:
- 通过节点的监控查节点网络增长曲线,检查节点上的Pod是否存在占用网络带宽过多的现象。
- 使用网络策略控制Pod的网络流量。具体操作,请参考配置网络策略限制Pod访问的对象。
节点PLEG异常-PLEG is not healthy
问题根因
Pod生命周期事件生成器PLEG(Pod Lifecycle Event Generator)会记录Pod生命周期中的各种事件,如容器的启动、终止等。PLEG is not healthy异常通常是由于节点上的运行时进程异常或者节点Systemd版本缺陷导致。
问题现象
- 节点状态NotReady
- 在Kubelet日志中,可看到如下日志。
skipping pod synchronization - PLEG is not healthy: pleg was last seen active 3m17.028393648s ago; threshold is 3m0s.
解决方案
- 依次重启节点关键组件Docker、Containerd、Kubelet,待完成重启之后查看节点是否恢复正常。
- 若节点关键组件重启后节点仍未恢复正常,可尝试重启异常节点。(重启节点可能会导致您的业务中断,请谨慎操作)
节点负载过高
问题根因
节点调度资源不足导致。
问题现象
- 集群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
其中调度器判定节点资源不足的计算方式为:
- 集群节点CPU资源不足的判定方式:当前Pod请求的CPU资源总量>(节点可分配的CPU资源总量-节点已分配的CPU资源总量)
- 集群节点内存资源不足的判定方式:当前Pod请求的内存资源总量>(节点可分配的内存资源总量-节点已分配的内存资源总量)
- 集群节点临时存储不足的判定方式:当前Pod请求的临时存储总量>(节点可分配的临时存储总量-节点已分配的临时存储总量)
如果当前Pod请求的资源总量大于节点可分配的资源总量减去节点已分配的资源总量,Pod就不会调度到当前节点。
执行以下命令,查看节点的资源分配信息:
kubectl describe node $nodeName
关注输出中,关于资源分配的部分:
Allocatable: cpu: 1930m ephemeral-storage: 94576560382 hugepages-1Gi: 0 hugepages-2Mi: 0 localssd: 0 localvolume: 0 memory: 2511096Ki pods: 20 Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 1255m (65%) 4600m (238%) memory 1945Mi (79%) 3876Mi (158%) ephemeral-storage 0 (0%) 0 (0%) hugepages-1Gi 0 (0%) 0 (0%) hugepages-2Mi 0 (0%) 0 (0%) localssd 0 0 localvolume 0 0
其中:
- Allocatable:表示本节点可分配的(CPU/内存/临时存储)资源总量。
- Allocated resources:表示本节点已经分配的(CPU/内存/临时存储)资源总量。
解决方案
- 删除或减少不必要的Pod,降低节点的负载。
- 根据自身业务情况,限制Pod的资源配置。
- 在集群中添加新的节点。