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. 流程

  1. 创建网络负载平衡器

    在每个红帽构建的 Keycloak 集群中执行以下操作:

    1. 登录到 ROSA 集群
    2. 创建 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
      Copy to Clipboard Toggle word wrap

      1
      $NAMESPACE 应该替换为红帽构建的 Keycloak 部署的命名空间
      2
      在 AWS 创建的资源中添加附加标签,以便稍后可以检索它们。ACCELERATOR_NAME 应当是后续步骤中创建的全局加速器的名称,CLUSTER_NAME 应该是当前站点的名称。
      3
      健康检查探测的执行频率(以秒为单位)
      4
      NLB 必须通过多少健康检查才被认为是健康的
      5
      NLB 被视为不健康的健康检查必须失败
    3. 记录 DNS 主机名,因为稍后需要:

      命令:

      oc -n $NAMESPACE get svc accelerator-loadbalancer --template="{{range .status.loadBalancer.ingress}}{{.hostname}}{{end}}"
      Copy to Clipboard Toggle word wrap

      输出:

      abab80a363ce8479ea9c4349d116bce2-6b65e8b4272fa4b5.elb.eu-west-1.amazonaws.com
      Copy to Clipboard Toggle word wrap

  2. 创建全局加速器实例

    命令:

    aws globalaccelerator create-accelerator \
      --name example-accelerator \ 
    1
    
      --ip-address-type DUAL_STACK \ 
    2
    
      --region us-west-2 
    3
    Copy to Clipboard Toggle word wrap

    1
    要创建的加速器的名称,根据需要更新
    2
    可以是 'DUAL_STACK' 或 'IPV4'
    3
    所有 globalaccelerator 命令必须使用区域 'us-west-2'

    输出:

    {
        "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
    
        }
    }
    Copy to Clipboard Toggle word wrap

    1
    与创建的加速器实例关联的 ARN,这将在后续命令中使用
    2
    哪个 IPv4 红帽构建的 Keycloak 客户端应该连接到的 DNS 名称
    3
    用于 Red Hat build of Keycloak 客户端的 IPv6 红帽构建的 DNS 名称
  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
    Copy to Clipboard Toggle word wrap

    输出:

    {
        "Listener": {
            "ListenerArn": "arn:aws:globalaccelerator::606671647913:accelerator/e35a94dd-391f-4e3e-9a3d-d5ad22a78c71/listener/1f396d40",
            "PortRanges": [
                {
                    "FromPort": 443,
                    "ToPort": 443
                }
            ],
            "Protocol": "TCP",
            "ClientAffinity": "NONE"
        }
    }
    Copy to Clipboard Toggle word wrap

  4. 为 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
    Copy to Clipboard Toggle word wrap

    1 3
    集群的 NLB 的 DNS 主机名
    2 4 5
    上一步中创建的 Listener 的 ARN
    6
    这应该是托管集群的 AWS 区域

    输出:

    {
        "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
        }
    }
    Copy to Clipboard Toggle word wrap

  5. 可选:配置自定义域

    如果您使用自定义域,请通过在自定义域中配置 Alias 或 CNAME 将自定义域指向 AWS Global Load Balancer。

  6. 创建或更新红帽构建的 Keycloak 部署

    在每个红帽构建的 Keycloak 集群中执行以下操作:

    1. 登录到 ROSA 集群
    2. 确保 Keycloak CR 具有以下配置

      apiVersion: k8s.keycloak.org/v2alpha1
      kind: Keycloak
      metadata:
        name: keycloak
      spec:
        hostname:
          hostname: $HOSTNAME 
      1
      
        ingress:
          enabled: false 
      2
      Copy to Clipboard Toggle word wrap
      1
      用于连接到 Keycloak 的主机名客户端
      2
      禁用默认入口,因为所有红帽构建的 Keycloak 访问都应通过置备的 NLB

      为确保请求转发按预期工作,Keycloak CR 需要指定要通过其访问红帽构建的 Keycloak 实例的主机名。这可以是与全局加速器关联的 DualStack DnsName 或 DnsName 主机名。如果您使用自定义域,请将自定义域指向 AWS 全局加速器,并在这里使用您的自定义域。

3.16.5. 验证

要验证 Global Accelerator 是否已正确配置为连接到集群,请导航到上述主机名,您应该会看到红帽构建的 Keycloak 管理控制台。

3.16.6. 进一步阅读

  • 在线提供站点
  • 使站点离线
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat