为实现 HA 部署 Keycloak,使用 Keycloak Operator

Keycloak 部署的构建块

本指南介绍了 Kubernetes 的高级 Keycloak 配置,这些配置经过负载测试,可以从单个 Pod 故障中恢复。

这些说明旨在与多站点部署概念指南中描述的设置一起使用。请将其与多站点部署构建块指南中概述的其他构建块一起使用。

先决条件

步骤

  1. 使用CPU 和内存资源大小调整概念指南确定部署的大小。

  2. 按照Keycloak Operator 安装指南中的描述安装 Keycloak Operator。

  3. 请注意,以下配置文件包含与从在多可用区部署 AWS Aurora连接到 Aurora 数据库相关的选项

  4. 请注意,以下配置文件包含与从使用 Infinispan Operator 为 HA 部署 Infinispan连接到 Infinispan 服务器相关的选项

  5. 构建一个自定义 Keycloak 镜像,该镜像已为与 Amazon Aurora PostgreSQL 数据库一起使用而准备

  6. 使用在第一步中计算的资源请求和限制,使用以下值部署 Keycloak CR

    apiVersion: k8s.keycloak.org/v2alpha1
    kind: Keycloak
    metadata:
      labels:
        app: keycloak
      name: keycloak
      namespace: keycloak
    spec:
      hostname:
        hostname: <KEYCLOAK_URL_HERE>
      resources:
        requests:
          cpu: "2"
          memory: "1250M"
        limits:
          cpu: "6"
          memory: "2250M"
      db:
        vendor: postgres
        url: jdbc:aws-wrapper:postgresql://<AWS_AURORA_URL_HERE>:5432/keycloak
        poolMinSize: 30 (1)
        poolInitialSize: 30
        poolMaxSize: 30
        usernameSecret:
          name: keycloak-db-secret
          key: username
        passwordSecret:
          name: keycloak-db-secret
          key: password
      image: <KEYCLOAK_IMAGE_HERE> (2)
      startOptimized: false (2)
      features:
        enabled:
          - user-event-metrics
          - multi-site (3)
      transaction:
        xaEnabled: false (4)
      additionalOptions:
    
        - name: log-console-output
          value: json
        - name: metrics-enabled (5)
          value: 'true'
        - name: event-metrics-user-enabled
          value: 'true'
        - name: cache-remote-host
          value: "infinispan.keycloak.svc"
        - name: cache-remote-port
          value: "11222"
        - name: cache-remote-username
          secret:
            name: remote-store-secret
            key: username
        - name: cache-remote-password
          secret:
            name: remote-store-secret
            key: password
        - name: spi-connections-infinispan-quarkus-site-name
          value: keycloak
        - name: db-driver
          value: software.amazon.jdbc.Driver
      http:
        tlsSecret: keycloak-tls-secret
      instances: 3
    1 数据库连接池的初始大小、最大大小和最小大小应相同,以便为数据库启用语句缓存。调整此数字以满足您的系统需求。由于大多数请求不会触及数据库(因为 Keycloak 嵌入式缓存),因此此更改可以为每秒数百个请求提供服务。有关详细信息,请参阅数据库连接池概念指南。
    2 指定自定义 Keycloak 镜像的 URL。如果您的镜像已优化,请将 startOptimized 标志设置为 true
    3 启用多站点支持的附加功能,例如负载均衡器探针 /lb-check
    4 Amazon Web Services JDBC Driver不支持 XA 事务。
    5 为了能够分析负载下的系统,请启用指标端点。此设置的缺点是指标将在外部 Keycloak 端点上可用,因此您必须添加过滤器,以便该端点无法从外部访问。在 Keycloak 前面使用反向代理来过滤掉这些 URL。

验证部署

确认 Keycloak 部署已准备就绪。

kubectl wait --for=condition=Ready keycloaks.k8s.keycloak.org/keycloak
kubectl wait --for=condition=RollingUpdate=False keycloaks.k8s.keycloak.org/keycloak

可选:负载脱落

要启用负载脱落,请限制排队请求的数量。

具有最大排队 http 请求的负载脱落
spec:
  additionalOptions:
    - name: http-max-queued-requests
      value: "1000"

所有超出请求都将以 HTTP 503 错误代码响应。

您可能需要进一步限制 http-pool-max-threads 的值,因为一旦达到请求的 CPU 限制,多个并发线程将导致 Kubernetes 进行节流。

有关负载脱落的详细信息,请参阅配置线程池概念指南。

可选:禁用粘性会话

当在 OpenShift 上运行,并且使用 Keycloak Operator 提供的默认 passthrough Ingress 设置时,HAProxy 完成的负载均衡是通过使用基于源 IP 地址的粘性会话来完成的。当运行负载测试,或者在 HAProxy 前面有反向代理时,您可能需要禁用此设置,以避免在单个 Keycloak Pod 上接收所有请求。

在 Keycloak Custom Resource 中的 spec 下添加以下补充配置以禁用粘性会话。

spec:
  ingress:
    enabled: true
    annotations:
      # When running load tests, disable sticky sessions on the OpenShift HAProxy router
      # to avoid receiving all requests on a single Keycloak Pod.
      haproxy.router.openshift.io/balance: roundrobin
      haproxy.router.openshift.io/disable_cookies: 'true'
本页内容