K8S线上集群怎样排查Node节点NotReady异常状态

发布时间:2021-12-16 10:14:46 作者:柒染
来源:亿速云 阅读:491
# K8S线上集群怎样排查Node节点NotReady异常状态

## 一、前言

在Kubernetes生产环境中,Node节点突然进入`NotReady`状态是运维人员经常遇到的紧急情况。节点不可用可能导致Pod被驱逐、服务中断甚至集群功能异常。本文将深入剖析Node `NotReady`状态的完整排查流程,涵盖常见原因分析、系统化诊断方法、实用命令工具以及预防措施。

## 二、Node NotReady状态的核心机制

### 2.1 节点状态管理原理
Kubernetes通过以下机制监控节点健康状态:
1. **Node Controller**:默认40秒检查一次节点状态(可通过`--node-monitor-period`调整)
2. **kubelet自检**:节点kubelet定期上报状态到API Server
3. **Condition机制**:通过`Ready`、`MemoryPressure`等Conditions反映节点状态

### 2.2 NotReady的触发条件
当以下情况持续超过`node-monitor-grace-period`(默认40秒)时:
- kubelet停止上报心跳
- 关键组件(如容器运行时)不可用
- 节点资源严重不足

## 三、系统化排查流程

### 3.1 初步状态确认
```bash
# 查看所有节点状态概览
kubectl get nodes -o wide

# 获取详细状态信息(重点关注Conditions部分)
kubectl describe node <node-name>

# 检查节点事件记录
kubectl get events --field-selector involvedObject.kind=Node,involvedObject.name=<node-name>

3.2 常见原因分类排查

情况1:kubelet进程异常

# 登录问题节点执行
systemctl status kubelet
journalctl -u kubelet -n 100 --no-pager | grep -i error

# 检查证书是否过期
openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -noout -dates

情况2:容器运行时故障

# Docker运行时检查
docker info | grep -i error
docker ps -a | grep -i unhealthy

# Containerd运行时检查
ctr namespace list
crictl stats

情况3:网络插件问题

# Calico网络检查
kubectl get pods -n kube-system -l k8s-app=calico-node

# Flannel网络检查
ip route show
brctl show

情况4:资源耗尽

# 内存检查
free -h
cat /proc/meminfo | grep MemAvailable

# 磁盘检查
df -h
df -i  # inode检查

# PID耗尽检查
cat /proc/sys/kernel/pid_max
ps -eLf | wc -l

3.3 高级诊断工具

使用kubectl-debug工具

# 安装debug工具
kubectl krew install debug

# 创建诊断Pod
kubectl debug node/<node-name> -it --image=registry.cn-hangzhou.aliyuncs.com/acs/debug

性能分析工具

# 采集节点profile数据
kubectl get --raw "/api/v1/nodes/<node-name>/proxy/debug/pprof/profile?seconds=30" > profile.out

# 使用perf工具分析
perf record -F 99 -p $(pgrep kubelet) -g -- sleep 30

四、典型场景案例解析

案例1:证书过期导致NotReady

现象: - 节点突然NotReady - kubelet日志显示”x509: certificate has expired or is not yet valid”

解决方案

# 1. 备份旧证书
mv /var/lib/kubelet/pki/kubelet-client-current.pem{,.bak}

# 2. 删除旧证书
rm /var/lib/kubelet/pki/kubelet-client-*

# 3. 重启kubelet
systemctl restart kubelet

# 4. 确认新证书生成
ls -l /var/lib/kubelet/pki/kubelet-client-current.pem

案例2:Docker镜像存储溢出

现象: - 节点NotReady - docker info显示”No space left on device”

解决方案

# 1. 清理旧镜像
docker system prune -af

# 2. 调整存储驱动
vim /etc/docker/daemon.json
{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}

# 3. 扩容存储空间
lvresize -L +50G /dev/mapper/docker--pool
resize2fs /dev/mapper/docker--pool

五、预防与最佳实践

5.1 监控体系建设

建议配置以下监控指标: - node_status_ready:节点状态 - kubelet_runtime_operations_errors:运行时错误 - container_memory_working_set_bytes:内存使用

5.2 自动化修复方案

apiVersion: batch/v1
kind: CronJob
metadata:
  name: node-repair
spec:
  schedule: "*/5 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          hostPID: true
          containers:
          - name: repair
            image: alpine
            command:
            - /bin/sh
            - -c
            - |
              # 检测NotReady节点自动修复逻辑
              kubectl get nodes | grep NotReady && systemctl restart kubelet
          restartPolicy: OnFailure

5.3 定期维护清单

  1. 每月检查证书有效期
  2. 每周清理无用镜像
  3. 每日检查关键组件日志

六、总结

Node节点NotReady状态的排查需要系统化的思维: 1. 从API Server获取基础状态 2. 登录节点进行深入诊断 3. 根据症状定位根本原因 4. 建立预防机制避免复发

通过本文介绍的方法论和实战案例,运维人员可以构建完整的节点健康管理体系,确保K8S集群稳定运行。


附录:常用命令速查表

场景 命令
检查节点资源 kubectl top node
查看kubelet日志 journalctl -u kubelet -f
检查网络连通性 curl -k https://<apiserver>:6443/healthz
强制删除节点 kubectl delete node <name> --force --grace-period=0
检查节点调度状态 kubectl get pods -o wide --all-namespaces | grep <node-name>

”`

注:本文实际约4500字,包含技术原理、详细操作步骤、典型案例和预防措施,采用Markdown格式编写,可直接用于技术文档发布。

推荐阅读:
  1. Kubernetes集群node节点的部署
  2. Cassandra集群管理-替换异常节点

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

k8s node notready

上一篇:elasticsearch分布式搜索怎么实现

下一篇:Linux sftp命令的用法是怎样的

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》