IBM Cloud Docs
對 Pod 之間的網路連線進行除錯

對 Pod 之間的網路連線進行除錯

檢閱用於對 Pod 之間的連線問題進行除錯的選項和策略。

檢查叢集元件及網路 Pod 的性能

請遵循下列步驟來檢查元件的性能。 如果叢集元件不是最新或不是處於健全狀態,則可能會發生網路問題。

  1. 請檢查您的叢集主節點和工作者節點是否在支援的版本上執行,且處於健全狀態。 如果叢集主節點或工作者節點未執行支援的版本,請 進行任何必要的更新,以便它們執行支援的版本。 如果任何元件的狀態不是 NormalReady,請查看 叢集主運行狀況狀態叢集狀態工作節點狀態CriticalNotReady 工作節點進行故障排除的步驟 以取得更多資訊。 請確定已解決任何相關問題,然後再繼續。

    若要檢查叢集主節點版本及性能,請執行下列動作:

    ibmcloud oc cluster get -c <cluster-id>
    

    若要檢查工作者節點版本及性能,請執行下列動作:

    ibmcloud oc workers -c <cluster-id>
    
  2. 針對每一個工作者節點,驗證 Calico 及叢集 DNS Pod 是否存在且以性能正常狀態執行。

    1. 執行指令以取得叢集 Pod 的詳細資料。

       oc get pods -A -o wide | grep -e calico -e dns-default
      
    2. 在輸出中,確保叢集包含下列 Pod。 請確定每一個 Pod 的狀態都是 Running,且 Pod 沒有太多重新啟動。

      • 每個工作者節點正好一個 calico-node Pod。
      • 每個叢集至少一個 calico-typha Pod。 較大的叢集可能有多個。
      • 每個叢集只有一個 calico-kube-controllers Pod。
      • 每個節點一個 dns-default pod。 但是,某些節點如果附加了標籤,則可能沒有 dns-default pod。 這是正常現象,不會導致網路問題。

      輸出範例

      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>
      
    3. 如果有任何列出的 Pod 不存在或處於不健全狀態,請完成先前步驟所包含的叢集和工作者節點問題拍攝文件。 在繼續之前,請確定已解決此步驟中 Pod 的任何問題。

使用測試 Pod 進行除錯

若要判定 Pod 上網路問題的原因,您可以在每一個工作者節點上建立測試 Pod。 然後,您可以執行測試並觀察 Pod 內的網路活動,這可能會顯示問題的來源。

設定 Pod

  1. 為測試 Pod 建立新的特許名稱空間。 建立新的名稱空間可防止現有名稱空間中的任何自訂原則或配置影響測試 Pod。 在此範例中,新的名稱空間稱為 pod-network-test

    建立名稱空間。

    oc create ns pod-network-test
    
  2. 將標籤新增至新的特權命名空間。

    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"
    
  3. 執行指令以容許名稱空間執行具有特許安全環境定義的 Pod。

oc adm policy add-scc-to-group privileged system:serviceaccounts:pod-network-test
  1. 建立並套用以下守護程序集以在每個節點上建立測試 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
          ```
    
    
  2. 套用 daemonset 以在工作者節點上部署測試 Pod。

oc apply --namespace pod-network-test -f <daemonset-file>
  1. 透過列出命名空間中的所有 Pod,驗證 Pod 是否成功啟動。
    oc get pods --namespace pod-network-test -o wide
    

在 Pod 內執行測試

執行 curlpingnc 指令,以測試每一個 Pod 的網路連線,並執行 dig 指令以測試叢集 DNS。 檢閱每一個輸出,然後參閱 識別問題,以找出結果可能意味著什麼。

  1. 列出測試 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>
    
  2. 執行 exec 指令登入一個 pod。

    kubectl exec -it --namespace pod-network-test <pod_name> -- sh
    
  3. 在 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
    
  4. 在 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
    
  5. 在 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
    
  6. 執行 dig 指令以測試 DNS。

    dig +short kubernetes.default.svc.cluster.local
    

    輸出範例

    172.21.0.1
    
    dig +short ibm.com
    

    輸出範例

    23.50.74.64
    
  7. 執行 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"
    }
    
  8. 登出 pod。

    exit
    
  9. 對其餘 Pod 重複先前的步驟。

識別問題

檢閱前一節的輸出,以協助尋找 Pod 網路問題的原因。 本節列出可從先前區段識別的一些一般原因。

  • 如果指令在測試 Pod 上正常運作,但您在預設名稱空間中的應用程式 Pod 中仍有網路問題,則可能有特別與應用程式相關的問題。

    • 您可能具有限制網路資料流量的 Calico 或 Kubernetes 網路安全原則。 如果將網路原則套用至 Pod,則會 捨棄該原則未明確容許的所有資料流量。 如需網路原則的相關資訊,請參閱 Kubernetes 文件
    • 如果您是使用 Istio 或 Red Hat OpenShift Service Mesh,則可能有服務配置問題會捨棄或封鎖 Pod 之間的資料流量。 如需相關資訊,請參閱 IstioRed Hat OpenShift Service Mesh的疑難排解說明文件。
    • 此問題可能與應用程式中的錯誤相關,而不是與叢集中的錯誤相關,並且可能需要您自己的獨立問題拍攝。
  • 如果特定 Pod 的 curlpingnc 指令失敗,請識別這些 Pod 所在的工作者節點。 如果問題只存在於部分工作者節點上,請 取代那些工作者節點,或參閱 工作者節點問題拍攝 的相關資訊。

  • 如果來自 dig 指令的 DNS 查閱失敗,請參閱 Red Hat DNS 疑難排解資訊

如果您仍然無法解決 Pod 網路問題,請 開立支援案例,並包含問題的詳細說明、您嘗試解決的方式、您執行的測試類型,以及 Pod 和工作者節點的 相關日誌。 如需開立支援案例以及要包含哪些資訊的相關資訊,請參閱 一般除錯手冊