我已经在 VM 上安装了 k8s,现在我可以直接通过此 VM 上的服务访问 pod,因为 kubelet 在 VM 上配置了 iptable NAT。
我的目标是通过集群外部的机器(我们称之为)的 IP 地址访问 pod my-home-machine
。我已配置通过主节点到 k8s 服务 IP 的路由。因此,我可以通过my-home-machine
以下方式使用 netcat 将数据包发送到 nginx-pod:
netcat -zv 10.77.112.147 80
其中 10.77.112.147 是 k8s 中 nginx-service 的 ClusterIP。从 nginx-pod 内部,我使用 tcpdump 看到了这个请求:
17:42:55.985517 IP 10.0.10.64.56080 > 10.0.113.193.80: Flags [S], seq 3003847122, win 64240, options [mss 1460,sackOK,TS val 4001672643 ecr 0,nop,wscale 7], length 0
17:42:55.985557 IP 10.0.113.193.80 > 10.0.10.64.56080: Flags [S.], seq 3158920861, ack 3003847123, win 27760, options [mss 1400,sackOK,TS val 8954181 ecr 4001672643,nop,wscale 7], length 0
其中 10.0.10.64 是 k8s NAT 应该工作的地方(也许我错了,请纠正我),10.0.113.193 是 nginx-pod 的 ClusterIP。如您所见,pod 已收到数据包并发送响应。此外,我可以在运行 nginx-pod 的 k8s-node 上捕获此响应。再次使用 tcpdump:
21:06:24.669622 IP 10.0.113.193.http > 10.0.10.64.56080: Flags [S.], seq 475316172, ack 3702114669, win 27760, options [mss 1400,sackOK,TS val 9919609 ecr 4002638070,nop,wscale 7], length 0
21:06:25.673809 IP 10.0.113.193.http > 10.0.10.64.56080: Flags [S.], seq 475316172, ack 3702114669, win 27760, options [mss 1400,sackOK,TS val 9920614 ecr 4002638070,nop,wscale 7], length 0
10.0.10.64 数据包经过另外三个路由器后才能到达my-home-machine
。问题是这个数据包my-home-machine
根本没有到达(我从 netcat 中得到超时)。我怀疑 10.0.10.64 出了问题,因为我可以从 nginx-pod 成功 pingmy-home-machine
或连接到 mysql 服务器(在 上运行my-home-machine
)。有什么建议可以解决此问题吗?
答案1
正如您在问题中提到的,这些 IP 地址是“虚拟的”,是通过 iptables 向导创建的。如果您想Service
从软件定义网络之外访问 Kubernetes,则需要使用 of Service
(type: NodePort
或type: LoadBalancer
,与 相同,只是它还会尝试为您配置负载均衡器),或者,如果您的集群中已经有一个入口控制器正在运行,并且与入口控制器施加的约束兼容,NodePort
则可以使用资源。Ingress
Service