Load-Balancing

如何在Google計算引擎中創建內部/私有負載均衡器

  • June 12, 2018

我有兩個集群。集群 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 groups thread 中所建議的,HA 代理是另一個建議。

另一個想法是向整個 WAN 開放防火牆,並在集群 A 和 B 之間添加安全身份驗證。出於安全原因,這可能是一個好主意嗎?難度可能從簡單到困難,具體取決於集群 A 和 B 正在執行 - 有一個更通用的解決方案可能會很好。

有沒有人有更好的主意?還有其他人有同樣的問題嗎?

現在可以使用官方 GCP 內部 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

我對複雜性感到抱歉!我不是 Compute Engine 防火牆方面的專家,但我希望您對源標籤僅適用於內部流量的限制是正確的。

Kubernetes 團隊意識到協調多個集群是很困難的,我們正在開始研究解決方案,但不幸的是,我們還沒有任何特別可靠和可用的東西。

與此同時,有一種不使用Google云負載均衡器或類似 haproxy 的東西的方式來對從一個集群到另一個集群的流量進行負載均衡。您可以在要與之通信的服務的PublicIPs 欄位中指定集群 B 中的一個節點的內部 IP 地址(或將流量定向到集群 B 中的節點之一的 GCE 路由的 IP) 。然後,讓集群 A 將其請求發送到服務埠上的該 IP,它們將在支持該服務的所有 pod 之間保持平衡。

它應該可以工作,因為在 kubernetes 集群的每個節點上執行著一個叫做 kube-proxy 的東西,它會自動將用於服務 IP 和埠的流量代理到支持該服務的 Pod。只要 PublicIP 在服務定義中,kube-proxy 就會為您平衡流量。

如果您停在這裡,這僅與您將流量發送到其 IP 的節點一樣可靠(但單節點可靠性實際上非常高)。然而,如果你想變得更漂亮,我們可以通過集群 A 的負載平衡到集群 B 中的所有節點來使事情變得更可靠。

為了完成這項工作,您需要將集群 B 的所有節點的內部 IP(或到所有節點的內部 IP 的路由)放在服務的 PublicIPs 欄位中。然後,在集群 A 中,您可以使用空標籤選擇器創建一個單獨的服務,並在使用集群 B 中的每個 IP 的 (IP, port) 對創建它時手動填充其中的端點欄位。空標籤選擇器可以防止kubernetes 基礎設施不會覆蓋您手動輸入的端點,並且集群 A 中的 kube-proxy 將跨集群 B 的 IP 對服務的流量進行負載平衡。如果您想要更多上下文, PR #2450使這成為可能。

如果您需要更多幫助,請告訴我!

引用自:https://serverfault.com/questions/682236