节点故障排查
CKA 考试 Domain 5 — 节点 NotReady 排查、kubelet 检查、系统资源排查、证书处理
← 返回 CKA 练习目录 节点是 Kubernetes 集群的工作节点,节点故障直接影响 Pod 运行。CKA 考试中节点故障排查是高频考点。
1. Node NotReady 状态排查流程
# 1. 查看节点状态
kubectl get nodes
# 2. 查看节点详情(查找 Conditions 部分)
kubectl describe node <node-name>
# 3. SSH 登录到问题节点
ssh <user>@<node-ip>
# 4. 检查 kubelet 状态
sudo systemctl status kubelet
# 5. 查看 kubelet 日志
sudo journalctl -u kubelet -n 100 --no-pager
# 6. 检查容器运行时
sudo systemctl status containerd
# 或
sudo systemctl status docker
排查流程图:
Node NotReady
│
├─ SSH to node
│
├─ systemctl status kubelet
│ ├─ inactive → systemctl start kubelet
│ └─ active → 检查日志
│
├─ journalctl -u kubelet -n 50
│ ├─ 证书错误 → 检查证书
│ ├─ 网络插件错误 → 检查 CNI
│ └─ 资源不足 → 检查系统资源
│
├─ 检查磁盘空间
├─ 检查内存
└─ 检查容器运行时
2. kubelet 状态检查
# 查看 kubelet 服务状态
sudo systemctl status kubelet
# 启动/停止/重启 kubelet
sudo systemctl start kubelet
sudo systemctl stop kubelet
sudo systemctl restart kubelet
# 设置开机自启
sudo systemctl enable kubelet
3. kubelet 日志查看
# 查看最近 kubelet 日志(推荐)
sudo journalctl -u kubelet -n 100 -f
# 查看指定时间范围的日志
sudo journalctl -u kubelet --since "5 min ago"
# 查看所有日志(翻页)
sudo journalctl -u kubelet --no-pager
# 将日志输出到文件分析
sudo journalctl -u kubelet --no-pager > /tmp/kubelet.log
4. kubelet 配置检查
# 查看 kubelet 配置(kubeadm 部署)
kubectl get nodes -o wide
cat /var/lib/kubelet/config.yaml
# kubelet 启动参数
cat /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 或
ps aux | grep kubelet
# 检查 kubelet 证书
ls /var/lib/kubelet/pki/
5. 系统资源排查
磁盘空间
# 检查磁盘使用率
df -h
# 检查 /var 目录(Docker/containerd 镜像存储)
du -sh /var/lib/containerd/
du -sh /var/lib/docker/
# 清理不用的容器镜像
docker image prune -a
# 或
crictl rmi --prune
内存使用
# 检查内存
free -h
# 查看占用内存的进程
top
# 或
htop
Docker / containerd 状态
# containerd(新版本)
sudo systemctl status containerd
sudo crictl ps
# Docker(旧版本)
sudo systemctl status docker
sudo docker ps
6. 节点证书过期处理
# 检查证书有效期(kubeadm 部署)
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates
openssl x509 -in /var/lib/kubelet/pki/kubelet.crt -noout -dates
# kubeadm 更新证书
sudo kubeadm certs renew all
# 更新 kubeconfig
sudo kubeadm init phase kubeconfig all
# 重启 kubelet
sudo systemctl restart kubelet
# 检查证书过期时间
kubeadm certs check-expiration
7. kubectl describe node 查看节点详情
# 全面查看节点信息
kubectl describe node <node-name>
# 重点关注
# - Conditions: Ready, DiskPressure, MemoryPressure, PIDPressure
# - Capacity / Allocatable: CPU, 内存, Pod 数量
# - Non-terminated Pods: 该节点上运行的 Pod
# - Events: 节点相关事件
Conditions 解释:
| Condition | 说明 |
|---|---|
Ready | 节点是否正常 |
DiskPressure | 磁盘空间是否不足 |
MemoryPressure | 内存是否不足 |
PIDPressure | PID 是否过多 |
NetworkUnavailable | 网络是否正常 |
8. 节点恢复步骤
# Step 1: SSH 到节点排查
ssh <user>@<node-ip>
# Step 2: 重启 kubelet
sudo systemctl restart kubelet
# Step 3: 验证 kubelet 状态
sudo systemctl status kubelet
# Step 4: 回到 master 验证节点
kubectl get nodes
kubectl describe node <node-name>
# Step 5: 如果节点仍不可用,尝试 cordon/drain
kubectl cordon <node-name> # 标记为不可调度
kubectl drain <node-name> --ignore-daemonsets # 驱逐 Pod
9. 考试要点
- 节点 NotReady 时,第一步是 SSH 登录节点
journalctl -u kubelet是最重要的诊断命令- 磁盘满(
/var目录)是常见故障原因 - 证书过期后使用
kubeadm certs renew all更新 kubectl describe node中的 Condition 字段是定位问题的关键- 考试环境不支持重启节点,重点关注 kubelet 重启
🧪 完整操作实例:排查 Node NotReady 故障
场景描述
模拟一个节点变为 NotReady 状态,从查看节点状态、SSH 登录节点、检查 kubelet 日志到最终恢复的完整排查流程。
前置条件
- 一个有 Master 和 Worker 节点的集群
- 有 Worker 节点的 SSH 访问权限
- 节点上使用 systemd 管理 kubelet
操作步骤
Step 1: 发现节点状态异常
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# master-node Ready control-plane 10d v1.28.0
# worker-node1 NotReady <none> 10d v1.28.0
Step 2: 查看节点详细信息找到排查线索
kubectl describe node worker-node1
# ...
# Conditions:
# Type Status LastHeartbeatTime Reason
# ---- ------ ----------------- ------
# Ready Unknown 2026-05-27T10:00:00Z NodeStatusUnknown
# ...
# Message: Kubelet stopped posting node status.
Step 3: SSH 到问题节点并检查 kubelet 状态
ssh worker-node1
sudo systemctl status kubelet
# ● kubelet.service - kubelet: The Kubernetes Node Agent
# Loaded: loaded (/usr/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
# Active: inactive (dead) ← kubelet 未运行
Step 4: 查看 kubelet 日志确定故障原因
sudo journalctl -u kubelet -n 50 --no-pager
# May 27 09:55:00 worker-node1 kubelet[1234]: E0527 09:55:00.123456 1234 kubelet.go:1234] "Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"systemd\" is different from docker cgroup driver: \"cgroupfs\""
# May 27 09:55:00 worker-node1 systemd[1]: kubelet.service: Main process exited, code=exited, status=1/FAILURE
Step 5: 检查系统资源(磁盘空间和容器运行时)
# 检查磁盘空间
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 12G 35G 26% /
# → 磁盘空间充足
# 检查容器运行时
sudo systemctl status containerd
# ● containerd.service - Container Runtime
# Active: active (running)
# → 容器运行时正常
Step 6: 修复配置并重启 kubelet
# 根据日志修改 cgroup driver 配置
# 编辑 kubelet 配置文件(此处演示修复后直接启动)
sudo systemctl start kubelet
# 检查启动状态
sudo systemctl status kubelet
# ● kubelet.service - kubelet: The Kubernetes Node Agent
# Active: active (running) ← 现在已启动
# 设置开机自启(确保重启后自动启动)
sudo systemctl enable kubelet
Step 7: 回到 Master 节点验证恢复
exit
# 回到 Master 节点
kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# master-node Ready control-plane 10d v1.28.0
# worker-node1 Ready <none> 10d v1.28.0
# → 节点恢复正常
验证结果
# 验证节点 Ready 状态
kubectl get nodes worker-node1 -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'
# True
# 验证 kubelet 运行正常
ssh worker-node1 'sudo systemctl is-active kubelet'
# active
# 确认节点上的 Pod 恢复正常
kubectl get pods -o wide --field-selector spec.nodeName=worker-node1
考试提示
- Node NotReady 时第一步 SSH 登录节点,检查
systemctl status kubelet journalctl -u kubelet -n 50是最关键的诊断命令,可以看到具体错误信息- 常见原因:kubelet 未运行、磁盘满(
df -h)、证书过期、容器运行时异常 - 修复后执行
systemctl restart kubelet,然后回到 Master 用kubectl get nodes验证 - 如果节点持续 NotReady,检查
kubectl describe node的 Conditions 字段获取更多信息