我在一个共享的VPC网络上的两个区域中有GKE集群,它们都在运行istio,我需要在它们之间进行全局负载平衡。在用暴露了端口80的istio-ilbgateway设置了每个集群后,创建了GCP内部区域负载均衡器,并在该区域的子网上分配了一个外部IP。我可以看到两个ilb网关的相应后端服务。然而,当使用新的后端服务设置全局HTTP负载平衡器并ping全局负载平衡器的IP时,请求会被它定向到集群的一个节点的IP地址,而不是我预期的内部负载平衡器的IP地址。
我在这里努力实现的目标可能吗?如果是,上面是否缺少一个步骤?
您想要实现的目标是不可能的。原因有二。
- GCP没有可以处理两个不同集群的GKE入口。这被称为多集群入口,不受支持
- 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