我有两个集群。 集群A(在谷歌容器引擎上)是一个面向公众的集群,它需要连接到专用集群B(在GCE上的点击部署集群)来访问服务。 我希望集群A通过负载平衡器连接到集群B,即使所有GCE负载均衡器都需要公有IP地址,也可以工作https://groups.google.com/d/topic/gce讨论/ Dv6289i4_rg /讨论 (我宁愿如果它都是私人的)。
如果您只需设置一个简单的防火墙规则并使用标准的Google负载平衡器,公共IP地址本身就不是那么糟糕。 不幸的是,源标签似乎没有跨越广域网的门槛(或只是没有通过负载平衡器)。 这是我想要使用的规则:
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
正如谷歌组线程中所build议的,HA代理是另一个build议。
另一个想法是打开防火墙到整个广域网,并添加安全authentication之间的集群A和B.也许这是一个好主意,为安全起见呢? 根据A和B的运行情况,难度可能从容易变到困难 – 有一个更一般的解决scheme可能是很好的。
有没有人有更好的主意? 其他人是否也有同样的问题?
对于复杂性我感到抱歉 我并不是计算引擎防火墙的专家,但是我认为您对源代码标签的局限性只适用于内部stream量是正确的。
Kubernetes团队意识到,协调多个集群是困难的,我们正在开始解决scheme,但不幸的是,我们还没有什么特别坚实和可用的东西。
与此同时,在不需要Google云负载平衡器或类似haproxy的情况下,从一个群集到另一个群集负载平衡stream量也是一种很不好的方法。 您可以在要与之通话的服务的PublicIPs字段中指定集群B中某个节点的内部IP地址(或将stream量导向集群B中某个节点的GCE路由的IP地址)。 然后,集群A将其请求发送到该服务端口上的该IP,并且将在所有支持该服务的荚上进行平衡。
它应该可以工作,因为在kubernetes集群的每个节点上都有一个叫做kube-proxy的东西,它可以自动将用于服务IP和端口的stream量代理到支持该服务的pod。 只要PublicIP位于服务定义中,kube-proxy就会为您平衡stream量。
如果你在这里停下来的话,这只和你发送stream量的IP节点一样可靠(但是单节点可靠性实际上相当高)。 然而,如果你想变得很花哨,我们可以通过在集群B中的所有节点上从集群A进行负载均衡来使事情变得更加可靠。
要做到这一点,你需要在服务的PublicIPs字段中放置所有集群B节点的内部IP(或路由到所有节点的内部IP)。 然后,在集群A中,可以创build一个带有空标签select器的单独服务,并且在为集群B中的每个IP使用(IP,端口)对创build时,手动填充端点字段。空标签select器可以防止kubernetes基础设施将覆盖手动input的端点,群集A中的kube-proxies将负载均衡群集B的IP上的服务stream量。 如果你想要更多的上下文,这是通过PR#2450实现的 。
让我知道,如果你需要更多的帮助,任何这个!