當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則不會為其配置負載平衡。CCM使用聲明式API,會在一定條件下自動根據Service的配置重新整理負載平衡配置,您自行在負載平衡控制台上修改的配置均存在被覆蓋的風險。
請勿手動刪除或修改Service上的
service.k8s.alibaba/resources或service.k8s.alibaba/nlbFinalizer,手動操作Finalizer可能會導致CLB或NLB資源無法被正常回收。Cloud Controller Manager版本為v2.5.0及以上時,通過控制台建立Service時,CLB執行個體選項變為白名單功能。如需使用,請通過配額平台提交申請。
當Type=LoadBalancer的Service變更為Type!=LoadBalancer時,CCM會刪除為該負載平衡添加的配置,從而造成無法通過該負載平衡訪問Service。
請勿在負載平衡控制台上手動修改ACK建立並維護的負載平衡的任何配置,否則有配置丟失的風險,造成Service不可訪問。
在叢集內訪問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-hostnameAnnotation,並使用配置的網域名稱代替IP進行訪問,確保流量被正確處理。關於Annotation的詳細說明,請參見為Service設定Hostname。重要使用此功能繞行CLB訪問時,應避免將用戶端Pod和服務端Pod調度到同一節點。否則,可能會因非對稱路由問題導致訪問不通。
CCM單叢集管理大規模負載平衡時注意事項
叢集規模較大時,CCM 對 Service 事件的處理能力存在一定限制。在以下情境中,負載平衡的建立、刪除及伺服器組的端點變更等操作可能出現延遲:
大量 LoadBalancer 類型的 Service 同時建立或刪除
大量 Service Endpoint 同時變更
存在大量 LoadBalancer 類型 Service 時,節點批量加入或刪除
建議關注以下幾點:
如果需要為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
叢集中一個節點對應一條路由表項,VPC預設情況下僅支援200條路由表項,如果叢集節點數目多於200個,請到配額平台提交申請。
更多VPC使用限制,請參見限制與配額。
查詢VPC配額,請參見Virtual Private Cloud配額管理。
負載平衡
CCM會為
Type=LoadBalancer類型的Service建立負載平衡。預設情況下一個使用者可以保留60個CLB執行個體和60個NLB執行個體。如果需要建立的數量大於60,請到配額平台提交申請。CCM會根據Service的配置將ECS或ENI掛載到負載平衡後端伺服器組中,並為 Service 中不同的 targetPort 分別建立獨立的伺服器組。 請關注以下配額限制:
CCM會根據Service中定義的連接埠建立監聽。預設情況下一個CLB或NLB執行個體可以添加50個監聽,如需添加更多監聽,請到配額平台提交申請。
更多負載平衡使用限制,請參見CLB使用限制和NLB使用限制。
負載平衡配額查詢請參見負載平衡配額管理。
負載平衡更新策略
ACK支援為Service指定一個已有的Server Load Balancer執行個體,或者讓CCM自動建立新的Server Load Balancer執行個體。兩種方式在負載平衡的資源更新策略方面存在一些差異,如下表所示。
資來源物件 | 指定已有負載平衡 | CCM管理負載平衡 |
負載平衡 | 設定annotation:
|
|
監聽 | 設定annotation:
| CCM會根據Service的配置,自動建立和配置監聽策略。 |
後端伺服器組 | 當Service對應的後端Endpoint或者叢集節點發生變化時,CCM會自動更新負載平衡的後端虛擬伺服器組。
| |
為Service開啟刪除保護
您可以為涉及關鍵業務、敏感性資料的Service開啟刪除保護功能,以避免誤刪除帶來的維護成本。啟用後,僅當您手動關閉刪除保護後,對應的資源才可以被刪除。關於為Service開啟刪除保護操作步驟詳情,請參見為Service開啟刪除保護。