
Kubernetes 集群中节点是承载工作负载(Pod)的物理机或虚拟机。节点的健康状态直接关系到整个集群的稳定性和应用的可用性。本文将介绍 Kubernetes 节点的核心管理概念,并深入探讨节点“未就绪”(NotReady)这一常见问题的处理流程。
Kubernetes 节点控制器会持续监控节点状态,并将其报告给 API Server。节点主要存在以下几种状态:
# 查看所有节点及其状态
kubectl get nodes
# 查看节点详细信息,包括IP地址、角色等
kubectl get nodes -o wide
# 获取特定节点的详细描述信息,包含事件、资源使用情况等
kubectl describe node <node-name># 封锁节点,停止在该节点上调度新Pod(现有Pod不受影响)
kubectl cordon <node-name>
# 驱逐节点上所有Pod(结合cordon使用,用于维护)
kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
# 解除节点封锁,恢复调度
kubectl uncordon <node-name>节点进入“NotReady”状态是运维中常见的问题,通常由以下原因导致:
1、系统资源耗尽:CPU、内存或磁盘空间不足。
2、核心组件故障:节点上的 kubelet 或 kube-proxy 进程异常退出或停止响应。
3、网络连接问题:节点与控制平面(Control Plane)之间的网络中断或不稳定。
4、操作系统或硬件问题:内核崩溃、硬件故障等。
以下是一个系统性的排查流程,适用于大多数“NotReady”场景。
首先,确认节点确实处于“NotReady”状态,并获取其基本信息。
# 确认节点状态
kubectl get nodes
# 输出示例:
# NAME STATUS ROLES AGE VERSION
# node-worker1 NotReady <none> 15d v1.28.4
# node-master Ready control-plane 30d v1.28.4
# 获取节点详细描述,重点关注 `Conditions` 和 `Events` 部分
kubectl describe node node-worker1在 describe 命令的输出中, Conditions 部分会显示 MemoryPressure 、 DiskPressure 、 PIDPressure 等条件,这些是判断资源是否耗尽的关键。 Events 部分则记录了节点状态变化的相关事件。
通过 SSH 等方式登录到问题节点,进行现场排查。
ssh user@node-worker1-ip-address在节点上,检查 kubelet 和 kube-proxy (如果以系统服务形式运行)的状态。
# 检查 kubelet 服务状态(适用于 systemd 系统)
sudo systemctl status kubelet
# 查看 kubelet 服务日志
sudo journalctl -u kubelet -f --since "10 minutes ago"
# 检查 kube-proxy 状态(通常以 Pod 形式运行,但服务模式也需检查)
sudo systemctl status kube-proxy # 如果以服务形式存在如果服务处于 inactive 或 failed 状态,尝试重启服务。
sudo systemctl restart kubelet
sudo systemctl restart kube-proxy # 如果适用检查节点的资源使用情况和系统日志,寻找异常。
# 查看实时资源使用情况(CPU、内存)
top
# 查看磁盘空间使用情况
df -h
# 查看系统日志,过滤 kubelet 相关错误
sudo tail -100f /var/log/syslog | grep kubelet
# 或使用 journalctl 查看内核和系统日志
sudo journalctl -xe | grep -E "(kubelet|Out of memory|Killed process)"从控制平面节点或集群内部其他 Pod,测试到问题节点的网络连通性。
# 首先获取问题节点的内部IP
kubectl get node node-worker1 -o wide | awk '{print $6}'
# 在控制平面节点或一个工具Pod中,测试连通性
# 使用 kubectl run 创建一个临时调试 Pod
kubectl run -it --rm debug-pod --image=busybox --restart=Never -- sh
# 进入 Pod 后,ping 问题节点IP
ping <node-worker1-internal-ip>
# 测试到 kubelet 端口(默认10250)的连通性
telnet <node-worker1-internal-ip> 10250有时问题可能源于控制平面组件,如 kube-proxy Pod 异常。
# 检查 kube-system 命名空间中所有 Pod 的状态
kubectl get pods -n kube-system -o wide
# 查看异常的 kube-proxy Pod 日志
kubectl logs -n kube-system <kube-proxy-pod-name-on-node-worker1>如果以上步骤未能定位问题,可以进行更深入的诊断。
sudo systemctl status containerd
sudo ctr --address /run/containerd/containerd.sock versionsudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates# 在控制平面节点上,驱逐并删除节点
kubectl drain node-worker1 --ignore-daemonsets --delete-emptydir-data
kubectl delete node node-worker1
# 在问题节点上,重置 kubeadm 加入状态(如果使用 kubeadm)
sudo kubeadm reset -f
# 然后根据集群初始化时的命令重新加入
# sudo kubeadm join ...1、资源监控与告警:部署 Prometheus 和 Grafana 等监控工具,对节点的 CPU、内存、磁盘使用率设置告警阈值。
2、合理的资源规划与请求/限制:为 Pod 设置合理的 requests 和 limits ,防止单个 Pod 耗尽节点资源。
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app
image: my-app:latest
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"3、使用节点自动伸缩:在云环境中,配置 Cluster Autoscaler,在资源不足时自动添加新节点。
4、保持 Kubernetes 组件版本一致:确保集群内 kubelet 、 kube-proxy 等组件版本与控制平面兼容,并及时升级到稳定版本。
5、定期维护与健康检查:通过 CronJob 定期执行节点健康检查脚本。
apiVersion: batch/v1
kind: CronJob
metadata:
name: node-health-check
spec:
schedule: "0 */6 * * *" # 每6小时运行一次
jobTemplate:
spec:
template:
spec:
containers:
- name: check
image: curlimages/curl
command:
- /bin/sh
- -c
- |
# 这里可以编写检查节点核心服务、磁盘、网络的脚本
echo "Performing node health check..."
restartPolicy: OnFailureKubernetes 节点管理是集群稳定运行的基石。熟练掌握 kubectl 节点管理命令,理解节点状态的含义,是日常运维的基础。当遇到节点“NotReady”问题时,遵循从状态确认、服务检查、资源诊断到网络验证的系统性排查流程,可以高效地定位并解决大多数故障。同时,通过实施监控告警、资源规划等预防性最佳实践,能显著降低此类问题的发生频率,保障业务应用的持续可用性。
“无他,惟手熟尔”!有需要的用起来!
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!