管理 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-featuresservice.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 時,此註解才適用。
  • 若指定的 TCP 埠號超出 Kubernetes 節點埠號範圍(30,000-32,767),則必須 修改 套用至叢集工作節點的 VPC 安全群組,以允許該埠號的傳入流量。
  • 若將此註解套用至與 VPC ALB 關聯的 Kubernetes 負載平衡服務,則必須 修改 指派給該 VPC ALB 的安全群組的出站規則,以允許出站流量傳輸至指定的 TCP 埠。
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-path
選用。 HTTP 和 HTTPs 健康檢查的健康檢查 URL 路徑。 僅當 ibm-load-balancer-cloud-provider-vpc-health-check-protocol 設定為 httphttps 時,此註釋才適用。
  • URL 路徑必須是 origin-form 請求目標的格式。
  • 如果未指定此註釋且 ibm-load-balancer-cloud-provider-vpc-health-check-protocol 註釋設定為 httphttps,則套用預設值 /
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 服務。

  1. 請登入您的帳戶。 適用的話,請將適當的資源群組設為目標。 設定叢集的環境定義。

  2. 列出您的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
    
  3. 找到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 負載平衡器名稱中,已從 Kubernetes LoadBalancer 服務 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      
    
  4. 取得Kubernetes LoadBalancer 服務定義並將輸出儲存為名為 my-lb.yaml 的 yaml 檔案。

    oc describe service my-load-balancer -o yaml
    
  5. 刪除Kubernetes LoadBalancer 服務。 這也會刪除對應的 VPC 負載平衡器。

    oc delete service my-load-balancer
    
  6. 使用您想要實施的子網路或區域變更更新Kubernetes LoadBalancer 服務定義檔。 請勿變更「LoadBalancer」服務的名稱。 有關為網路負載平衡器指定子網路或區域的詳細信息,請參閱 Network Load Balancer for VPC

  7. 應用新的 LoadBalancer 定義檔。

    oc apply -f my-lb.yaml
    
  8. 請確認您的叢集中已成功重新建立「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.
    
  9. 驗證 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