k8s 排查集群中故障节点
在 Kubernetes 集群中,故障节点可能导致 Pod 无法正常运行或资源分配异常。以下是排查集群中故障节点的常用方法:
1. 使用 kubectl get nodes
查看节点状态
首先检查所有节点的健康状态,kubectl get nodes
命令会显示集群中所有节点的状态。
kubectl get nodes
输出示例:
NAME STATUS ROLES AGE VERSION
node1 Ready <role> 10d v1.24.0
node2 NotReady <role> 10d v1.24.0
- STATUS 列:节点状态,包括
Ready
、NotReady
、Unknown
等。如果节点处于NotReady
或Unknown
状态,可能存在网络、资源或节点本身的问题。
2. 查看节点详细信息和事件
kubectl describe node <node-name>
命令可用于查看故障节点的详细信息和事件日志。
kubectl describe node <node-name>
在输出中查找 Conditions
和 Events
部分,观察是否存在以下常见问题:
- OutOfDisk:磁盘空间不足。
- MemoryPressure:内存压力过大,节点内存不足。
- DiskPressure:磁盘 I/O 压力过高。
- PIDPressure:进程数过多,节点已超出系统允许的最大 PID。
- NetworkUnavailable:节点网络不可用,可能是网络插件或连接问题。
3. 检查节点上的关键服务状态
Kubernetes 节点需要关键服务保持正常运行。使用 SSH 登录到节点,检查以下关键服务的状态:
# 检查 kubelet 服务
systemctl status kubelet
# 检查容器运行时(如 Docker 或 containerd)
systemctl status docker # 若使用 Docker
systemctl status containerd # 若使用 containerd
确保 kubelet
和容器运行时服务都在运行。如果服务出现故障,可以尝试重启:
sudo systemctl restart kubelet
sudo systemctl restart docker # 或 containerd
4. 查看节点的资源使用情况
使用 kubectl top nodes
查看每个节点的 CPU 和内存使用情况,以检查资源是否耗尽。
kubectl top nodes
如果某些节点的资源使用率极高(接近 100%),则可能会导致 Pod 调度失败或节点变为 NotReady
状态。
5. 查看网络插件日志
如果 kubectl describe node
显示 NetworkUnavailable
或节点连接中断,可能与网络插件有关(如 Calico、Flannel 等)。检查网络插件的 Pod 日志:
kubectl -n kube-system get pods | grep calico # 查找网络插件 Pod
kubectl -n kube-system logs <network-plugin-pod-name> # 查看网络插件日志
6. 检查节点上的 kubelet 日志
kubelet 是节点管理服务,其日志可以帮助定位问题。在节点上使用以下命令查看 kubelet 的日志:
journalctl -u kubelet -f
日志中查看是否有错误或告警信息,例如认证失败、资源不可用或节点连接问题。
7. 检查网络连接
网络连接问题可能会导致节点状态异常。可以在节点上使用 ping
或 curl
命令检查节点与主节点(如 apiserver
)的网络连通性。
ping <master-node-ip>
curl -k https://<master-node-ip>:6443/healthz # 检查 apiserver 健康状态
8. 检查节点的容器日志
如果某些节点上的 Pod 异常,可以查看其容器日志,定位 Pod 运行异常的原因:
kubectl logs <pod-name> -n <namespace> -c <container-name>
9. 重新标记节点(若节点恢复正常)
如果节点恢复正常,但仍显示 NotReady
,可以先将节点标记为不可调度(cordon
)再恢复:
kubectl cordon <node-name> # 暂时标记节点为不可调度
kubectl uncordon <node-name> # 恢复节点为可调度
总结
通过上述方法可以排查出节点故障原因,比如资源耗尽、服务故障、网络中断等。根据具体问题采取相应的措施,如重启服务、增加资源、调整网络配置等,从而恢复节点正常状态。