為了提高容災能力和可靠性,或實現更高級別的安全隔離,跨集群部署服務是一種有效的策略。這種情況下,如果每個后端Service都選擇LoadBalancer類型,會因為創建多個負載均衡器實例導致浪費。通過使用CCM(cloud-controller-manager)組件,您可以在已有的負載均衡實例上同時掛載集群內與集群外的端點,使用單一負載均衡實例達成跨集群部署服務的目標,同時還可以為端點設置轉發權重。
前提條件
已創建CLB或NLB實例,且該實例與ACK集群處于同一地域。具體操作,請參見創建和管理CLB實例、創建和管理NLB實例。
cloud-controller-manager組件為v2.0.1或更高版本。關于如何升級組件,請參見管理組件。
已通過kubectl工具連接集群。具體操作,請參見獲取集群KubeConfig并通過kubectl工具連接集群。
場景一:將流量轉發至集群的Service和集群外的端點
您可以在負載均衡實例上同時掛載集群內的Service和集群外的端點(例如ECS)。
在傳統型負載均衡CLB控制臺或網絡型負載均衡NLB控制臺查看已有負載均衡實例的ID。
創建Service時選擇復用已有負載均衡實例。
使用控制臺創建
通過容器服務管理控制臺創建Service時,服務類型選擇負載均衡選項,并選擇使用已有SLB,然后在下方選擇要使用的已有負載均衡實例,并選中強制覆蓋已有監聽。
通過kubectl創建
使用kubectl創建Service時,需要在Annotation中填入負載均衡實例的ID。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${LB_ID} # ${LB_ID}替換為已有負載均衡實例的ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" # 設置為true,會自動創建監聽與虛擬服務器組。 labels: #... name: #... spec: #...
重要創建Service后,CCM組件會在目標負載均衡實例中自動創建一個虛擬服務器組,以及一個后端為此虛擬服務器組、端口為Service端口的監聽。
登錄傳統型負載均衡CLB控制臺或網絡型負載均衡NLB控制臺。在自動創建的虛擬服務器組中添加集群外的端點。具體操作,請參見創建和管理CLB虛擬服務器組、創建和管理服務器組。
配置完成后,您在虛擬服務器組中既可以看到集群內的Pod,又可以看到集群外的端點,也可以為它們設置轉發權重。集群內應用進行擴縮容時,會自動將集群內的端點加入或移出服務器組,集群外的ECS節點不受影響。
場景二:將流量轉發至多個ACK集群內的Service
您可以在負載均衡實例上同時掛載多個不同集群內的Service,為它們提供統一的入口。
為了在Service后端的Pod發生變化時能自動更新負載均衡實例的后端轉發端點,多個Service復用同一個負載均衡實例時,需要共用相同的監聽以及虛擬服務器組。您需要手動為負載均衡實例配置監聽和虛擬服務器組,并在所有Service中復用此虛擬服務器組,監聽使用的端口需要與Service相同。
不同集群中的Service需要使用統一的端口。
集群的命名空間+Service的組合名稱不能相同。
登錄傳統型負載均衡CLB控制臺或網絡型負載均衡NLB控制臺,為負載均衡實例創建監聽與虛擬服務器組。具體操作,請參見CLB監聽概述、創建和管理CLB虛擬服務器組、NLB監聽概述、創建和管理服務器組。
創建Service時復用已手動創建的虛擬服務器組。
在Service的Annotation中填入負載均衡實例的ID以及虛擬服務器組的ID,即可復用虛擬服務器組。同時可以為Service設置轉發權重。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}" # ${YOUR_LB_ID}替換為已有負載均衡實例ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port: "${YOUR_VGROUP_ID}:{PORT}" # ${YOUR_VGROUP_ID}替換為虛擬服務器組ID,{PORT}替換為Service的端口。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-weight: "100" # 選填參數。此Service所屬的Pod在負載均衡實例后端的轉發權重。取值范圍1~1000,默認值100。 labels: #... name: #... spec: #...
說明如果
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vgroup-port
有多個端口及虛擬服務器組的組合,可以通過英文半角逗號(,)分隔。例如"${YOUR_VGROUP_ID_1}:80, ${YOUR_VGROUP_ID_2}:443"。配置完成后,登錄負載均衡控制臺,可以看到虛擬服務器組中有多個來自不同集群的Service的Pod。某個集群內的應用進行擴縮容時,會自動將其所屬的Pod加入或移出服務器組,不會影響其他集群的Pod。
重要如果您在Service中使用Annotation配置了轉發權重,請勿在控制臺再對轉發權重進行調整,否則可能導致狀態不同步。
相關文檔
更多Annotation的配置,請參見通過Annotation配置傳統型負載均衡CLB及通過Annotation配置網絡型負載均衡NLB。
CCM組件的變更記錄,請參見Cloud Controller Manager。