使用 Keycloak Operator 部署具備高可用性的 Keycloak

Keycloak 部署的建構模組

本指南描述了 Kubernetes 的進階 Keycloak 設定,這些設定經過負載測試,並且能夠從單一 Pod 故障中恢復。

這些說明旨在與 多站點部署概念 指南中描述的設置一起使用。請將其與 多站點部署建構模組 指南中概述的其他建構模組一起使用。

先決條件

步驟

  1. 使用 CPU 和記憶體資源大小的概念 指南來確定部署的大小。

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

  3. 請注意,以下組態檔包含與從 在多個可用區域中部署 AWS Aurora 連接到 Aurora 資料庫相關的選項

  4. 請注意,以下組態檔包含與從 使用 Infinispan Operator 部署具備高可用性的 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 Operator 提供的預設傳遞 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'
本頁面