全部產品
Search
文件中心

:通過複用已有負載平衡實現跨叢集部署服務

更新時間:Jul 27, 2024

為了提高容災能力和可靠性,或實現更進階別的安全隔離,跨叢集部署服務是一種有效策略。這種情況下,如果每個後端Service都選擇LoadBalancer類型,會因為建立多個負載平衡器執行個體導致浪費。通過使用CCM(cloud-controller-manager)組件,您可以在已有的Server Load Balancer執行個體上同時掛載叢集內與叢集外的端點,使用單一Server Load Balancer執行個體達成跨叢集部署服務的目標,同時還可以為端點設定轉寄權重。

前提條件

情境一:將流量轉寄至叢集的Service和叢集外的端點

您可以在Server Load Balancer執行個體上同時掛載叢集內的Service和叢集外的端點(例如ECS)。

  1. 傳統型負載平衡CLB控制台網路型負載平衡NLB控制台查看已有Server Load Balancer執行個體的ID。

  2. 建立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連接埠的監聽。

  3. 登入傳統型負載平衡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的組合名稱不能相同。

  1. 登入傳統型負載平衡CLB控制台網路型負載平衡NLB控制台,為Server Load Balancer執行個體建立監聽與虛擬伺服器組。具體操作,請參見CLB監聽概述建立和管理CLB虛擬伺服器組NLB監聽概述建立和管理伺服器組

  2. 建立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配置了轉寄權重,請勿在控制台再對轉寄權重進行調整,否則可能導致狀態不同步。

相關文檔