GCP:将流量从全局 HTTP 负载均衡器定向到 istio 内部负载均衡器

GCP: Directing traffic from Global HTTP Load Balancer to istio internal load balancer

我在共享 VPC 网络上的 2 个区域中有 GKE 集群,两者都是 运行 istio,我需要在它们之间进行全局负载平衡。在为每个集群设置一个 istio-ilbgateway 并暴露端口 80 后,创建一个 GCP 内部区域负载均衡器并在该区域的子网上分配一个外部 IP。我可以看到两个 ilb-gateways 的相应后端服务。但是,当使用新的后端服务设置全局 HTTP 负载均衡器并 ping 全局负载均衡器的 IP 时,请求被它定向到集群节点之一的 IP 地址,而不是内部负载均衡器的 IP 地址,因为我预期的。

我想在这里实现的目标可能吗?如果是这样,上面是否缺少步骤?

你想要达到的目标是不可能的。有两个原因。

  1. GCP 没有可以处理两个不同集群的 GKE Ingress。这称为多集群入口,不受支持。
  2. GCP 负载均衡器不能将另一个负载均衡器作为后端。

您可以在 Istio 之上设置全局负载均衡器。但是,您无法访问 Istio Ingress Gateway 自动设置的 TCP 负载均衡器。

这个 Ingress Gateway 是一个暴露 NodePorts 的 K8S 服务。您可以使用以下命令获取它们:

# For HTTP
kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}'

# For HTTPS
kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}'

现在您可以使用集群创建的实例组和 NodePort 设置全局负载均衡器后端。通过这种方式,您的流量将在不使用 Ingress 网关(-> TCP 负载均衡器)的情况下路由到 Istio。

关于2个区域,你应该有2个实例组,每个区域1个,以及2个TCP Load Balancer,每个区域1个。顺便说一句,您可以在全局负载均衡器上定义 2 个不同的后端,但您不能在 2 个区域之间对相同的流量进行负载均衡。您将有 2 个不同的路径规则,因此有 2 个不同的 URL 条目

更新

经过深思熟虑,如果要在两个区域路由相同的流量,则必须依赖执行这种负载平衡的动态 DNS 服务。大多数时候,这种 DNS 服务包括健康检查,以验证您所在的地区是否有响应。今天 Google 全局负载平衡不允许这样做。我知道 Cloudflare 会这样做。

GCP 有一个单独的工具供您用来设置一个名为 KubeMCI 的全局入口,它需要一些手动干预,例如,在这种情况下,您的 Istio 网关需要路由到的服务 运行 作为节点端口而不是负载均衡器,节点端口需要在您希望它响应的每个集群上完全相同。

操作指南仅提及 Kubernetes 服务未提及 Istio,而且我认为 TCP 仅可用 HTTP(s)。请记住,它明确表示 kubemci 是一个临时工具,直到他们将功能构建到 Kubectl 中。

但是如果您配置相同的节点端口,它应该可以正常工作。

官方文档如下: https://cloud.google.com/kubernetes-engine/docs/how-to/multi-cluster-ingress