k8s 排查集群中故障节点

在 Kubernetes 集群中,故障节点可能导致 Pod 无法正常运行或资源分配异常。以下是排查集群中故障节点的常用方法:

1. 使用 kubectl get nodes 查看节点状态

首先检查所有节点的健康状态,kubectl get nodes 命令会显示集群中所有节点的状态。

bash 复制代码
kubectl get nodes

输出示例:

plaintext 复制代码
NAME          STATUS     ROLES    AGE     VERSION
node1         Ready      <role>   10d     v1.24.0
node2         NotReady   <role>   10d     v1.24.0
  • STATUS 列 :节点状态,包括 ReadyNotReadyUnknown 等。如果节点处于 NotReadyUnknown 状态,可能存在网络、资源或节点本身的问题。

2. 查看节点详细信息和事件

kubectl describe node <node-name> 命令可用于查看故障节点的详细信息和事件日志。

bash 复制代码
kubectl describe node <node-name>

在输出中查找 ConditionsEvents 部分,观察是否存在以下常见问题:

  • OutOfDisk:磁盘空间不足。
  • MemoryPressure:内存压力过大,节点内存不足。
  • DiskPressure:磁盘 I/O 压力过高。
  • PIDPressure:进程数过多,节点已超出系统允许的最大 PID。
  • NetworkUnavailable:节点网络不可用,可能是网络插件或连接问题。

3. 检查节点上的关键服务状态

Kubernetes 节点需要关键服务保持正常运行。使用 SSH 登录到节点,检查以下关键服务的状态:

bash 复制代码
# 检查 kubelet 服务
systemctl status kubelet

# 检查容器运行时(如 Docker 或 containerd)
systemctl status docker  # 若使用 Docker
systemctl status containerd  # 若使用 containerd

确保 kubelet 和容器运行时服务都在运行。如果服务出现故障,可以尝试重启:

bash 复制代码
sudo systemctl restart kubelet
sudo systemctl restart docker  # 或 containerd

4. 查看节点的资源使用情况

使用 kubectl top nodes 查看每个节点的 CPU 和内存使用情况,以检查资源是否耗尽。

bash 复制代码
kubectl top nodes

如果某些节点的资源使用率极高(接近 100%),则可能会导致 Pod 调度失败或节点变为 NotReady 状态。

5. 查看网络插件日志

如果 kubectl describe node 显示 NetworkUnavailable 或节点连接中断,可能与网络插件有关(如 Calico、Flannel 等)。检查网络插件的 Pod 日志:

bash 复制代码
kubectl -n kube-system get pods | grep calico  # 查找网络插件 Pod
kubectl -n kube-system logs <network-plugin-pod-name>  # 查看网络插件日志

6. 检查节点上的 kubelet 日志

kubelet 是节点管理服务,其日志可以帮助定位问题。在节点上使用以下命令查看 kubelet 的日志:

bash 复制代码
journalctl -u kubelet -f

日志中查看是否有错误或告警信息,例如认证失败、资源不可用或节点连接问题。

7. 检查网络连接

网络连接问题可能会导致节点状态异常。可以在节点上使用 pingcurl 命令检查节点与主节点(如 apiserver)的网络连通性。

bash 复制代码
ping <master-node-ip>
curl -k https://<master-node-ip>:6443/healthz  # 检查 apiserver 健康状态

8. 检查节点的容器日志

如果某些节点上的 Pod 异常,可以查看其容器日志,定位 Pod 运行异常的原因:

bash 复制代码
kubectl logs <pod-name> -n <namespace> -c <container-name>

9. 重新标记节点(若节点恢复正常)

如果节点恢复正常,但仍显示 NotReady,可以先将节点标记为不可调度(cordon)再恢复:

bash 复制代码
kubectl cordon <node-name>    # 暂时标记节点为不可调度
kubectl uncordon <node-name>  # 恢复节点为可调度

总结

通过上述方法可以排查出节点故障原因,比如资源耗尽、服务故障、网络中断等。根据具体问题采取相应的措施,如重启服务、增加资源、调整网络配置等,从而恢复节点正常状态。

相关推荐
the丶only36 分钟前
单点登录平台Casdoor搭建与使用,集成gitlab同步创建删除账号
linux·运维·服务器·docker·gitlab
ccubee1 小时前
docker 安装 ftp
运维·docker·容器
枫叶红花1 小时前
【Linux系统编程】:信号(2)——信号的产生
linux·运维·服务器
yaosheng_VALVE2 小时前
探究全金属硬密封蝶阀的奥秘-耀圣控制
运维·eclipse·自动化·pyqt·1024程序员节
dami_king2 小时前
SSH特性|组成|SSH是什么?
运维·ssh·1024程序员节
探索云原生2 小时前
在 K8S 中创建 Pod 是如何使用到 GPU 的: nvidia device plugin 源码分析
ai·云原生·kubernetes·go·gpu
启明真纳2 小时前
elasticache备份
运维·elasticsearch·云原生·kubernetes
苹果醋32 小时前
SpringBoot快速入门
java·运维·spring boot·mysql·nginx
TsengOnce3 小时前
Docker 安装 禅道-21.2版本-外部数据库模式
运维·docker·容器
永卿0013 小时前
nginx学习总结(不包含安装过程)
运维·nginx·负载均衡