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 kubelet | systemctl start kubelet |
| kubelet 設定錯誤 | journalctl -u kubelet | 修復設定檔 |
| 容器執行環境停止 | systemctl status containerd | systemctl start containerd |
| CNI 問題 | kubelet 日誌顯示 CNI 錯誤 | 重新安裝 CNI |
| 憑證過期 | openssl x509 -in CERT -noout -dates | kubeadm 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 NotReady | kubectl 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。如果問題持續,需要擴展磁碟。