設定負載平衡包括設定 Kubernetes 負載平衡器服務或入口資源以及 NCP 複寫控制站。

您可以透過設定負載平衡器類型的 Kubernetes 服務,建立第 4 層負載平衡器,並透過設定 Kubernetes 入口資源建立第 7 層負載平衡器。

若要在 NCP 中設定負載平衡,請在 ncp-rc.yml 檔案中:

  1. 設定 use_native_loadbalancer = True
  2. (選擇性) 將 pool_algorithm 設定為 ROUND_ROBINLEAST_CONNECTION/IP_HASH。預設為 ROUND_ROBIN
  3. (選擇性) 設定 service_size = SMALLMEDIUMLARGE。預設為 SMALL

LEAST_CONNECTION/IP_HASH 演算法表示相同來源 IP 位址中的流量將傳送至相同的後端網繭。

如需有關不同大小的 NSX-T 負載平衡器支援什麼的詳細資料,請參閱《NSX-T Data Center 管理指南》

建立負載平衡器後,無法透過更新組態檔來變更負載平衡器大小。可透過 NSX Manager 使用者介面或 API 進行變更。

設定第 4 層與第 7 層負載平衡的持續性

您可以使用 NCP ConfigMap 中的 l4_persistencel7_persistence 參數指定持續性設定。第 4 層持續性的可用選項為來源 IP。第 7 層持續性的可用選項為 Cookie 和來源 IP。預設值為 <None>。例如,
   # Choice of persistence type for ingress traffic through L7 Loadbalancer.
   # Accepted values:
   # 'cookie'
   # 'source_ip'
   l7_persistence = cookie

   # Choice of persistence type for ingress traffic through L4 Loadbalancer.
   # Accepted values:
   # 'source_ip'
   l4_persistence = source_ip

如果已關閉全域第 4 層持續性,您也可以為 Kubernetes 負載平衡器服務指定服務規格上的 sessionAffinity,以設定服務的持續性行為,也就是將 l4_persistence 設定為 <None>。如果將 l4_persistence 設為 source_ip,服務規格的 sessionAffinity 則可用於自訂服務的持續性逾時。預設的第 4 層持續性逾時為 10800 秒 (如同服務 Kubernetes 說明文件中指定的值 (https://kubernetes.io/docs/concepts/services-networking/service)。具有預設持續性逾時的所有服務,將共用相同的 NSX-T 負載平衡器持續性設定檔。會為每個使用非預設持續性逾時的服務建立專用的設定檔。

備註: 如果入口的後端服務是一種類型為負載平衡器的服務,則此服務的第 4 層虛擬伺服器和此入口的第 7 層虛擬伺服器不能有不同的持續性設定,例如,第 4 層的 source_ip 和第 7 層的 cookie。在此案例中,這兩個虛擬伺服器的持續性設定必須相同 ( source_ipcookieNone),或者其中一個虛擬伺服器是 None (則另一個設定可以是 source_ipcookie)。此案例的範例:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: cafe-ingress
spec:
  rules:
  - host: cafe.example.com
    http:
      paths:
      - path: /tea
        backend:
          serviceName: tea-svc
          servicePort: 80
-----
apiVersion: v1
kind: Service
metadata:
  name: tea-svc <==== same as the Ingress backend above
  labels:
    app: tea
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: tcp
  selector:
    app: tea
  type: LoadBalancer

入口

  • NSX-T Data Center 將針對含 TLS 規格的入口和不含 TLS 規格的入口,分別建立一個第 7 層負載平衡器。
  • 所有入口將取得單一 IP 位址。
  • 會從 ncp.ini[nsx_v3] 區段中的 external_ip_pools 選項所指定的外部 IP 集區,為入口資源配置 IP 位址。負載平衡器將在此 IP 位址及 HTTP 和 HTTPS 連接埠 (80 和 443) 上公開。
  • 會從 ncp.ini[nsx_v3] 區段中的 external_ip_pools_lb 選項所指定的外部 IP 集區,為入口資源配置 IP 位址。如果 external_ip_pools_lb 選項不存在,則會使用 external_ip_pools 所指定的集區。負載平衡器將在此 IP 位址及 HTTP 和 HTTPS 連接埠 (80 和 443) 上公開。
  • 您可以透過變更組態並重新啟動 NCP,變更為不同的 IP 集區。
  • 您可以指定 TLS 的預設憑證。如需產生憑證並將憑證掛接到 NCP 網繭中的相關資訊,請參閱以下內容。
  • 不含 TLS 規格的入口將主控於 HTTP 虛擬伺服器 (連接埠 80) 之上。
  • 含 TLS 規格的入口將主控於 HTTPS 虛擬伺服器 (連接埠 443) 之上。負載平衡器將充當 SSL 伺服器,並且會終止用戶端 SSL 連線。
  • 密碼與入口的建立順序無關緊要。如果該密碼物件已存在,且有入口參考該密碼物件,則憑證將匯入 NSX-T Data Center 中。如果密碼已刪除或參考該密碼的最後一個入口已刪除,將會刪除與密碼對應的憑證。
  • 支援透過新增或移除 TLS 區段來修改入口。從入口規格中移除 tls 金鑰時,入口規則將從 HTTPS 虛擬伺服器 (連接埠 443) 傳輸至 HTTP 虛擬伺服器 (連接埠 80)。同樣地,將 tls 金鑰新增至入口規格時,入口規則將從 HTTP 虛擬伺服器 (連接埠 80) 傳輸至 HTTPS 虛擬伺服器 (連接埠 443)。
  • 如果單一叢集的入口定義中有重複規則,則僅套用第一個規則。
  • 每個叢集僅支援具有預設後端的單一入口。不符合任何入口規則的流量將會轉送至預設後端。
  • 如果有多個入口具有預設後端,則僅設定第一個入口。其他入口將標註為錯誤。
  • 支援使用規則運算式字元「.」進行萬用字元 URI 比對。「*」進行萬用字元 URI 比對。例如,路徑「/coffee/.*」與後面不跟字元或後跟一或多個字元的「/coffee/」(例如,「/coffee/」、「/coffee/a」、「/coffee/b」) 相符,但是與「/coffee」、「/coffeecup」或「/coffeecup/a」等不符。
    入口規格範例:
    kind: Ingress
    metadata:
      name: cafe-ingress
    spec:
      rules:
      - http:
          paths:
          - path: /coffee/.*    #Matches /coffee/, /coffee/a but NOT /coffee, /coffeecup, etc.
            backend:
              serviceName: coffee-svc
              servicePort: 80
  • 您可以透過新增註解至入口資源,來設定 URL 要求重寫。例如,
    kind: Ingress
    metadata:
      name: cafe-ingress
      annotations:
        ingress.kubernetes.io/rewrite-target: /
    spec:
      rules:
      - host: cafe.example.com
        http:
          paths:
          - path: /tea
            backend:
              serviceName: tea-svc
              servicePort: 80
          - path: /coffee
            backend:
              serviceName: coffee-svc
              servicePort: 80

    路徑 /tea/coffee 將重寫為 /,然後再將 URL 傳送至後端服務。

  • 支援入口註解 kubernetes.io/ingress.allow-http
    • 如果註解設定為 false,僅會建立 HTTPS 規則。
    • 如果註解設定為 true 或缺少註解,將會建立 HTTP 規則。此外,如果入口規格中存在 TLS 區段,將會建立 HTTPS 規則。
  • 已向入口資源標註錯誤。錯誤索引鍵為 ncp/error.loadbalancer,警告索引鍵為 ncp/warning.loadbalancer。可能的錯誤和警告如下:
    • ncp/error.loadbalancer: DEFAULT_BACKEND_IN_USE

      這個錯誤指示具有預設後端的入口已存在。入口將處於非作用中狀態。具有和不具有 TLS 的入口群組只能有一個預設後端。若要修正錯誤,請刪除入口,然後重新建立具有正確規格的入口。

    • ncp/warning.loadbalancer: SECRET_NOT_FOUND

      這個錯誤指示入口規格中指定的密碼不存在。入口將部分處於作用中狀態。若要修正錯誤,請建立遺失的密碼。請注意,註解中一旦出現警告,在入口資源的生命週期內將不會予以清除。

    • ncp/warning.loadbalancer: INVALID_INGRESS
      此錯誤指出下列條件之一為 true。入口將處於非作用中狀態。若要修正錯誤,請刪除入口,然後重新建立具有正確規格的入口。
      • 入口規則與相同 Kubernetes 叢集中的另一個入口規則衝突。
      • allow-http 註解設為 False,且入口沒有 TLS 區段。
      • 入口規則未指定 hostpath。此類入口規則具有與入口預設後端相同的功能。請改用入口預設後端。

類型為負載平衡器的服務

  • NSX-T Data Center 將為每個服務連接埠建立第 4 層負載平衡器虛擬伺服器和集區。
  • TCP 和 UDP 均受支援。
  • 每個服務都具有唯一的 IP 位址。
  • 服務會根據負載平衡器定義 loadBalancerIP 欄位的外部 IP 集區配置 IP 位址。loadBalancerIP 欄位可以為空白,並具有 IP 位址、名稱或 IP 集區的識別碼。如果 loadBalancerIP 欄位為空白,會從 ncp.ini[nsx_v3] 區段中的 external_ip_pools_lb 選項所指定的外部 IP 集區配置 IP。如果 external_ip_pools_lb 選項不存在,則會使用 external_ip_pools 所指定的集區。負載平衡器服務將在此 IP 位址和服務連接埠上公開。
  • 您可以透過變更組態並重新啟動 NCP,變更為不同的 IP 集區。
  • loadBalancerIP 指定的 IP 集區必須有標籤 scope: ncp/owner, tag: cluster:<cluster_name>

  • 已向服務標註錯誤。錯誤索引鍵為 ncp/error.loadbalancer。可能的錯誤如下:
    • ncp/error.loadbalancer: IP_POOL_NOT_FOUND

      這個錯誤指示您指定 loadBalancerIP: <nsx-ip-pool>,但 <nsx-ip-pool> 不存在。服務將處於非作用中狀態。若要修正錯誤,請指定有效的 IP 集區,刪除服務,然後再重新建立服務。

    • ncp/error.loadbalancer: IP_POOL_EXHAUSTED

      這個錯誤指示您指定 loadBalancerIP: <nsx-ip-pool>,但 IP 集區已用盡其 IP 位址。服務將處於非作用中狀態。若要修正錯誤,請指定具有可用 IP 位址的 IP 集區,刪除服務,然後再重新建立服務。

    • ncp/error.loadbalancer: IP_POOL_NOT_UNIQUE

      這個錯誤指出多個 IP 集區具有 loadBalancerIP: <nsx-ip-pool> 所指定的名稱。服務將處於非作用中狀態。

    • ncp/error.loadbalancer: POOL_ACCESS_DENIED

      此錯誤指出 loadBalancerIP 所指定的 IP 集區沒有標籤 scope: ncp/owner, tag: cluster:<cluster_name>,或標籤中指定的叢集與 Kubernetes 叢集的名稱不相符。

    • ncp/error.loadbalancer: LB_VIP_CONFLICT

      此錯誤表示 loadBalancerIP 欄位中的 IP 與作用中服務的 IP 相同。服務將處於非作用中狀態。

  • 支援自動調整第 4 層負載平衡器。如果 Kubernetes 負載平衡器服務已建立或修改,使其需要額外的虛擬伺服器,而現有的第 4 層負載平衡器沒有容量,將會建立新的第 4 層負載平衡器。NCP 也將刪除不再連結有虛擬伺服器的第 4 層負載平衡器。此功能預設為啟用狀態。可以透過在 NCP ConfigMap 中將 l4_lb_auto_scaling 設定為 false,將其停用。

負載平衡器和網路原則

當流量從 NSX 負載平衡器虛擬伺服器轉送至網繭時,來源 IP 為第 1 層路由器上行連接埠的 IP 位址。此位址位於私人第 1 層傳送網路上,並且會導致以 CIDR 為基礎的網路原則禁止應允許的流量。若要避免此問題,必須設定網路原則,以便第 1 層路由器上行連接埠的 IP 位址是允許的 CIDR 區塊的一部分。此內部 IP 位址將顯示於 status.loadbalancer.ingress.ip 欄位,做為入口資源上的註解 (ncp/internal_ip_for_policy)。

例如,如果虛擬伺服器的外部 IP 位址為 4.4.0.5,內部第 1 層路由器上行連接埠的 IP 位址為 100.64.224.11,則狀態將為:
    status:
      loadBalancer:
      ingress:
      - ip: 4.4.0.5
      - ip: 100.64.224.11
類型為負載平衡器資源的入口和服務上的註解將為:
    ncp/internal_ip_for_policy: 100.64.224.11
IP 位址 100.64.224.11 必須屬於網路原則的 ipBlock 選取器中允許的 CIDR。例如,
    apiVersion: networking.k8s.io/v1
    kind: NetworkPolicy
    ...
    ingress:
    - from:
      - ipBlock:
         cidr: 100.64.224.11/32

產生 CA 簽署憑證的範例指令碼

下列指令碼會產生 CA 簽署憑證和私密金鑰,其分別儲存在 <filename>.crt 和 <finename>.key 檔案中。 genrsa 命令會產生 CA 金鑰。應加密 CA 金鑰。您可以使用 aes256 等命令指定加密方法。
#!/bin/bash
host="www.example.com"
filename=server

openssl genrsa -out ca.key 4096
openssl req -key ca.key -new -x509 -days 365 -sha256 -extensions v3_ca -out ca.crt -subj "/C=US/ST=CA/L=Palo Alto/O=OS3/OU=Eng/CN=${host}"
openssl req -out ${filename}.csr -new -newkey rsa:2048 -nodes -keyout ${filename}.key -subj "/C=US/ST=CA/L=Palo Alto/O=OS3/OU=Eng/CN=${host}"
openssl x509 -req -days 360 -in ${filename}.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out ${filename}.crt -sha256

將預設憑證和金鑰掛接到 NCP 網繭

產生憑證和私密金鑰後,將其放置在主機虛擬機器上的目錄 /etc/nsx-ujo 中。假設憑證和金鑰檔案的名稱分別為 lb-default.crtlb-default.key,編輯 ncp-rc.yaml,以便主機上的這些檔案掛接到網繭中。例如,
spec:
  ...
  containers:
  - name: nsx-ncp
    ...
    volumeMounts:
    ...
    - name: lb-default-cert
      # Mount path must match nsx_v3 option "lb_default_cert_path"
      mountPath: /etc/nsx-ujo/lb-default.crt
    - name: lb-priv-key
      # Mount path must match nsx_v3 option "lb_priv_key_path"
      mountPath: /etc/nsx-ujo/lb-default.key
  volumes:
  ...
  - name: lb-default-cert
    hostPath:
      path: /etc/nsx-ujo/lb-default.crt
  - name: lb-priv-key
    hostPath:
      path: /etc/nsx-ujo/lb-default.key