如何在 Google 计算引擎中创建内部/私有负载均衡器

如何在 Google 计算引擎中创建内部/私有负载均衡器

我有两个集群。集群 A(在 Google 容器引擎上)是一个面向公众的集群,它需要连接到私有集群 B(GCE 上的单击部署集群)才能访问服务。我希望集群 A 通过负载均衡器连接到集群 B,这样就可以工作,尽管似乎所有 GCE 负载均衡器都需要公共 IP 地址https://groups.google.com/d/topic/gce-discussion/Dv6289i4_rg/discussion(如果一切都是私人的就更好了)。

如果您可以设置一个简单的防火墙规则并使用标准的 Google 负载均衡器,那么公共 IP 地址本身并不是那么糟糕。不幸的是,源标签似乎没有跨越 WAN 阈值(或者只是没有被负载均衡器传递)。这是我想要使用的规则:

gcloud compute firewall-rules create servicename-lb-from-gke-cluster --allow tcp:1234 --source-tags k8s-gke-cluster-node --target-tags servicename #DOES NOT WORK

输入上述命令后,集群 A 无法通过 tcp 端口 1234 与集群 B(通过负载均衡器)通信。

这确实有效,但很痛苦,因为它需要监督来自动设置源集群的公共 IP 地址:

gcloud compute firewall-rules create servicename-lb-from-gke-cluster --allow tcp:1234 --source-ranges 100.2.3.4/32 100.3.5.9/32 100.9.1.2/32 --target-tags servicename #Does work, but is painful

正如 google 群组帖子所建议的,HA 代理是另一个建议。

另一个想法是向整个 WAN 开放防火墙,并在集群 A 和 B 之间添加安全身份验证。出于安全原因,这样做也许是个好主意?不过,难度可能从易到难,具体取决于集群 A 和 B 正在运行什么 - 最好有一个更通用的解决方案。

有谁有更好的主意吗?还有人遇到同样的问题吗?

答案1

抱歉,内容太复杂了!我不是 Compute Engine 防火墙方面的专家,但我认为你对源标签仅适用于内部流量的限制是正确的。

Kubernetes 团队意识到协调多个集群很困难,我们正在开始研究解决方案,但不幸的是,我们还没有为您提供特别可靠和可用的解决方案。

与此同时,有一种巧妙的方法可以将流量从一个集群负载平衡到另一个集群,而无需使用 Google Cloud Load Balancer 或类似 haproxy 的东西。您可以在以下位置指定集群 B 中某个节点的内部 IP 地址(或将流量定向到集群 B 中某个节点的 GCE 路由的 IP):PublicIPs 字段您想要与之通信的服务。然后,让集群 A 将其请求发送到服务端口上的该 IP,这些请求将在支持该服务的所有 pod 之间进行平衡。

它应该可以工作,因为在 kubernetes 集群的每个节点上都运行着一个叫做 kube-proxy 的东西,它会自动将服务 IP 和端口的流量代理到支持该服务的 pod。只要 PublicIP 在服务定义中,kube-proxy 就会为您平衡流量。

如果您在这里停止,那么这仅与您要向其发送流量的 IP 的节点一样可靠(但单节点可靠性实际上相当高)。但是,如果您真的想变得更好,我们可以通过在集群 A 到集群 B 中的所有节点之间进行负载平衡,使事情变得更可靠一些。

为了实现这一点,您需要将集群 B 的所有节点的内部 IP(或到所有节点的内部 IP 的路由)放入服务的 PublicIPs 字段中。然后,在集群 A 中,您可以创建一个带有空标签选择器的单独服务,并在创建该服务时手动填充其中的端点字段,并为集群 B 中的每个 IP 创建 (IP, 端口) 对。空标签选择器可防止 Kubernetes 基础架构覆盖您手动输入的端点,集群 A 中的 kube-proxies 将在集群 B 的 IP 之间对服务的流量进行负载平衡。这是通过公关 #2450,如果您需要更多背景信息。

如果您需要更多帮助请告诉我!

答案2

现在,通过官方的 GCP Internal LB 可以实现这一点: https://cloud.google.com/compute/docs/load-balancing/internal/

具体来说,这里是 kubernetes(GKE)文档: https://cloud.google.com/kubernetes-engine/docs/how-to/internal-load-balancing

注意服务注释:

  annotations:
    cloud.google.com/load-balancer-type: "Internal"

请注意,虽然此 LB 已经只能在内部访问,但是如果您想进一步限制到集群 pod,您可以执行以下操作:

loadBalancerSourceRanges: 10.4.0.0/14

要获取你的 pod IP 范围,你可以运行: gcloud container clusters describe $CLUSTER_NAME |grep clusterIpv4Cidr

相关内容