Chuyển đến nội dung chính

第10課:節點故障排除

Node NotReady 診斷。kubelet 故障排除。 憑證過期、磁碟壓力、記憶體壓力。CKA 考試中的節點除錯。

節點故障排除流程 — NotReady 診斷

1. Node NotReady — 常見原因

kubectl get nodes
# NAME         STATUS     ROLES           AGE   VERSION
# worker1      NotReady             30d   v1.30.0

# 診斷步驟:
kubectl describe node worker1
# 查看 Conditions:
#   Ready            False    ← 問題
#   MemoryPressure   False
#   DiskPressure     False
#   PIDPressure      False
NotReady 原因診斷修復
kubelet 停止systemctl status kubeletsystemctl start kubelet
kubelet 設定錯誤journalctl -u kubelet修復設定檔
容器執行環境停止systemctl status containerdsystemctl start containerd
CNI 問題kubelet 日誌顯示 CNI 錯誤重新安裝 CNI
憑證過期openssl x509 -in CERT -noout -dateskubeadm certs renew

2. kubelet 故障排除

# SSH 到有問題的節點
ssh worker1

# 檢查 kubelet 服務狀態
systemctl status kubelet
# Active: inactive (dead) ← 問題!

# 查看 kubelet 日誌
journalctl -u kubelet -f
journalctl -u kubelet --since "10 minutes ago"

# 常見錯誤訊息:
# "failed to load kubelet config file" → 設定路徑錯誤
# "unable to load client CA file" → 憑證路徑錯誤
# "failed to run Kubelet: running with swap on is not supported" → swap 未關閉

# 重新啟動 kubelet
systemctl daemon-reload
systemctl restart kubelet
systemctl enable kubelet

3. 磁碟與記憶體壓力

# 檢查節點條件
kubectl describe node worker1 | grep -A5 Conditions

# DiskPressure:
# kubelet 預設閾值:可用磁碟 < 10%
df -h   # 檢查磁碟使用量
# 清理不用的映像檔
crictl rmi --prune

# MemoryPressure:
# kubelet 預設閾值:可用記憶體 < 100Mi
free -h  # 檢查記憶體使用量

# PIDPressure:
# 進程數超過限制
ps aux | wc -l

4. 憑證過期

# 檢查叢集憑證有效期
kubeadm certs check-expiration

# 檢查特定憑證
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -dates

# 更新所有憑證
kubeadm certs renew all
systemctl restart kubelet

5. 速查表

症狀診斷指令
Node NotReadykubectl describe node NAME
kubelet 無法啟動systemctl status kubelet + journalctl -u kubelet
憑證過期kubeadm certs check-expiration
磁碟壓力df -h + crictl rmi --prune
containerd 狀態systemctl status containerd

6. 練習題

Q1:worker1 節點的狀態是 NotReady。SSH 到節點後 systemctl status kubelet 顯示 "inactive (dead)"。下一步應該做什麼?

  • A) 刪除節點
  • B) 查看 kubelet 日誌(journalctl -u kubelet),找出啟動失敗的原因 ✓
  • C) 直接重新安裝 kubelet
  • D) 執行 kubectl uncordon worker1

解析:kubelet 未運行時,先用 journalctl 查看日誌找出原因。可能是設定錯誤、憑證問題、swap 未關閉等。盲目重啟可能無法解決根本問題。

Q2:kubelet 日誌顯示 "failed to run Kubelet: running with swap on is not supported"。如何解決?

  • A) 更新 kubelet 版本
  • B) 關閉 swap(swapoff -a)並修改 /etc/fstab 永久關閉 ✓
  • C) 增加節點記憶體
  • D) 重新安裝 containerd

解析:Kubernetes 預設不支援 swap。執行 swapoff -a 臨時關閉,修改 /etc/fstab 註解掉 swap 行以永久關閉。K8s 1.28+ 可以啟用 swap 支援但非預設。

Q3:kubectl describe node 顯示 DiskPressure: True。最適當的初步處理是?

  • A) 增加新的磁碟
  • B) 清理不用的容器映像檔和日誌以釋放磁碟空間 ✓
  • C) 增加記憶體
  • D) 重新啟動叢集

解析:DiskPressure 表示磁碟空間不足。初步處理:使用 crictl rmi --prune 清除未使用的映像檔、清理容器日誌(/var/log/containers/)、清除已終止的 Pod。如果問題持續,需要擴展磁碟。