使用 VPC 的負載平衡器公開應用程式

Virtual Private Cloud

設定 Load Balancer for VPC 以在公用或專用網路上公開應用程式。

若要在 VPC 叢集裡公開應用程式,您可以建立第 7 層 Application Load Balancer for VPC。 您可以選擇性地建立第 4 層 Network Load Balancer for VPC。

Loadbalancer 類型

下表說明每一個負載平衡選項的基本性質。

VPC 叢集的負載平衡選項
性質 Application Load Balancer for VPC Network Load Balancer for VPC
支援的 Red Hat OpenShift 版本 所有版本 所有版本
傳輸層 第 7 層 第 4 層
負載平衡器的類型 公用和專用 公用和專用
支援的通訊協定 TCP TCP, UDP
應用程式存取權 主機名稱 主機名稱及靜態 IP 位址
來源 IP 保留 可配置 * 是
利用直接傳回伺服器來改良效能 否 是
多區域遞送 是 是
埠範圍 否 僅限公用
安全群組 是 是

Network Load Balancer for VPC

在 VPC 叢集中,請在叢集的每個區域中設定一個 layer-4 Network Load Balancer for VPC (VPC NLB),作為應用程式接收傳入請求的外部入口點。

VPC NLB 提供數個優點,例如利用直接伺服器返回 (DSR) 提供更高的傳輸量和更好的效能。 使用 DSR,工作者節點可以將應用程式回應封包直接傳送至用戶端 IP 位址,並跳過 VPC NLB,從而減少 VPC NLB 必須處理的資料流量。 此外,依預設,VPC NLB 在所有用戶端要求上支援來源 IP 位址保留。

  • 標準 VPC NLB 名稱的格式為 kube-<cluster_ID>-<kubernetes_lb_service_UID>。 若要查看您的叢集 ID,請執行 ibmcloud oc cluster get --cluster <cluster_name>。 若要查看 Kubernetes LoadBalancer 服務的 UID,請執行 oc get svc myloadbalancer -o yaml,並在輸出中尋找 metadata.uid 欄位。 在 VPC NLB 名稱中,會從 Kubernetes LoadBalancer 服務 UID 中移除連字號 (-)。

  • 持續性 VPC NLB 名稱的格式為 kube-<cluster_ID>-<kubernetes_lb_service_UID>。 若要查看您的叢集 ID,請執行 ibmcloud oc cluster get --cluster <cluster_name>。 若要查看 Kubernetes LoadBalancer 服務的 UID,請執行 oc get svc myloadbalancer -o yaml,並在輸出中尋找 metadata.uid 欄位。 在 VPC NLB 名稱中,會從 Kubernetes LoadBalancer 服務 UID 中移除連字號 (-)。

  • 當您為叢集裡的應用程式建立 Kubernetes LoadBalancer 服務並包含 service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "nlb" 註釋時,會在叢集外部的 VPC 中建立 VPC NLB。 VPC NLB 會透過在您的工作節點上自動開啟的私有 NodePorts,將您應用程式的請求進行路由。

  • 如果您建立 公用 Kubernetes LoadBalancer 服務,則可以透過 VPC NLB 指派給 Kubernetes LoadBalancer 服務的外部公用 IP 位址,從網際網路存取應用程式。 即使您的工作節點僅連接到私有 VPC 子網,VPC NLB 仍可接收公共請求,並將其路由至公開您應用程式的服務。 請注意,您的 VPC 子網段無需設定公共閘道,即可允許對您的 VPC NLB 發送公共請求。 然而,如果您的應用程式必須存取公開的 URL,則必須將公開閘道連接至您的工作節點所連線的 VPC 子網。

  • 若您建立一個私有 Kubernetes LoadBalancer 服務,您的應用程式將僅限於同一區域及 VPC 內、且已連線至您私有子網的系統存取。 如果您已連接至專用 VPC 網路,則可以透過 VPC NLB 指派給 Kubernetes LoadBalancer 服務的外部專用 IP 位址來存取應用程式。

下圖說明使用者如何透過 VPC NLB 從網際網路存取應用程式。

透過 VPC NLB 為叢集進行負載平衡。
透過 VPC NLB 為叢集進行 VPC 負載平衡

  1. 對您應用程式的請求會使用 VPC NLB 指派給 Kubernetes LoadBalancer 服務的外部 IP 位址。
  2. 該請求會由 VPC NLB 自動轉發至工作節點上的其中一個節點埠,然後再轉發至應用程式 Pod 的私有 IP 位址。
  3. 若應用程式實例部署至叢集中的多個工作節點,VPC NLB 會將請求在叢集所有區域內各工作節點上的應用程式 Pod 之間進行路由。

Application Load Balancer for VPC

設定一個 layer-7、多區域 Application Load Balancer for VPC (VPC ALB)作為群集內應用程式接收傳入請求的外部入口點。

請勿將「Application Load Balancer for VPC」與「Red Hat OpenShift on IBM Cloud」這兩款 Ingress 應用程式負載平衡器混淆。 VPC 應用程式負載平衡器 (VPC ALB) 運行於您的叢集外部的 VPC 中,並由您所建立的 Kubernetes LoadBalancer 服務進行配置。 Ingress 應用程式負載平衡器(ALB) 是在叢集裡的工作者節點上執行的 Ingress 控制器。

  • VPC ALB 名稱的格式為 kube-<cluster_ID>-<kubernetes_lb_service_UID>。 若要查看您的叢集 ID,請執行 ibmcloud oc cluster get --cluster <cluster_name>。 若要查看 Kubernetes LoadBalancer 服務的 UID,請執行 oc get svc myloadbalancer -o yaml,並在輸出中尋找 metadata.uid 欄位。 在 VPC ALB 名稱中,會從 Kubernetes LoadBalancer 服務 UID 中移除連字號 (-)。

  • 預設情況下,當您在叢集中為某個應用程式建立 Kubernetes LoadBalancer 服務時,系統會在叢集外的 VPC 中建立一個 Application Load Balancer for VPC。 VPC ALB 會透過在您的工作節點上自動開啟的私有 NodePorts,將請求路由至您的應用程式。

  • 若您建立了一個公開的 Kubernetes LoadBalancer 服務,即可透過 VPC ALB 指派給 Kubernetes LoadBalancer 服務的主機名稱,以 1234abcd-<region>.lb.appdomain.cloud 的格式從網際網路存取您的應用程式。 即使您的工作節點僅連接到私有 VPC 子網,VPC ALB 仍可接收公開請求,並將其路由至公開您應用程式的服務。 請注意,您的 VPC 子網段無需設定公共閘道,即可允許對您的 VPC ALB 發出公共請求。 然而,如果您的應用程式必須存取公開的 URL,則必須將公開閘道連接至您的工作節點所連線的 VPC 子網。

  • 若您建立一個私有 Kubernetes LoadBalancer 服務,您的應用程式將僅限於同一區域及 VPC 內、且已連線至您私有子網的系統存取。 如果您已連線至您的私有 VPC 網路,即可透過 VPC ALB 指派給 Kubernetes LoadBalancer 服務的主機名稱,以 1234abcd-<region>.lb.appdomain.cloud 這種格式存取您的應用程式。

下圖說明使用者如何透過 VPC ALB 從網際網路存取應用程式。

透過 VPC ALB 為叢集進行負載平衡。
透過 VPC ALB 為叢集進行負載平衡

  1. 對您應用程式的請求會使用 VPC ALB 指派給 Kubernetes LoadBalancer 服務的主機名稱,例如 1234abcd-<region>.lb.appdomain.cloud。
  2. 該請求會由 VPC ALB 自動轉發至工作節點上的其中一個節點埠,然後再轉發至應用程式 Pod 的私有 IP 位址。
  3. 如果應用程式實例部署到叢集裡的多個工作者節點,則負載平衡器會在各個工作者節點上的應用程式 Pod 之間遞送要求。 此外,如果您擁有多區域叢集,VPC ALB 會將請求路由至叢集中所有子網和區域中的工作節點。

建立一個 Network Load Balancer for VPC

透過在 VPC 叢集的每個區域中設定 公共 或 私有 Kubernetes LoadBalancer 服務,將您的應用程式對外公開或僅限於私有網路存取。 接著,您可以選擇性地 透過 DNS 記錄和 TLS 憑證來註冊 VPC NLB。 VPC NLB 同時支援「TCP」和「UDP」這兩種協定類型。

設定公用 VPC NLB

透過在叢集的每個區域中設定 Kubernetes LoadBalancer 服務,讓您的應用程式暴露於公共網路流量中。 當您建立「Kubernetes」LoadBalancer 服務時,系統會自動在您的 VPC 中(位於叢集之外)為您建立一個公開的 Network Load Balancer for VPC (VPC NLB),用以將請求路由至您的應用程式。

  1. 將應用程式部署至叢集。 請務必在部署配置檔的 metadata 區段中新增標籤。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。

  2. 建立 Kubernetes LoadBalancer 服務的配置 YAML 檔。 請考量以 <app_name>-vpc-nlb-<VPC_zone> 格式命名服務。

    apiVersion: v1
    kind: Service
    metadata:
      name: <app_name>-vpc-nlb-<VPC_zone>
      annotations:
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "nlb"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "public"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector: "<key>=<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets: "<subnet1_ID,subnet2_ID>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp: "<tcp_port>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-protocol: "<protocol>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-port: "<port>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-path: "<url_path>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-delay: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-security-group: "<security-group>"
    spec:
      type: LoadBalancer
      selector:
        <selector_key>: <selector_value>
      ports:
       - name: http
         protocol: TCP
         port: 8080
         targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
       - name: https
         protocol: TCP
         port: 443
         targetPort: 443 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
      externalTrafficPolicy: Local # Specify Local or Cluster.
    
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"
    選用。 包括唯一名稱以讓 VPC 負載平衡器持續存在。 刪除持續性 VPC 負載平衡器所屬的叢集時,不會刪除持續性 VPC 負載平衡器。 如需相關資訊,請參閱 持續性 VPC 負載平衡器。 只能在建立負載平衡器時設定此註釋。 無法在更新作業中使用它。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "nlb"
    必要: 用來建立 VPC NLB 的註釋。 只能在建立負載平衡器時設定此註釋。 無法在更新作業中使用它。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type
    選用項目: 註釋以指定接受公用要求的服務。 如果不包含此註釋,則會建立公用 VPC NLB。 只能在建立負載平衡器時設定此註釋。 無法在更新作業中使用它。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector
    選用: 用來指定工作者節點標籤選取器的註釋。 若要識別接收資料流量的工作者節點,您可以選取其中一個支援的標籤選取器索引鍵。 請注意,您只能在註釋中包含一個標籤選取元,且選取元必須以 "key=value" 格式指定。 如果未指定此註釋,則會配置與 VPC NLB 位於相同區域中的所有工作者節點,以接收來自 VPC NLB 的資料流量。 如果指定,則此註釋優先於 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 註釋,並會忽略工作者節點上的任何 dedicated: edge 標籤。 若要將資料流量限制為特定區域,您可以使用此註釋來指定該區域中的工作者節點。
    允許下列金鑰。 - ibm-cloud.kubernetes.io/internal-ip - ibm-cloud.kubernetes.io/machine-type - ibm-cloud.kubernetes.io/os - ibm-cloud.kubernetes.io/region - ibm-cloud.kubernetes.io/subnet-id - ibm-cloud.kubernetes.io/worker-pool-id - ibm-cloud.kubernetes.io/worker-pool-name - ibm-cloud.kubernetes.io/zone - kubernetes.io/arch - kubernetes.io/hostname - kubernetes.io/os - node.kubernetes.io/instance-type - topology.kubernetes.io/region - topology.kubernetes.io/zone
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets
    選修的:註釋,用於指定 VPC NLB 部署到的一個可用區中的一個或多個子網路。 值可以指定為 VPC 子網路 ID、VPC 子網路名稱或 VPC 子網路 CIDR。 如果指定,該註釋優先於 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 註解。 請注意,您可以在與叢集所連接的子網路相同的 VPC 中指定不同的子網路。 在此情況下,即使 VPC NLB 部署至相同 VPC 中的不同子網路,VPC NLB 仍可以將資料流量遞送至相同區域中叢集子網路上的工作者節點。 若要查看所有資源組中的子網,請執行 ibmcloud oc subnets --provider vpc-gen2 --vpc-id <vpc> --zone <zone>。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-zone
    選修的:用於指定您的叢集附加到的 VPC 區域的註解。 VPC NLB 會部署至工作者節點所連接區域中的相同子網路。 因為 VPC NLB 是單一區域,所以只有此區域中叢集裡的工作者節點才會配置為接收資料流量。
    若要查看區域,請執行 ibmcloud oc zone ls --provider vpc-gen2。 如果您稍後將此註釋變更為不同的區域,則 VPC NLB 不會移至新區域。
    請注意,如果您不指定此註釋或service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets註解,VPC NLB部署到最優可用區。 例如,VPC NLB僅部署在Worker節點所在的可用區,且位於 Ready 狀態。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp
    若您指定了 UDP 通訊協定,並將 externalTrafficPolicy 設定為 Cluster,則此欄位為必填。 否則,此註釋是可選的。
    指定一個用於在 UDP 負載平衡器中執行 TCP 狀態檢查的 TCP 埠。 此設定適用於將「externalTrafficPolicy」設定為「Cluster」的 UDP 負載平衡器。 有關設定埠號值的更多資訊,請參閱 《 為 UDP 負載平衡器設定 TCP 狀態檢查 》。
    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 設為 http 或 https 時,此註釋才適用。
    • URL 的路徑必須採用「源格式」請求目標的格式。
    • 如果未指定此註釋,且 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。
    selector
    選用。 您在應用程式部署 YAML 檔案的「spec.template.metadata.labels」區段中使用的標籤鍵(<selector_key> )與值(<selector_value> )。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。
    port
    選用。 服務所接聽的埠。
    targetPort
    選用。 服務將資料流量導向該處的目標埠。 在 Pod 中執行的應用程式必須監聽此目標埠上的傳入 TCP 流量。 目標埠通常在應用程式 Pod 中執行的映像檔中靜態定義。 Pod 中配置的目標埠與服務的節點埠不同,也可能與 VPC LB 上配置的外部埠不同。
    externalTrafficPolicy
    必填。 指定 Local 或者 Cluster。
    設定Local保留用戶端向您的應用程式要求的來源 IP 位址。 此設定會防止送入的資料流量轉遞至不同的節點。 此選項亦會設定 HTTP 的運作狀態檢查。
    如果Cluster設定後,DSR 僅從 VPC NLB 最初將傳入請求轉送到的工作節點實作。 送入的要求到達之後,會將要求轉遞至包含應用程式 Pod 的工作者節點,該 Pod 可能位於不同的區域中。 來自應用程式 Pod 的回應會傳送至原始工作者節點,且該工作者節點會使用 DSR 將回應直接傳送回用戶端,並略過 VPC NLB。 此選項亦會設定 TCP 的運作狀態檢查。 對於 UDP 負載平衡器,若您選擇「Cluster」選項,則必須使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp。 如需更多資訊,請參閱《 為 UDP 負載平衡器設定 TCP 狀態檢查 》。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota
    選用。 負載平衡器路由到的每個區域的工作節點數量。 預設值為 8。 對於工作節點位於三個區域的集群,這會導致負載平衡器路由到總共 24 個工作節點。 負載平衡器路由到的所有區域中的工作節點總數不能超過 50。 如果叢集在所有可用區中的工作程序節點少於 50 個,請指定 0 以路由至一個可用區中的所有工作程序節點。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-security-group
    選用。 若要新增至 VPC 負載平衡器的客戶管理的安全群組。 如果您不想使用 IBM- 託管安全群組,指定您擁有和管理的安全群組。 該選項刪除了IBM- 託管安全群組並將其替換為您指定的安全性群組。 從現有負載平衡器中刪除註解會將您新增的安全性群組替換為IBM- 託管安全群組。 您可以隨時新增或刪除此註釋。 您負責管理您的安全群組並保持最新狀態。
  3. 在叢集裡建立 Kubernetes LoadBalancer 服務。

    oc apply -f <filename>.yaml -n <namespace>
    
  4. 驗證 Kubernetes LoadBalancer 服務已在您的叢集裡順利建立。 建立服務時,LoadBalancer Ingress 欄位會移入由 VPC NLB 指派的外部 IP 位址。

VPC NLB 需花費幾分鐘才能在您的 VPC 中完成配置。 在 VPC NLB 完全配置完成之前,您的 Kubernetes LoadBalancer 服務的外部 IP 位址可能會是 pending。

```sh {: pre}
oc describe svc myloadbalancer -n <namespace>
```
公用 `LoadBalancer` 服務的 CLI 輸出範例:
```sh {: screen}
NAME:                     myvpcnlb
Namespace:                default
Labels:                   <none>
Annotations:              service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: nlb
Selector:                 app=echo-server
Type:                     LoadBalancer
IP:                       172.21.204.12
LoadBalancer Ingress:     169.XXX.XXX.XXX
Port:                     tcp-80  80/TCP
TargetPort:               8080/TCP
NodePort:                 tcp-80  32022/TCP
Endpoints:                172.17.17.133:8080,172.17.22.68:8080,172.17.34.18:8080 + 3 more...
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     30882
Events:
    Type     Reason                           Age                  From                Message
----     ------                           ----                 ----                -------
Warning  SyncLoadBalancerFailed           13m (x5 over 15m)    service-controller  Error syncing load balancer: failed to ensure load balancer: kube-bqcssbbd0bsui62odcdg-2d93b07decf641d2ad3f9c2985122ec1 for service default/myvpcnlb is busy: offline/create_pending
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/myvpcnlb with UID 2d93b07d-ecf6-41d2-ad3f-9c2985122ec1: The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is currently online/active.
```
  1. 請確認您的 VPC 中已成功建立 VPC NLB。 在輸出結果中,請確認 VPC NLB 的「運作狀態」為「online」,而「配置狀態」為「active」。

    請勿重新命名任何為 LoadBalancer 服務自動建立的 VPC NLB。 若您重新命名 VPC NLB,Red Hat OpenShift on IBM Cloud 會自動為 LoadBalancer 服務建立另一個 VPC NLB。

    ibmcloud is load-balancers
    

    在以下範例的 CLI 輸出中,已為 Kubernetes LoadBalancer 服務建立了一個名為 kube-bh077ne10vqpekt0domg-046e0f754d624dca8b287a033d55f96e 的 VPC NLB:

    ID                                     Name                                                         Created          Host Name                                  Is Public   Listeners                               Operating Status   Pools                                   Private IPs              Provision Status   Public IPs                    Subnets                                Resource Group
    06496f64-a689-4693-ba23-320959b7b677   kube-bh077ne10vqpekt0domg-046e0f754d624dca8b287a033d55f96e   8 minutes ago    1234abcd-us-south.lb.appdomain.cloud       yes         95482dcf-6b9b-4c6a-be54-04d3c46cf017    online             717f2122-5431-403c-b21d-630a12fc3a5a    10.241.0.7               active             169.63.99.184                 c6540331-1c1c-40f4-9c35-aa42a98fe0d9   00809211b934565df546a95f86160f62
    
  2. 存取您在步驟 4 中找到的 Kubernetes LoadBalancer 服務的 IP 位址,以及格式為 <external_IP>:<app_port> 的應用程式埠。

  3. 選用項目: 重複這些步驟,以在您要公開應用程式的每一個區域中部署公用 VPC NLB。 然後,您可以在每個區域中使用一個 DNS 子網域 登錄 VPC NLB 的外部 IP 位址。

在建立叢集期間或在區域中新增工作者節點時,請勿刪除您已連接至叢集的子網路。 如果您刪除叢集使用的 VPC 子網路,則使用子網路中 IP 位址的任何 VPC NLB 可能會遇到問題,而且您可能無法建立新的負載平衡器。

使用埠範圍來設定 NLB

當需要從具有多個後端應用程式的單一主機名稱來管理服務時,可以在公用 NLB 中使用埠範圍,每一個都在個別埠號上接聽。 若要使用 Kubernetes 叢集中的埠範圍,必須執行部分手動配置。 首先,必須設定 ibm-load-balancer-cloud-provider-vpc-port-range 選項。 它可以包含一或多個範圍,每一個範圍以逗點區隔。 spec.ports.port 值也必須設為埠範圍內的最小值。

在下列範例中,使用埠範圍 30000-30010。

必須針對 NLB 服務在其中轉遞要求的每一個部署,手動建立節點埠服務。 每個這些 Nodeport 服務的埠號都必須在 NLB 服務中配置的埠範圍內。

在下列範例圖中,針對部署 1 建立具有埠 30000 的 Nodeport 服務,而針對部署 2 建立具有埠 30001 的 Nodeport 服務。

使用者對包含埠範圍的 NLB 埠 30001 提出要求。 此要求會導向至 VPC NLB 服務,該服務會將要求導向至叢集中也在埠 30001 上接聽的 Nodeport 服務,在此情況下適用於部署 2。 然後,Nodeport 服務會將要求導向至部署 2 所選取 Pod 的目標埠。

使用埠區間的 VPC NLB。
具有埠區間的 VPC NLB

使用下列範例來建立使用埠範圍的 NLB。 選取器及後端 Pod 必須與埠範圍負載平衡器服務相關聯,以便性能檢查傳回成功,並將資料遞送至埠範圍中的埠。 若要使用埠範圍,您必須建立其他 NodePort 服務,其埠值位於負載平衡器服務所定義的範圍內。

  1. 將下列範例 LoadBalancer 配置儲存為稱為 loadbalancer.yaml 的檔案。

    apiVersion: v1
    kind: Service
    metadata:
      annotations:
        service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: nlb
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-port-range: 30000-30010
      name: nlb-port-range
    spec:
      externalTrafficPolicy: Cluster
      ports:
      - port: 30000 # Must match min from the port range
        protocol: TCP
        nodePort: 30011 # Can be port in range or not
        targetPort: 8080
      selector:
        app: echo-server  # Must be valid for health checks to work
      type: LoadBalancer
    
  2. 建立服務。

    oc apply -f loadbalancer.yaml
    
  3. 建立 NodePort 服務,其埠值位於您先前建立之 LoadBalancer 中指定的埠範圍內。

    apiVersion: v1
    kind: Service
    metadata:
      name: echo-server-node-port
    spec:
      ports:
      - port: 80
        protocol: TCP # The protocol of the port range
        nodePort: 30003 # Node port in the port range
        targetPort: 8080
      selector:
        app: echo-server
      type: NodePort
    
  4. 建立「NodePort」服務。

    oc apply -f nodeport.yaml
    
  5. 存取 NLB 所提供範圍內的埠。

    curl https://<public ip assigned to NLB>:30003
    
    • 30003 = 是回應要求之範圍中的節點埠
    • 除非建立其他節點埠服務,否則範圍中的其他埠不會回應。

設定專用 VPC NLB

透過在叢集的每個區域中設定 Kubernetes LoadBalancer 服務,讓您的應用程式能處理私有網路流量。 當您建立「Kubernetes」LoadBalancer 服務時,系統會自動在您的 VPC 中(位於叢集之外)為您建立一個私有 Network Load Balancer for VPC (VPC NLB),用以將請求路由至您的應用程式。

開始之前

若要讓您的應用程式接收專用網路要求,

  1. 建立 VPC NLB 專用的 VPC 子網路。 此子網路必須存在於與叢集相同的 VPC 及位置中,但無法連接至叢集或任何工作者節點。

    1. 在 VPC 子網控制台上,點選「新增子網」。
    2. 請輸入子網路的名稱。
    3. 選取叢集所在的位置,以及您要建立 VPC NLB 的區域。
    4. 選取叢集所在 VPC 的名稱。
    5. 指定要建立的 IP 位址數。 因為此子網路專用於 VPC NLB,所以您可以選擇較小的大小,例如 16。 您無法在事後變更 VPC 子網所擁有的 IP 位址數量。 如果您輸入特定的 IP 範圍,請不要使用下列保留範圍: 172.16.0.0/16、172.18.0.0/16、172.19.0.0/16 及 172.20.0.0/16。
    6. 按一下建立子網路。 佈建子網路之後,請記下其 ID。
  2. 如果必須透過 VPC NLB 連接至應用程式的用戶端存在於您在其中建立專用 VPC 子網路的 VPC 及區域之外,則必須建立自訂進入遞送表。 專用 VPC NLB 可能會將規則新增至自訂遞送表,以確保某些失敗狀況的服務可用性。 如需相關資訊,請參閱 已知限制 及 關於遞送表和路徑 中的表格。

    1. 從 VPC 路由表儀表板中,按一下 建立。
    2. 請輸入路由表的名稱。
    3. 選取您在其中建立專用子網路的位置及區域。
    4. 選取子網路所在的 VPC 名稱。
    5. 針對 資料流量類型,選取 進入。
    6. 視用戶端存取應用程式的位置而定,選擇 資料流量來源。 如需設定 VPC 專用網路連線的相關資訊,請參閱 文件,以選擇用於 VPC 連線功能的 IBM Cloud VPC VPN、Transit Gateway或 Direct Link。
      • 內部部署網路: 直接鏈結
      • 另一個 VPC 或標準基礎架構: Transit gateway
      • 相同 VPC 內的另一個區域: VPC 區域
  3. 將應用程式部署至叢集。 請務必在部署配置檔的 metadata 區段中新增標籤。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。

  4. 建立 Kubernetes LoadBalancer 服務的配置 YAML 檔。 請考量以 <app_name>-vpc-nlb-<VPC_zone> 格式命名服務。

    apiVersion: v1
    kind: Service
    metadata:
      name: <app_name>-vpc-nlb-<VPC_zone>
      annotations:
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "nlb"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "private"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets: "<subnet_ID>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector: "<key>=<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp: "<tcp_port"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-protocol: "<protocol>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-port: "<port>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-path: "<url_path>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-delay: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-security-group: "<security-group>"
    spec:
      type: LoadBalancer
      selector:
        <selector_key>: <selector_value>
      ports:
       - name: http
         protocol: TCP
         port: 8080
         targetPort: 8080
         targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
       - name: https
         protocol: TCP
         port: 443
         targetPort: 443 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
      externalTrafficPolicy: Local # Specify Local or Cluster.
    
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"
    選用。 包括唯一名稱以讓 VPC 負載平衡器持續存在。 刪除持續性 VPC 負載平衡器所屬的叢集時,不會刪除持續性 VPC 負載平衡器。 如需相關資訊,請參閱 持續性 VPC 負載平衡器。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "nlb"
    必要: 用來建立 VPC NLB 的註釋。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "private"
    必要: 用來指定接受專用要求之服務的註釋。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets
    必要: 用於指定 VPC NLB 部署至其中的專用子網路的註釋。 該值可以指定為 VPC 子網路 ID、VPC 子網路名稱或 VPC 子網路 CIDR。 您只能指定一個子網路。 子網路必須存在於與叢集相同的 VPC 中,以及叢集具有工作者節點的區域中,但無法將任何工作者節點連接至此子網路。 與此子網路存在於相同區域中的工作者節點配置為接收來自 VPC NLB 的資料流量。 若要查看所有資源群組中的子網路,請執行 ibmcloud oc subnets --provider vpc-gen2 --vpc-id <vpc> --zone <zone>。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector
    選用: 用來指定工作者節點標籤選取器的註釋。 在與 VPC NLB 專用子網路相同的區域內,您可以透過選取其中一個支援的標籤選取器金鑰來配置特定工作者節點以接收資料流量。 請注意,您只能在註釋中包含一個標籤選取元,且選取元必須以 "key=value" 格式指定。 如果未指定此註釋,則與您在 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets 註釋中指定的 VPC 子網路位於相同區域中的所有工作者節點都會配置為接收來自 VPC NLB 的資料流量。 如果指定,則會忽略工作者節點上的任何 dedicated: edge 標籤。
    允許下列金鑰。 - ibm-cloud.kubernetes.io/internal-ip - ibm-cloud.kubernetes.io/machine-type - ibm-cloud.kubernetes.io/os - ibm-cloud.kubernetes.io/region - ibm-cloud.kubernetes.io/subnet-id - ibm-cloud.kubernetes.io/worker-pool-id - ibm-cloud.kubernetes.io/worker-pool-name - ibm-cloud.kubernetes.io/zone - kubernetes.io/arch - kubernetes.io/hostname - kubernetes.io/os - node.kubernetes.io/instance-type - topology.kubernetes.io/region - topology.kubernetes.io/zone
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp
    可選:指定一個 TCP 節點埠,用於在 UDP 負載平衡器中執行 TCP 狀態檢查。 此設定適用於將「externalTrafficPolicy」設定為「Cluster」的 UDP 負載平衡器。 在設定埠號值之前,請參閱《 設定 TCP 狀態檢查以供 UDP 負載平衡器 使用》一文,了解更多相關考量事項。
    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 設為 http 或 https 時,此註釋才適用。
    • URL 的路徑必須採用「源格式」請求目標的格式。
    • 如果未指定此註釋,且 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。
    selector
    您在應用程式部署 YAML 檔案的 spec.template.metadata.labels 區段中使用的標籤鍵(<selector_key> )與值(<selector_value> )。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。
    port
    服務所接聽的埠。
    targetPort
    可選:服務將流量導向的埠號。 在 Pod 中執行的應用程式必須監聽此目標埠上的傳入 TCP 流量。 目標埠通常在應用程式 Pod 中執行的映像檔中靜態定義。 Pod 中配置的目標埠與服務的節點埠不同,也可能與 VPC LB 上配置的外部埠不同。
    externalTrafficPolicy
    必填。 指定 Local 或者 Cluster。
    設定Local保留用戶端向您的應用程式要求的來源 IP 位址。 此設定會防止送入的資料流量轉遞至不同的節點。 此選項亦會設定 HTTP 的運作狀態檢查。
    如果Cluster設定後,DSR 僅從 VPC NLB 最初將傳入請求轉送到的工作節點實作。 送入的要求到達之後,會將要求轉遞至包含應用程式 Pod 的工作者節點,該 Pod 可能位於不同的區域中。 來自應用程式 Pod 的回應會傳送至原始工作者節點,且該工作者節點會使用 DSR 將回應直接傳送回用戶端,並略過 VPC NLB。 此選項亦會設定 TCP 的運作狀態檢查。 對於 UDP 負載平衡器,若您選擇「Cluster」選項,則必須使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp。 如需更多資訊,請參閱《 為 UDP 負載平衡器設定 TCP 狀態檢查 》。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota
    選用。 負載平衡器路由到的每個區域的工作節點數量。 預設值為 8。 對於工作節點位於三個區域的集群,這會導致負載平衡器路由到總共 24 個工作節點。 負載平衡器路由到的所有區域中的工作節點總數不能超過 50。 如果叢集在所有可用區中的工作程序節點少於 50 個,請指定 0 以路由至一個可用區中的所有工作程序節點。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-security-group
    選用。 若要新增至 VPC 負載平衡器的客戶管理的安全群組。 如果您不想使用 IBM- 託管安全群組,指定您擁有和管理的安全群組。 該選項刪除了IBM- 託管安全群組並將其替換為您指定的安全性群組。 從現有負載平衡器中刪除註解會將您新增的安全性群組替換為IBM- 託管安全群組。 您可以隨時新增或刪除此註釋。 您負責管理您的安全群組並保持最新狀態。
  5. 在叢集裡建立 Kubernetes LoadBalancer 服務。

    oc apply -f <filename>.yaml -n <namespace>
    
  6. 驗證 Kubernetes LoadBalancer 服務已在您的叢集裡順利建立。 建立服務時,LoadBalancer Ingress 欄位會移入由 VPC NLB 指派的外部 IP 位址。

VPC NLB 需花費幾分鐘才能在您的 VPC 中完成配置。 在 VPC NLB 完全配置完成之前,您的 Kubernetes LoadBalancer 服務的外部 IP 位址可能會是 pending。

```sh {: pre}
oc describe svc myloadbalancer -n <namespace>
```
以下是私有 `LoadBalancer` 服務的 CLI 輸出範例:
```sh {: screen}
NAME:                     myvpcnlb
Namespace:                default
Labels:                   <none>
Annotations:              service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: nlb
                          service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "private"
                          service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets: "<subnet1_ID,subnet2_ID>"
Selector:                 app=echo-server
Type:                     LoadBalancer
IP:                       172.21.204.12
LoadBalancer Ingress:     10.XXX.XXX.XXX
Port:                     tcp-80  80/TCP
TargetPort:               8080/TCP
NodePort:                 tcp-80  32022/TCP
Endpoints:                172.17.17.133:8080,172.17.22.68:8080,172.17.34.18:8080 + 3 more...
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     30882
Events:
    Type     Reason                           Age                  From                Message
----     ------                           ----                 ----                -------
Warning  SyncLoadBalancerFailed           13m (x5 over 15m)    service-controller  Error syncing load balancer: failed to ensure load balancer: kube-bqcssbbd0bsui62odcdg-2d93b07decf641d2ad3f9c2985122ec1 for service default/myvpcnlb is busy: offline/create_pending
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/myvpcnlb with UID 2d93b07d-ecf6-41d2-ad3f-9c2985122ec1: The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is currently online/active.
```
  1. 請確認您的 VPC 中已成功建立 VPC NLB。 在輸出結果中,請確認 VPC NLB 的「運作狀態」為「online」,而「配置狀態」為「active」。

    ibmcloud is load-balancers
    

    在以下範例的 CLI 輸出中,已為 Kubernetes LoadBalancer 服務建立了一個名為 kube-bh077ne10vqpekt0domg-046e0f754d624dca8b287a033d55f96e 的 VPC NLB:

    ID                                     Name                                                         Created          Host Name                                  Is Public   Listeners                               Operating Status   Pools                                   Private IPs              Provision Status   Public IPs                    Subnets                                Resource Group
    06496f64-a689-4693-ba23-320959b7b677   kube-bh077ne10vqpekt0domg-046e0f754d624dca8b287a033d55f96e   8 minutes ago    1234abcd-us-south.lb.appdomain.cloud       no         95482dcf-6b9b-4c6a-be54-04d3c46cf017    online             717f2122-5431-403c-b21d-630a12fc3a5a    10.XXX.XXX.XXX           active             -               c6540331-1c1c-40f4-9c35-aa42a98fe0d9   00809211b934565df546a95f86160f62
    
  2. 從 VPC 專用網路的連線,存取您在步驟 6 中找到的 Kubernetes LoadBalancer 服務的 IP 位址,以及 <external_IP>:<app_port> 格式的應用程式埠。

  3. 選用項目: 重複這些步驟,以在您要公開應用程式的每一個區域中部署專用 VPC NLB。 然後,您可以在每個區域中使用一個 DNS 子網域 登錄 VPC NLB 的外部 IP 位址。

註冊 DNS 記錄與 TLS 憑證

VPC NLB 提供靜態外部 IP 位址,您可以透過這些位址來存取應用程式。 若要為您的應用程式網域註冊 SSL 憑證以支援 HTTPS,您可以建立由 IBM 提供的子網域,或使用您自己的自訂網域。

例如,假設您具有多區域叢集,並在叢集的每個區域中的工作者節點上執行應用程式的抄本。 每個區域 建立一個 VPC NLB 以公開應用程式抄本。 然後,您可以使用一個 DNS 項目來登錄每一個 VPC NLB 所提供的外部 IP 位址。

為 VPC NLB 建立 DNS 子網域後,您將無法使用 nlb-dns health-monitor 指令來建立自訂狀態檢查。 而是使用預設 VPC 性能檢查。 如需相關資訊,請參閱 VPC 文件。

  • 為應用程式每個區域 建立一個 VPC NLB。 請務必在您的 Kubernetes LoadBalancer 服務中定義一個 HTTPS 埠,以設定 VPC NLB。
  • 若要使用 SSL 憑證透過 HTTPS 存取您的應用程式,您的應用程式必須能夠終止 TLS 連線。

若要向 DNS 子網域登錄 VPC NLB IP 位址,

  1. 擷取負載平衡器的外部 IP 位址。

    oc get svc -o wide
    

    輸出範例

    NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)            AGE      SELECTOR
    ...
    myapp-vpc-nlb-jp-tok-3    LoadBalancer   172.21.xxx.xxx   169.xx.xxx.xx     8080:30532/TCP     1d       run=webserver
    
  2. 為 IP 位址建立自訂或 IBM提供的 DNS 子網域。

    • 自訂網域:

      1. 使用「網域名稱服務 (DNS)」提供者或 IBM Cloud DNS 來登錄自訂網域。
      2. 將負載平衡器 IP 位址指定為 A 記錄,以定義自訂網域的別名。
    • IBM- 已提供的子網域:請使用 nlb-dns 指令,為該 IP 位址產生一個附帶 SSL 憑證的子網域。IBM Cloud 會為您處理該子網域的 SSL 通配符憑證的產生與維護工作。

      1. 建立一個 DNS 子網域及 SSL 憑證。
        ibmcloud oc nlb-dns create vpc-gen2 --type public --cluster <cluster_name_or_id> --ip <vpc_nlb1_ip> --ip <vpc_nlb2_ip> --ip <vpc_nlb3_ip>
        
      2. 驗證已建立子網域。 如需相關資訊,請參閱瞭解子網域格式。
        ibmcloud oc nlb-dns ls --cluster <cluster_name_or_id>
        
        輸出範例
        Subdomain                                                                               IP(s)                                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     169.46.xx.x,169.48.xxx.xx,169.48.xxx.xx      None             created                   <certificate>
        
  3. 開啟網頁瀏覽器,並輸入 URL,即可透過該子網域存取您的應用程式。

若要使用 SSL 憑證透過 HTTPS 存取您的應用程式,請確保您已在 Kubernetes LoadBalancer 服務中 定義了 HTTPS 埠。 您可以執行 curl -v --insecure https://<domain>,以確認請求是否已正確透過 HTTPS 埠進行路由。 發生連線錯誤,表示該服務上沒有開啟任何 HTTPS 埠。 此外,請確保您的應用程式能夠終止 TLS 的連線。 您可以執行 curl -v https://<domain> 來驗證您的應用程式是否能正確終止 TLS。 憑證錯誤表示您的應用程式未能正確終止 TLS 的連線。

設定一個 Application Load Balancer for VPC

藉由在叢集裡設定 Kubernetes LoadBalancer 服務,向公用或專用網路公開應用程式。 當您公開應用程式時,系統會自動在您的 VPC 中(位於叢集之外)為您建立一個 Application Load Balancer for VPC (VPC ALB),用以將請求路由至您的應用程式。 VPC ALB 僅支援 TCP 協定。

請勿將「Application Load Balancer for VPC」與「Red Hat OpenShift on IBM Cloud」這兩款 Ingress 應用程式負載平衡器混淆。 VPC 應用程式負載平衡器 (VPC ALB) 運行於您的叢集外部的 VPC 中,並由您所建立的 Kubernetes LoadBalancer 服務進行配置。 Ingress 應用程式負載平衡器(ALB) 是在叢集裡的工作者節點上執行的 Ingress 控制器。

設定公用或專用 VPC ALB

開始之前

若要讓您的應用程式能夠接收公開或私有請求,

  1. 將應用程式部署至叢集。 請務必在部署配置檔的 metadata 區段中新增標籤。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。

  2. 為 Kubernetes LoadBalancer 服務建立配置 YAML 檔案,並將該檔案命名為 myloadbalancer.yaml。

    apiVersion: v1
    kind: Service
    metadata:
      name: myloadbalancer
      annotations:
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "proxy-protocol"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "<public_or_private>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector: "<key>=<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets: "<subnet1_ID,subnet2_ID>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-protocol: "<protocol>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-port: "<port>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-path: "<url_path>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-delay: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-timeout: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-retries: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota: "<value>"
        service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-security-group: "<security-group>"
    spec:
     type: LoadBalancer
     selector:
        <selector_key>: <selector_value>
     ports:
       - name: http
         protocol: TCP
         port: 8080
         targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
       - name: https
         protocol: TCP
         port: 443
         targetPort: 443 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
      externalTrafficPolicy: Local # Specify Local or Cluster.
    
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"

    選用。 包括唯一名稱以讓 VPC 負載平衡器持續存在。 刪除持續性 VPC 負載平衡器所屬的叢集時,不會刪除持續性 VPC 負載平衡器。 如需相關資訊,請參閱 持續性 VPC 負載平衡器。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "proxy-protocol"

    選用: 啟用 PROXY 通訊協定。 負載平衡器會將要求標頭中的用戶端連線資訊 (包括用戶端 IP 位址、Proxy 伺服器 IP 位址及兩個埠號) 傳遞至後端應用程式。 請注意,您的後端應用程式必須配置為接受 PROXY 通訊協定。 例如,您可以依照 以下步驟, 將 NGINX 應用程式設定為接受 PROXY 協定。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type

    用於指定接受公用或專用要求之服務的註釋。 若未包含此註解,系統將建立一個公開的 LoadBalancer 。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector
    用來指定工作者節點標籤選取器的註釋。 若要識別接收資料流量的工作者節點,您可以選取其中一個支援的標籤選取器索引鍵。 請注意,您只能在註釋中包含一個標籤選取元,且選取元必須以 "key=value" 格式指定。 如果未指定此註釋,則叢集裡的所有工作者節點都會配置為接收來自 VPC ALB 的資料流量。 如果指定,則此註釋優先於 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 註釋,並會忽略工作者節點上的任何 dedicated: edge 標籤。
    允許下列金鑰: - ibm-cloud.kubernetes.io/internal-ip - ibm-cloud.kubernetes.io/machine-type - ibm-cloud.kubernetes.io/os - ibm-cloud.kubernetes.io/region - ibm-cloud.kubernetes.io/subnet-id - ibm-cloud.kubernetes.io/worker-pool-id - ibm-cloud.kubernetes.io/worker-pool-name - ibm-cloud.kubernetes.io/zone - kubernetes.io/arch - kubernetes.io/hostname - kubernetes.io/os - node.kubernetes.io/instance-type - topology.kubernetes.io/region - topology.kubernetes.io/zone
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets

    註釋,用於指定 VPC ALB 服務部署至其中的一或多個子網路。 如果指定的話,此註釋優先於 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 註釋。 請注意,您可以在與叢集所連接的子網路相同的 VPC 中指定不同的子網路。 在此情況下,即使 VPC ALB 部署至相同 VPC 中的不同子網路,VPC ALB 仍可以將資料流量遞送至叢集子網路上的工作者節點。 若要查看所有資源群組中的子網路,請執行 ibmcloud oc subnets --provider vpc-gen2 --vpc-id <vpc> --zone <zone>。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-zone

    用來指定叢集所連接的 VPC 區域的註釋。 當您在此註釋中指定區域時,會發生兩個程序。

    1. VPC ALB 會部署至工作者節點所連接區域中的相同子網路。
    2. 只有此區域中叢集裡的工作者節點才會配置為接收來自 VPC ALB 的資料流量。

    若要檢視區域,請執行 ibmcloud oc zone ls --provider vpc-gen2。

    若要將負載平衡器放在特定區域中,您必須在建立負載平衡器時指定此註釋。 如果您稍後將此註釋變更為不同的區域,則負載平衡器本身不會移至新區域。 不過,負載平衡器會重新配置成只將資料流量傳送至新區域中的工作者節點。
    如果在工作者節點上設定 dedicated: edge 標籤,且您指定此註釋,則只會將指定區域中的邊緣節點配置為接收資料流量。 其他區域中的邊緣節點及指定區域中的非邊緣節點不會從負載平衡器接收資料流量。
    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 設為 http 或 https 時,此註釋才適用。

    • URL 的路徑必須採用「源格式」請求目標的格式。
    • 如果未指定此註釋,且 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。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-idle-connection-timeout

    選用。 接聽器的閒置連線逾時值(以秒為單位)。 預設閒置逾時值取決於您的帳戶設定。 此值通常是 50。 不過,部分列入允許清單的帳戶具有較大的逾時設定。 如果您未設定註釋,則您的負載平衡器會在帳戶中使用逾時設定。 您可以透過設定此註釋來明確指定逾時。 最小值為 50。 最大值為 7200。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-instance-crn: "private-dns-crn"

    選用。 此版本僅適用於私人VPC ALB4.15或稍後。 與此負載平衡器關聯的 DNS 網址 instance。 有關更多信息,請參閱 註冊私有 DNS 記錄。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-zone-id: "dns-zone-id"

    選用。 此版本僅適用於私人VPC ALB4.15或稍後。 與此負載平衡器關聯的 DNS 網址 zone。 有關更多信息,請參閱 註冊私有 DNS 記錄。

    selector

    您在應用程式部署 YAML 檔案的 spec.template.metadata.labels 區段中使用的標籤鍵(<selector_key> )與值(<selector_value> )。 此自訂標籤會識別您應用程式執行所在的所有 Pod,以將它們包含在負載平衡中。

    port

    服務所接聽的埠。

    targetPort

    可選:服務將流量導向的埠號。 在 Pod 中執行的應用程式必須監聽此目標埠上的傳入 TCP 流量。 目標埠通常在應用程式 Pod 中執行的映像檔中靜態定義。 Pod 中配置的目標埠與服務的節點埠不同,也可能與 VPC LB 上配置的外部埠不同。

    externalTrafficPolicy
    必要。 指定 Local 或者 Cluster。
    設定Local保留用戶端向您的應用程式要求的來源 IP 位址。 此設定會防止送入的資料流量轉遞至不同的節點。 此選項亦會設定 HTTP 的運作狀態檢查。 對於 UDP 負載平衡器,若您選擇「Cluster」選項,則必須使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp。 如需更多資訊,請參閱《 為 UDP 負載平衡器設定 TCP 狀態檢查 》。
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota

    選用。 負載平衡器路由到的每個區域的工作節點數量。 預設值為 8。 對於工作節點位於三個區域的集群,這會導致負載平衡器路由到總共 24 個工作節點。 負載平衡器路由到的所有區域中的工作節點總數不能超過 50。 如果叢集在所有可用區中的工作程序節點少於 50 個,請指定 0 以路由至一個可用區中的所有工作程序節點。

    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-security-group

    選用。 若要新增至 VPC 負載平衡器的客戶管理的安全群組。 如果您不想使用 IBM- 託管安全群組,指定您擁有和管理的安全群組。 該選項刪除了IBM- 託管安全群組並將其替換為您指定的安全性群組。 從現有負載平衡器中刪除註解會將您新增的安全性群組替換為IBM- 託管安全群組。 您可以隨時新增或刪除此註釋。 您負責管理您的安全群組並保持最新狀態。

  3. 在叢集裡建立 Kubernetes LoadBalancer 服務。

    oc apply -f myloadbalancer.yaml -n <namespace>
    
  4. 驗證 Kubernetes LoadBalancer 服務已在您的叢集裡順利建立。 建立服務時,LoadBalancer 的 Ingress 欄位會填入由 VPC ALB 指派的主機名稱。

在您的 VPC 中配置 VPC ALB 需要幾分鐘時間。 在 VPC ALB 完全配置完成之前,您無法透過 Kubernetes LoadBalancer 服務的主機名稱存取您的應用程式。

```sh {: pre}
oc describe svc myloadbalancer -n <namespace>
```
公用 `LoadBalancer` 服務的 CLI 輸出範例:
```sh {: screen}
NAME:                     myvpcalb
Namespace:                default
Labels:                   <none>
Annotations:              
Selector:                 app=echo-server
Type:                     LoadBalancer
IP:                       172.21.XX.XX
LoadBalancer Ingress:     1234abcd-us-south.lb.appdomain.cloud
Port:                     tcp-80  80/TCP
TargetPort:               8080/TCP
NodePort:                 tcp-80  30610/TCP
Endpoints:                172.17.17.133:8080,172.17.22.68:8080,172.17.34.18:8080 + 3 more...
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     31438
Events:
    Type    Reason                           Age   From                Message
----    ------                           ----  ----                -------
Normal  EnsuringLoadBalancer             16m   service-controller  Ensuring load balancer
Normal  EnsuredLoadBalancer              15m   service-controller  Ensured load balancer
Normal  CloudVPCLoadBalancerNormalEvent  13m   ibm-cloud-provider  Event on cloud load balancer myvpcalb for service default/myvpcalb with UID 08cbacf0-2c93-4186-84b6-c4ab88a2faf9: The VPC load balancer that routes requests to this Kubernetes LoadBalancer service is currently online/active.
```
  1. 請確認您的 VPC 中已成功建立 VPC ALB。 在輸出結果中,請確認 VPC ALB 的「運作狀態」為「online」,而「配置狀態」為「active」。

    請勿重新命名任何為 LoadBalancer 服務自動建立的 VPC ALB。 若您重新命名 VPC ALB,Red Hat OpenShift on IBM Cloud 會自動為 LoadBalancer 服務建立另一個 VPC ALB。

    ibmcloud is load-balancers
    

    在以下範例的 CLI 輸出中,已為 Kubernetes LoadBalancer 服務建立了一個名為 kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306 的 VPC ALB:

    ID                                          Name                                                         Family        Subnets               Is public   Provision status   Operating status   Resource group
    r006-d044af9b-92bf-4047-8f77-a7b86efcb923   kube-bsaucubd07dhl66e4tgg-1f4f408ce6d2485499bcbdec0fa2d306   Application   mysubnet-us-south-3   true        active             online             default
    
  2. 如果您已建立一個公開的 LoadBalancer 服務,請使用 curl 指令存取在步驟 4 中找到的 VPC ALB 所指派的 Kubernetes LoadBalancer 服務的主機名稱。 範例:

    curl 06496f64-us-south.lb.appdomain.cloud:8080
    

    輸出範例

    Hello world from hello-world-deployment-5fd7787c79-sl9hn! Your app is up and running in a cluster!
    

    如果您建立專用 LoadBalancer 服務,則必須連接至專用 VPC 網路才能對主機名稱執行 curl 指令。

在建立叢集期間或在區域中新增工作者節點時,請勿刪除您已連接至叢集的子網路。 如果您刪除叢集使用的 VPC 子網路,則使用子網路中 IP 位址的任何負載平衡器可能會遇到問題,而且您可能無法建立新的負載平衡器。

未與 Kubernetes 或 OpenShift 叢集綁定的 VPC ALB 和 NLB,可直接透過「ibmcloud is」指令或控制台中的「VPC 基礎架構」區段進行更新。 例如,變更前端接聽器的埠或性能檢查逾時值。 但對於與 Kubernetes 或 OpenShift 叢集綁定的 VPC 負載平衡器,任何相關更新都必須透過 Ingress 配置中的註解來執行。 IBM Cloud 提供者會定期與任何相關聯的 VPC ALB 和 NLB 重新同步,以確保正在運行的負載平衡器符合 Ingress 的預期設定。 因此,如果您直接透過 VPC 而非使用 Ingress 註釋對此類負載平衡器進行任何變更,則會回復那些變更。

註冊 DNS 記錄與 TLS 憑證

Application Load Balancer for VPC (VPC ALB)會提供一個預設的 HTTP 主機名稱,格式為 1234abcd-<region>.lb.appdomain.cloud,您可以透過此主機名稱存取您的應用程式。 不過,如果您希望為應用程式的網域取得 TLS 憑證以支援 HTTPS,您可以建立由 IBM 提供的子網域,或為公共及私有 VPC ALB 導入您自己的自訂網域。

為 VPC ALB 主機名建立 DNS 子網域後,您將無法使用 nlb-dns health-monitor 指令來建立自訂健康檢查。 相反地,系統會使用針對預設 VPC ALB 主機名稱所提供的預設 VPC 負載平衡器健康檢查。 如需相關資訊,請參閱 VPC 文件。

開始之前

  • 設定 VPC ALB。 請務必在您的 Kubernetes LoadBalancer 服務中定義一個 HTTPS 埠,以設定 VPC ALB。
  • 若要使用 TLS 憑證透過 HTTPS 存取您的應用程式,您的應用程式必須能夠終止 TLS 連線。

若要向 DNS 子網域登錄 VPC ALB 主機名稱,

  1. 執行 get svc 指令,以擷取 VPC ALB 的主機名稱。 在輸出的 EXTERNAL-IP 直欄中尋找該主機名稱。 例如,1234abcd-us-south.lb.appdomain.cloud。

    oc get svc -o wide
    

    輸出範例

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP                            PORT(S)     AGE       SELECTOR
    ...
    webserver-lb    LoadBalancer   172.21.xxx.xxx   1234abcd-us-south.lb.appdomain.cloud   8080:30532/TCP     1d       run=webserver
    
  2. 為負載平衡器的主機名建立自訂的 DNS 子網域,或使用 IBM 提供的 DNS 子網域。

    • 自訂網域: 指定負載平衡器外部 IP (格式為 1234abcd-us-south.lb.appdomain.cloud ) 作為「標準名稱記錄 (CNAME)」),以提供您自己的自訂網域並為它提供別名。

      1. 使用「網域名稱服務 (DNS)」提供者或 IBM Cloud DNS 來登錄自訂網域。
      2. 透過將負載平衡器的外部 IP 設定為規範名稱記錄 (CNAME),為您的自訂網域定義一個別名。 在下列範例中,可以在 www.your-custom-domain.com 呼叫到外部 IP 為 1234abcd-us-south.lb.appdomain.cloud 的負載平衡器。
      主機/服務
      您要在其中呼叫到應用程式的字首,例如 www。
      資源類型
      選取 CNAME。
      TTL
      選取存活時間。
      值/目標
      您先前擷取的 LoadBalancer 外部 IP。 例如 1234abcd-us-south.lb.appdomain.cloud.。 請注意,當使用 IBM Cloud DNS 時,請務必輸入尾端句點。
    • IBM- 提供的子網域:使用 nlb-dns 指令,為 VPC ALB 主機名生成一個具備 TLS 憑證的子網域。IBM Cloud 會為您自動生成並維護該子網域的通配符 TLS 憑證。

      1. 建立一個 DNS 子網域及 TLS 憑證。
        ibmcloud oc nlb-dns create vpc-gen2 --cluster <cluster_name_or_id> --lb-host <vpc_lb_hostname> --type (public|private)
        
      2. 驗證已建立子網域。 如需相關資訊,請參閱瞭解子網域格式。
        ibmcloud oc nlb-dns ls --cluster <cluster_name_or_id>
        
        輸出範例
        Subdomain                                                                               Load Balancer Hostname                        Health Monitor   SSL Cert Status           SSL Cert Secret Name
        mycluster-a1b2cdef345678g9hi012j3kl4567890-0001.us-south.containers.appdomain.cloud     ["1234abcd-us-south.lb.appdomain.cloud"]      None             created                   <certificate>
        
  3. 如果您為公開 VPC ALB 建立了子網域,請開啟網頁瀏覽器並輸入 URL,即可透過該子網域存取您的應用程式,例如範例中的 www.your-custom-domain.com。 如果您為私有 VPC ALB 建立了子網域,則必須 連線至您的私有 VPC 網路, 才能測試對該子網域的存取。

若要使用 TLS 憑證透過 HTTPS 存取您的應用程式,請確保您已在 Kubernetes LoadBalancer 服務中 定義了 HTTPS 埠。 您可以執行 curl -v --insecure https://<domain>,以確認請求是否已正確透過 HTTPS 埠進行路由。 發生連線錯誤,表示該服務上沒有開啟任何 HTTPS 埠。 此外,請確保您的應用程式能夠終止 TLS 的連線。 您可以執行 curl -v https://<domain> 來驗證您的應用程式是否能正確終止 TLS。 憑證錯誤表示您的應用程式未能正確終止 TLS 的連線。

為私人 VPC ALB 註冊私人 DNS 記錄

版本中4.15或者稍後您可以使用以下可選註解來關聯自己的 DNS instance 它提供自訂 DNS zone 具有私有 VPC ALB。 為此,必須設定兩個可選註釋。 如果未指定,則 DNS A 此負載平衡器的記錄 hostname 屬性將會被加入到公共 DNS 區域 lb.appdomain.cloud。

service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-instance-crn: "private-dns-crn"
與此負載平衡器關聯的 DNS 網址 instance 。 指定的實例可能位於不同的區域或帳戶中,具體取決於 IAM 策略。 可能的值:9 ≤ 長度 ≤ 512
service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-zone-id: "dns-zone-id"
與此負載平衡器關聯的 DNS 網址 zone 。 指定的區域可能位於不同的區域或帳戶中,具體取決於 IAM 策略。 可能的數值:1 ≤ 長度 ≤ 128,數值必須符合以下正規表達式:[1]*[a-z0-9]$

在使用此功能之前,您需要按照先決條件執行以下操作:

  • 建立可綁定負載平衡器的DNS區域
  • 啟用 VPC LB 之間的服務到服務授權DNS Services
  • 將叢集的VPC加入到可用區允許的網路中

如需詳細資訊,請參閱《 將應用程式負載平衡器與 IBM Cloud DNS Services 整合 》及 《將 VPC 新增至 DNS 區域作為允許的網路》這兩份 文件。

範例:

apiVersion: v1
kind: Service
metadata:
  name: myloadbalancer
  annotations:
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name: "my-load-balancer"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: "private"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-instance-crn: "crn:v1:bluemix:public:dns-svcs:global:a/bb1b52262f7441a586f49068482f1e60:f761b566-030a-4696-8649-cc9d09889e88::"
    service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-private-dns-zone-id: "d66662cc-aa23-4fe1-9987-858487a61f45"
spec:
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 169.60.115.164
...

持續性 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 負載平衡器,您必須透過 重新命名 VPC 負載平衡器,或從原始 LoadBalancer 服務定義中移除 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-lb-name 註釋,來中斷與 LoadBalancer 服務的鏈結。 您也可以透過 刪除叢集,從叢集分離持續性 VPC 負載平衡器。

如果您移除註釋,則原始 LoadBalancer 服務會回復並在原始叢集裡建立非持續性 VPC 負載平衡器。 此非持續性 VPC 負載平衡器遵循 kube-<cluster_ID>-<kubernetes_lb_service_UID> 命名慣例。

將 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 時,此註釋才適用。
  • 若指定的 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 設為 http 或 https 時,此註釋才適用。
  • URL 的路徑必須採用「源格式」請求目標的格式。
  • 如果未指定此註釋,且 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。 不過,如果節點埠位於 30000-32767 範圍之外,您必須 修改 VPC 叢集安全群組 kube-<cluster-ID>,以容許送入資料流量 至指定的埠。

請注意,若指定的埠號值對應的服務意外中斷,或其埠號值已被重新設定,則 TCP 的運作狀態檢查將停止運作,直到該服務恢復運作,或您重新設定 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-health-check-udp 註解並指定新的 TCP 埠號值為止。 若要避免此情況,您可以指定 kubelet 埠 10250,這是不會發生服務中斷的靜態埠值。 不過,您必須 修改 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  
    

限制

請檢閱下列預設值和限制。

  • 檢閱 VPC ALB 的已知限制 及 VPC NLB 的已知限制。
  • 專用 VPC ALB 不接受所有資料流量,僅接受 RFC 1918 資料流量。
  • 必須在專用 VPC 子網路上建立專用 VPC NLB,該子網路必須存在於與叢集相同的 VPC 及位置中,但子網路無法連接至叢集或任何工作者節點。
  • Red Hat OpenShift: 雖然在 Kubernetes 社群版本中已正式發行 Kubernetes SCTP 通訊協定,但在 IBM Cloud Kubernetes Service 叢集裡不支援建立使用此通訊協定的負載平衡器。
  • 會為您建立的每個 Kubernetes LoadBalancer 服務建立一個 VPC 負載平衡器,而該 VPC 負載平衡器只會將要求遞送到該個 Kubernetes LoadBalancer 服務。 在您的 VPC 中的所有 VPC 叢集中,最多可建立 50 個 VPC 負載平衡器。 如需相關資訊,請參閱 VPC 配額文件。
  • VPC 負載平衡器可以將要求遞送至有限數目的工作者節點。 您可以將要求遞送至其中的節點數目上限,取決於您設定 externalTrafficPolicy 註釋的方式。
    • 如果您在負載平衡器配置中設定 externalTrafficPolicy: Cluster:
      • VPC 負載平衡器會遞送至每個區域中探索到的前 8 個工作者節點。 對於工作節點位於三個區域的集群,這會導致負載平衡器路由到總共 24 個工作節點。 若為單一區域叢集,負載平衡器會遞送至總計 8 個工作者節點。 您可以使用下列命令變更負載平衡器路由到的每個區域的工作節點數量 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-member-quota,但所有區域的總數不能超過 50。 如果叢集在所有可用區中的工作程序節點少於 50 個,請指定 0 以路由至一個可用區中的所有工作程序節點。 這 kube-proxy 設定 IP 表以將傳入流量從工作節點路由到應用程式 Pod 所在的節點上的應用程式 Pod。
    • 如果您在負載平衡器配置中設定 externalTrafficPolicy: Local,則只有在叢集上有 50 個或更少的工作者節點時,才會建立 VPC 負載平衡器。 此限制是由每個 VPC 負載平衡器儲存區 50 個儲存區成員的 VPC 配額限制所設定。 若要避免此限制,請使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector 註釋來限制負載平衡器儲存區中的工作者節點。 例如,您可以使用此註釋,將送入資料流量強制送入特定的工作者節點儲存區。 如果您使用此註釋來強制資料流量至特定的工作者節點儲存區,則還必須確保應用程式 Pod 也在相同的工作者節點儲存區中執行。
  • 為 Kubernetes LoadBalancer 服務定義配置 YAML 檔案時,不支援下列註釋和設定:
    • service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan: "<vlan_id>"
    • service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
    • service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "<algorithm>"
    • spec.loadBalancerIP
    • spec.loadBalancerSourceRanges
    • 僅限 VPC NLB: service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "proxy-protocol"
    • 僅限 VPC ALB:externalTrafficPolicy: Local 設定雖受支援,但此設定不會保留請求的來源 IP 位址。
  • 當您刪除 VPC 叢集時,也會自動刪除該叢集中 Kubernetes LoadBalancer 服務的任何非持續性 VPC 負載平衡器 (以 kube-<cluster_ID>-<kubernetes_lb_service_UID> 格式命名,並由 Red Hat OpenShift on IBM Cloud 自動建立)。 不過,不會刪除具有唯一名稱的 持續性負載平衡器,以及您在 VPC 中手動建立的 VPC 負載平衡器。
  • 對於 VPC 負載平衡器主機名稱,最多可以登錄 128 個子網域。 開立支援案例,即可要求提高這項限制。
  • 您針對 VPC 負載平衡器登錄的子網域限制為 130 個字元或更少。
  • VPC ALB 會在叢集工作者節點配置所在的相同 VPC 子網路上接聽,除非使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets 或 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 註釋建立 Kubernetes 負載平衡器服務,這會限制特定節點的資料流量。
    • 建立 ALB 之後,可以更新或修改 VPC ALB 的子網路及區域。 如果您將更多區域新增至叢集,或使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets 或 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 註釋更新 Kubernetes 負載平衡器服務,則會更新 VPC ALB 以在新的子網路上接聽。
  • VPC NLB 僅在單一區域中的單一 VPC 子網路上接聽。 它們無法配置為在多個 VPC 子網路上接聽,或在多個區域上接聽。 您可以使用 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-subnets 或 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone 註釋來指定 NLB 接聽的單一子網路。
    • VPC NLB 會將送入資料流量轉遞至叢集裡的所有工作者節點,除非您將送入資料流量限制為具有 service.kubernetes.io/ibm-load-balancer-cloud-provider-vpc-node-selector 或 service.kubernetes.io/ibm-load-balancer-cloud-provider-zone annotations 的特定工作者節點。 若要將資料流量限制為特定區域,您可以使用這些註釋來指定該區域中的工作者節點。
  • VPC 負載平衡器不支援停用負載平衡器 NodePort 配置。
  • VPC NLB 可在同一 VPC 負載平衡器上同時設定 UDP 與 TCP,但監聽埠必須不同。

  1. a-z0-9- ↩︎