Qingular

节点故障排查

·CKAk8s练习

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内存是否不足
PIDPressurePID 是否过多
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 字段获取更多信息

官方文档