【问题标题】:Kubernetes: Exposed service to deployment unreachableKubernetes:暴露的服务无法部署
【发布时间】:2017-05-06 23:52:41
【问题描述】:

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

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

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

我所做的第一个公开了应用程序。我能够与应用程序通信并获得响应。

第二个根本没有连接。我不断收到连接被拒绝或连接超时。为了解决这个问题,我进一步剥离了我的防火墙规则,以尽可能宽容地解决这个问题。由于允许 ICMP,默认情况下,ping 此平衡器的 ip 会导致回复。

kubernetes 是否只允许一个负载均衡器工作,即使可以配置多个?如果重要的话,工作平衡器的外部 ip 在模式 35.xxx.xxx.xxx 中,而不工作的平衡器的 ip 是 107.xxx.xxx.xxx。

作为一个附带问题,有没有一种方法可以使用 kubectl expose --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 实现。

【问题讨论】:

    标签: java kubernetes google-kubernetes-engine


    【解决方案1】:

    经过更彻底的调查(在正在运行的 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 文档中提到了这一点。

    【讨论】:

      猜你喜欢
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2021-08-13
      • 1970-01-01
      • 2020-07-17
      • 2018-10-31
      • 2020-06-18
      相关资源
      最近更新 更多