經典:使用 NLB 設定 DSR 負載平衡 2.0

版本 2.0 NLB 僅可在經典叢集中建立,無法在 VPC 叢集中建立。 若要平衡 VPC 叢集裡的負載,請參閱使用 VPC 的負載平衡器公開應用程式

公開埠並使用可攜式 IP 位址,讓第 4 層網路負載平衡器 (NLB) 可以公開容器化應用程式。 如需 2.0 版 NLB 的相關資訊,請參閱 NLB 2.0 的元件和架構

必要條件

您無法將現有的 1.0 NLB 版本升級至 2.0。 您必須建立新的 NLB 2.0。 您可以在同一個叢集中同時執行 1.0 和 2.0 版本的NLB。 若要使用 NLB 2.0,您的叢集必須執行 Red Hat OpenShift 版本 4。

在建立 NLB 2.0 之前,您必須完成下列必要條件步驟。

  1. 若要容許 NLB 2.0 將要求轉遞到多個區域中的應用程式 Pod,請開立支援案例以要求對 VLAN 進行容量聚集。 此配置設定不會導致任何網路中斷。

    1. 登入 IBM Cloud 主控台
    2. 從功能表列,按一下支援,按一下管理案例標籤,然後按一下建立新的案例
    3. 在案例欄位中,輸入下列內容: 主題:網路 - 配置 子主題:經典 - VLAN
    4. 將下列資訊新增至說明: Please set up the network to allow capacity aggregation on the public and private VLANs associated with my account. This is related to /docs/openshift?topic=openshift-loadbalancer-v2#ipvs_provision, and is needed so I can configure NLB v2.0 LoadBalancers in my Classic Kubernetes Cluster.。 請注意,如果要容許特定 VLAN 上的容量聚集(例如,僅一個叢集的公用 VLAN),則可以在說明中指定這些 VLAN ID。
    5. 按一下提交
  2. 為 IBM Cloud 基礎架構帳戶啟用虛擬路由器功能 (VRF)。 若要啟用 VRF,請參閱 啟用 VRF。 若要檢查是否已啟用 VRF,請使用 ibmcloud account show 指令。 如果您無法或不想啟用 VRF,請啟用 VLAN Spanning。 啟用 VRF 或 VLAN Spanning 時,NLB 2.0 可以將封包遞送至帳戶中的各種子網路。

  3. 如果您使用 Calico DNAT 前網路原則 來管理 NLB 2.0的資料流量,則必須將 applyOnForward: truedoNotTrack: true 欄位新增至原則中的 spec 區段,並從其中移除 preDNAT: trueapplyOnForward: true 可確保將 Calico 原則封裝及轉遞時套用至資料流量。doNotTrack: true 可確保工作者節點可以使用 DSR 將回應封包直接傳回至用戶端,而不需要追蹤連線。 例如,若您使用「Calico」政策,僅允許來自特定 IP 位址的流量連線至您的 NLB IP 位址,該政策將類似如下:

    apiVersion: projectcalico.org/v3
    kind: GlobalNetworkPolicy
    metadata:
      name: allowlist
    spec:
      applyOnForward: true
      doNotTrack: true
      ingress:
      - action: Allow
        destination:
          nets:
          - <loadbalancer_IP>/32
          ports:
          - 80
        protocol: TCP
        source:
          nets:
          - <client_address>/32
      selector: ibm.role=='worker_public'
      order: 500
      types:
      - Ingress
    

接下來,您可以遵循在多區域叢集裡設定 NLB 2.0在單一區域叢集裡設定 NLB 2.0 中的步驟。

在多區域叢集裡設定 NLB 2.0

開始之前

在繼續之前,請先完成 NLB 2.0 的先決條件

  • 若要在多個區域中建立公用 NLB,則必須至少有一個公用 VLAN 在每個區域中都具有可用的可攜式子網路。 若要在多個區域中建立專用 NLB,則必須至少有一個專用 VLAN 在每個區域中都具有可用的可攜式子網路。 您可以遵循配置叢集子網路中的步驟,來新增子網路。

  • 請確認您已擁有 default 命名空間的 作家經理 IBM Cloud IAM 服務存取角色

  • 確定您具有必要的工作者節點數目:

    • 標準叢集:如果您將網路資料流量限制為邊緣工作者節點,請確定在每個區域中至少啟用兩個邊緣工作者節點,以統一部署 NLB。
  • 當重新載入叢集節點時,或當叢集主節點更新項目包含新的 keepalived 映像檔時,負載平衡器虛擬 IP 會移至新節點的網路介面。 發生此情況時,必須重新建立與負載平衡器的任何長時間連線。 請考慮在應用程式中併入重試邏輯,以便快速嘗試重新建立連線。

若要在多區域叢集裡設定 NLB 2.0,請執行下列動作:

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

  2. 為您要公開至公用網際網路或專用網路的應用程式建立負載平衡器服務。

    1. 例如,建立名稱為 myloadbalancer.yaml 的服務配置檔。
    2. 為您要公開的應用程式定義負載平衡器服務。 您可以指定區域、VLAN 及 IP 位址。
        apiVersion: v1
        kind: Service
        metadata:
          name: myloadbalancer
          annotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private>
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "<zone>"
            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:
          type: LoadBalancer
          selector:
            <selector_key>: <selector_value>
          ports:
           - protocol: TCP
             port: 8080
             targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
          loadBalancerIP: <IP_address>
          externalTrafficPolicy: Local
        ```
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type`
        :   用於指定 `private`  `public` 負載平衡器的註解。
    
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-zone`
        :   用來指定負載平衡器服務要部署至其中之區域的註釋。 若要查看區域,請執行 `ibmcloud oc zone ls`。
    
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan`
        :   用來指定負載平衡器服務要部署至其中之 VLAN 的註釋。 若要檢視 VLAN,請執行 `ibmcloud oc vlan ls --zone ZONE`。
    
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"`
        :   用來指定 2.0 版負載平衡器的註釋。
    
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler`
        :   選用項目:用來指定排程演算法的註釋。 可接受的值為:輪詢(round-robin)模式下為 ` `"rr"` `(預設值),或來源雜湊(Source Hashing)模式下為 ` `"sh"` `。 如需相關資訊,請參閱 [2.0:排程演算法](#scheduling)。
    
        `selector`
        :   您在應用程式部署 YAML 檔案的 `spec.template.metadata.labels` 區段中使用的標籤鍵(`<selector_key>` )與值(`<selector_value>` )。
    
        `port`
        :   服務所接聽的埠。
    
        `loadBalancerIP`
        :   選用項目:若要建立專用 NLB,或針對公用 NLB 使用特定的可攜式 IP 位址,請指定您要使用的 IP 位址。 IP 位址必須位於您在註釋中指定的區域和 VLAN 中。 若未指定 IP 位址:
            :   如果叢集是在公用 VLAN 上,則會使用可攜式公用 IP 位址。 大部分叢集都在公用 VLAN 上。
            :   如果叢集只能在專用 VLAN 上使用,則會使用可攜式專用 IP 位址。
    
        `externalTrafficPolicy: Local`
        :   請將其設定為 `Local`。
    
    
        以下為在 `dal12` 中建立使用輪詢(round-robin)排程演算法的 NLB 2.0 服務的範例設定檔:
    
        ```yaml {: codeblock}
        apiVersion: v1
        kind: Service
        metadata:
          name: myloadbalancer
          annotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-zone: "dal12"
            service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr"
        spec:
          type: LoadBalancer
          selector:
            app: nginx
          ports:
           - protocol: TCP
             port: 8080
             targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
          externalTrafficPolicy: Local
        ```
    3. 可選:透過在「`spec.loadBalancerSourceRanges`」欄位中指定 IP 位址,將您的 NLB 服務僅限於特定範圍的 IP 位址存取。`loadBalancerSourceRanges` 是由您叢集中的 `kube-proxy` 透過在工作節點上套用 iptables 規則來實現的。 如需更多資訊,請參閱 [Kubernetes 的文件](https://kubernetes.io/docs/concepts/services-networking/){: external}。
    
    4. 在叢集裡建立服務。
    
    ```sh {: pre}
        oc apply -f myloadbalancer.yaml
        ```
    
  3. 驗證已順利建立 NLB 服務。 這可能需要幾分鐘的時間,才能適當地建立 NLB 服務,並讓應用程式可供使用。

    oc describe service myloadbalancer
    

    輸出範例:

    NAME:                   myloadbalancer
    Namespace:              default
    Labels:                 <none>
    Selector:               app=liberty
    Type:                   LoadBalancer
    Zone:                   dal10
    IP:                     172.21.xxx.xxx
    LoadBalancer Ingress:   169.xx.xxx.xxx
    Port:                   <unset> 8080/TCP
    NodePort:               <unset> 32040/TCP
    Endpoints:              172.30.xxx.xxx:8080
    Session Affinity:       None
    Events:
        FirstSeen    LastSeen    Count    From            SubObjectPath    Type     Reason                      Message
        ---------    --------    -----    ----            -------------    ----     ------                      -------
        10s            10s            1        {service-controller }      Normal CreatingLoadBalancer    Creating load balancer
        10s            10s            1        {service-controller }        Normal CreatedLoadBalancer    Created load balancer
    

    LoadBalancer Ingress IP 位址是已指派給 NLB 服務的可攜式 IP 位址。

  4. 如果您已建立公用 NLB,請從網際網路存取您的應用程式。

    1. 開啟偏好的 Web 瀏覽器。
    2. 輸入 NLB 的可攜式公用 IP 位址及埠。
        http://169.xx.xxx.xxx:8080
        ```
    
  5. 為了實現高可用性,請重複步驟 2 至 4,在每個擁有應用程式執行個體的區域中新增一個 NLB 2.0。

  6. 選用項目:NLB 服務也可讓您的應用程式透過服務的 NodePort 提供使用。 叢集內每個節點的每個公用及專用 IP 位址上都可以存取 NodePort。 若要在使用 NLB 服務時封鎖流向 NodePort 的資料流量,請參閱控制網路負載平衡器 (NLB) 或 NodePort 服務的入埠資料流量

接下來,您可以登錄 NLB 子網域

在單一區域叢集裡設定 NLB 2.0

開始之前

在繼續之前,請先完成 NLB 2.0 的先決條件

  • 您必須具有可指派給 NLB 服務的可用可攜式公用或專用 IP 位址。 如需相關資訊,請參閱配置叢集的子網路

  • 請確認您已擁有 default 命名空間的 作家經理 IBM Cloud IAM 服務存取角色

  • 當重新載入叢集節點時,或當叢集主節點更新項目包含新的 keepalived 映像檔時,負載平衡器虛擬 IP 會移至新節點的網路介面。 發生此情況時,必須重新建立與負載平衡器的任何長時間連線。 請考慮在應用程式中併入重試邏輯,以便快速嘗試重新建立連線。

若要在單一區域叢集裡建立 NLB 2.0 服務,請執行下列動作:

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

  2. 為您要公開至公用網際網路或專用網路的應用程式建立負載平衡器服務。

    1. 例如,建立名稱為 myloadbalancer.yaml 的服務配置檔。

    2. 為您要公開的應用程式定義負載平衡器 2.0 服務。

        apiVersion: v1
        kind: Service
        metadata:
          name: myloadbalancer
          annotations:
            service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type: <public_or_private>
            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:
          type: LoadBalancer
          selector:
            <selector_key>: <selector_value>
          ports:
           - protocol: TCP
             port: 8080
             targetPort: 8080 # Optional. By default, the `targetPort` is set to match the `port` value unless specified otherwise.
          loadBalancerIP: <IP_address>
          externalTrafficPolicy: Local
        ```
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-ip-type`
        :   用於指定 `private`  `public` 負載平衡器的註解。
    
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-vlan`
        :   選用項目:用來指定負載平衡器服務要部署至其中之 VLAN 的註釋。 若要檢視 VLAN,請執行 `ibmcloud oc vlan ls --zone ZONE`。
    
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-enable-features: "ipvs"`
        :   用來指定負載平衡器 2.0 的註釋。
    
        `service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler`
        :   選用項目:用來指定排程演算法的註釋。 可接受的值為:輪詢(round-robin)模式下為 ` `"rr"` `(預設值),或來源雜湊(Source Hashing)模式下為 ` `"sh"` `。 如需相關資訊,請參閱 [2.0:排程演算法](#scheduling)。
    
    
        `selector`
        :   您在應用程式部署 YAML 檔案的 `spec.template.metadata.labels` 區段中使用的標籤鍵(`<selector_key>` )與值(`<selector_value>` )。
    
    
        `port`
        :   服務所接聽的埠。
    
    
        `loadBalancerIP`
        :   選用項目:若要建立專用 NLB,或針對公用 NLB 使用特定的可攜式 IP 位址,請指定您要使用的 IP 位址。 IP 位址必須位於您在註釋中指定的 VLAN 上。 若未指定 IP 位址:
            - 如果叢集是在公用 VLAN 上,則會使用可攜式公用 IP 位址。 大部分叢集都在公用 VLAN 上。
            - 如果叢集只能在專用 VLAN 上使用,則會使用可攜式專用 IP 位址。
    
    
        `externalTrafficPolicy: Local`
        :   請將其設定為 `Local`。
    
    3. 可選:透過在「`spec.loadBalancerSourceRanges`」欄位中指定 IP 位址,將您的 NLB 服務僅限於特定範圍的 IP 位址存取。`loadBalancerSourceRanges` 是由您叢集中的 `kube-proxy` 透過在工作節點上套用 iptables 規則來實現的。 如需更多資訊,請參閱 [Kubernetes 的文件](https://kubernetes.io/docs/concepts/services-networking/){: external}。
    
    4. 在叢集裡建立服務。
    
    ```sh {: pre}
        oc apply -f myloadbalancer.yaml
        ```
    
  3. 驗證已順利建立 NLB 服務。 這可能需要幾分鐘的時間,才能建立服務,並讓應用程式可供使用。

    oc describe service myloadbalancer
    

    輸出範例:

    NAME:                   myloadbalancer
    Namespace:              default
    Labels:                 <none>
    Selector:               app=liberty
    Type:                   LoadBalancer
    Location:               dal10
    IP:                     172.21.xxx.xxx
    LoadBalancer Ingress:   169.xx.xxx.xxx
    Port:                   <unset> 8080/TCP
    NodePort:               <unset> 32040/TCP
    Endpoints:              172.30.xxx.xxx:8080
    Session Affinity:       None
    Events:
        FirstSeen    LastSeen    Count    From            SubObjectPath    Type     Reason                      Message
        ---------    --------    -----    ----            -------------    ----     ------                      -------
        10s            10s            1        {service-controller }      Normal CreatingLoadBalancer    Creating load balancer
        10s            10s            1        {service-controller }        Normal CreatedLoadBalancer    Created load balancer
    

    LoadBalancer Ingress IP 位址是已指派給 NLB 服務的可攜式 IP 位址。

  4. 如果您已建立公用 NLB,請從網際網路存取您的應用程式。

    1. 開啟偏好的 Web 瀏覽器。
    2. 輸入 NLB 的可攜式公用 IP 位址及埠。
        http://169.xx.xxx.xxx:8080
        ```
    
  5. 選用項目:NLB 服務也可讓您的應用程式透過服務的 NodePort 提供使用。 叢集內每個節點的每個公用及專用 IP 位址上都可以存取 NodePort。 若要在使用 NLB 服務時封鎖流向 NodePort 的資料流量,請參閱控制網路負載平衡器 (NLB) 或 NodePort 服務的入埠資料流量

接下來,您可以登錄 NLB 子網域

排程演算法

排程演算法決定 NLB 2.0 如何將網路連線指派給您的應用程式 Pod。 當用戶端要求到達您的叢集時,NLB 會根據排程演算法,將要求封包遞送至工作者節點。 若要使用排程演算法,請在 NLB 服務設定檔的排程器註解中指定其「Keepalived」簡稱:service.kubernetes.io/ibm-load-balancer-cloud-provider-ipvs-scheduler: "rr"。 請檢查下列清單,以查看 Red Hat OpenShift on IBM Cloud 中支援哪些排程演算法。 若未指定排程演算法,系統預設將使用輪詢演算法。 如需更多資訊,請參閱 Keepalived 文件

支援的排程演算法

輪流制(rr
將連線遞送至工作者節點時,NLB 會輪流選取應用程式 Pod 清單,並平均處理每一個應用程式 Pod。循環式是 2.0 版 NLB 的預設排程演算法。
來源雜湊 (sh)
NLB 會根據用戶端要求封包的來源 IP 位址來產生雜湊金鑰。 然後,NLB 會在靜態指派的雜湊表中查閱雜湊金鑰,並將該要求遞送至處理該範圍雜湊的應用程式 Pod。 此演算法可確保來自特定用戶端的要求一律導向至相同的應用程式 Pod。 Kubernetes 使用 iptables 規則,使請求被發送至工作節點上的隨機 Pod。 若要使用此排程演算法,您必須確保每個工作者節點都只部署一個應用程式 Pod。 例如,若每個 Pod 都有標籤 run=<app_name>,請在應用程式部署的 spec 區段中加入以下反親和性規則:
spec:
  affinity:
  podAntiAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
    - weight: 100
      podAffinityTerm:
        labelSelector:
          matchExpressions:
          - key: run
            operator: In
            values:
            - <APP_NAME>
        topologyKey: kubernetes.io/hostname

不受支援的排程演算法

目的地雜湊 (dh)
封包的目的地(即 NLB IP 位址及埠)是用來判定哪個工作者節點會處理送入的要求。 不過,Red Hat OpenShift on IBM Cloud 中 NLB 的 IP 位址及埠不會變更。 NLB 被迫將要求保留在其所在之相同工作者節點內,因此只有某個工作者節點上的應用程式 Pod 才可處理所有送入的要求。
動態連線計數演算法
下列演算法取決於用戶端與 NLB 之間的動態連線計數。 不過,因為直接服務傳回 (DSR) 會避免 NLB 2.0 Pod 在傳回封包路徑中,因此 NLB 不會追蹤已建立的連線。
  • 最少連接 (lc)
  • 基於局部性的最小連接演算法(lblc
  • 基於位置的帶複製功能最少連接演算法(lblcr
  • 永不排隊 (nq)
  • 最短預期延遲(seq
加權 Pod 演算法
下列演算法取決於加權應用程式 Pod。 不過,在 Red Hat OpenShift on IBM Cloud 中,所有應用程式 Pod 都會獲指派相等的負載平衡加權。
  • 加權最小連接法(wlc
  • 加權循環式 (wrr)