配置负载平衡需要配置 Kubernetes LoadBalancer 服务或 OpenShift 路由。此外,还需要配置 NCP 复制控制器。LoadBalancer 服务用于第 4 层流量,而 OpenShift 路由用于第 7 层流量。

配置 Kubernetes LoadBalancer 服务时,会从您配置的外部 IP 块为该服务分配一个 IP 地址。会在此 IP 地址和服务端口上公开负载平衡器。可以使用 loadBalancerIP 规范在 LoadBalancer 定义中指定 IP 池的名称或 ID。将从该 IP 池分配 Loadbalancer 服务的 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 pod 中。有关说明,请参见下文。

  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 才不会向 LoadBalancer 服务分配 IP。

    • /etc/origin/master/master-config.yaml 文件中的 networkConfig 下,将 ingressIPNetworkCIDR 设置为 0.0.0.0/32。

    • 使用以下命令重新启动 API 服务器和控制器:

         master-restart api
         master-restart controllers

对于 Kubernetes LoadBalancer 服务,如果禁用了全局第 4 层持久性(即 l4_persistence 设置为 <None>),您还可以在服务规范上指定 sessionAffinity 以配置服务持久性行为。如果 l4_persistence 设置为 source_ip,则可以使用服务规范上的 sessionAffinity 自定义服务持久性超时。默认第 4 层持久性超时为 10800 秒,与 Kubernetes 文档 (https://kubernetes.io/docs/concepts/services-networking/service) 中指定的服务超时相同。具有默认持久性超时的所有服务将使用相同的 NSX-T 负载平衡器持久性配置文件。将为每个具有非默认持久性超时的服务创建专用的配置文件。

注:

如果 Ingress 的后端服务的服务类型为 LoadBalancer,则该服务的第 4 层虚拟服务器和 Ingress 的第 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 群集支持一个 Loadbalancer 服务。

  • NSX-T Data Center 将为每个 LoadBalancer 服务端口创建一个第 4 层负载平衡器虚拟服务器和池。TCP 和 UDP 均受支持。

  • NSX-T Data Center 负载平衡器有多种不同大小。有关配置 NSX-T Data Center 负载平衡器的信息,请参见《NSX-T Data Center 管理指南》

    创建负载平衡器后,无法通过更新配置文件来更改负载平衡器大小,但是可以通过 UI 或 API 进行更改。

  • 支持自动缩放第 4 层负载平衡器。如果创建或修改 Kubernetes LoadBalancer 服务以便需要更多的虚拟服务器,而现有的第 4 层负载平衡器没有足够的容量,将创建新的第 4 层负载平衡器。NCP 也将删除不再连接虚拟服务器的第 4 层负载平衡器。默认情况下,将启用该功能。可以通过在 NCP ConfigMap 中将 l4_lb_auto_scaling 设置为 false 禁用此功能。

用于生成 CA 签名证书的示例脚本

以下脚本可分别生成存储在文件 <filename>.crt 和 <finename>.key 中的 CA 签名证书和私钥。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 Pod 中

生成证书和私钥后,请将其置于主机虚拟机上的目录 /etc/nsx-ujo 中。假设证书文件和密钥文件分别命名为 lb-default.crtlb-default.key,请编辑 ncp-rc.yaml 以便主机上的这些文件挂载到 pod 中。例如,

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