為了提高容災能力和可靠性,或實現更進階別的安全隔離,跨叢集部署服務是一種有效策略。這種情況下,如果每個後端Service都選擇LoadBalancer類型,會因為建立多個負載平衡器執行個體導致浪費。通過使用CCM(cloud-controller-manager)組件,您可以在已有的Server Load Balancer執行個體上同時掛載叢集內與叢集外的端點,使用單一Server Load Balancer執行個體達成跨叢集部署服務的目標,同時還可以為端點設定轉寄權重。
前提條件
已建立CLB或NLB執行個體,且該執行個體與ACK叢集處於同一地區。具體操作,請參見建立和管理CLB執行個體、建立和管理NLB執行個體。
cloud-controller-manager組件為v2.0.1或更高版本。關於如何升級組件,請參見管理組件。
已通過kubectl工具串連叢集。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集。
情境一:將流量轉寄至叢集的Service和叢集外的端點
您可以在Server Load Balancer執行個體上同時掛載叢集內的Service和叢集外的端點(例如ECS)。
在傳統型負載平衡CLB控制台或網路型負載平衡NLB控制台查看已有Server Load Balancer執行個體的ID。
建立Service時選擇複用已有Server Load Balancer執行個體。
使用控制台建立
通過Container Service管理主控台建立Service時,服務類型選擇負載平衡選項,並選擇使用已有SLB,然後在下方選擇要使用的已有Server Load Balancer執行個體,並選中強制覆蓋已有監聽。
通過kubectl建立
使用kubectl建立Service時,需要在Annotation中填入Server Load Balancer執行個體的ID。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: ${LB_ID} # ${LB_ID}替換為已有Server Load Balancer執行個體的ID。 service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners: "true" # 設定為true,會自動建立監聽與虛擬伺服器組。 labels: #... name: #... spec: #...
重要建立Service後,CCM組件會在目標Server Load Balancer執行個體中自動建立一個虛擬伺服器組,以及一個後端為此虛擬伺服器組、連接埠為Service連接埠的監聽。
登入傳統型負載平衡CLB控制台或網路型負載平衡NLB控制台。在自動建立的虛擬伺服器組中添加叢集外的端點。具體操作,請參見建立和管理CLB虛擬伺服器組、建立和管理伺服器組。
配置完成後,您在虛擬伺服器組中既可以看到叢集內的Pod,又可以看到叢集外的端點,也可以為它們設定轉寄權重。叢集內應用進行擴縮容時,會自動將叢集內的端點加入或移出伺服器組,叢集外的ECS節點不受影響。
情境二:將流量轉寄至多個ACK叢集內的Service
您可以在Server Load Balancer執行個體上同時掛載多個不同叢集內的Service,為它們提供統一的入口。
為了在Service後端的Pod發生變化時能自動更新Server Load Balancer執行個體的後端轉寄端點,多個Service複用同一個Server Load Balancer執行個體時,需要共用相同的監聽以及虛擬伺服器組。您需要手動為Server Load Balancer執行個體配置監聽和虛擬伺服器組,並在所有Service中複用此虛擬伺服器組,監聽使用的連接埠需要與Service相同。
不同叢集中的Service需要使用統一的連接埠。
叢集的命名空間+Service的組合名稱不能相同。
登入傳統型負載平衡CLB控制台或網路型負載平衡NLB控制台,為Server Load Balancer執行個體建立監聽與虛擬伺服器組。具體操作,請參見CLB監聽概述、建立和管理CLB虛擬伺服器組、NLB監聽概述、建立和管理伺服器組。
建立Service時複用已手動建立的虛擬伺服器組。
在Service的Annotation中填入Server Load Balancer執行個體的ID以及虛擬伺服器組的ID,即可複用虛擬伺服器組。同時可以為Service設定轉寄權重。
apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: "${YOUR_LB_ID}" # ${YOUR_LB_ID}替換為已有Server Load Balancer執行個體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在Server Load Balancer執行個體後端的轉寄權重。取值範圍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。