對 Pod 之間的網路連線進行除錯
檢閱用於對 Pod 之間的連線問題進行除錯的選項和策略。
檢查叢集元件及網路 Pod 的性能
請遵循下列步驟來檢查元件的性能。 如果叢集元件不是最新或不是處於健全狀態,則可能會發生網路問題。
-
請檢查您的叢集主節點和工作者節點是否在支援的版本上執行,且處於健全狀態。 如果叢集主節點或工作者節點未執行支援的版本,請 進行任何必要的更新,以便它們執行支援的版本。 如果任何元件的狀態不是
Normal或Ready,請查看 叢集主運行狀況狀態、 叢集狀態、工作節點狀態 或 對Critical或NotReady工作節點進行故障排除的步驟 以取得更多資訊。 請確定已解決任何相關問題,然後再繼續。若要檢查叢集主節點版本及性能,請執行下列動作:
ibmcloud oc cluster get -c <cluster-id>若要檢查工作者節點版本及性能,請執行下列動作:
ibmcloud oc workers -c <cluster-id> -
針對每一個工作者節點,驗證 Calico 及叢集 DNS Pod 是否存在且以性能正常狀態執行。
-
執行指令以取得叢集 Pod 的詳細資料。
oc get pods -A -o wide | grep -e calico -e dns-default -
在輸出中,確保叢集包含下列 Pod。 請確定每一個 Pod 的狀態都是
Running,且 Pod 沒有太多重新啟動。- 每個工作者節點正好一個
calico-nodePod。 - 每個叢集至少一個
calico-typhaPod。 較大的叢集可能有多個。 - 每個叢集只有一個
calico-kube-controllersPod。 - 每個節點一個
dns-defaultpod。 但是,某些節點如果附加了標籤,則可能沒有dns-defaultpod。 這是正常現象,不會導致網路問題。
輸出範例
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED READINESS GATES calico-system calico-kube-controllers-1a1a1a1 1/1 Running 0 37m 172.17.61.195 10.245.0.5 <none> <none> calico-system calico-node-1a1a1a1 1/1 Running 0 37m 10.245.0.5 10.245.0.5 <none> <none> calico-system calico-node-1a1a1a1 1/1 Running 0 37m 10.245.0.4 10.245.0.4 <none> <none> calico-system calico-typha-1a1a1a1 1/1 Running 0 37m 10.245.0.5 10.245.0.5 <none> <none> openshift-dns dns-default-1a1a1a1 2/2 Running 0 33m 172.17.36.144 10.245.0.4 <none> <none> openshift-dns dns-default-1a1a1a1 2/2 Running 0 33m 172.17.61.210 10.245.0.5 <none> <none> - 每個工作者節點正好一個
-
如果有任何列出的 Pod 不存在或處於不健全狀態,請完成先前步驟所包含的叢集和工作者節點問題拍攝文件。 在繼續之前,請確定已解決此步驟中 Pod 的任何問題。
-
使用測試 Pod 進行除錯
若要判定 Pod 上網路問題的原因,您可以在每一個工作者節點上建立測試 Pod。 然後,您可以執行測試並觀察 Pod 內的網路活動,這可能會顯示問題的來源。
設定 Pod
-
為測試 Pod 建立新的特許名稱空間。 建立新的名稱空間可防止現有名稱空間中的任何自訂原則或配置影響測試 Pod。 在此範例中,新的名稱空間稱為
pod-network-test。建立名稱空間。
oc create ns pod-network-test -
將標籤新增至新的特權命名空間。
oc label namespace pod-network-test --overwrite=true \ pod-security.kubernetes.io/enforce=privileged \ pod-security.kubernetes.io/enforce-version=latest \ pod-security.kubernetes.io/audit=privileged \ pod-security.kubernetes.io/audit-version=latest \ pod-security.kubernetes.io/warn=privileged \ pod-security.kubernetes.io/warn-version=latest \ security.openshift.io/scc.podSecurityLabelSync="false" -
執行指令以容許名稱空間執行具有特許安全環境定義的 Pod。
oc adm policy add-scc-to-group privileged system:serviceaccounts:pod-network-test
-
建立並套用以下守護程序集以在每個節點上建立測試 Pod。
apiVersion: apps/v1 kind: DaemonSet metadata: labels: name: webserver-test app: webserver-test name: webserver-test spec: selector: matchLabels: name: webserver-test template: metadata: labels: name: webserver-test app: webserver-test spec: tolerations: - operator: "Exists" containers: - name: webserver securityContext: privileged: true image: us.icr.io/armada-master/network-alpine:latest env: - name: ENABLE_ECHO_SERVER value: "true" - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name restartPolicy: Always terminationGracePeriodSeconds: 1 ``` -
套用 daemonset 以在工作者節點上部署測試 Pod。
oc apply --namespace pod-network-test -f <daemonset-file>
- 透過列出命名空間中的所有 Pod,驗證 Pod 是否成功啟動。
oc get pods --namespace pod-network-test -o wide
在 Pod 內執行測試
執行 curl、ping 及 nc 指令,以測試每一個 Pod 的網路連線,並執行 dig 指令以測試叢集 DNS。 檢閱每一個輸出,然後參閱 識別問題,以找出結果可能意味著什麼。
-
列出測試 Pod,並記下每一個 Pod 的名稱及 IP。
oc get pods --namespace pod-network-test -o wide輸出範例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES webserver-test-1a1a1 1/1 Running 0 68s 172.17.36.169 10.245.0.4 <none> <none> webserver-test-1a1a1 1/1 Running 0 68s 172.17.61.240 10.245.0.5 <none> <none> -
執行
exec指令登入一個 pod。kubectl exec -it --namespace pod-network-test <pod_name> -- sh -
在 Pod 上執行
curl指令,並記下輸出。 指定您未登入的 pod 的 IP。 這會測試不同節點上 Pod 之間的網路連線。curl <pod_ip>:8080成功輸出範例。
Hostname: webserver-test-t546j Pod Information: node name: env var NODE_NAME not set pod name: webserver-test-t546j pod namespace: env var POD_NAMESPACE not set pod IP: env var POD_IP not set Connection Information: remote address: 172.17.36.169 remote port: 56042 local address: 172.17.61.240 local port: 8080 -
在 Pod 上執行
ping指令,並記下輸出。 指定您未使用exec指令登入的 pod 的 IP。 這會測試不同節點上 Pod 之間的網路連線。ping -c 5 <pod_ip>成功輸出範例。
PING 172.30.248.201 (172.30.248.201) 56(84) bytes of data. 64 bytes from 172.30.248.201: icmp_seq=1 ttl=62 time=0.473 ms 64 bytes from 172.30.248.201: icmp_seq=2 ttl=62 time=0.449 ms 64 bytes from 172.30.248.201: icmp_seq=3 ttl=62 time=0.381 ms 64 bytes from 172.30.248.201: icmp_seq=4 ttl=62 time=0.438 ms 64 bytes from 172.30.248.201: icmp_seq=5 ttl=62 time=0.348 ms --- 172.30.248.201 ping statistics --- 5 packets transmitted, 5 received, 0% packet loss, time 4086ms rtt min/avg/max/mdev = 0.348/0.417/0.473/0.046 ms -
在 Pod 上執行
nc指令,並記下輸出。 指定您未使用exec指令登入的 pod 的 IP。 這會測試不同節點上 Pod 之間的網路連線。nc -vzw 5 <pod_ip> 8080成功輸出範例。
nc -vzw 5 172.17.61.240 8080 172.17.61.240 (172.17.61.240:8080) open -
執行
dig指令以測試 DNS。dig +short kubernetes.default.svc.cluster.local輸出範例
172.21.0.1dig +short ibm.com輸出範例
23.50.74.64 -
執行
curl指令,測試服務的完整 TCP 或 HTTPS 連線。 此範例透過擷取叢集的版本資訊來測試 Pod 與叢集主節點之間的連線。 順利擷取叢集版本表示連線正常。curl -k https://kubernetes.default.svc.cluster.local/version輸出範例
{ "major": "1", "minor": "25", "gitVersion": "v1.25.14+bcb9a60", "gitCommit": "3bdfba0be09da2bfdef3b63e421e6a023bbb08e6", "gitTreeState": "clean", "buildDate": "2023-10-30T21:33:07Z", "goVersion": "go1.19.13 X:strictfipsruntime", "compiler": "gc", "platform": "linux/amd64" } -
登出 pod。
exit -
對其餘 Pod 重複先前的步驟。
識別問題
檢閱前一節的輸出,以協助尋找 Pod 網路問題的原因。 本節列出可從先前區段識別的一些一般原因。
-
如果指令在測試 Pod 上正常運作,但您在預設名稱空間中的應用程式 Pod 中仍有網路問題,則可能有特別與應用程式相關的問題。
- 您可能具有限制網路資料流量的 Calico 或 Kubernetes 網路安全原則。 如果將網路原則套用至 Pod,則會 捨棄該原則未明確容許的所有資料流量。 如需網路原則的相關資訊,請參閱 Kubernetes 文件。
- 如果您是使用 Istio 或 Red Hat OpenShift Service Mesh,則可能有服務配置問題會捨棄或封鎖 Pod 之間的資料流量。 如需相關資訊,請參閱 Istio 和 Red Hat OpenShift Service Mesh的疑難排解說明文件。
- 此問題可能與應用程式中的錯誤相關,而不是與叢集中的錯誤相關,並且可能需要您自己的獨立問題拍攝。
-
如果特定 Pod 的
curl、ping或nc指令失敗,請識別這些 Pod 所在的工作者節點。 如果問題只存在於部分工作者節點上,請 取代那些工作者節點,或參閱 工作者節點問題拍攝 的相關資訊。 -
如果來自
dig指令的 DNS 查閱失敗,請參閱 Red Hat DNS 疑難排解資訊。
如果您仍然無法解決 Pod 網路問題,請 開立支援案例,並包含問題的詳細說明、您嘗試解決的方式、您執行的測試類型,以及 Pod 和工作者節點的 相關日誌。 如需開立支援案例以及要包含哪些資訊的相關資訊,請參閱 一般除錯手冊。