跳至主要内容

網路

本頁面列出的命令/步驟可用於檢查叢集中與網路相關的問題。

確保你配置了正確的 kubeconfig(例如,對於 Rancher HA,使用 export KUBECONFIG=$PWD/kube_config_cluster.yml),或透過 UI 使用嵌入式 kubectl。

仔細檢查所有必要的連接埠是否已在你的(主機)防火牆中開啟​

仔細檢查所有必要的連接埠是否已在你的(主機)防火牆中開啟。覆蓋網路使用 UDP,而所有其他必要的連接埠都使用 TCP。

檢查覆蓋網路是否正常運作​

Pod 可以調度到你用於叢集的任何主機上,但這意味著 NGINX ingress controller 需要能夠將請求從 NODE_1 路由到 NODE_2。這是透過覆蓋網路發生的。如果覆蓋網路未運作,你將遇到間歇性的 TCP/HTTP 連線失敗,因為 NGINX ingress controller 無法路由到 Pod。

要測試覆蓋網路,你可以啟動以下 DaemonSet 定義。這將在每個主機上執行一個 swiss-army-knife 容器(映像由 Rancher 工程師開發,可在此處找到:https://github.com/rancherlabs/swiss-army-knife),我們將使用它在所有主機上的容器之間執行 ping 測試。

警告

swiss-army-knife 容器不支援 Windows 節點。它也不支援 ARM 節點,例如 Raspberry Pi。當測試遇到不相容的節點時,這會在 Pod 日誌中記錄為錯誤訊息,例如 ARM 節點的 exec user process caused: exec format error,或 Windows 節點的 ImagePullBackOff (Back-off pulling image "rancherlabs/swiss-army-knife)。

  1. 將以下檔案儲存為 overlaytest.yml

    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
    name: overlaytest
    spec:
    selector:
    matchLabels:
    name: overlaytest
    template:
    metadata:
    labels:
    name: overlaytest
    spec:
    tolerations:
    - operator: Exists
    containers:
    - image: rancherlabs/swiss-army-knife
    imagePullPolicy: Always
    name: overlaytest
    command: ["sleep", "infinity"]
    terminationMessagePath: /dev/termination-log

  2. 使用 kubectl create -f overlaytest.yml 啟動它

  3. 等待直到 kubectl rollout status ds/overlaytest -w 回傳:daemon set "overlaytest" successfully rolled out。

  4. 從同一位置執行以下腳本。它將讓每個主機上的每個 overlaytest 容器彼此 ping:

    #!/bin/bash
    echo "=> Start network overlay test"
    kubectl get pods -l name=overlaytest -o jsonpath='{range .items[*]}{@.metadata.name}{" "}{@.spec.nodeName}{"\n"}{end}' |
    while read spod shost
    do kubectl get pods -l name=overlaytest -o jsonpath='{range .items[*]}{@.status.podIP}{" "}{@.spec.nodeName}{"\n"}{end}' |
    while read tip thost
    do kubectl --request-timeout='10s' exec $spod -c overlaytest -- /bin/sh -c "ping -c2 $tip > /dev/null 2>&1"
    RC=$?
    if [ $RC -ne 0 ]
    then echo FAIL: $spod on $shost cannot reach pod IP $tip on $thost
    else echo $shost can reach $thost
    fi
    done
    done
    echo "=> End network overlay test"
  5. 當此命令執行完成時,它將輸出每個路由的狀態:

    => Start network overlay test
    Error from server (NotFound): pods "wk2" not found
    FAIL: overlaytest-5bglp on wk2 cannot reach pod IP 10.42.7.3 on wk2
    Error from server (NotFound): pods "wk2" not found
    FAIL: overlaytest-5bglp on wk2 cannot reach pod IP 10.42.0.5 on cp1
    Error from server (NotFound): pods "wk2" not found
    FAIL: overlaytest-5bglp on wk2 cannot reach pod IP 10.42.2.12 on wk1
    command terminated with exit code 1
    FAIL: overlaytest-v4qkl on cp1 cannot reach pod IP 10.42.7.3 on wk2
    cp1 can reach cp1
    cp1 can reach wk1
    command terminated with exit code 1
    FAIL: overlaytest-xpxwp on wk1 cannot reach pod IP 10.42.7.3 on wk2
    wk1 can reach cp1
    wk1 can reach wk1
    => End network overlay test

    如果你在輸出中看到錯誤,兩個主機上的 Pod 之間的路由存在一些問題。在上面的輸出中,節點 wk2 在覆蓋網路上沒有連線。這可能是因為 wk2 的覆蓋網路必要的連接埠未開啟。

  6. 你現在可以透過執行 kubectl delete ds/overlaytest 來清理 DaemonSet。

檢查 MTU 是否在主機和對等/隧道設備/裝置上正確配置​

當 MTU 配置不正確時(無論是在執行 Rancher 的主機上、已建立/匯入叢集中的節點上,還是在中間的設備/裝置上),錯誤訊息將記錄在 Rancher 和代理程式中,類似於:

  • websocket: bad handshake
  • Failed to connect to proxy
  • read tcp: i/o timeout

請參閱 Google Cloud VPN: MTU 注意事項以作為在 Rancher 和叢集節點之間使用 Google Cloud VPN 時如何正確配置 MTU 的範例。