8.6. 使用 HTTP/2 侦听程序创建 TLS 终止负载均衡器
当您使用 TLS 终止的 HTTPS 负载均衡器时,您可以将 CPU 密集型加密操作卸载到负载均衡器,并允许负载均衡器使用第 7 层检查等高级功能。通过添加 HTTP/2 侦听器,您可以利用 HTTP/2 协议来更快地加载页面来提高性能。负载均衡器使用应用程序协议协商(ALPN) TLS 扩展来与客户端协商 HTTP/2。
负载均衡服务(octavia)支持端到端 HTTP/2 流量,这意味着从请求到达负载均衡器时的 HAProxy 不会转换 HTTP2 流量,直到响应从负载均衡器返回为止。要实现端到端的 HTTP/2 流量,您必须有一个带有后端重新加密的 HTTP 池:池成员侦听为 HTTPS 流量配置的安全端口和 Web 应用程序。
您可以将 HTTP/2 流量发送到 HTTP 池,而无需重新加密后端。在这种情况下,HAProxy 会在到达池前转换流量,并在从负载均衡器返回前将响应转换为 HTTP/2。
红帽建议您创建一个运行状况监控器,以确保您的后端成员在 OpenShift (RHOSO)环境中的 Red Hat OpenStack Services 中仍然可用。
目前,负载均衡服务不支持使用 HTTP/2 监听器的 TLS 终止负载均衡器的健康状况监控。
先决条件
-
管理员已为您创建一个项目,并为您提供了一个
clouds.yaml
文件来访问云。 python-openstackclient
软件包驻留在您的工作站上。dnf list installed python-openstackclient
$ dnf list installed python-openstackclient
Copy to Clipboard Copied! Toggle word wrap Toggle overflow TLS 公钥加密配置有以下特征:
-
从分配给负载均衡器 VIP 地址的 DNS 名称的外部证书颁发机构(CA)获取 TLS 证书、密钥和中间证书链,例如
www.example.com
。 - 证书、密钥和中间证书链位于当前目录中的独立文件中。
- 密钥和证书是 PEM 编码的。
- 中间证书链包含多个 PEM 编码并串联在一起的证书。
-
从分配给负载均衡器 VIP 地址的 DNS 名称的外部证书颁发机构(CA)获取 TLS 证书、密钥和中间证书链,例如
- 您必须将负载均衡服务(octavia)配置为使用 Key Manager 服务(barbican)。如需更多信息,请参阅使用 密钥管理器服务指南管理 secret。
流程
将密钥(
server.key
)、证书(server.crt
)和中间证书链(ca-chain.crt
)组合成单个 PKCS12 文件(server.p12
)。注意括号内的值是此流程中示例命令中使用的示例值。将这些示例值替换为适合您的站点的值。
重要当您创建 PKCS12 文件时,请不要密码保护该文件。
Example
在本例中,PKCS12 文件在没有密码的情况下创建:
openssl pkcs12 -export -inkey server.key -in server.crt \ -certfile ca-chain.crt -passout pass: -out server.p12
$ openssl pkcs12 -export -inkey server.key -in server.crt \ -certfile ca-chain.crt -passout pass: -out server.p12
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用 Key Manager 服务为 PKCS12 文件创建 secret 资源(
tls_secret1
)。Example
openstack secret store --name='tls_secret1' \ -t 'application/octet-stream' -e 'base64' \ --payload="$(base64 < server.p12)"
$ openstack secret store --name='tls_secret1' \ -t 'application/octet-stream' -e 'base64' \ --payload="$(base64 < server.p12)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确认为您的云设置了系统
OS_CLOUD
变量:echo $OS_CLOUD
$ echo $OS_CLOUD my_cloud
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果需要,重置变量:
export OS_CLOUD=my_other_cloud
$ export OS_CLOUD=my_other_cloud
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 作为替代方案,您可以在每次运行
openstack
命令时添加--os-cloud <cloud_name
> 选项指定云名称。在公共子网(
public_subnet
)上创建负载平衡器(lb1
)。Example
openstack loadbalancer create --name lb1 --vip-subnet-id \ public_subnet --wait
$ openstack loadbalancer create --name lb1 --vip-subnet-id \ public_subnet --wait
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建
TERMINATED_HTTPS
侦听器(listener1
)并执行以下操作:-
引用机密资源(
tls_secret1
),作为侦听器的默认 TLS 容器。 -
设置 ALPN 协议(
h2
)。 如果客户端不支持 HTTP/2 (
http/1.1
),则设置回退协议。Example
openstack loadbalancer listener create --name listener1 \ --protocol-port 443 --protocol TERMINATED_HTTPS --alpn-protocol h2 \ --alpn-protocol http/1.1 --default-tls-container=\ $(openstack secret list | awk '/ tls_secret1 / {print $2}') lb1
$ openstack loadbalancer listener create --name listener1 \ --protocol-port 443 --protocol TERMINATED_HTTPS --alpn-protocol h2 \ --alpn-protocol http/1.1 --default-tls-container=\ $(openstack secret list | awk '/ tls_secret1 / {print $2}') lb1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
引用机密资源(
创建池(
pool1
),并使其成为侦听器的默认池。Example
本例中的命令创建一个 HTTP 池,其中包含在 TCP 端口 80 上托管使用 Web 应用程序配置的 HTTP 应用程序的后端服务器:
openstack loadbalancer pool create --name pool1 \ --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP
$ openstack loadbalancer pool create --name pool1 \ --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在连接到后端服务器的池(
pool1
)上创建一个类型为(TCP
)的运行状况监控器(healthmon1
)。健康检查有助于避免误报。如果没有定义运行状况监视器,则假定成员服务器为
ONLINE
。Example
openstack loadbalancer healthmonitor create --name healthmon1 \ --delay 15 --max-retries 4 --timeout 10 --type TCP pool1
$ openstack loadbalancer healthmonitor create --name healthmon1 \ --delay 15 --max-retries 4 --timeout 10 --type TCP pool1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将专用子网(
private_subnet
)上的 HTTP 后端服务器(192.0.2.10
和192.0.2.11)
添加到池。Example
在本例中,后端服务器
192.0.2.10
和192.0.2.11
分别命名为member1
和member2
:openstack loadbalancer member create --name member1 --subnet-id \ private_subnet --address 192.0.2.10 --protocol-port 80 pool1 openstack loadbalancer member create --name member2 --subnet-id \ private_subnet --address 192.0.2.11 --protocol-port 80 pool1
$ openstack loadbalancer member create --name member1 --subnet-id \ private_subnet --address 192.0.2.10 --protocol-port 80 pool1 $ openstack loadbalancer member create --name member2 --subnet-id \ private_subnet --address 192.0.2.11 --protocol-port 80 pool1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
验证
查看并验证负载平衡器(
lb1
)设置。Example
openstack loadbalancer status show lb1
$ openstack loadbalancer status show lb1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 当存在运行状况监控器并正常运行时,您可以检查每个成员的状态。
Example
openstack loadbalancer member show pool1 member1
$ openstack loadbalancer member show pool1 member1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
工作成员(
member1
)在其operating_status
中有一个ONLINE
值:Copy to Clipboard Copied! Toggle word wrap Toggle overflow