iT邦幫忙

2025 iThome 鐵人賽

DAY 29
1
DevOps

牧場主的 K8s 放牧日記系列 第 29

Day 29: 故障排除與診斷工具箱 - 牧場主的急救包

  • 分享至 

  • xImage
  •  

牧場主今日工作

身為數位牧場主,最怕的就是半夜被叫起來處理突發狀況!今天我們要建立完整的故障診斷工具箱,學會快速定位問題的系統性方法。這些都是來自地端環境的實戰經驗,讓各位牧場主在面對各種疑難雜症時能夠冷靜應對,快速找到問題根源並解決。不再是無頭蒼蠅亂撞,而是有系統、有方法的專業排查!

牧場主必備工具箱

https://ithelp.ithome.com.tw/upload/images/20250911/201417940eVHyGD0Yq.png

工欲善其事,必先利其器。以下是地端環境必備的診斷工具:

Debug DaemonSet - 每個節點的診斷助手

強烈建議:用 DaemonSet 在每個節點部署一個專門用來 debug 的 Pod,這樣就不用每次都 SSH 到節點上了!可以使用 nicolaka/netshoot 這種包含各種網路診斷工具的映像檔,設定 hostNetwork 和 privileged 權限來存取節點網路。

k9s - 終端機界面的瑞士軍刀

在網路隔離的環境中絕對必備!有些公司無法從辦公室直接連到 server,純 terminal 介面就是救星。

安裝與使用

# 安裝 k9s
curl -sS https://webinstall.dev/k9s | bash

# 啟動並連接到叢集
k9s

核心功能

  • 即時監控所有資源狀態
  • 快速查看 Pod 日誌和描述
  • 直接編輯資源配置
  • 資源使用率即時顯示

Lens - 圖形化管理利器

公司使用需要付費,不然就用 FreeLens。視覺化界面對複雜問題診斷很有幫助。

krew - kubectl 插件管理器

可以安裝各種實用插件,但討厭的 Windows 幾乎都不支援!真的要用可以考慮在 WSL 環境。好懷念用 MacBook 工作的日子...

有用的插件

# 安裝 krew
kubectl krew install krew

# 實用插件
kubectl krew install ctx      # 切換 context
kubectl krew install ns       # 切換 namespace
kubectl krew install konfig   # 管理多叢集 kubeconfig

konfig - 多叢集配置管理

當你要管理數十座 clusters 時,Rancher 會產生一堆 kubeconfig 需要管理,konfig 可以自動化整理成同一份檔案。

# 透過 krew 安裝
kubectl krew install konfig

# 合併多個 kubeconfig
kubectl konfig merge config1.yaml config2.yaml

地端環境常見問題診斷指南

網路連線問題 - 牧場的通訊中斷

網路問題分為兩大類,診斷方法不同:

1. 節點網路無法連線到外部

診斷步驟

  1. 基本連線測試

    # 測試基本連線
    ping 8.8.8.8
    telnet google.com 443
    

    如果連線失敗,通常是公司防火牆政策限制,需要聯繫網管開通相關端口或加入白名單。

  2. DNS 解析檢查

    # 測試 DNS 解析
    dig google.com
    nslookup kubernetes.io
    
    # 檢查 DNS 配置
    cat /etc/resolv.conf
    

2. 叢集內部無法連線

系統性診斷流程

  1. 基本網路測試

    # 在問題 Pod 中測試
    kubectl exec -it <pod-name> -- ping google.com
    

    如果 ping google.com 有通,理論上 DNS 就正常,因為 Pod 會先去 CoreDNS 做網域解析。

  2. Network Policy 檢查

    # 檢查是否有 Network Policy 限制
    kubectl get networkpolicy --all-namespaces
    
    # 查看具體規則
    kubectl describe networkpolicy <policy-name> -n <namespace>
    

    前面我們做過 Global Network Policy 的實驗,可能會影響連線。

  3. CNI 相關問題

    公司其實是用 Calico,常見問題:

    • iptables 版本問題
    • 多個 NIC 可能會走錯
    • VXLAN Port 撞到其他服務(像是 VMware)

    診斷方法

    # 檢查 Calico 狀態
    kubectl get pods -n calico-system
    
    # 查看 Calico 日誌
    kubectl logs -n calico-system <calico-pod> --tail=100
    
    # 檢查 Calico 節點狀態
    kubectl get nodes -o wide
    
  4. 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>
    
  5. OS 防火牆檢查

    最白痴但最常見的問題:OS 的 firewall 有沒有關?

    記得以前用 kubeadm 建原生的 k8s 都要關防火牆,最近在 RKE2 就容易漏掉這個。

    # Ubuntu/Debian
    sudo ufw status
    sudo ufw disable
    
    # RHEL/CentOS
    sudo systemctl status firewalld
    sudo systemctl stop firewalld
    

DiskPressure - 牧場的儲存空間危機

問題分析

RKE2 存資料的位置空間不足,預設會在 /var/lib/rancher 下面。如果硬碟這裡切太小就會有問題。

診斷與解決

# 檢查磁碟使用量
df -h /var/lib/rancher

# 查看大檔案
du -sh /var/lib/rancher/* | sort -hr

解決方案

  1. 擴增現有空間(較安全)

  2. 修改資料目錄(需謹慎)

    /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 不可用

Worker Nodes 頻繁崩潰

根本原因

有可能是資源不足導致,必須設置適當的資源保留:

解決方案

# /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 儲存問題

常見情況

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>

內部 CA 憑證過期

影響範圍

這有點像叢集更新,每個節點都一定要重啟。

處理策略

漸進式處理(建議):

  1. 手動先處理 Master 節點
  2. 更新憑證
  3. Workers 再慢慢重啟

自動化處理(風險較高):
用自動化一次處理完,但太激烈的操作要小心使用者的反饋。

快速診斷的系統性方法

問題定位的優先順序

  1. 檢查事件(Events)

    kubectl get events --sort-by=.metadata.creationTimestamp
    kubectl get events -n <namespace> --sort-by=.metadata.creationTimestamp
    
  2. 查看 Pod 狀態和日誌

    kubectl get pods -o wide
    kubectl describe pod <pod-name>
    kubectl logs <pod-name> --previous  # 查看前一次的日誌
    
  3. 檢查資源使用狀況

    kubectl top nodes
    kubectl top pods --all-namespaces --sort-by=memory
    
  4. 檢查服務和網路

    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 的警示功能,設定關鍵指標的告警閾值。

重點監控項目

  • 節點的 CPU、記憶體、磁碟使用率
  • Pod 重啟次數和狀態異常
  • 服務連線可用性
  • 憑證到期時間

定期檢查這些指標,大多數問題都能提前發現和處理。

排查問題的心法

保持耐心與系統性思考

畢竟是 OpenSource 的服務,請有耐心一點找答案,永遠都會有 bug。

高效排查的原則

  1. 先檢查最常見的問題(網路、資源、權限)
  2. 查看事件和日誌(大部分線索都在這裡)
  3. 逐層向上排查(Pod → Node → Cluster → Network)
  4. 隔離變數(單一變數測試,避免同時改多個設定)
  5. 記錄解決過程(下次遇到同樣問題就有參考)

建立問題知識庫

常見問題分類

  • 網路連線類:防火牆、DNS、CNI、Service
  • 資源限制類:CPU、Memory、Storage、PID
  • 權限認證類:RBAC、ServiceAccount、憑證
  • 配置錯誤類:YAML 格式、標籤選擇器、環境變數
  • 基礎設施類:節點故障、儲存問題、網路設備

今日總結與明日預告

今天我們建立了完整的故障診斷工具箱,從基本工具到系統性的排查方法,涵蓋地端環境最常遇到的各種問題。這些都是實戰經驗的結晶!

今日重點

  • ✅ 掌握必備的診斷工具(k9s、Lens、krew)
  • ✅ 建立網路問題的系統性診斷流程
  • ✅ 了解地端環境特有的問題與解決方案
  • ✅ 學會資源和儲存問題的診斷技巧
  • ✅ 培養耐心與系統性的排查心法

明天我們將迎來最終章 Day 30:牧場主畢業典禮 - 多租戶 Kubernetes 管理大師之路!回顧 30 天的學習成果,總結多租戶管理的核心技能,為各位牧場主頒發畢業證書!

💡 牧場主小提示:故障排查就像醫生看病,要有系統性的診斷流程,不能頭痛醫頭腳痛醫腳。記住:90% 的問題都是網路、資源、權限這三大類,先從最常見的開始查起。最重要的是保持冷靜和耐心,開源軟體總會有各種奇怪的 bug,但只要方法對了,沒有解決不了的問題!


上一篇
Day 28: 叢集升級與備份策略 - 牧場的安全防護網
下一篇
Day 30: 牧場主畢業典禮 - 多租戶 Kubernetes 管理大師之路
系列文
牧場主的 K8s 放牧日記30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言