gpt4 book ai didi

java - Kubernetes:无法访问部署的公开服务

转载 作者:行者123 更新时间:2023-12-02 13:14:27 25 4
gpt4 key购买 nike

我在 Google Container Engine 上部署了一个容器,它运行良好。现在,我想揭露它。

此应用程序是一个监听 2 个端口的服务。使用 kubectl 公开部署,我创建了 2 个负载均衡器,每个端口一个。

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

我制作的第一个应用程序按其应有的方式公开了该应用程序。我能够与应用程序通信并获得响应。

第二个根本无法连接。我不断收到连接被拒绝或连接超时的消息。为了解决这个问题,我进一步精简了我的防火墙规则,尽可能宽松地解决这个问题。由于默认情况下允许 ICMP,因此 ping 该平衡器的 IP 会得到回复。

即使可以配置多个负载均衡器,kubernetes 是否只允许一个负载均衡器工作?如果有的话,工作平衡器的外部 IP 格式为 35.xxx.xxx.xxx,而不工作的平衡器的 IP 为 107.xxx.xxx.xxx。

作为一个附带问题,有没有一种方法可以使用 kubectl Exposure --port 公开多个端口,而不需要定义范围,即我只需要 2 个端口?

最后,我尝试使用 Google 控制台,但无法让负载均衡器或转发规则与 kubernetes 上的内容配合使用,就像在 kubectl 上那样。

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

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

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

编辑:外部IP与此无关。我不断删除并重新创建平衡器,直到为工作平衡器提供了 xxx.xxx.xxx.xxx 的 IP,并且平衡器仍然工作正常。

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

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

最佳答案

经过更彻底的调查(在正在运行的 Pod 中打开控制台、安装 tcpdump、iptables 等),我发现该服务(即负载均衡器)实际上是可以访问的。在这种情况下发生的情况是,尽管流量到达了容器的虚拟网络接口(interface) (eth0),但数据并未路由到监听服务,即使这些是接口(interface)的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com