管理 VPC 負載平衡器
對現有 VPC 負載平衡器進行更改。
請勿重新命名任何 VPC NLB 或 ALB。 重新命名 VPC 負載平衡器會導致Kubernetes LoadBalancer
服務出現錯誤,這可能會中斷您的工作負載。
持久 VPC 負載平衡器
預設情況下,當刪除與 VPC 負載平衡器關聯的叢集時,VPC 負載平衡器也會被刪除。 但是,當您建立 LoadBalancer
定義時,您可以使負載平衡器持久化,以便即使在叢集被刪除後它仍然可用。 在刪除先前的叢集後,持久性 VPC 負載平衡器可以應用於不同的叢集。
VPC 負載平衡器名稱預設格式為 kube-<cluster_ID>-<kubernetes_lb_service_UID>
。 刪除叢集時,此名稱格式會指定隨後也被刪除的關聯負載平衡器。 為了確保您的負載平衡器在刪除叢集時不會被刪除,請在 LoadBalancer
服務定義中包含 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name
註釋,以便為負載平衡器提供唯一的名稱。 負載平衡器名稱在您的 VPC 中必須是唯一的,並且只能包含小寫字母數字字元和連字符 ( -
)。此註解可套用於所有 VPC 負載平衡器類型。
您負責在不再需要持久性 VPC 負載平衡器時將其刪除。 若要刪除持久性 VPC 負載平衡器,請刪除與 VPC 負載平衡器關聯的Kubernetes LoadBalancer
服務定義。
將 VPC 負載平衡器從一個集群移至另一個集群
持久 VPC 負載平衡器 可以從一個 VPC 叢集分離,然後附加到另一個 VPC 叢集。 新集群必須與原始集群位於同一 VPC 內。
從叢集中分離 VPC 負載平衡器
VPC 負載平衡器連結到建立它們時使用的Kubernetes LoadBalancer
服務定義。 若要從叢集中分離持久 VPC 負載平衡器,您必須中斷與 LoadBalancer
服務的連結。 這樣做會使 LoadBalancer
服務無法使用,並且可以安全地刪除它。 然後,VPC 負載平衡器可以 連接到不同的叢集。
要斷開 VPC 負載平衡器和 LoadBalancer
服務之間的鏈接,您可以 重新命名 VPC 負載平衡器 或從原始 LoadBalancer
服務定義中刪除 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name
註釋。 請注意,這是您應該重新命名 VPC 負載平衡器的唯一情況,因為這樣做會為Kubernetes資源帶來錯誤。 但是,如果您的最終目標是在不同叢集上使用 VPC 負載平衡器,則此錯誤不會中斷您的工作負載。 如果您希望將負載平衡器保留在同一個叢集上,請勿重新命名 VPC 負載平衡器。
將 VPC 負載平衡器附加到集群
將持久性 VPC 負載平衡器與叢集分開後,您可以透過建立引用該 VPC 負載平衡器的新Kubernetes LoadBalancer
服務定義來附加到不同的叢集。
當您在新叢集上建立新的 LoadBalancer
服務時,您可以使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name
註解指定要附加的 VPC 負載平衡器的名稱。
在建立LoadBalancer服務時,VPC 負載平衡器類型(ALB、NLB)和 IP 類型(公有、私有)必須與 LoadBalancer
服務中的規格相符。 例如,新群集上指定 NLB 類型的現有 LoadBalancer
服務不能用來將 VPC ALB 附加到群集。 指定負載平衡器類型和 IP 類型的注解是 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features
和 service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type
。
LoadBalancer
服務中指定的連接埠和節點連接埠不需要與建立 VPC 負載平衡器時使用的連接埠和節點連接埠相符。 VPC 負載平衡器使用新叢集中與其關聯的 LoadBalancer
服務的連接埠定義進行重新配置。
負載平衡器的健康檢查
VPC 負載平衡器會自動設定運作狀況檢查,您可以使用 externalTrafficPolicy
註解進行設定。 您可以使用其他註解來自 訂負載平衡器的運作狀況檢查。
- 如果
externalTrafficPolicy
設定為Cluster
,則套用 TCP 運行狀況檢查。 如果您要設定 UDP 負載平衡器,則必須指定其他連接埠規格。 - 如果
externalTrafficPolicy
設定為Local
,則會套用 HTTP 健康檢查。 傳入流量僅傳遞到駐留在該特定節點上的應用程式 Pod。 如果該特定節點上沒有應用程式 Pod,則傳入流量將被丟棄。
externalTrafficPolicy: Local
設定可能會導致負載平衡器工作節點上的運作狀況檢查失敗。 通常,此結果是預期行為,不一定表示有問題,因為如果負載平衡器嘗試連接到任何沒有應用程式 Pod 的節點,流量就會被故意丟棄。 有關更多信息,請參閱 為什麼 VPC 負載平衡器運行狀況檢查在我的工作線程節點上失敗?。
自訂 VPC 負載平衡器的運作狀況檢查
為了更好地控制 VPC 負載平衡器運行狀況檢查,您可以使用可選註釋通過測試間隔、逾時和重試的高級配置來自訂運行狀況檢查。 您可以隨時變更或刪除這些自訂設定。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-protocol
- 選用:此註解設定與Kubernetes負載平衡器服務關聯的 VPC 負載平衡器資源的運作狀況檢查協定。 通常,VPC LB 健康檢查協定由Kubernetes負載平衡器服務規範中
externalTrafficPolicy
設定的值決定。 此註解會覆寫該邏輯。 此註解不會改變Kubernetes (特別是 kube-proxy)在externalTrafficPolicy
的各種設定方面的行為。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-port
- 選用。 用於運行狀況檢查的 TCP 連接埠。 僅當也指定了
ibm-load-balancer-cloud-provider-vpc-health-check-protocol
時,此註解才適用。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-path
- 選用。 HTTP 和 HTTPs 健康檢查的健康檢查 URL 路徑。 僅當
ibm-load-balancer-cloud-provider-vpc-health-check-protocol
設定為http
或https
時,此註釋才適用。- URL 路徑必須是 origin-form 請求目標的格式。
- 如果未指定此註釋且
ibm-load-balancer-cloud-provider-vpc-health-check-protocol
註釋設定為http
或https
,則套用預設值/
。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-delay
- 選用。 運行狀況檢查嘗試之間等待的秒數。 預設情況下,值設定為
5
,最小值為2
,最大值為60
。 該值必須大於ibm-load-balancer-cloud-provider-vpc-health-check-timeout
值,預設為2
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout
- 選用。 等待健康檢查反應的秒數。 預設情況下,值設定為
2
,最小值為1
,最大值為59
。 該值必須小於ibm-load-balancer-cloud-provider-vpc-health-check-delay
值,預設為5
。 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-retries
- VPC負載平衡器健康檢查重試的最大次數。 預設情況下,值設定為
2
,最小值為1
,最大值為10
。
為 UDP 負載平衡器啟用 TCP 運作狀況檢查
由於沒有 UDP 運行狀況檢查,因此使用 TCP 運行狀況檢查的 UDP 負載平衡器必須具有使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp
註釋指定的附加 TCP 連接埠。
您可以為叢集中執行的另一個負載平衡器或NodePort指定 TCP 節點連接埠。 對於叢集1.29及更早版本,如果節點連接埠位於 30000-32767
範圍之外,您必須 修改 VPC 叢集安全群組 kube-<cluster-ID>
以允許傳入流量 到達指定連接埠。
請注意,如果指定的連接埠值用於意外關閉或重新配置其連接埠值的服務,則 TCP 運行狀況檢查將停止工作,直到該服務備份或您使用新的 TCP 連接埠值重新配置 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp
註解。 為了避免這種情況,您可以指定 kubelet
port 10250
,這是一個不會遇到服務中斷的靜態連接埠值。
但是,對於叢集版本1.29及更早版本,您必須 修改 VPC 叢集安全群組 kube-<cluster-ID>
以接受來自 kubelet
連接埠的傳入流量。
想要避免在 UDP 負載平衡器中指定額外 TCP 連接埠進行運行狀況檢查的複雜性嗎? 將 externalTrafficPolicy
設為 Local
,以使用 HTTP 健康檢查,它不需要額外的連接埠規格。
變更負載平衡器的子網路或區域
建立 VPC NLB 後,您無法重新設定其建立時的監聽子網路。 如果您想要變更現有 VPC NLB 的監聽子網,您必須刪除、更新並重新套用對應的Kubernetes LoadBalancer
服務。
-
列出您的Kubernetes服務並找到您要變更的
LoadBalancer
服務的名稱。kubectl get services
範例輸出。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE my-load-balancer LoadBalancer 172.21.77.198 52.118.150.107 8080:32767/TCP,443:30943/TCP 5d
-
找到Kubernetes
LoadBalancer
服務對應的 VPC 負載平衡器。VPC 負載平衡器名稱的格式為
kube-<cluster_ID>-<kubernetes_lb_service_UID>
。 若要查看您的群集 ID,請執行ibmcloud ks cluster get --cluster <cluster_name>
。 若要查看 Kubernetes LoadBalancer 服務 UID,請執行kubectl get svc <load-balancer-name> -o yaml
並在輸出中尋找 metadata.uid 欄位。 VPC 負載平衡器名稱中的 KubernetesLoadBalancer
服務 UID 中的連字號 (-) 會被移除。ibmcloud is load-balancers
範例輸出。
ID Name Family Subnets Is public Provision status Operating status Resource group r000-5aaaa11f6-c111-111f-b2e0-1c11aaaaf0dc0 kube-c441c43d02mb8mg00r70-3e25d0b5bf11111111fe4ca3f11111cb Network subnet-1 true active online default Application
-
取得Kubernetes
LoadBalancer
服務定義並將輸出儲存為名為my-lb.yaml
的 yaml 檔案。kubectl describe service my-load-balancer -o yaml
-
刪除Kubernetes
LoadBalancer
服務。 這也會刪除對應的 VPC 負載平衡器。kubectl delete service my-load-balancer
-
使用您想要實施的子網路或區域變更更新Kubernetes
LoadBalancer
服務定義檔。 請勿變更LoadBalancer
服務的名稱。 有關為網路負載平衡器指定子網路或區域的詳細信息,請參閱 Network Load Balancer for VPC。 -
應用新的
LoadBalancer
定義檔。kubectl apply -f my-lb.yaml
-
驗證 Kubernetes
LoadBalancer
服務在群集中重新建立成功。 建立服務時,LoadBalancer Ingress 欄位將填入 NLB 的外部 IP 位址。kubectl describe service my-load-balancer
範例輸出。
NAME: my-load-balancer Namespace: default Labels: <none> Annotations: service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: nlb Selector: app=echo-server Type: LoadBalancer IP: 172.X.XXX.XX LoadBalancer Ingress: 169.XXX.XXX.XXX Port: tcp-80 80/TCP TargetPort: 8080/TCP NodePort: tcp-80 32022/TCP Endpoints: 172.XX.XX.XXX:8080,172.XX.XX.XX:8080,172.XX.XX.XX:8080 + 3 more... Session Affinity: None External Traffic Policy: Local HealthCheck NodePort: 30882 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 9m27s (x7 over 15m) service-controller Ensuring load balancer Normal EnsuredLoadBalancer 9m20s service-controller Ensured load balancer Normal CloudVPCLoadBalancerNormalEvent 8m17s ibm-cloud-provider Event on cloud load balancer myvpcnlb for service default/my-load-balancer with UID 2d93b07d-ecf6-41d2-ad3f-9c2985122ec1: The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is currently online/active.
-
驗證 VPC 負載平衡器是否已重新建立以及子網路或區域是否已更新。 請注意,配置 VPC 負載平衡器需要幾分鐘的時間,並且在完全配置之前您可能會看到
create_pending
狀態。ibmcloud is load-balancers
範例輸出。
ID Name Family Subnets Is public Provision status Operating status Resource group r006-5ecc68f6-c751-409f-b2e0-1c69babf0dc0 kube-c441c43d02mb8mg00r70-3e25d0b5bf03445796fe4ca3f73885cb Network subnet-2 true active online default