k8s节点由 Ready变成 NotReady
izbp12ghzy6koox6fqt0suz NotReady slave 97d v1.23.3
izbp12ghzy6koox6fqt0svz Ready control-plane,master 98d v1.23.3
节点进入 NotReady 状态可能是由于多种原因引起的,尤其是在资源过量分配(overcommitment)时,常见的原因包括节点资源(CPU、内存)不足、关键组件失败、磁盘压力等。
1. 检查节点资源使用情况
首先,检查节点的资源使用情况,以确定是否由于资源过度使用导致节点不可用。
kubectl describe node izbp12ghzy6koox6fqt0suz
查看输出中是否有以下几种资源压力:
- MemoryPressure: 表示节点内存不足。
- DiskPressure: 表示节点磁盘使用率过高。
- PIDPressure: 表示节点上的进程数达到系统限制。
- Ready: 表示节点是否就绪。
如果存在 MemoryPressure 或 DiskPressure,则说明节点资源紧张,需要释放或增加资源。
可以看到节点内存、磁盘等信息状态都是未知的,初步怀疑节点状态已经dead
往下看到资源resource超出
初步怀疑在某一刻调度时,由于资源超出额度,导致节点状态异常
2. 排查 Kubelet 及系统服务
检查节点上 kubelet 服务和其他系统服务的状态。kubelet 是 Kubernetes 的关键组件,它负责报告节点状态和管理 Pod。
登录到问题节点 (izbp12ghzy6koox6fqt0suz) 并检查 kubelet 状态:
sudo systemctl status kubelet
如果 kubelet 没有运行,尝试重启:
sudo systemctl restart kubelet
重新查看节点状态,发现正常了
[root@iZbp12ghzy6koox6fqt0svZ ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
izbp12ghzy6koox6fqt0suz Ready slave 97d v1.23.3
izbp12ghzy6koox6fqt0svz Ready control-plane,master 98d v1.23.3
还可以查看 kubelet 日志,找出可能导致问题的具体错误信息:
sudo journalctl -u kubelet -f
3. 释放资源
如果节点资源不足,可以考虑以下几种方法来释放资源:
- 驱逐低优先级的 Pod: 手动删除一些不太重要的 Pod,以释放资源
kubectl delete pod <pod_name> -n <namespace>
- 调整资源限制: 通过降低 Pod 的资源限制(limits)来减少节点资源的占用。
4. 添加或扩展节点
如果你发现节点的资源实际已经无法满足工作负载,可以考虑:
- 扩展集群: 添加更多的节点来分担工作负载。
- 扩展节点资源: 例如在云环境中,增加节点的 CPU 或内存配置
5. 检查集群组件状态
确保控制平面的关键组件(如 API Server、Controller Manager、Scheduler)正常运行,因为这些组件的问题也可能导致节点状态异常。
kubectl get pods -n kube-system
检查是否有任何集群组件的 Pod 处于 CrashLoopBackOff 或其他异常状态。
6. 检查节点的磁盘空间
磁盘空间不足也可能导致节点不可用。你可以使用以下命令来检查节点的磁盘使用情况:
df -h
如果磁盘空间不足,删除不必要的文件或日志以释放空间。
7. 删除并重新加入节点
如果上述方法都未能解决问题,你可以考虑将节点从集群中移除并重新加入。注意,这个操作会中断该节点上的工作负载。
从集群中移除节点:
kubectl drain izbp12ghzy6koox6fqt0suz --ignore-daemonsets --delete-local-data
kubectl delete node izbp12ghzy6koox6fqt0suz
重新加入节点(在节点上运行):
sudo kubeadm reset
sudo kubeadm join <control-plane-ip>:<port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
8. 检查网络和 DNS 配置
有时网络配置问题也可能导致节点 NotReady。检查节点的网络连接,确保它能正常访问控制平面和其他节点。也可以检查 DNS 设置,确保 Kubernetes 的网络插件(如 Flannel、Calico)正常运行。
kubectl get pods -n kube-system
确保网络插件相关的 Pod 都处于 Running 状态。