网络

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

确保您配置了正确的 kubeconfig(例如,在使用 Rancher 高可用时,export KUBECONFIG=$PWD/kube_config_cluster.yml) 或者通过 Rancher UI 使用内嵌的 kubectl。

仔细检查是否在主机防火墙中打开了所有必需的端口

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

检查 Overlay 网络是否正常运行

可以将 Pod 调度到集群的任何主机上,在 Overlay 网络上意味着 NGINX Ingress Controller 需要能够将请求从NODE_1路由到NODE_2。如果 Overlay 网络不起作用,可能导致 NGINX Ingress Controller 无法将请求路由到 Pod,您将遇到间歇性的 TCP/HTTP 连接失败。

要测试 Overlay 网络,您可以根据以下 yaml 文件启动一个DaemonSet。这将在每个主机上运行一个busybox容器,我们将在所有主机上的容器之间运行一个ping测试。

注意:这个容器不支持 ARM 节点,例如 Raspberry Pi。这将在 pod 日志中显示为 exec user process caused: exec format error

  1. 将以下文件另存为overlaytest.yml
  1. apiVersion: apps/v1
  2. kind: DaemonSet
  3. metadata:
  4. name: overlaytest
  5. spec:
  6. selector:
  7. matchLabels:
  8. name: overlaytest
  9. template:
  10. metadata:
  11. labels:
  12. name: overlaytest
  13. spec:
  14. tolerations:
  15. - operator: Exists
  16. containers:
  17. - image: rancherlabs/swiss-army-knife
  18. imagePullPolicy: Always
  19. name: overlaytest
  20. command: ["sh", "-c", "tail -f /dev/null"]
  21. terminationMessagePath: /dev/termination-log

Copy

  1. 使用kubectl启动它kubectl create -f overlaytest.yml
  2. 等待,直到 kubectl rollout status ds/overlaytest -w 返回: daemon set "overlaytest" successfully rolled out
  3. 运行以下命令,以使每个主机上的每个容器相互 ping 通。
  1. #!/bin/bash
  2. echo "=> Start network overlay test"
  3. kubectl get pods -l name=overlaytest -o jsonpath='{range .items[*]}{@.metadata.name}{" "}{@.spec.nodeName}{"\n"}{end}' |
  4. while read spod shost
  5. do kubectl get pods -l name=overlaytest -o jsonpath='{range .items[*]}{@.status.podIP}{" "}{@.spec.nodeName}{"\n"}{end}' |
  6. while read tip thost
  7. do kubectl --request-timeout='10s' exec $spod -c overlaytest -- /bin/sh -c "ping -c2 $tip > /dev/null 2>&1"
  8. RC=$?
  9. if [ $RC -ne 0 ]
  10. then echo FAIL: $spod on $shost cannot reach pod IP $tip on $thost
  11. else echo $shost can reach $thost
  12. fi
  13. done
  14. done
  15. echo "=> End network overlay test"

Copy

  1. 该命令运行完毕后,一切正确的的输出应该是:

    1. => Start network overlay test
    2. => End network overlay test

    Copy

如果您在输出中看到错误,则表示用于 Overlay 网络的所需的端口在指示的主机之间没有打开。

NODE1 的 UDP 端口被阻塞的情况的示例错误输出。

  1. => Start network overlay test
  2. command terminated with exit code 1
  3. NODE2 cannot reach NODE1
  4. command terminated with exit code 1
  5. NODE3 cannot reach NODE1
  6. command terminated with exit code 1
  7. NODE1 cannot reach NODE2
  8. command terminated with exit code 1
  9. NODE1 cannot reach NODE3
  10. => End network overlay test

Copy

运行命令来清理这个 DaemonSet 应用 kubectl delete ds/overlaytest

检查主机和网络设备上的 MTU 是否正确配置

当 MTU 配置错误时(在运行 Rancher 的主机上,在已创建/导入的集群中的节点上或在两者之间的网络设备上),错误消息将记录在 Rancher Server 和 Rancher Agent 中,类似于:

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

单击查看有关在 Rancher 和集群节点之间使用 Google Cloud VPN 时如何正确配置 MTU 的示例 Google Cloud VPN:MTU 问题

已知问题

使用 Canal/Flannel 的 Overlay 网络缺少节点注释

GitHub #13644已在 v2.1.2 中解决。

要检查您的集群是否受到影响,以下命令将列出异常的节点(此命令要求安装jq):

  1. kubectl get nodes -o json | jq '.items[].metadata | select(.annotations["flannel.alpha.coreos.com/public-ip"] == null or .annotations["flannel.alpha.coreos.com/kube-subnet-manager"] == null or .annotations["flannel.alpha.coreos.com/backend-type"] == null or .annotations["flannel.alpha.coreos.com/backend-data"] == null) | .name'

Copy

如果没有输出,则集群不受影响。

System 命名空间的 Pod 网络连接断开

注意: 这仅适用于从 v2.0.6 或更早版本升级到 v2.0.7 或更高版本的 Rancher。从 v2.0.7 升级到更高版本不受影响。

已知问题 GitHub #15146

如果系统命名空间中的 Pod 无法与其他系统命名空间中的 Pod 通信,则需要按照升级到 v2.0.7+ :命名空间迁移描述的方式恢复连接。症状包括:

  • NGINX ingress controller 在访问时显示 504 Gateway Time-out
  • NGINX ingress controller 访问时日志打印 upstream timed out (110: Connection timed out) while connecting to upstream