我在Google Container Engine上部署了一个容器,它运行良好。现在,我要公开它。

此应用程序是在2个端口上侦听的服务。使用kubectl暴露部署,我创建了2个负载均衡器,每个端口一个。

我制作了2个负载平衡器,因为kubectl暴露命令似乎不允许多个端口。虽然我在kubectl上将其定义为type = LoadBalancer,但是一旦在GKE上创建了它们,它们便被定义为与2个目标池关联的转发规则,这些目标池也由kubectl创建。 kubectl还会自动为每个平衡器制定防火墙规则。

我制作的第一个应用程序应按需公开。我能够与应用程序进行通信并获得响应。

第二个根本不连接。我一直保持连接被拒绝或连接超时。为了解决此问题,我进一步简化了防火墙规则,以尽可能地宽松,以解决此问题。由于允许使用ICMP,因此默认情况下,对此平衡器ping ip会得到答复。

即使可以配置多个负载均衡器,kubernetes是否仅允许一个负载均衡器工作?如果有关系,则工作平衡器的外部ip处于模式35.xxx.xxx.xxx,不起作用的平衡器的ip为107.xxx.xxx.xxx。

作为附带的问题,是否有一种方法可以使用kubectl暴露-端口公开多个端口,而无需定义范围,即我只需要2个端口?

最后,我尝试使用Google控制台,但无法获得负载平衡器,或无法转发规则以与kubernetes上的设备一起使用,就像在kubectl上那样。

这是我使用的命令,在第二次使用时修改了端口和服务名称:

kubectl expose deployment myapp --name=my-app-balancer --type=LoadBalancer --port 62697 --selector="app=my-app"


我的防火墙规则基本上设置为允许所有传入的TCP连接超过0.0.0.0/0。

编辑:
外部IP与它无关。我一直删除并重新创建平衡器,直到为工作平衡器分配了xxx.xxx.xxx.xxx的IP,并且平衡器仍然可以正常工作。

我还尝试删除正在工作的平衡器,然后重新创建一个不起作用的平衡器,以查看平衡器之间是否存在冲突。即使是第二台平衡器,它仍然没有工作。

我目前正在研究应用程序第二服务的代码,尽管它实际上与第一服务相同,这是一个在定义的端口上侦听的简单ServerSocket实现。

最佳答案

经过更彻底的调查(在正在运行的Pod中打开控制台,安装tcpdump,iptables等)之后,我发现该服务(即负载均衡器)实际上是可以访问的。在这种情况下发生的事情是,尽管流量到达了容器的虚拟网络接口(eth0),但即使这些是接口的ip别名(eth0:1,eth0:2),也没有将数据路由到侦听服务。

使它起作用的最后一步是通过

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport <listener-ip> -j DNAT --to-destination <listener-ip>


注意,还有其他方法可以完成此操作,但这是我选择的方法。我希望Docker / Kubernetes文档提到这一点。

关于java - Kubernetes:暴露给部署的服务无法访问,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43826490/

10-10 02:38