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

第12課:網路故障排除 & 考試策略

kube-proxy、CNI 與 Service 除錯。端對端故障排除。 CKA 考試時間管理與實戰策略。

Kubernetes 網路除錯與 CKA 考試策略

1. 網路故障排除流程

Pod ──► Service ──► Endpoint ──► Pod(目標)

除錯順序:
1. Pod 可以到達自己嗎?         → kubectl exec pod -- curl localhost:PORT
2. Pod 可以到達其他 Pod 嗎?     → kubectl exec pod -- curl POD_IP:PORT
3. Pod 可以到達 Service 嗎?     → kubectl exec pod -- curl SERVICE:PORT
4. DNS 能解析嗎?               → kubectl exec pod -- nslookup SERVICE
5. NetworkPolicy 有阻擋嗎?     → kubectl get networkpolicy -n NS

2. kube-proxy 除錯

# 確認 kube-proxy 運行中
kubectl get pods -n kube-system -l k8s-app=kube-proxy

# 檢查 kube-proxy 日誌
kubectl logs -n kube-system -l k8s-app=kube-proxy

# 確認 kube-proxy 模式
kubectl logs -n kube-system -l k8s-app=kube-proxy | grep "Using"
# "Using iptables Proxier" 或 "Using ipvs Proxier"

# 確認 kube-proxy ConfigMap
kubectl get configmap kube-proxy -n kube-system -o yaml

# iptables 規則除錯(在節點上)
iptables -t nat -L KUBE-SERVICES | grep my-service

3. CNI 除錯

# 確認 CNI 外掛運行中
kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium|weave'

# Pod IP 問題除錯
kubectl get pod -o wide   # 確認 Pod 有 IP

# 如果 Pod 沒有 IP:
# 1. 確認 CNI 二進位檔案存在
ls /opt/cni/bin/

# 2. 確認 CNI 設定
ls /etc/cni/net.d/

# 3. 檢查 kubelet 日誌中的 CNI 錯誤
journalctl -u kubelet | grep -i cni

4. Service 端對端除錯

# 情境:Pod 無法存取 Service
# 依序排除:

# 1. Service 存在嗎?
kubectl get svc my-service -n NS

# 2. Endpoints 有值嗎?
kubectl get endpoints my-service -n NS
# 空 → selector 不匹配

# 3. Pod 是否為 Ready?
kubectl get pods -l app=my-app

# 4. NetworkPolicy 阻擋?
kubectl get networkpolicy -n NS

# 5. 從 Pod 內測試連線
kubectl exec -it test-pod -- curl http://my-service:80
kubectl exec -it test-pod -- wget -qO- http://my-service:80 --timeout=3

5. CKA 考試策略

策略說明
時間管理2 小時 17 題。每題約 7 分鐘。跳過困難題目(做標記後返回)
切換 Context每題第一行都是 kubectl config use-context ...。絕對不要忘記!
善用文件考試允許存取 k8s.io/docs。善用搜尋功能
善用 aliasalias k=kubectl、export do="--dry-run=client -o yaml"
--dry-runkubectl run pod --image=nginx $do > pod.yaml 快速產生 YAML
自動完成source <(kubectl completion bash),Tab 補全 Pod 名稱
# 考試開始時的快速設定
alias k=kubectl
export do="--dry-run=client -o yaml"
source <(kubectl completion bash)
complete -o default -F __start_kubectl k

# 常用快速指令
k run nginx --image=nginx $do > pod.yaml    # 產生 Pod YAML
k create deploy web --image=nginx $do       # 產生 Deployment YAML
k expose deploy web --port=80 $do           # 產生 Service YAML

6. 考試檢查清單

考前準備:
☑ 練習 kubectl 快捷鍵和 alias
☑ 熟悉 k8s.io/docs 搜尋
☑ 練習 vim/nano 編輯 YAML
☑ 熟悉 etcd backup/restore 流程
☑ 練習 kubeadm upgrade 流程

考試中:
☑ 切換 context(每題必做)
☑ 仔細讀題(確認 Namespace、叢集名稱)
☑ 先做簡單題(5 分鐘內可完成的)
☑ 用 --dry-run 產生 YAML 而非從零寫起
☑ 完成後驗證(kubectl get、describe)

7. 速查表

情境指令
確認 Service 連線kubectl exec pod -- curl SVC:PORT
DNS 除錯kubectl exec pod -- nslookup SVC
kube-proxy 狀態kubectl get pods -n kube-system -l k8s-app=kube-proxy
iptables 規則iptables -t nat -L KUBE-SERVICES
CNI 設定ls /etc/cni/net.d/

8. 練習題

Q1:Pod 可以透過 Pod IP 存取另一個 Pod,但透過 Service 名稱無法存取。可能的原因是?

  • A) CNI 外掛故障
  • B) CoreDNS 未運行或 kube-proxy 規則異常 ✓
  • C) kubelet 停止
  • D) etcd 損壞

解析:Pod IP 可以連通表示 CNI 正常。Service 名稱無法存取可能是 DNS(CoreDNS)或 kube-proxy(iptables 規則)的問題。依序檢查:CoreDNS Pod 狀態、nslookup 測試、kube-proxy Pod 狀態、Endpoints。

Q2:CKA 考試中最重要的第一步是什麼?

  • A) 設定 alias 和自動完成
  • B) 閱讀題目並切換到正確的 context ✓
  • C) 檢查叢集狀態
  • D) 備份 etcd

解析:CKA 考試有多個叢集。每題需要切換到指定的 context。忘記切換 context 是常見的扣分原因 — 在錯誤的叢集操作等於白做。

Q3:kubectl exec test-pod -- curl http://web-svc:80 超時。但 kubectl get endpoints web-svc 顯示有效的 endpoint IP。接下來應該檢查什麼?

  • A) Pod 的 readinessProbe
  • B) NetworkPolicy 是否阻擋了從 test-pod 到 web-svc 的流量 ✓
  • C) 重新啟動 web-svc 的 Pod
  • D) 升級 Kubernetes 版本

解析:Endpoints 有效但連線超時。排除:Service selector 正確(有 endpoint)、DNS 正常(名稱可以解析)。剩下的可能:NetworkPolicy 阻擋流量、kube-proxy 規則異常、目標 Pod 的應用程式不監聽指定連接埠。