K8S Node异常问题排查过程

 更新时间:2026年01月16日 08:57:29   作者:CN-FuWei  
文章介绍了使用kubectl命令行对K8S集群中的Node异常进行初步定位的方法,包括查看NotReady发生时间、异常event、NodeConditions以及kubelet日志,文章还详细描述了常见问题的解决方法,如Kubelet停止汇报心跳、PLEG不可用和Node被驱逐等情况

一、简介

可使用 kubectl 命令行对 K8S Node 异常做初步定位,方法几乎适用于所有 K8S 集群。

二、排查方法

使用 grafana kubelet 查看 NotReady 发生时间:

# kubectl get nodes
NAME          STATUS     ROLES    AGE   VERSION
172.16.80.4   Ready      <none>   18h   v1.20.8
172.16.80.6   NotReady   <none>   18h   v1.20.8

kubectl describe node 172.16.80.6 查看异常 event

Conditions:
  Type                 Status    LastHeartbeatTime                 LastTransitionTime                Reason              Message
  ----                 ------    -----------------                 ------------------                ------              -------
  NetworkUnavailable   False     Mon, 13 Jun 2022 19:41:10 +0800   Mon, 13 Jun 2022 19:41:10 +0800   RouteCreated        CCE RouteController created a route
  MemoryPressure       Unknown   Tue, 14 Jun 2022 14:08:00 +0800   Tue, 14 Jun 2022 14:09:36 +0800   NodeStatusUnknown   Kubelet stopped posting node status.
  DiskPressure         Unknown   Tue, 14 Jun 2022 14:08:00 +0800   Tue, 14 Jun 2022 14:09:36 +0800   NodeStatusUnknown   Kubelet stopped posting node status.
  PIDPressure          Unknown   Tue, 14 Jun 2022 14:08:00 +0800   Tue, 14 Jun 2022 14:09:36 +0800   NodeStatusUnknown   Kubelet stopped posting node status.
  Ready                Unknown   Tue, 14 Jun 2022 14:08:00 +0800   Tue, 14 Jun 2022 14:09:36 +0800   NodeStatusUnknown   Kubelet stopped posting node status.

kubectl get node 172.16.80.6 -o yaml 查看 NodeConditions:

  conditions:
  - lastHeartbeatTime: "2022-06-13T11:41:10Z"
    lastTransitionTime: "2022-06-13T11:41:10Z"
    message: CCE RouteController created a route
    reason: RouteCreated
    status: "False"
    type: NetworkUnavailable
  - lastHeartbeatTime: "2022-06-14T06:08:00Z"
    lastTransitionTime: "2022-06-14T06:09:36Z"
    message: Kubelet stopped posting node status.
    reason: NodeStatusUnknown
    status: Unknown
    type: MemoryPressure
  - lastHeartbeatTime: "2022-06-14T06:08:00Z"
    lastTransitionTime: "2022-06-14T06:09:36Z"
    message: Kubelet stopped posting node status.
    reason: NodeStatusUnknown
    status: Unknown
    type: DiskPressure
  - lastHeartbeatTime: "2022-06-14T06:08:00Z"
    lastTransitionTime: "2022-06-14T06:09:36Z"
    message: Kubelet stopped posting node status.
    reason: NodeStatusUnknown
    status: Unknown
    type: PIDPressure
  - lastHeartbeatTime: "2022-06-14T06:08:00Z"
    lastTransitionTime: "2022-06-14T06:09:36Z"
    message: Kubelet stopped posting node status.
    reason: NodeStatusUnknown
    status: Unknown
    type: Ready

登录节点查看 kubelet 的日志:

 journalctl -u kubelet --since="2022-06-14 14:00:00" | less 

三、常见问题

Kubelet stopped posting node status

kubelet 停止汇报心跳,通常是 node 节点宕机,可让用户尝试登录节点,无法登录的话,一般通过重启恢复。原因一般和节点负载有关,可通过监控查看节点异常前负载情况。

PLEG is not healthy

Pod Lifecycle Event Generator,kubelet 会定期同步 pod 状态,当同步 pod 状态超时(3分钟),会将 node 置为 not ready 状态。

  • 通过命令定位是否有容器 inspect 卡住的情况: docker ps -a -q | xargs docker inspect

如果该命令卡住,则进一步定位是由具体的哪个容器导致,通过 docker inspect {CONTAINER ID} 确认。定位到具体容器后,经客户允许后可将该容器删除 docker rm -f {CONTAINER ID}

Node Evicted

当节点因为资源不足(CPU、内存、磁盘)被驱逐时,需根据不同原因处理:

  • CPU,内存资源不足:

- 虚机升配

- 合理设置资源的 resource request, 使 pod 合理调度到不同的节点上。

  • 磁盘空间不足:

- 扩容容器数据目录所在磁盘

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • kubernetes存储之GlusterFS集群详解

    kubernetes存储之GlusterFS集群详解

    最近工作中用到了GlusterFS作为Kubernetes的存储,这篇文章主要给大家介绍了关于kubernetes存储之GlusterFS集群的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • k8s容器放开锁内存限制问题

    k8s容器放开锁内存限制问题

    nccl-test容器运行mpirun时因NCCL_BUFFSIZE过大导致OOM,需通过修改docker服务配置文件,将LimitMEMLOCK设为infinity并重启docker,以解除内存锁定限制
    2025-09-09
  • Kubernetes DNS解析实战过程

    Kubernetes DNS解析实战过程

    Kubernetes中,Pod需Ready状态才会被CoreDNS解析,而Service创建时即添加记录,当服务依赖Pod解析时易引发启动死循环,通过设置Service的publishNotReadyAddresses为true,可解决此问题,允许未就绪Pod的IP立即被解析
    2025-09-09
  • Kubernetes(k8s)常用yaml配置和注释方式

    Kubernetes(k8s)常用yaml配置和注释方式

    这篇文章主要介绍了Kubernetes(k8s)常用yaml配置和注释方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • K8S集群卸载清理的完整步骤流程

    K8S集群卸载清理的完整步骤流程

    在Kubernetes(简称K8S)的生命周期中,可能会遇到需要卸载和清理集群的情况,本文将详细介绍如何安全地卸载K8S集群,并清理所有相关的资源,需要的可以了解下
    2025-08-08
  • k8s常用命令大全(最新推荐)

    k8s常用命令大全(最新推荐)

    这篇文章主要介绍了k8s常用命令大全,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 详解k8s ConfigMap 中 subPath 字段和 items 字段

    详解k8s ConfigMap 中 subPath 字段和 items

    volumeMounts.subPath 属性可用于指定所引用的卷内的子路径,而不是其根路径,这篇文章主要介绍了详解k8s ConfigMap 中 subPath 字段和 items 字段,需要的朋友可以参考下
    2023-03-03
  • K8S Pod定向部署到指定节点的实现全过程

    K8S Pod定向部署到指定节点的实现全过程

    K8S Pod定向部署通过节点标签、亲和性和污点三种机制实现资源适配、业务隔离与节点专属化,适用于不同场景,选型建议为标签用于基础、亲和性用于弹性、污点用于资源保护
    2025-08-08
  • 详解kubectl资源管理命令(陈述式)

    详解kubectl资源管理命令(陈述式)

    kubectl是官方的CTL命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理k8s各种资源的一种有效途径,这篇文章主要介绍了详解kubectl资源管理命令(陈述式),需要的朋友可以参考下
    2025-04-04
  • k8s中的NetworkPolicy使用详解

    k8s中的NetworkPolicy使用详解

    这篇文章主要介绍了k8s中的NetworkPolicy使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-10-10

最新评论