Kubernetes中节点间无法访问服务IP

3
我已在Azure云中创建了一个带有一个主节点(Master)和两个节点(Node1Node2)的kubernetes v1.2。我已部署了一个NginxTomcat应用程序。这两个容器都部署在各自的pods中,具有RC,并且每个都有一个SERVICENginx pod 部署在 Node1 上,而Tomcat pod则部署在 Node2上。现在,从 Node1Nginx 尝试通过位于 Node2 中的 tomcat's ServiceIP(clusterIP) 访问Tomcat,但无法访问。

Nginx serviceIP: 10.16.0.2 Node1

Tomcat serviceIP: 10.16.0.4 Node2

我尝试从 Node2 使用 curl 10.16.0.4:8080,它可以工作。但同样的操作从 Node1 失败,并显示curl: (52) Empty reply from server 因此,节点间服务IP的通信失败。这是kube v1.2的问题吗?
注意:创建服务时必须指定服务的ClusterIP。

你可以直接访问Tomcat Pod的IP地址吗?这将有助于确定是服务路由问题还是更一般的网络问题。 - CJ Cullen
你正在使用哪个覆盖网络插件?你是在使用iptables模式还是用户空间模式?请参考此链接https://dev59.com/SloV5IYBdhLWcg3wkfe9。 - atv
@MrE,我没有设置DNS(也没有安装任何插件)。我们需要为节点间通信设置DNS吗? - Sujai Sivasamy
Pod通常通过服务进行通信,而服务使用DNS,因此在实践中确实需要DNS,特别是为了跟踪可能会更改的IP。现在我认为问题在于Pod无法调用自己的IP,这似乎是您正在做的事情。Pod通过其本地主机地址进行通信。我相信原因是如果可以的话,它将导致无限循环(即Pod不应该调用自身)。 - MrE
我可以通过IP地址从运行它的同一节点访问Pod,但无法从不同的节点访问。这与DNS有关吗? - Sujai Sivasamy
显示剩余2条评论
1个回答

0

由于您能够从Node2访问集群IP,看起来服务选择器已经正确定义。

Kube-proxy是监视服务并为端点创建iptables规则的组件。我会检查Node1上的kube-proxy是否正常运行。然后检查是否为您正在尝试访问的集群IP正确设置了iptables规则。 您可以使用iptables -L -t nat | grep namespace/servicename查看这些内容。

以下是一个示例:

bash-4.3# iptables -L -t nat | grep kube-system/heapster KUBE-MARK-MASQ all -- 172.168.16.182 anywhere /* kube-system/heapster: */ DNAT tcp -- anywhere anywhere /* kube-system/heapster: */ tcp to:172.168.16.182:8082 KUBE-SVC-BJM46V3U5RZHCFRZ tcp -- anywhere 192.168.172.66 /* kube-system/heapster: cluster IP */ tcp dpt:http KUBE-SEP-KNJP5BBKUOCH7NDB all -- anywhere anywhere /* kube-system/heapster: */

在这个例子中,我查找了运行在kube-system命名空间中的heapster。它显示集群IP为192.168.172.66 DNAT到端点172.168.16.182,这是Pod的IP(您应该与kubectl describe service中列出的端点进行交叉检查)。
如果没有,请尝试重新启动kube-proxy。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接