【K8S系列】Kubernetes pod节点NotReady问题及解决方案详解【已解决】

ops/2024/10/18 22:13:29/

在这里插入图片描述

Kubernetes 集群中的每个节点都是运行容器化应用的基础。当节点状态显示为 NotReady
时,意味着该节点无法正常工作,这可能会导致 Pod
无法调度,从而影响整个应用的可用性。本文将深入分析节点不健康的各种原因、详细的排查步骤以及有效的解决方案。

一、节点不健康的原因

节点不健康的原因可以归结为多种因素,以下是一些主要原因:

  1. 资源不足

    • CPU 和内存压力:当节点上的 CPU 或内存使用率接近 100% 时,Kubernetes 可能会将节点标记为不健康。
    • 磁盘空间不足:如果节点的磁盘空间不足,可能会导致 Pod 无法正常运行。
  2. Kubelet 服务故障

    • Kubelet 是负责管理节点上容器的主要组件。如果 Kubelet 进程未运行或崩溃,节点会被标记为 NotReady
  3. 网络问题

    • 节点与 Kubernetes 控制平面或其他节点之间的网络连接故障,导致无法与 API 服务器通信。
  4. 容器运行时问题

    • Docker 或其他容器运行时未正常工作,会导致 Pod 无法启动。
  5. 节点维护状态

    • 节点可能被人为标记为维护状态(cordon),这会阻止新的 Pod 调度到该节点。
  6. 系统级别问题

    • 操作系统的错误、内核崩溃或其他严重问题可能导致节点不健康。

二、排查步骤

步骤 1: 查看节点状态

首先,使用以下命令检查集群中所有节点的状态:

kubectl get nodes

输出示例:

NAME           STATUS     ROLES    AGE     VERSION
node1         NotReady   <none>   5d      v1.21.0
node2         Ready      <none>   5d      v1.21.0

这表明 node1 的状态为 NotReady

步骤 2: 描述节点

使用 kubectl describe 命令获取节点的详细信息:

kubectl describe node <node-name>

输出示例:

Name:               node1
Labels:             <none>
Annotations:        kubernetes.io/hostname=node1
...
Conditions:Type              StatusReady             FalseOutOfDisk         FalseMemoryPressure    FalseDiskPressure      FalsePIDPressure       FalseNetworkUnavailable False
...
Events:Type     Reason       Age                From                 Message----     ------       ----               ----                 -------Warning  KubeletNotReady  5m                kubelet, node1     Kubelet is not posting active status

在输出中,关注以下几个方面:

  • Conditions:查看 Ready 状态是否为 False,以及其他条件(如 OutOfDiskMemoryPressure 等)。
  • Events:检查是否有异常事件,特别是 Kubelet 的状态信息。

步骤 3: 检查资源使用情况

确认节点的资源使用情况,确保没有达到限制:

kubectl top nodes

输出示例:

NAME       CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
node1      2000m        95%    1500Mi          90%
node2      1000m        30%    800Mi           50%

如果某个节点的 CPU 或内存使用率接近 100%,说明资源不足。

步骤 4: 检查 Kubelet 状态

SSH 登录到节点,检查 Kubelet 服务的状态:

sudo systemctl status kubelet

输出示例:

● kubelet.service - Kubernetes KubeletLoaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: disabled)Active: failed (Result: exit-code) since Thu 2023-10-10 10:00:00 UTC; 5min ago

如果 Kubelet 未运行或状态为 failed,查看日志以查找故障原因:

journalctl -u kubelet

查找关键错误信息,帮助定位问题。

步骤 5: 检查 Docker 状态

确认 Docker 或其他容器运行时是否正常工作:

sudo systemctl status docker

输出示例:

● docker.service - Docker Application Container EngineLoaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)Active: active (running) since Thu 2023-10-10 09:50:00 UTC; 10min ago

如果 Docker 服务未运行,查看 Docker 日志,检查是否有错误信息:

journalctl -u docker

步骤 6: 检查网络连接

确保节点能够访问 Kubernetes 控制平面和其他节点。可以使用 pingcurl 命令检查网络连通性。例如,检查 API 服务器是否可达:

curl -k https://<k8s-api-server>:6443/version

如果网络无法连接,可能需要检查防火墙或网络配置。

三、解决方案

解决方案 1: 释放资源

如果节点资源不足,考虑以下措施:

  • 减少 Pod 数量:使用 kubectl delete pod <pod-name> 删除不必要的 Pod。
  • 调整资源请求和限制:优化 Pod 的资源配置,确保不超过节点的可用资源。
  • 扩展节点:通过云服务提供商添加新的节点或将现有节点的资源进行扩展。

解决方案 2: 重启 Kubelet

如果 Kubelet 服务出现问题,可以尝试重启:

sudo systemctl restart kubelet

重启后,再次检查节点状态:

kubectl get nodes

解决方案 3: 处理网络问题

如果发现网络连接不通:

  • 检查防火墙设置:确保 Kubernetes 所需的端口(如 6443、10250 等)是开放的。
  • 确认网络插件:如果使用了网络插件(如 Calico、Flannel 等),确保其正常工作。

解决方案 4: 检查和重启 Docker

如果 Docker 服务出现问题,尝试重启 Docker:

sudo systemctl restart docker

然后再次检查节点状态。

解决方案 5: 检查节点维护状态

如果节点被标记为 cordon,可以使用以下命令解除该状态:

kubectl uncordon <node-name>

确保节点能够接收新的 Pod。

解决方案 6: 处理系统级别问题

如果排查后仍无法解决,可能需要检查系统日志,查找操作系统级别的问题。这可能包括:

  • 检查系统负载和进程状态。
  • 重新启动节点,解决临时问题。

四、总结

节点不健康的问题是 Kubernetes 运维中的常见挑战。通过系统化的排查步骤和针对性的解决方案,用户可以高效地定位和解决问题,确保集群的稳定运行。了解节点的健康状态以及如何进行有效的故障排查,将极大地提升运维效率和服务质量。掌握这些知识和技能,将使你在 Kubernetes 的管理和维护中更加游刃有余。


http://www.ppmy.cn/ops/126570.html

相关文章

Docker日志管理:深入理解docker logs命令

Docker容器技术已经成为现代应用开发和部署的主流方式。在使用Docker的过程中&#xff0c;日志管理是一个非常重要的话题。Docker提供了强大的日志管理功能&#xff0c;其中最常用的命令就是docker logs。本文将深入探讨docker logs命令的各个方面&#xff0c;帮助你更好地理解…

Python量化交易(一):量化投资基本概念

引言 大家好&#xff0c;我是GISer Liu&#x1f601;&#xff0c;一名热爱AI技术的GIS开发者。本系列文章是我跟随DataWhale 2024年10月学习赛的Python量化交易学习总结文档&#xff1b;在现代社会中&#xff0c;投资已成为个人、机构和政府追求财富增长和资源配置的重要方式。…

YOLOv11改进策略【卷积层】| ECCV-2024 Histogram Transformer Block 适用于噪声大,图像质量低的检测任务

一、本文介绍 本文记录的是利用直方图自注意力优化YOLOv11的目标检测方法研究。在目标检测任务中,清晰准确的图像对于目标检测至关重要,本文创新方法通过恢复图像质量,可以减少因图像质量低导致的误检和漏检,实现有效涨点。 专栏目录:YOLOv11改进目录一览 | 涉及卷积层、…

探索OpenCV的人脸检测:用Haar特征分类器识别图片中的人脸

目录 简介 OpenCV和Haar特征分类器 实现人脸检测 1. 导入所需库 2. 加载图片和Haar特征分类器 3. 检测人脸 4. 标注人脸 5. 显示 6、结果展示 结论 简介 在计算机视觉和图像处理领域&#xff0c;人脸识别是一项重要的技术。它不仅应用于安全监控、人机交互&#xff0…

LinkedList源码解读

这里写目录标题 简介源码解读基础变量构造函数LinkedList()LinkedList(Collection<? extends E> c) 总结 简介 LinkedList 是对 Java 集合框架中 List 接口的一种具体实现&#xff0c;归属于线性数据结构的范畴。其核心内部结构是通过双向链表&#xff08;double-linke…

Flink简介及小案例

Apache Flink 是一个用于分布式数据流处理的框架&#xff0c;常用于实时大数据处理和批处理。Flink 的操作可以分为两个方面&#xff1a;安装配置和编写任务代码。下面对这两块做一下简单的介绍。 1. 安装和配置 Flink (1) 下载并安装 Flink 从 Apache Flink 的官网上下载对…

zabbix 6.4主机名不支持中文的问题优化

zabbix 6.4主机名默认不支持中文&#xff0c;可以通过修改文件实现支持中文 vi /usr/share/zabbix/include/defines.inc.php 找到 define(ZBX_PREG_INTERNAL_NAMES, ([0-9a-zA-Z_\. \-])); // !!! Dont forget sync code with C !!! 修改为 define(ZBX_PREG_INTERNAL_NAMES, …

OpenHarmony 入门——ArkUI 自定义组件内同步的装饰器@State小结(二)

文章大纲 引言一、组件内状态装饰器State1、初始化2、使用规则3、变量的传递/访问规则说明4、支持的观察变化的场景5、State 变量的值初始化和更新机制6、State支持联合类型实例 引言 前一篇文章OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结&#xff08;一&…