我已经在VM上安装了k8s,由于kubelet在VM上配置iptable NAT,现在我可以通过这个VM上的服务访问pods。
我的目标是通过位于集群外部的机器(让它称为my-home-machine)通过服务的IP地址访问豆荚。我已经通过主节点配置了路由到k8s服务I。因此,我可以将数据包发送到nginx,例如,使用my-home-machine提供的netcat这样的方式:
netcat -zv 10.77.112.147 80其中10.77.112.147是ClusterIP of nginx- k8s中的服务。在nginx内部,我看到了使用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的ClusterIP。正如你所看到的,荚已经得到了数据包并发送了响应。此外,我可以在nginx运行的K8s节点上捕捉到这个响应。再次使用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 010.0.10.64之后,数据包在到达my-home-machine之前再经过三个路由器。问题是这个包根本没有到达my-home-machine (我从netcat那里得到超时)。我怀疑10.0.10.64有什么问题,因为我可以从nginx成功地通过my-home-machine或连接到mysql服务器(运行在my-home-machine上)。有什么建议吗?我该怎么解决?
发布于 2020-02-27 06:44:22
正如您在问题中提到的,这些IP地址是“虚拟的”,并且是通过iptables魔法创建的。如果您想从软件定义的网络之外访问Kubernetes Service,则需要使用Service of type: NodePort (或type: LoadBalancer,与NodePort相同--它也尝试为您提供负载均衡器),或者,如果您已经在集群中运行了入口控制器,并且Service与入口控制器施加的约束兼容,则可以使用Ingress资源。
https://serverfault.com/questions/1004715
复制相似问题