NSX-T Data Center負載平衡器與 OpenShift 整合,並用作 OpenShift 路由器。
NCP 監看 OpenShift 路由和端點事件,且根據路由規格設定負載平衡器上的負載平衡規則。因此,NSX-T Data Center負載平衡器會根據規則將傳入第 7 層流量轉送到適當的後端網繭。
設定負載平衡包括設定 Kubernetes 負載平衡器服務或 OpenShift 路由。您還需要設定 NCP 複寫控制站。負載平衡器服務適用於第 4 層流量,而 OpenShift 路由適用於第 7 層流量。
當您設定 Kubernetes 負載平衡器服務時,將從您設定的外部 IP 區塊為該服務配置 IP 位址。負載平衡器將在此 IP 位址和服務連接埠上公開。您可以使用負載平衡器定義中的 loadBalancerIP 規格指定 IP 集區的名稱或識別碼。負載平衡器服務的 IP 將從此 IP 集區配置。如果 loadBalancerIP 規格為空白,將從您設定的外部 IP 區塊配置 IP。
loadBalancerIP 指定的 IP 集區必須有標籤 scope: ncp/owner, tag: cluster:<cluster_name>
。
若要使用 NSX-T Data Center 負載平衡器,您必須在 NCP 中設定負載平衡。在 ncp_rc.yml 檔案中,執行下列操作:
- 將 use_native_loadbalancer 設為 True。
- 將 pool_algorithm 設為 WEIGHTED_ROUND_ROBIN。
- 將 lb_default_cert_path 和 lb_priv_key_path 分別設定為 CA 簽署憑證檔案和私密金鑰檔案的完整路徑名稱。請參閱以下產生 CA 簽署憑證的範例指令碼。此外,將預設憑證和金鑰掛接到 NCP 網繭。如需相關指示,請參閱以下內容。
- (選擇性) 使用 l4_persistence 和 l7_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
- (選擇性) 將 service_size 設為 SMALL、MEDIUM 或 LARGE。預設值為 SMALL。
-
如果您正在執行 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 負載平衡器持續性設定檔。會為每個使用非預設持續性逾時的服務建立專用的設定檔。
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
路由器分區
在 OpenShift 4 中,每個路由在其中繼資料欄位中可有任意數量的標籤。路由器會使用選取器,從整個路由集區中選取路由子集。選擇項可能還涉及路由命名空間上的標籤。選取的路由會構成一個路由分區。
- 根據路由標籤或命名空間來設定入口。
- 為應用程式設定不同的路由。
- 將工作負載分配到多項負載平衡器服務之間,以提高效能。
此功能僅支援對第 7 層負載平衡器服務進行分區。
- 在 configmap.yaml 的 [k8s] 區段中,將 enable_lb_crd 選項設為 True,並套用該 YAML 檔案。建立並套用定義了 LoadBalancer CRD (CustomResourceDefinition) 的 YAML 檔案。例如,
apiVersion: vmware.com/v1alpha1 kind: LoadBalancer metadata: name: lbs-crd-1 spec: httpConfig: virtualIP: 192.168.4.4 # VIP for HTTP/HTTPS server. Default to auto_allocate port: 81 # HTTP port number. Default to 80 tls: port: 9998 # HTTPS port number. default to 443 secretName: default_secret # Default certificate for HTTPS server. Default to nil secretNamespace: default # Need to be set with secretName xForwardedFor: INSERT # Available values are INSERT, REPLACE. Default to nil affinity: type: source_ip # Available values are sourceIP, cookie timeout: 100 # Default to 10800 size: MEDIUM # Default to SMALL
- 執行下列命令,以設定具有命名空間標籤選取器的路由器 (假設路由器的 dc/svc 是 router):
oc set env dc/router NAMESPACE_LABELS="router=r1"
- 您在上一個步驟中所設定的路由器將處理來自所選命名空間的路由。若要讓此選取器符合命名空間,請據此標記該命名空間。例如,
apiVersion: v1 kind: Route metadata: name: cafe-route annotations: nsx/loadbalancer: lbs-crd-1 spec: host: cafe.example.com to: kind: Service name: tea-svc weight: 1
執行下列命令:oc label namespace targetns "router=r1"
將 targetns 取代為目標路由所在的確切命名空間。例如,apiVersion: v1 kind: Namespace metadata: name: qe annotations: nsx/loadbalancer: lbs-crd-1
附註:如果命名空間內的路由有另一項註解,會優先採用路由註解。
第 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
其他附註
- 支援所有終止模式:edge、passthrough 和 reencrypt。
- 支援萬用字元子網域。例如,如果 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,將其停用。
- 在路由規格中,參數 destinationCACertificate 不受支援,且 NCP 將忽略該參數。
- 每個 TLS 路由必須具有不同的 CA 簽署憑證。
產生 CA 簽署憑證的範例指令碼
#!/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