调试 pod 之间的网络连接
查看用于调试 pod 之间的连接问题的选项和策略。
检查集群组件和联网 pod 的运行状况
执行以下步骤以检查组件的运行状况。 如果集群组件不是最新的或未处于正常状态,那么可能会发生网络问题。
-
检查集群主节点和工作程序节点是否在受支持的版本上运行并且处于正常状态。 如果集群主节点或工作程序未运行受支持的版本,请 进行任何必要的更新 以使其运行受支持的版本。 如果任何组件的状态不是
Normal或Ready,请查看 群集主控健康状态、 群集状态、工作节点状态,或 故障排除Critical或NotReady工作节点的步骤,以了解更多信息。 请确保已解决任何相关问题,然后再继续。要检查集群主版本和运行状况:
ibmcloud ks cluster get -c <cluster-id>要检查工作程序节点版本和运行状况:
ibmcloud ks workers -c <cluster-id> -
对于每个工作程序节点,请验证 Calico 和集群 DNS pod 是否存在并以正常状态运行。
-
运行命令以获取集群 pod 的详细信息。
kubectl get pods -A -o wide | grep -e calico -e coredns -
在输出中,确保集群包含以下 pod。 确保每个 pod 的状态为
Running,并且 pod 的重新启动次数不会过多。- 每个工作程序节点正好有一个
calico-nodepod。 - 每个集群至少有一个
calico-typhapod。 较大的集群可能有多个集群。 - 每个集群正好有一个
calico-kube-controllerspod。 - 每个集群至少有一个
corednspod。 大多数簇生植物有三个coredns豆荚;较大的簇生植物可能有更多。 - 正好一个
coredns-autoscalerpod。
示例输出
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED READINESS GATES calico-system calico-kube-controllers-1a1a1a1 1/1 Running 0 16h 172.17.87.11 192.168.0.28 <none> <none> calico-system calico-node-1a1a1a1 1/1 Running 0 16h 192.168.0.28 192.168.0.28 <none> <none> calico-system calico-node-1a1a1a1 1/1 Running 0 16h 192.168.0.27 192.168.0.27 <none> <none> calico-system calico-typha-1a1a1a1 1/1 Running 0 16h 192.168.0.28 192.168.0.28 <none> <none> kube-system coredns-867bfb84df-1a1a1a1 1/1 Running 0 16h 172.17.87.1 192.168.0.28 <none> <none> kube-system coredns-867bfb84df-1a1a1a1 1/1 Running 0 16h 172.17.87.15 192.168.0.28 <none> <none> kube-system coredns-867bfb84df-1a1a1a1 1/1 Running 0 16h 172.17.87.14 192.168.0.28 <none> <none> kube-system coredns-autoscaler-1a1a1a1 1/1 Running 0 16h 172.17.87.2 192.168.0.28 <none> <none> - 每个工作程序节点正好有一个
-
如果列出的任何 pod 不存在或处于不正常状态,请浏览先前步骤中包含的集群和工作程序节点故障诊断文档。 在继续之前,请确保解决此步骤中 pod 的任何问题。
-
使用测试 pod 进行调试
要确定 pod 上网络问题的原因,可以在每个工作程序节点上创建测试 pod。 然后,您可以运行测试并观察 pod 中的联网活动,这可能会揭示问题的根源。
设置 pod
-
为测试 pod 创建新的特权名称空间。 创建新的名称空间可防止现有名称空间中的任何定制策略或配置影响测试 pod。 在此示例中,新名称空间称为
pod-network-test。创建名称空间。
kubectl create ns 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 -
应用守护进程集,在每个工作节点上部署一个测试 pod。
kubectl apply --namespace pod-network-test -f <daemonset-file> -
列出命名空间中的所有 pod,验证 pod 是否成功启动。
kubectl get pods --namespace pod-network-test -o wide
在 pod 中运行测试
运行 curl,ping 和 nc 命令以测试每个 pod 的网络连接,并运行 dig 命令以测试集群 DNS。 查看每个输出,然后参阅 确定问题 以查找结果可能意味着什么。
-
列出测试 pod 并记下每个 pod 的名称和 IP。
kubectl get pods --namespace pod-network-test -o wide示例输出
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES webserver-test-2fv7c 1/1 Running 0 68s 172.17.36.169 10.245.0.4 <none> <none> webserver-test-4mktb 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-4mktb Pod Information: node name: env var NODE_NAME not set pod name: webserver-test-4mktb 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.17.61.240 (172.17.61.240) 56(84) bytes of data. 64 bytes from 172.17.61.240: icmp_seq=1 ttl=62 time=0.473 ms 64 bytes from 172.17.61.240: icmp_seq=2 ttl=62 time=0.449 ms 64 bytes from 172.17.61.240: icmp_seq=3 ttl=62 time=0.381 ms 64 bytes from 172.17.61.240: icmp_seq=4 ttl=62 time=0.438 ms 64 bytes from 172.17.61.240: icmp_seq=5 ttl=62 time=0.348 ms --- 172.17.61.240 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": "34", "emulationMajor": "1", "emulationMinor": "34", "minCompatibilityMajor": "1", "minCompatibilityMinor": "33", "gitVersion": "v1.34.7+IKS", "gitCommit": "67bf12be5abc8e65743a243172693ad1a098a2c4", "gitTreeState": "clean", "buildDate": "2026-04-16T04:24:50Z", "goVersion": "go1.25.9", "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 服务网格的故障排除文档。
- 此问题可能与应用程序中的错误相关,而不是与集群相关,并且可能需要您自己的独立故障诊断。
-
如果针对某些 pod 的
curl,ping或nc命令失败,请标识这些 pod 所在的工作程序节点。 如果问题仅存在于某些工作程序节点上,请 更换这些工作程序节点 或查看有关 工作程序节点故障诊断 的其他信息。 -
如果
dig命令中的 DNS 查找失败,请检查是否正确配置了 集群 DNS。
如果您仍无法解决 pod 联网问题,请 打开支持案例,并包含问题的详细描述,您尝试解决该问题的方式,您运行的测试类型以及 pod 和工作程序节点的 相关日志。 有关打开支持案例以及要包含哪些信息的更多信息,请参阅 常规调试指南。