身為數位牧場主,最怕的就是半夜被叫起來處理突發狀況!今天我們要建立完整的故障診斷工具箱,學會快速定位問題的系統性方法。這些都是來自地端環境的實戰經驗,讓各位牧場主在面對各種疑難雜症時能夠冷靜應對,快速找到問題根源並解決。不再是無頭蒼蠅亂撞,而是有系統、有方法的專業排查!
工欲善其事,必先利其器。以下是地端環境必備的診斷工具:
強烈建議:用 DaemonSet 在每個節點部署一個專門用來 debug 的 Pod,這樣就不用每次都 SSH 到節點上了!可以使用 nicolaka/netshoot 這種包含各種網路診斷工具的映像檔,設定 hostNetwork 和 privileged 權限來存取節點網路。
在網路隔離的環境中絕對必備!有些公司無法從辦公室直接連到 server,純 terminal 介面就是救星。
安裝與使用:
# 安裝 k9s
curl -sS https://webinstall.dev/k9s | bash
# 啟動並連接到叢集
k9s
核心功能:
公司使用需要付費,不然就用 FreeLens。視覺化界面對複雜問題診斷很有幫助。
可以安裝各種實用插件,但討厭的 Windows 幾乎都不支援!真的要用可以考慮在 WSL 環境。好懷念用 MacBook 工作的日子...
有用的插件:
# 安裝 krew
kubectl krew install krew
# 實用插件
kubectl krew install ctx # 切換 context
kubectl krew install ns # 切換 namespace
kubectl krew install konfig # 管理多叢集 kubeconfig
當你要管理數十座 clusters 時,Rancher 會產生一堆 kubeconfig 需要管理,konfig 可以自動化整理成同一份檔案。
# 透過 krew 安裝
kubectl krew install konfig
# 合併多個 kubeconfig
kubectl konfig merge config1.yaml config2.yaml
網路問題分為兩大類,診斷方法不同:
診斷步驟:
基本連線測試
# 測試基本連線
ping 8.8.8.8
telnet google.com 443
如果連線失敗,通常是公司防火牆政策限制,需要聯繫網管開通相關端口或加入白名單。
DNS 解析檢查
# 測試 DNS 解析
dig google.com
nslookup kubernetes.io
# 檢查 DNS 配置
cat /etc/resolv.conf
系統性診斷流程:
基本網路測試
# 在問題 Pod 中測試
kubectl exec -it <pod-name> -- ping google.com
如果 ping google.com
有通,理論上 DNS 就正常,因為 Pod 會先去 CoreDNS 做網域解析。
Network Policy 檢查
# 檢查是否有 Network Policy 限制
kubectl get networkpolicy --all-namespaces
# 查看具體規則
kubectl describe networkpolicy <policy-name> -n <namespace>
前面我們做過 Global Network Policy 的實驗,可能會影響連線。
CNI 相關問題
公司其實是用 Calico,常見問題:
診斷方法:
# 檢查 Calico 狀態
kubectl get pods -n calico-system
# 查看 Calico 日誌
kubectl logs -n calico-system <calico-pod> --tail=100
# 檢查 Calico 節點狀態
kubectl get nodes -o wide
kube-proxy 健康檢查
有時候節點剛建好的時候,kube-proxy 還沒準備好:
# 檢查 kube-proxy 狀態
kubectl get pods -n kube-system | grep kube-proxy
# 查看 kube-proxy 日誌
kubectl logs -n kube-system <kube-proxy-pod>
OS 防火牆檢查
最白痴但最常見的問題:OS 的 firewall 有沒有關?
記得以前用 kubeadm 建原生的 k8s 都要關防火牆,最近在 RKE2 就容易漏掉這個。
# Ubuntu/Debian
sudo ufw status
sudo ufw disable
# RHEL/CentOS
sudo systemctl status firewalld
sudo systemctl stop firewalld
RKE2 存資料的位置空間不足,預設會在 /var/lib/rancher
下面。如果硬碟這裡切太小就會有問題。
# 檢查磁碟使用量
df -h /var/lib/rancher
# 查看大檔案
du -sh /var/lib/rancher/* | sort -hr
解決方案:
擴增現有空間(較安全)
修改資料目錄(需謹慎)
在 /etc/rancher/rke2/config.yaml
中用 data-dir
指定路徑,但 Control Plane 這邊會很麻煩。
重要警告:最好還是不要改路徑,不然你會發現 rancher-system-agent 一直在原本的位置找 scheduler 等組件的憑證!
資源開得太剛好,導致 Deployments 無法 rolling update。因為是先建後拆的策略,多一個 Pod 的時候就造成 Namespace 資源不足。
# 檢查 ResourceQuota
kubectl get resourcequota -n <namespace>
kubectl describe resourcequota <quota-name> -n <namespace>
# 檢查當前資源使用
kubectl top pods -n <namespace>
kubectl top nodes
# 調整 Deployment 策略
spec:
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 0 # 不允許超出副本數
maxUnavailable: 1 # 允許一個 Pod 不可用
有可能是資源不足導致,必須設置適當的資源保留:
# /etc/rancher/rke2/config.yaml
kubelet-arg:
- "system-reserved=cpu=500m,memory=1Gi,ephemeral-storage=10Gi"
- "kube-reserved=cpu=500m,memory=1Gi,ephemeral-storage=10Gi"
- "eviction-hard=memory.available<500Mi,nodefs.available<10%"
重要提醒:要設置資源水位驅逐 Pods。一旦 kubelet 掛掉,你很難做其他事情來急救!
NFS PVC 不能用,有些 NAS 有 IP 白名單限制。
# 在節點上直接測試 NFS 掛載
sudo mount -t nfs <nfs-server>:<path> /mnt/test
# 檢查 NFS CSI Driver 狀態
kubectl get pods -n nfs-system
kubectl logs -n nfs-system <nfs-csi-pod>
這有點像叢集更新,每個節點都一定要重啟。
漸進式處理(建議):
自動化處理(風險較高):
用自動化一次處理完,但太激烈的操作要小心使用者的反饋。
檢查事件(Events)
kubectl get events --sort-by=.metadata.creationTimestamp
kubectl get events -n <namespace> --sort-by=.metadata.creationTimestamp
查看 Pod 狀態和日誌
kubectl get pods -o wide
kubectl describe pod <pod-name>
kubectl logs <pod-name> --previous # 查看前一次的日誌
檢查資源使用狀況
kubectl top nodes
kubectl top pods --all-namespaces --sort-by=memory
檢查服務和網路
kubectl get svc,endpoints -o wide
kubectl get ingress --all-namespaces
系統級日誌:
# RKE2 相關日誌
journalctl -u rke2-server -f
journalctl -u rke2-agent -f
journalctl -u rancher-system-agent -f
# 系統資源狀況
dmesg | tail -50
應用級日誌:
# 即時監控日誌
kubectl logs -f deployment/app-name
# 查看多容器 Pod 的特定容器
kubectl logs <pod-name> -c <container-name>
# 查看日誌的最後 N 行
kubectl logs <pod-name> --tail=100
比起被動排查問題,更重要的是建立主動監控。前面我們已經部署了 LGTM Stack,好好利用 Grafana 和 Prometheus 的警示功能,設定關鍵指標的告警閾值。
重點監控項目:
定期檢查這些指標,大多數問題都能提前發現和處理。
畢竟是 OpenSource 的服務,請有耐心一點找答案,永遠都會有 bug。
高效排查的原則:
常見問題分類:
今天我們建立了完整的故障診斷工具箱,從基本工具到系統性的排查方法,涵蓋地端環境最常遇到的各種問題。這些都是實戰經驗的結晶!
今日重點:
明天我們將迎來最終章 Day 30:牧場主畢業典禮 - 多租戶 Kubernetes 管理大師之路!回顧 30 天的學習成果,總結多租戶管理的核心技能,為各位牧場主頒發畢業證書!
💡 牧場主小提示:故障排查就像醫生看病,要有系統性的診斷流程,不能頭痛醫頭腳痛醫腳。記住:90% 的問題都是網路、資源、權限這三大類,先從最常見的開始查起。最重要的是保持冷靜和耐心,開源軟體總會有各種奇怪的 bug,但只要方法對了,沒有解決不了的問題!