Node故障处理
本文介绍关于 k3s/k8s Node节点异常问题的诊断流程、排查思路、常见问题及解决方案。
本文目录
诊断流程

- 查看节点是否处于异常状态。具体操作,请参见检查节点的状态。
- 若节点处于NotReady状态,可参考如下步骤进行排查:
- 检查节点状态信息,查看PIDPressure、DiskPressure、MemoryPressure等节点类型的状态是否为True。若某一节点类型的状态为True,则根据相应异常状态关键字进行排查。具体操作,请参见Dockerd异常处理-RuntimeOffline、节点内存不足-MemoryPressure和节点索引节点不足-InodesPressure等进行解决。
- 检查节点的关键组件和日志。
- Kubelet
- 检查Kubelet的 状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Kubelet存在异常,请参见Kubelet异常处理操作。
- Dockerd
- 检查Dockerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Dockerd存在异常,请参见Dockerd异常处理-RuntimeOffline操作。
- Containerd
- 检查Containerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Containerd存在异常,请参见Containerd异常处理-RuntimeOffline操作。
- NTP
- 检查NTP服务的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若NTP服务存在异常,请参见NTP异常处理-NTPProblem操作。
- Kubelet
- 检查节点的诊断日志。
- 检查节点的监控,查看节点CPU、内存、网络等资源负载情况是否存在异常。具体操作,请参见检查节点的监控。若节点负载异常,请参见节点CPU不足和节点内存不足-MemoryPressure等解决。
- 若节点处于Unknown状态,可参考如下步骤进行排查。
- 检查节点服务器实例状态是否为开机 运行中。
- 检查节点的关键组件。
- Kubelet
- 检查Kubelet的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Kubelet存在异常,请参见Kubelet异常处理操作。
- Dockerd
- 检查Dockerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Dockerd存在异常,参见Dockerd异常处理-RuntimeOffline操作。
- Containerd
- 检查Containerd的状态、日志、配置等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若Containerd存在异常,请参见Containerd异常处理-RuntimeOffline操作。
- NTP
- 检查NTP服务的状态、日志、配置 等是否存在异常。具体操作,请参见检查节点的关键组件。
- 若NTP服务存在异常,请参见NTP异常处理-NTPProblem操作。
- Kubelet
- 检查节点的网络连通性。具体操作,请参见检查节点防火墙及安全组。若节点网络存在异常,请参见节点网络异常解决。
- 检查节点的诊断日志。
- 检查节点的监控,查看节点CPU、内存、网络等资源负载情况是否存在异常。具体操作,请参见检查节点的监控。若节点负载异常,请参见节点CPU不足和节点内存不足-MemoryPressure解决。
- 若节点处于NotReady状态,可参考如下步骤进行排查:
- 若问题仍未解决,请提交工单排查。
常见排查方法
检查节点的状态
当节点出现故障时,您可以通过登录服务器,确保服务器是在线可连通状态,硬件及其他不可抗拒因素导致故障,不再排查范围内。
-
登录运维操作服务器,检查常规指标;CPU/内存/负载状态。
top -
进入ONES运维工具箱容器。
ones-ai-k8s.sh # 进入ones运维操作容器 -
查询K3S/K8S集群节点状态。
kubectl get node # 查看全部节点基本信息,检查节点状态是否为:Ready状态
kubectl describe node <node-name>- 若状态为Ready说明节点运行正常。
检查节点的详情及事件
- 登录运维操作服务器
- 进入ONES运维工具箱容器。
ones-ai-k8s.sh # 进入ones运维操作容器 - 查询K3S/K8S集群节点详情及事件信息。
kubectl get node # 查看全部节点基本信息,检查节点状态是否为:Ready状态
kubectl describe node <node-name>
kubectl describe node <node-name> | grep -A 5 "Events" # 这将提供有关节点事件的详细描述,包括事件的类型、原因、消息和产生事件的时间,通过分析节点的事件状态,您可以更全面地了解节点上发生的任何异常情况,从而有针对性地进行故障排查和修复。
若节点处于NotReady状态,可参考如下步骤进行排查:
检查节点状态信息,查看PIDPressure、DiskPressure、MemoryPressure等节点类型的状态是否为True。若某一节点类型的状态为True,则根据相应异常状态关键字进行排查。具体操作,请参见Dockerd异常处理-RuntimeOffline、节点内存不足-MemoryPressure和节点索引节点不足-InodesPressure等进行解决。
检查节点的关键组件
-
Kubelet (k8s deploy):
-
查看Kubelet状态
登录对应节点,在节点上执行如下命令,查看Kubelet进程状态。
systemctl status kubelet预期输出:

-
查看Kubelet日志
登录对应节点,在节点上执行如下命令,可查看Kubelet日志信息。
journalctl -u kubelet -
查看Kubelet配置
登录对应节点,在节点上执行如下命令,可查看Kubelet配置信息。
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
-
-
k3s (k3s deploy):
-
查看k3s状态
登录对应节点,在节点上执行如下命令,查看Kubelet进程状态。
k3s check-config # 运行 check-config 并确保它通过
systemctl status k3s -
查看k3s日志
登录对应节点,在节点上执行如下命令,可查看Kubelet日志信息。
journalctl -u k3s -
查看k3s配置
登录对应节点,在节点上执行如下命令,可查看Kubelet配置信息。
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
-
-
运行时:
-
检查Dockerd
-
查看Dockerd状态
登录对应节点,在节点上执行如下命令,查看Dockerd进程状态。
systemctl status docker -
查看Dockerd日志
登录对应节点,在节点上执行如下命令,可查看Dockerd的日志信息。
journalctl -u docker -
查看Dockerd配置
登录对应节点,在节点上执行如下命令,可查看Dockerd配置信息。
cat /etc/docker/daemon.json
-
-
检查Containerd
-
查看Containerd状态
登录对应节点,在节点上执行如下命令,查看Containerd进程状态。
systemctl status containerd -
查看Containerd日志
登录对应节点,在节点上执行如下命令,可查看Containerd日志信息。
more /var/lib/rancher/k3s/agent/containerd/containerd.log # 查看所有日志
journalctl -u containerd
-
-
-
检查NTP:
-
查看NTP服务状态
登录对应节点,在节点上执行如下命令,查看Chronyd进程的状态。
systemctl status chronyd预期输出:

-
查看NTP服务日志
登录对应节点,在节点上执行如下命令,可查看NTP日志信息。
journalctl -u chronyd
-
检查节点的监控
-
服务器监控
可以通过云厂商/私有云提供的基础监控服务,查看相关服务器指标。
-
ONES 周边Prometheus监控系统
- 登陆Grafana 监控面板
- 在控制台Dashboard选择 搜索 "
nodeordocker"关键词

- 在Grafana Dashboard页面,选择相应instance节点实例,查看对应常规节点的CPU、内存、磁盘、网络等监控信息及时间维度趋势状态。
检查节点防火墙及安全组
关于检查服务器节点防火墙及安全组需要放行哪些端口,请参见部署环境要求和最小化集群访问规则。
Kubelet异常处理
问题原因
通常是Kubelet进程异常、运行时异常、Kubelet配置有误等原因导致。
问题现象
Kubelet状态为inactive。
解决方案
-
执行如下命令重启Kubelet。重启Kubelet不会影响运行中的容器。
systemctl restart kubelet -
Kubelet重启后,登录节点执行以下命令,再次查看kubelet状态是否恢复正常。
systemctl status kubelet -
若Kubelet重启后状态仍异常,请登录节点执行以下命令查看Kubelet日志。
journalctl -u kubelet-
若日志中有明确的异常信息,请根据异常关键字进行排查。
-
若确认是Kubelet配置异常,请执行如下命令修改Kubelet配置。
vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf #修改Kubelet配置。
systemctl daemon-reload;systemctl restart kubelet #重新加载配置并重启Kubelet。
-
Dockerd异常处理-RuntimeOffline
问题原因
通常是Dockerd配置异常、进程负载异常、节点负载异常等原因导致。
问题现象
- Dockerd状态为inactive。
- Dockerd状态为active (running),但未正常工作,导致节点异常。通常有
docker ps、docker exec等命令执行失败的现象。 - 节点状态中RuntimeOffline为True。
解决方案
-
执行如下命令重启Dockerd。
systemctl restart docker -
Dockerd重启后,登录节点执行以下命令,再次查看Dockerd状态是否恢复正常。
systemctl status docker -
若Dockerd重启后状态仍异常,请登录节点执行以下命令查看Dockerd日志。
journalctl -u docker
Containerd异常处理-RuntimeOffline
问题原因
通常是Containerd配置异常、进程负载异常、节点负载异常等原因导致。
- Containerd状态为inactive。
- 节点状态中RuntimeOffline为True。
解决方案
-
执行如下命令重启Containerd。
systemctl restart containerd -
Containerd重启后,登录节点执行以下命令,再次查看Containerd状态是否恢复正常。
systemctl status containerd -
若Containerd重启后状态仍异常,请登录节点执行以下命令查看Containerd日志。
journalctl -u containerd
more /var/lib/rancher/k3s/agent/containerd/containerd.log
NTP异常处理-NTPProblem
问题原因
通常是NTP进程状态异常导致。
问题现象
- Chronyd状态为inactive。
- 节点状态中NTPProblem为True。
解决方案
-
执行如下命令重启Chronyd。
systemctl restart chronyd -
Chronyd重启后,登录节点执行以下命令,再次查看Chronyd状态是否恢复正常。
systemctl status chronyd -
若Chronyd重启后状态仍异常,请登录节点执行以下命令查看Chronyd日志。
journalctl -u chronyd
节点PLEG异常-PLEG is not healthy
问题原因
Pod生命周期事件生成器PLEG(Pod Lifecycle Event Generator)会记录Pod生命周期中的各种事件,如容器的启动、终止等。PLEG is not healthy异常通常是由于节点上的运行时进程异常或者节点Systemd版本缺陷导致。