使用 Keycloak 运算符部署高可用 Keycloak

Keycloak 部署的基础模块

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

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

先决条件

步骤

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

  2. 按照 Keycloak 运算符安装 指南中所述安装 Keycloak 运算符。

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

  4. 请注意,下面的配置文件包含与从 使用 Infinispan 运算符部署高可用 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:
          - multi-site (3)
      transaction:
        xaEnabled: false (4)
      additionalOptions:
    
        - name: http-max-queued-requests
          value: "1000"
        - name: log-console-output
          value: json
        - name: metrics-enabled (5)
          value: 'true'
        - name: http-pool-max-threads (6)
          value: "66"
        - 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 驱动程序 不支持 XA 事务。
    5 为了能够在负载下分析系统,请启用度量指标端点。此设置的缺点是度量指标将在外部 Keycloak 端点可用,因此您必须添加一个过滤器以使端点无法从外部访问。使用位于 Keycloak 前面的反向代理来过滤掉这些 URL。
    6 您可能需要进一步限制 Keycloak 线程的数量,因为一旦达到请求的 CPU 限制,多个并发线程会导致 Kubernetes 节流。有关详细信息,请参阅 配置线程池的概念 指南。

验证部署

确认 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 服务。有关负载脱落的详细信息,请参阅 配置线程池的概念 指南。

可选:禁用粘性会话

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

在 Keycloak 自定义资源中的 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'
在本页上