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

时间:2019-10-23 18:12:22

标签: google-cloud-platform google-kubernetes-engine istio

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

这是我想要实现的目标吗?如果是这样,上面是否还缺少步骤?

3 个答案:

答案 0 :(得分:1)

您无法实现的目标。有两个原因。

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

答案 1 :(得分:0)

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

此入口网关是公开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创建的实例组来设置全局负载平衡器后端。通过这种方式,您的流量将被路由到Istio,而无需使用Ingress网关(-> TCP Loadbalancer)。

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

更新

经过反射后,如果要在两个区域中路由相同的流量,则必须依靠执行这种负载平衡的动态DNS服务。大多数时候,这种DNS服务都包含运行状况检查,以验证您所在的区域是否响应。如今,Google Global Load Balancing不允许这样做。我知道Cloudflare可以做到这一点。

答案 2 :(得分:0)

GCP有一个单独的工具供您用来建立称为KubeMCI的全局入口,它需要一些手动干预,例如,路由到这种情况下的服务(在这种情况下,您的Istio网关需要作为节点端口运行)负载均衡器的性能和节点端口在要响应的每个群集上都必须完全相同。

该操作方法仅参考Kubernetes服务而不引用Istio,并且我认为TCP仅HTTP尚不可用。简而言之,它特别指出kubemci是一个临时工具,直到他们将功能内置到Kubectl中为止。

但是,只要为节点端口配置相同的端口,便应该可以正常工作。

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