當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建立或刪除、大量Service Endpoint同時變更、存在大量LoadBalancer類型Service時節點加入或刪除等情況下,CCM在負載平衡的建立、刪除,以及伺服器組的端點變更等操作中,可能會出現一定的延遲。
當您因業務需要而進行大批量的變更操作時,請提前做好容量的評估和壓測,避免因CCM的處理延遲而導致業務受損的情況發生。
如果需要為Service更換Server Load Balancer執行個體,該如何操作?
已建立LoadBalancer類型的Service不支援重新複用或更換Server Load Balancer執行個體。如果您需要更換Server Load Balancer執行個體,請刪除並重新建立Service。
配額限制
VPC
叢集中一個節點對應一條路由表項,VPC預設情況下僅支援200條路由表項,如果叢集節點數目多於200個,請到配額平台提交申請。
更多VPC使用限制,請參見限制與配額。
查詢VPC配額,請參見Virtual Private Cloud配額管理。
負載平衡
負載平衡更新策略
ACK支援為Service指定一個已有的Server Load Balancer執行個體,或者讓CCM自動建立新的Server Load Balancer執行個體。兩種方式在負載平衡的資源更新策略方面存在一些差異,如下表所示。
資來源物件 | 指定已有負載平衡 | CCM管理負載平衡 |
負載平衡 | 設定annotation:
|
|
監聽 | 設定annotation:
| CCM會根據Service的配置,自動建立和配置監聽策略。 |
後端伺服器組 | 當Service對應的後端Endpoint或者叢集節點發生變化時,CCM會自動更新負載平衡的後端虛擬伺服器組。
| |
為Service開啟刪除保護
您可以為涉及關鍵業務、敏感性資料的Service開啟刪除保護功能,以避免誤刪除帶來的維護成本。啟用後,僅當您手動關閉刪除保護後,對應的資源才可以被刪除。關於為Service開啟刪除保護操作步驟詳情,請參見為Service開啟刪除保護。