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



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

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

您想要实现的目标是不可能的。原因有二。

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

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

这个入口网关是一个K8S服务,它公开了NodePorts。你可以通过以下命令获得它们:

# 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。

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

更新

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

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

操作指南没有提到Istio,只有Kubernetes服务,我认为TCP还不可用,只有HTTP。请记住,它特别指出kubemci是一个临时工具,直到他们将功能构建到Kuectl中。

但是,如果您对节点端口进行相同的配置,它应该可以很好地工作。

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

最新更新