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。善用搜尋功能 |
| 善用 alias | alias k=kubectl、export do="--dry-run=client -o yaml" |
| --dry-run | kubectl 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 的應用程式不監聽指定連接埠。