配置负载均衡需要配置 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 池必须具有标记 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 pod 中。有关说明,请参见下文。
- (可选)使用参数 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 才不会向 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 负载均衡器持久性配置文件。将为每个具有非默认持久性超时的服务创建专用的配置文件。
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 路由器。
- 将命名空间标签添加到目标命名空间。
- 在目标命名空间中创建 TLS 重新加密路由/直通路由。
例如,要为路由器配置命名空间标签选择器,请运行以下命令(假设路由器的服务帐户名称为 router):
oc set env dc/router NAMESPACE_LABELS="router=r1"
该路由器现在将处理来自选定命名空间的路由。要使此选择器与命名空间匹配,请运行以下命令(假设命名空间名为 ns1):
oc label namespace ns1 "router=r1"
第 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 文件,删除并重新创建 Route 资源。
- 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 签名证书的示例脚本
#!/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 中
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