全部產品
Search
文件中心

Container Service for Kubernetes:配置Service負載平衡的注意事項及CCM資源更新策略

更新時間:Jul 10, 2026

當Service的類型設定為負載平衡,即Type=LoadBalancer時,Container ServiceACK的CCM(Cloud Controller Manager)組件會為該Service建立或配置一個Server Load Balancer執行個體。該執行個體類型包含:傳統型負載平衡CLB(Classic Load Balancer)和網路型負載平衡NLB(Network Load Balancer),配置包括執行個體、監聽、後端伺服器組等資源。本文介紹配置Service負載平衡的注意事項以及CCM的資源更新策略。

注意事項

哪些負載平衡可以被複用?

  • 僅支援複用通過負載平衡控制台建立的執行個體,不支援複用cloud-controller-manager自動建立的Server Load Balancer執行個體以及ACK管理的其它Server Load Balancer執行個體(如API Server所使用的負載平衡)。

  • 如果您需要在ACK叢集中複用私網類型的Server Load Balancer執行個體,則該執行個體需要和ACK叢集處於同一VPC下。跨VPC複用僅適用於NLB執行個體

  • 複用Server Load Balancer執行個體的地址類型必須與服務的訪問類型一致。當服務為公網訪問(即service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "internet")時,所用負載平衡的地址類型必須為公網;當服務為內部訪問(即service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: "intranet")時,所用負載平衡的地址類型必須為私網

  • 多個服務不能同時使用一個負載平衡的同一個監聽連接埠。

  • 跨叢集複用已有Server Load Balancer執行個體時,需要確保兩個叢集的命名空間和Service組合名稱不一致。

CCM管理負載平衡時注意事項

  • CCM只為Type=LoadBalancer類型的Service配置負載平衡,對於非LoadBalancer類型的Service則不會為其配置負載平衡。

  • 重要

    Type=LoadBalancer的Service變更為Type!=LoadBalancer時,CCM會刪除為該負載平衡添加的配置,從而造成無法通過該負載平衡訪問Service。

  • CCM使用聲明式API,會在一定條件下自動根據Service的配置重新整理負載平衡配置,您自行在負載平衡控制台上修改的配置均存在被覆蓋的風險。

  • 重要

    請勿在負載平衡控制台上手動修改ACK建立並維護的負載平衡的任何配置,否則有配置丟失的風險,造成Service不可訪問。

  • 請勿手動刪除或修改Service上的service.k8s.alibaba/resourcesservice.k8s.alibaba/nlb Finalizer,手動操作Finalizer可能會導致CLB或NLB資源無法被正常回收。

  • Cloud Controller Manager版本為v2.5.0及以上時,通過控制台建立Service時,CLB執行個體選項變為白名單功能。如需使用,請通過配額平台提交申請。

在叢集內訪問LoadBalancer Service的External IP的注意事項

受網路外掛程式類型、網路外掛程式版本及叢集版本影響,在叢集內訪問LoadBalancerService關聯的CLB IP時,叢集網路會在節點上截獲流量並直接轉寄至後端的Service Endpoint。

此過程會繞過外部的CLB執行個體,導致依賴CLB處理的特定配置失效,從而引發訪問異常。主要影響的情境包括:

  • externalTrafficPolicy設定為Local:流量可能因被轉寄到沒有後端Pod的節點而訪問失敗。

  • 啟用Proxy Protocol協議:後端服務無法擷取由CLB添加的Proxy Protocol頭部,導致協議握手失敗。

  • 使用HTTP/HTTPS類型監聽:依賴CLB進行TLS終止或添加特定Header(如X-Forwarded-For)等操作將不會生效。

因此,當存在叢集內訪問LoadBalancerService的需求時,建議:

  • 優先使用Service的叢集內地址,更為標準且穩定:在叢集內部的服務間通訊,使用Service的ClusterIP或其DNS名稱(如 <service-name>.<namespace>.svc.cluster.local)。

  • 如需使用CLB入口,通過Hostname訪問:為Service添加service.beta.kubernetes.io/alibaba-cloud-loadbalancer-hostname Annotation,並使用配置的網域名稱代替IP進行訪問,確保流量被正確處理。關於Annotation的詳細說明,請參見為Service設定Hostname

    重要

    使用此功能繞行CLB訪問時,應避免將用戶端Pod和服務端Pod調度到同一節點。否則,可能會因非對稱路由問題導致訪問不通。

CCM單叢集管理大規模負載平衡時注意事項

叢集規模較大時,CCM 對 Service 事件的處理能力存在一定限制。在以下情境中,負載平衡的建立、刪除及伺服器組的端點變更等操作可能出現延遲:

  • 大量 LoadBalancer 類型的 Service 同時建立或刪除

  • 大量 Service Endpoint 同時變更

  • 存在大量 LoadBalancer 類型 Service 時,節點批量加入或刪除

建議關注以下幾點:

  • 提前評估容量:進行大大量變更操作前做好容量評估和壓測,預留足夠的處理餘量,避免因延遲影響業務。

  • 保障變更期間的流量穩定:通過配置 readinessGatespreStop Hook 等方式,確保業務變更期間流量不中斷。詳見實現零中斷滾動部署

  • 關注配額限制:大規模使用 LoadBalancer 類型 Service 時,請重點關注 CLB 或 NLB 的配額限制。詳見下文的配額限制

  • 保持組件版本最新:及時升級叢集及 CCM 至最新版本,以獲得針對大規模叢集情境的持續最佳化。

如果需要為Service更換Server Load Balancer執行個體,該如何操作?

已建立LoadBalancer類型的Service不支援重新複用或更換Server Load Balancer執行個體。如果您需要更換Server Load Balancer執行個體,請刪除並重新建立Service。

外部存取與網路路徑說明

通過 LoadBalancer 類型 Service 對外暴露應用時,流量經負載平衡(CLB/NLB)進入後,負載平衡與後端之間通過阿里雲內網通訊,不經過節點公網頻寬。瞭解流量路徑有助於正確定位效能瓶頸,避免在無效維度上投入資源。

流量路徑

用戶端訪問 LoadBalancer Service 的完整鏈路為:

使用者(公網)→ 負載平衡(CLB/NLB)→ 阿里雲內網 → 後端節點/容器

負載平衡與後端節點/容器之間通過阿里雲內網通訊,不經過 ECS 節點的公網網卡及公網頻寬。

頻寬誤區

提升 ACK 節點的公網頻寬不能解決對外服務的高並發或流量峰值問題:

  • 外部存取 LoadBalancer Service 的頻寬消耗(含流媒體頻寬)發生在使用者到負載平衡之間,與節點頻寬無關。

  • 節點公網頻寬主要用於節點主動發起的出向流量(如拉取鏡像、訪問外部 API),不承載入向業務流量。

若遭遇公網頻寬瓶頸,應升級Server Load Balancer執行個體的頻寬規格,而非節點公網頻寬。

上行下行流量監控查看

如需查看 Service 的上行/下行流量,請登入負載平衡控制台,找到 Service 關聯的 CLB 或 NLB 執行個體,在其監控頁面查看流量指標,而非查看節點監控或叢集監控。

叢集外訪問方式與限制

叢集外部(如 VPC 內的 ECS 執行個體)訪問 Kubernetes Service 時,需根據 Service 類型選擇合適的訪問方式。ClusterIP 和 Pod IP 均存在訪問限制,建議使用私網 LoadBalancer Service 提供穩定入口。

ClusterIP 訪問限制

Service 的 ClusterIP 是 Kubernetes 分配的叢集內部虛擬 IP,僅在叢集網路內有效。同一 VPC 下的 ECS 或其他非叢集資源無法直接存取 ClusterIP(ClusterIP 不通),原因是 ClusterIP 的路由規則由叢集內的 kube-proxy 維護,叢集外部網路無法解析該虛擬 IP。

推薦方案:私網 LoadBalancer Service

若需從 VPC 內的 ECS 或其他非叢集資源訪問叢集應用,建議建立地址類型為私網的 LoadBalancer 類型 Service:

apiVersion: v1
kind: Service
metadata:
  annotations:
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type: intranet
spec:
  type: LoadBalancer
  # 其他欄位按需配置

CCM 會自動建立一個私網 SLB 執行個體,VPC 內的 ECS 可通過該私網 SLB 的固定內網 IP 穩定訪問叢集應用。

Pod IP 不穩定性

Pod IP 由叢集動態分配,Pod 重啟或重新調度後 IP 會發生變化(Pod IP 變化),不建議將 Pod IP 作為固定訪問入口。推薦使用以下穩定訪問方式:

  • 私網 LoadBalancer Service(VPC ECS 訪問推薦):通過私網 SLB IP 訪問,地址固定,適用於 VPC 內 ECS 訪問。

  • NodePort Service:通過節點 IP + 連接埠訪問,適用於可直接存取節點的情境。

配額限制

VPC

負載平衡

  • CCM會為Type=LoadBalancer類型的Service建立負載平衡。預設情況下一個使用者可以保留60個CLB執行個體和60個NLB執行個體。如果需要建立的數量大於60,請到配額平台提交申請

  • CCM會根據Service的配置將ECS或ENI掛載到負載平衡後端伺服器組中,並為 Service 中不同的 targetPort 分別建立獨立的伺服器組。 請關注以下配額限制:

    • 後端伺服器數量:預設一個CLB執行個體可掛載200個後端伺服器,NLB可掛載400個ECS/ENI/IP類型後端伺服器。實際所需配額 = 後端伺服器數 × targetPort 數量。請評估是否需要提前到配額平台提交申請申請擴容。

    • 伺服器組掛載次數:預設同一ECS或ENI執行個體可被掛載到CLB不同後端伺服器組的上限為50次,NLB為200次。如果掛載更多伺服器組,請到配額平台提交申請

    • 變換期間的額外佔用:業務變換期間,新 Pod 建立而舊 Pod 尚未銷毀時,會產生額外的配額佔用,實際消耗可能超出預期,請提前預留足夠配額。

  • CCM會根據Service中定義的連接埠建立監聽。預設情況下一個CLB或NLB執行個體可以添加50個監聽,如需添加更多監聽,請到配額平台提交申請

  • 更多負載平衡使用限制,請參見CLB使用限制NLB使用限制

    負載平衡配額查詢請參見負載平衡配額管理

負載平衡更新策略

ACK支援為Service指定一個已有的Server Load Balancer執行個體,或者讓CCM自動建立新的Server Load Balancer執行個體。兩種方式在負載平衡的資源更新策略方面存在一些差異,如下表所示。

資來源物件

指定已有負載平衡

CCM管理負載平衡

負載平衡

設定annotation:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id

  • CCM會使用該執行個體作為Service的負載平衡,並根據其他annotation配置負載平衡,自動為負載平衡建立多個虛擬伺服器組。

  • 當Service刪除時,CCM不會刪除您通過ID指定的已有負載平衡。

  • CCM會根據Service的配置,自動建立和配置負載平衡、監聽、虛擬伺服器組等資源,所有資源由CCM管理。

  • 當Service刪除時,CCM會刪除自動建立的負載平衡。

監聽

設定annotation:service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners

  • 如果設定為"false",CCM不會為負載平衡管理任何監聽配置。

  • 如果設定為"true",CCM會根據Service組態管理監聽;如果監聽已經存在,則CCM會覆蓋已有監聽。

CCM會根據Service的配置,自動建立和配置監聽策略。

後端伺服器組

當Service對應的後端Endpoint或者叢集節點發生變化時,CCM會自動更新負載平衡的後端虛擬伺服器組。

  • 對於Terway網路外掛程式,CCM預設掛載PodIP,而非掛載ECS節點到負載平衡後端。

  • 對於Flannel網路外掛程式,根據Service模式的不同,後端伺服器組的更新策略也有所不同。

    • Cluster模式(spec.externalTrafficPolicy = Cluster):CCM預設會將所有節點掛載到負載平衡的後端(使用BackendLabel標籤配置後端的除外)。

      重要

      負載平衡存在配額限制,限制了每個ECS能夠使用的負載平衡個數,這種方式會快速消耗該配額。當配額耗盡後,會造成Service Reconcile失敗。解決辦法:使用Local模式的Service。

    • Local模式(spec.externalTrafficPolicy = Local):CCM預設只會將Service對應的Pod所在節點加入到負載平衡後端。這樣可以降低負載平衡配額的消耗速度,同時支援四層源IP保留。

  • 對於Flannel網路外掛程式,任何情況下CCM都不會將Master節點作為負載平衡的後端。

  • 對於Flannel網路外掛程式,CCM預設不會從負載平衡後端移除被驅逐(kubectl drain)或停止調度(kubectl cordon)的節點。如需移除節點,請設定service.beta.kubernetes.io/alibaba-cloud-loadbalancer-remove-unscheduled-backendon

為Service開啟刪除保護

您可以為涉及關鍵業務、敏感性資料的Service開啟刪除保護功能,以避免誤刪除帶來的維護成本。啟用後,僅當您手動關閉刪除保護後,對應的資源才可以被刪除。關於為Service開啟刪除保護操作步驟詳情,請參見為Service開啟刪除保護