設定負載平衡包括設定 Kubernetes 負載平衡器服務或 OpenShift 路由。您還需要設定 NCP 複寫控制站。負載平衡器服務適用於第 4 層流量,而 OpenShift 路由適用於第 7 層流量。

當您設定 Kubernetes 負載平衡器服務時,將從您設定的外部 IP 區塊為該服務配置 IP 位址。負載平衡器將在此 IP 位址和服務連接埠上公開。您可以使用負載平衡器定義中的 loadBalancerIP 規格指定 IP 集區的名稱或識別碼。負載平衡器服務的 IP 將從此 IP 集區配置。如果 loadBalancerIP 規格為空白,將從您設定的外部 IP 區塊配置 IP。

loadBalancerIP 所指定的 IP 集區必須有標記 {"ncp/owner": cluster:<cluster>}

若要使用 NSX-T Data Center 負載平衡器,您必須在 NCP 中設定負載平衡。在 ncp_rc.yml 檔案中,執行下列操作:

  1. use_native_loadbalancer 設為 True

  2. pool_algorithm 設為 WEIGHTED_ROUND_ROBIN

  3. 將 lb_default_cert_path 和 lb_priv_key_path 分別設定為 CA 簽署憑證檔案和私密金鑰檔案的完整路徑名稱。請參閱以下產生 CA 簽署憑證的範例指令碼。此外,將預設憑證和金鑰掛接到 NCP 網繭。如需相關指示,請參閱以下內容。

  4. (選擇性) 使用 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
  5. (選擇性) 將 service_size 設為 SMALLMEDIUMLARGE。預設值為 SMALL

  6. 如果您正在執行 OpenShift 3.11,您必須執行下列組態,以便 OpenShift 不會將 IP 指派給負載平衡器服務。

    • /etc/origin/master/master-config.yaml 檔案中,在 networkConfig 下將 ingressIPNetworkCIDR 設定為 0.0.0.0/32。

    • 使用下列命令重新啟動 API 伺服器和控制器:

         master-restart api
         master-restart controllers

如果已關閉全域第 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

路由器分區

NCP 一律處理 TLS Edge 終止和 HTTP 路由,且略過 TLS 傳遞路由和 TLS 重新加密路由,無論其命名空間或命名空間標籤為何。若要限制 OpenShift 路由器僅處理 TLS 重新加密和傳遞路由,您必須執行下列步驟:

  • 將命名空間標籤選取器新增至 Openshift 路由器。

  • 將命名空間標籤新增至目標命名空間。

  • 在目標命名空間中建立 TLS 重新加密/傳遞路由。

例如,若要設定具有命名空間標籤選取器的路由器,請執行下列命令 (假設路由器的服務帳戶名稱是 router):

oc set env dc/router NAMESPACE_LABELS="router=r1"

路由器將立即處理所選命名空間中的路由。若要使此選取器符合命名空間,請執行下列命令 (假設命名空間稱為 ns1):

oc label namespace ns1 "router=r1"

第 7 層負載平衡器範例

下列 YAML 檔案設定兩個複寫控制站 (tea-rc 和 coffee-rc)、兩項服務 (tea-svc 和 coffee-svc) 和兩個路由 (cafe-route-multi 和 cafe-route),以提供第 7 層負載平衡。

# RC
apiVersion: v1
kind: ReplicationController
metadata:
  name: tea-rc
spec:
  replicas: 2
  template:
    metadata:
       labels:
         app: tea
    spec:
      containers:
      - name: tea
        image: nginxdemos/hello
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: ReplicationController
metadata:
  name: coffee-rc
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: coffee
    spec:
      containers:
      - name: coffee
        image: nginxdemos/hello
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
# Services
apiVersion: v1
kind: Service
metadata:
  name: tea-svc
  labels:
    app: tea
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: tea
---
apiVersion: v1
kind: Service
metadata:
  name: coffee-svc
  labels:
    app: coffee
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: http
  selector:
    app: coffee
---
# Routes
apiVersion: v1
kind: Route
metadata:
  name: cafe-route-multi
spec:
  host: www.cafe.com
  path: /drinks
  to:
    kind: Service
    name: tea-svc
    weight: 1
  alternateBackends:
  - kind: Service
    name: coffee-svc
    weight: 2
---
apiVersion: v1
kind: Route
metadata:
  name: cafe-route
spec:
  host: www.cafe.com
  path: /tea-svc
  to:
    kind: Service
    name: tea-svc
    weight: 1

其他附註

  • HTTPS 流量僅支援 Edge 終止。

  • 支援萬用字元子網域。例如,如果 wildcardPolicy 設為 Subdomain,且主機名稱設為 wildcard.example.com,將為 *.example.com 的任何要求提供服務。

  • 如果 NCP 因錯誤組態在路由事件處理期間擲回錯誤,則需要更正路由 YAML 檔案、刪除並重新建立路由資源。

  • NCP 不會依命名空間強制執行主機名稱擁有權。

  • 每個 Kubernetes 叢集支援一個負載平衡器服務。

  • NSX-T Data Center 將為每個負載平衡器服務連接埠建立第 4 層負載平衡器虛擬伺服器和集區。TCP 和 UDP 均受支援。

  • NSX-T Data Center 負載平衡器的大小不同。如需設定 NSX-T Data Center 負載平衡器的相關資訊,請參閱《NSX-T Data Center 管理指南》

    建立負載平衡器後,無法透過更新組態檔來變更負載平衡器大小。可透過 UI 或 API 進行變更。

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

產生 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