【问题标题】:Cross-region load balancing + routing on Google Container EngineGoogle Container Engine 上的跨区域负载均衡+路由
【发布时间】:2016-05-17 02:34:22
【问题描述】:

如何在 Google Container Engine 上实现跨区域负载均衡?

我将在多个区域的每个区域拥有一个 Kubernetes 集群,我需要将流量从单个域名路由到地理位置最近的集群。

我研究过的一些选项:

  • Kubernetes LoadBalancers 似乎仅限于一个集群。
  • 我不确定您如何让 Kubernetes Ingress 与不同的集群通信。 (听起来这个对象是由 Compute Engine HTTP 负载平衡器支持的。)
  • Compute Engine HTTP 负载均衡器与暴露的集群 sounds right 交谈,但我引用的链接似乎有一些旧术语,例如 gcloud beta
  • 除此之外,我真的可以让 Kubernetes 集群跨越不同的区域吗?

现在,如果我想将不同的 URL 路径路由到 pod 中的不同容器,我应该在哪里做呢?如果它处于 Ingress 或 HTTP 负载均衡器级别,那么我没有足够的粒度来处理特定的容器。这是否意味着我必须为每个不同的 URL 路径使用不同的 pod + 服务?

【问题讨论】:

    标签: docker load-balancing google-compute-engine kubernetes google-kubernetes-engine


    【解决方案1】:

    Google 的 Network load balancing (L3) 负载平衡专门针对每个区域(如果您创建 LoadBalancer 类型的服务,这些负载平衡器会自动配置)。正如 Alex 在他的回答中提到的,如果您使用网络负载均衡,您将需要为每个区域配置一个负载均衡器,然后使用 DNS 将用户请求传播到您的每个负载均衡器。

    Google 的 HTTP(S) load balancing 是跨区域的(例如全球)。这意味着您将获得一个 IP 来平衡所有 HTTP(S) 后端,该后端可以分布在多个区域的多个集群中。对于跨集群负载均衡,您必须按照Is it possible to use 1 Kubernetes ingress object to route traffic to k8s services in different clusters? 中的说明自行配置 HTTP(S) 负载均衡器。

    在任何一种情况下,您都需要为要路由到唯一后端的每个 URL 路径创建不同的服务。这些服务不必使用不同的 pod,尽管您可能希望它们接收不同数量的流量并且您希望独立扩展它们。

    如果您使用 HTTP(S) 负载平衡器,您可以将这些服务和 URL 映射定义为负载平衡器配置的一部分,并让 HTTP(S) 平衡器为您执行请求检查/路由。如果您使用网络负载平衡器,则您需要自己运行一个 HTTP(S) 服务器来终止连接、检查请求并将其路由到适当的服务。

    除了这一切,我真的可以让一个 Kubernetes 集群跨越不同的区域吗?

    不是开箱即用的。您可以配置多专区集群(在一个区域内),但我们不提供对配置跨区域的集群的明确支持。虽然您可以自己手动执行此操作,但我们不建议您这样做,因为集群管理软件中有许多参数已根据集群内主节点和节点之间低延迟通信的假设进行了调整。

    【讨论】:

    • 我已经阅读了您链接的 Ingress 文档,但不知道如何将其用于后端多个集群。特别是,backend: 引用了serviceName:,这大概表示集群上运行 Ingress 控制器的服务?如何指定不同的集群?
    • 特别是,kubernetes.io/docs/api-reference/extensions/v1beta1/definitions/… 似乎只允许为后端指定 serviceName:servicePort:。也许我错过了什么?
    • 我想我用 ingress 把你引向了错误的方向,因为它不能解决你的特定问题(多个集群中的后端)。它适用于单个集群,但如果您希望在多个集群中使用后端,则需要手动配置 HTTP(S) 负载均衡器。配置方法见stackoverflow.com/questions/35446512/…
    • 我编辑了我的答案,不再提及入口,并说您需要进行手动配置。
    • 您的链接很有帮助。旁白:我可以创建一个Service without a selector 来指向其他集群,然后使用 Ingress 对这些服务进行负载平衡,大概。除了硬编码端点 IP 地址的缺点之外,这样做还有其他利弊吗?
    【解决方案2】:

    目前最直接的选择是在每个集群中运行可替代副本,为每个集群配置负载平衡器,然后手动设置 DNS 记录以指向负载平衡器。

    不过,这当然不是很好。正在为即将发布的 1.3 版本制定更好的解决方案:https://github.com/kubernetes/kubernetes/issues/23848

    【讨论】:

    • 我不需要跨区域负载均衡器而不是每个集群的负载均衡器吗?那我是不是只能通过 NodePort 暴露集群?
    • 最好使用跨区域负载均衡器,但只需将多个 IP 地址(每个区域一个)与单个 DNS 名称相关联也可以。地理 DNS 服务可用于确保地理上合理的路由,如下所示:stackoverflow.com/a/21082285/1925481
    • 当然可能有一种方法可以配置全局负载均衡器来满足您的需求,我只是没有立即意识到 :)
    猜你喜欢
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多