如何让一个 Kubernetes LoadBalancer 平衡多个服务?

iam*_*eli 4 nginx amazon-web-services amazon-elb kubernetes

我在 AWS 上的 Kubernetes 集群中托管了以下服务。

  • 一个 nginx 服务器,在端口 80 和 443 上。
  • Minecraft 服务器,端口 25565。

两者都工作得很好。我目前将它们都设置为type: LoadBalancer,因此它们都具有向集群提供入口的弹性负载均衡器。

我只想拥有一个 ELB——它们要花钱,而且没有理由不在同一个外部 IP 上安装 Minecraft 服务器和 HTTP(S) 服务器。

我尝试创建一个没有选择器的服务,然后尝试手动创建一个引用该服务的 Endpoints 对象,但它似乎不起作用。这是 gist 上的设置。当我尝试从集群内部curl分配时nodePort,它只是挂起。

有没有办法让一个服务平衡到多个服务?

Ale*_*son 5

Ingress 资源是在 1.1.0 版中添加的,专为此用例设计。它允许您将多个服务放在一个 IP 地址后面,根据 HTTP 路径路由到它们。查看用户指南了解更多详细信息,但如果您有更多问题,请随时提问!

编辑:对于非 HTTP(S) 服务,您必须找到一种方法来确保所有必要的端口都由 ELB 进行负载平衡,然后由 Kubernetes 正确路由。在 GCE 上,您可以使用您需要的端口手动创建负载均衡器,然后将负载均衡器的 IP 放在externalIPs每个服务的字段中。我的记忆有点模糊,但我不相信它会与 ELB 一起使用,因为它会重写数据包。您可能希望将每个服务创建为一个NodePort服务,然后配置您的 ELB 以将数据包从正确的外部端口转发到每个服务的节点端口。

  • 我喜欢入口!问题中引用的 nginx 服务器实际上是基于 Kubernetes 的 contrib repo 中的 nginx-alpha Ingress 控制器。我所有的 HTTP(S) 资源都在那里处理。不幸的是,这对我的 Minecraft 服务器没有帮助——它不是 HTTP。我想我可以在那个 pod 上有另一个容器来适当地代理 Minecraft 连接,但似乎 kube-proxy 应该能够直接处理。 (3认同)

MrE*_*MrE 5

您也可以简单地使用 nginx 作为您的 minecraft 服务器的代理,并将流量从入口端口 25565 转发到 minecraft 服务器。这样所有的流量都通过一个服务