本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

网络

本页面列出的命令/步骤可用于检查集群中的网络相关问题。

确保您配置了正确的 kubeconfig(例如,export KUBECONFIG=$PWD/kube_config_cluster.yml 用于 Rancher HA),或者通过 UI 使用嵌入式 kubectl。

仔细检查您的(主机)防火墙中是否已打开所有必需的端口。

仔细检查您的(主机)防火墙中是否已打开所有的 必需端口。与所有其他必需的 TCP 端口相比,覆盖网络使用 UDP。

检查覆盖网络是否正常工作。

Pod 可以调度到您为集群使用的任何主机,但这意味着 NGINX 入口控制器需要能够将请求从 NODE_1 路由到 NODE_2。这发生在覆盖网络上。如果覆盖网络无法正常工作,您将会遇到间歇性的 TCP/HTTP 连接失败,因为 NGINX 入口控制器无法路由到 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 的示例。