3.16. 部署 AWS 全局加速器负载均衡器
在多集群部署中部署一个 AWS 全局加速器作为负载平衡器构建块。
本节论述了部署 AWS 全局加速器所需的流程,以便在多集群红帽构建 Keycloak 部署之间路由流量。
此部署旨在与 多集群部署 一章中介绍的设置一起使用。将此部署与构建块 多集群部署一章中介绍的其他构建块 一起使用。
我们提供这些蓝图来显示最小功能完整示例,为常规安装提供良好的基准性能。您仍然需要根据您的环境以及您的组织的标准和安全性最佳实践进行调整。
3.16.1. 受众 复制链接链接已复制到粘贴板!
本章论述了如何部署 AWS 全局加速器实例,以处理红帽构建的 Keycloak 客户端连接故障切换。
3.16.2. 架构 复制链接链接已复制到粘贴板!
为确保用户请求路由到每个红帽构建的 Keycloak 站点,我们需要使用负载均衡器。为了防止客户端上 DNS 缓存出现问题,实施应使用在将客户端路由到两个可用区时保持不变的静态 IP 地址。
在本章中,我们描述了如何通过 AWS Global Accelerator 负载均衡器路由所有红帽构建的 Keycloak 客户端请求。如果红帽构建的 Keycloak 站点构建失败,则加速器确保所有客户端请求都路由到剩余的健康站点。如果两个站点都标记为不健康,则加速器将"fail-open"并将请求转发到随机选择的站点。
图 3.2. AWS Global Accelerator Failover
在两个 ROSA 集群上都创建一个 AWS Network Load Balancer (NLB),以便将 Keycloak pod 作为 Endpoints 提供给 AWS 全局加速器实例。每个集群端点都会被分配一个 128 (最大权重为 255)的权重),以确保在两个集群都健康时加速器流量平均路由到两个可用区。
3.16.3. 先决条件 复制链接链接已复制到粘贴板!
- 基于 ROSA 的 Multi-AZ 红帽构建的 Keycloak 部署
3.16.4. 流程 复制链接链接已复制到粘贴板!
创建网络负载平衡器
在每个红帽构建的 Keycloak 集群中执行以下操作:
- 登录到 ROSA 集群
创建 OpenShift 负载均衡器服务
命令:
cat <<EOF | oc apply -n $NAMESPACE -f -1 apiVersion: v1 kind: Service metadata: name: accelerator-loadbalancer annotations: service.beta.kubernetes.io/aws-load-balancer-additional-resource-tags: accelerator=${ACCELERATOR_NAME},site=${CLUSTER_NAME},namespace=${NAMESPACE}2 service.beta.kubernetes.io/aws-load-balancer-type: "nlb" service.beta.kubernetes.io/aws-load-balancer-healthcheck-path: "/lb-check" service.beta.kubernetes.io/aws-load-balancer-healthcheck-protocol: "https" service.beta.kubernetes.io/aws-load-balancer-healthcheck-interval: "10"3 service.beta.kubernetes.io/aws-load-balancer-healthcheck-healthy-threshold: "3"4 service.beta.kubernetes.io/aws-load-balancer-healthcheck-unhealthy-threshold: "3"5 spec: ports: - name: https port: 443 protocol: TCP targetPort: 8443 selector: app: keycloak app.kubernetes.io/instance: keycloak app.kubernetes.io/managed-by: keycloak-operator sessionAffinity: None type: LoadBalancer EOF记录 DNS 主机名,因为稍后需要:
命令:
oc -n $NAMESPACE get svc accelerator-loadbalancer --template="{{range .status.loadBalancer.ingress}}{{.hostname}}{{end}}"输出:
abab80a363ce8479ea9c4349d116bce2-6b65e8b4272fa4b5.elb.eu-west-1.amazonaws.com
创建全局加速器实例
命令:
aws globalaccelerator create-accelerator \ --name example-accelerator \1 --ip-address-type DUAL_STACK \2 --region us-west-23 输出:
{ "Accelerator": { "AcceleratorArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71",1 "Name": "example-accelerator", "IpAddressType": "DUAL_STACK", "Enabled": true, "IpSets": [ { "IpFamily": "IPv4", "IpAddresses": [ "75.2.42.125", "99.83.132.135" ], "IpAddressFamily": "IPv4" }, { "IpFamily": "IPv6", "IpAddresses": [ "2600:9000:a400:4092:88f3:82e2:e5b2:e686", "2600:9000:a516:b4ef:157e:4cbd:7b48:20f1" ], "IpAddressFamily": "IPv6" } ], "DnsName": "a099f799900e5b10d.awsglobalaccelerator.com",2 "Status": "IN_PROGRESS", "CreatedTime": "2023-11-13T15:46:40+00:00", "LastModifiedTime": "2023-11-13T15:46:42+00:00", "DualStackDnsName": "ac86191ca5121e885.dualstack.awsglobalaccelerator.com"3 } }为加速器创建一个 Listener
命令:
aws globalaccelerator create-listener \ --accelerator-arn 'arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71' \ --port-ranges '[{"FromPort":443,"ToPort":443}]' \ --protocol TCP \ --region us-west-2输出:
{ "Listener": { "ListenerArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40", "PortRanges": [ { "FromPort": 443, "ToPort": 443 } ], "Protocol": "TCP", "ClientAffinity": "NONE" } }为 Listener 创建端点组
命令:
CLUSTER_1_ENDPOINT_ARN=$(aws elbv2 describe-load-balancers \ --query "LoadBalancers[?DNSName=='abab80a363ce8479ea9c4349d116bce2-6b65e8b4272fa4b5.elb.eu-west-1.amazonaws.com'].LoadBalancerArn" \1 --region eu-west-1 \2 --output text ) CLUSTER_2_ENDPOINT_ARN=$(aws elbv2 describe-load-balancers \ --query "LoadBalancers[?DNSName=='a1c76566e3c334e4ab7b762d9f8dcbcf-985941f9c8d108d4.elb.eu-west-1.amazonaws.com'].LoadBalancerArn" \3 --region eu-west-1 \4 --output text ) ENDPOINTS='[ { "EndpointId": "'${CLUSTER_1_ENDPOINT_ARN}'", "Weight": 128, "ClientIPPreservationEnabled": false }, { "EndpointId": "'${CLUSTER_2_ENDPOINT_ARN}'", "Weight": 128, "ClientIPPreservationEnabled": false } ]' aws globalaccelerator create-endpoint-group \ --listener-arn 'arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40' \5 --traffic-dial-percentage 100 \ --endpoint-configurations ${ENDPOINTS} \ --endpoint-group-region eu-west-1 \6 --region us-west-2输出:
{ "EndpointGroup": { "EndpointGroupArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40/endpoint-group/2581af0dc700", "EndpointGroupRegion": "eu-west-1", "EndpointDescriptions": [ { "EndpointId": "arn:aws:elasticloadbalancing:eu-west-1:606671647913:loadbalancer/net/abab80a363ce8479ea9c4349d116bce2/6b65e8b4272fa4b5", "Weight": 128, "HealthState": "HEALTHY", "ClientIPPreservationEnabled": false }, { "EndpointId": "arn:aws:elasticloadbalancing:eu-west-1:606671647913:loadbalancer/net/a1c76566e3c334e4ab7b762d9f8dcbcf/985941f9c8d108d4", "Weight": 128, "HealthState": "HEALTHY", "ClientIPPreservationEnabled": false } ], "TrafficDialPercentage": 100.0, "HealthCheckPort": 443, "HealthCheckProtocol": "TCP", "HealthCheckPath": "undefined", "HealthCheckIntervalSeconds": 30, "ThresholdCount": 3 } }可选:配置自定义域
如果您使用自定义域,请通过在自定义域中配置 Alias 或 CNAME 将自定义域指向 AWS Global Load Balancer。
创建或更新红帽构建的 Keycloak 部署
在每个红帽构建的 Keycloak 集群中执行以下操作:
- 登录到 ROSA 集群
确保 Keycloak CR 具有以下配置
apiVersion: k8s.keycloak.org/v2alpha1 kind: Keycloak metadata: name: keycloak spec: hostname: hostname: $HOSTNAME1 ingress: enabled: false2 为确保请求转发按预期工作,Keycloak CR 需要指定要通过其访问红帽构建的 Keycloak 实例的主机名。这可以是与全局加速器关联的
DualStack或 DnsName 主机名。如果您使用自定义域,请将自定义域指向 AWS 全局加速器,并在这里使用您的自定义域。DnsName
3.16.5. 验证 复制链接链接已复制到粘贴板!
要验证 Global Accelerator 是否已正确配置为连接到集群,请导航到上述主机名,您应该会看到红帽构建的 Keycloak 管理控制台。
3.16.6. 进一步阅读 复制链接链接已复制到粘贴板!
- 在线提供站点
- 使站点离线