管理 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 負載平衡器從叢集中解除關聯後,您可以透過建立一個新的 Kubernetes LoadBalancer 服務定義(該定義需引用該 VPC 負載平衡器),將其關聯至另一個叢集。
當您在新叢集上建立新的 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 連接埠。
您可以將 TCP 節點埠指定為您叢集中正在運行的另一個負載平衡器,或 NodePort。 對於叢集版本 4.14 及更早版本,若節點埠號位於 30000-32767 範圍之外,您必須將 修改 VPC 叢集的安全群組 kube-<cluster-ID>,以允許傳入流量 重新導向至指定的埠號。
請注意,若指定的埠號對應的服務意外中斷,或其埠號值已重新配置,則 TCP 的健康檢查將停止運作,直到該服務恢復運作,或您重新配置 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp 註解並指定新的 TCP 埠號值為止。 為了避免這種情況,您可以指定 kubelet port 10250,這是一個不會遇到服務中斷的靜態連接埠值。
然而,對於 4.14 及更早版本的叢集,您必須 修改 VPC 叢集的安全群組 kube-<cluster-ID>,以允許來自 kubelet 埠的傳入流量。
想避免在 UDP 負載平衡器中,為狀態檢查指定額外的 TCP 埠所帶來的複雜性嗎? 將 externalTrafficPolicy 設定為 Local ,即可使用 HTTP 狀態檢查,此設定無需額外指定端口。
變更負載平衡器的子網路或區域
建立 VPC NLB 後,您無法重新設定其建立時的監聽子網路。 若要變更現有 VPC NLB 的監聽子網,您必須先刪除、更新,然後重新套用對應的 Kubernetes LoadBalancer 服務。
-
列出您的Kubernetes服務並找到您要變更的
LoadBalancer服務的名稱。oc 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,請執行oc 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 檔案。oc describe service my-load-balancer -o yaml -
刪除Kubernetes
LoadBalancer服務。 這也會刪除對應的 VPC 負載平衡器。oc delete service my-load-balancer -
使用您想要實施的子網路或區域變更更新Kubernetes
LoadBalancer服務定義檔。 請勿變更「LoadBalancer」服務的名稱。 有關為網路負載平衡器指定子網路或區域的詳細信息,請參閱 Network Load Balancer for VPC。 -
應用新的
LoadBalancer定義檔。oc apply -f my-lb.yaml -
請確認您的叢集中已成功重新建立「Kubernetes」
LoadBalancer服務。 建立服務時,LoadBalancer Ingress 欄位將填入 NLB 的外部 IP 位址。oc 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