使用 Infinispan Operator 部署高可用性 Infinispan

Kubernetes 上 Infinispan 部署的建構模組

本指南說明在多叢集環境(跨站點)中部署 Infinispan 所需的步驟。為了簡單起見,本主題使用允許 Keycloak 與外部 Infinispan 一起使用的最簡配置。

本指南假設有兩個名為 Site-ASite-B 的 OpenShift 叢集。

這是遵循 多站點部署概念 指南中所述概念的建構模組。如需概觀,請參閱 多站點部署 指南。

僅支援 15.0.8.Final 或更新版本修補程式的 Infinispan 版本用於外部 Infinispan 部署。

架構

此設定在兩個站點中部署兩個同步複寫的 Infinispan 叢集,並具有低延遲網路連線。此情境的一個範例可能是 AWS 區域中的兩個可用性區域。

為了簡單起見,已從以下圖表中移除 Keycloak、負載平衡器和資料庫。

infinispan crossdc az.dio

先決條件

步驟

  1. 安裝 Infinispan Operator

  2. 設定用於存取 Infinispan 叢集的憑證。

    Keycloak 需要此憑證才能與 Infinispan 叢集進行驗證。以下 identities.yaml 檔案設定具有管理員權限的使用者名稱和密碼

    credentials:
      - username: developer
        password: strong-password
        roles:
          - admin

    identities.yaml 可以設定為密碼,如下所示

    • 作為 Kubernetes 資源

      憑證密碼
      apiVersion: v1
      kind: Secret
      type: Opaque
      metadata:
        name: connect-secret
        namespace: keycloak
      data:
        identities.yaml: Y3JlZGVudGlhbHM6CiAgLSB1c2VybmFtZTogZGV2ZWxvcGVyCiAgICBwYXNzd29yZDogc3Ryb25nLXBhc3N3b3JkCiAgICByb2xlczoKICAgICAgLSBhZG1pbgo= (1)
      1 先前範例中 base64 編碼的 identities.yaml
    • 使用 CLI

      kubectl create secret generic connect-secret --from-file=identities.yaml

      如需詳細資訊,請查看 設定驗證 文件。

      這些命令必須在兩個 OpenShift 叢集上執行。

  3. 建立服務帳戶。

    需要服務帳戶才能在叢集之間建立連線。Infinispan Operator 使用它來檢查遠端站點的網路設定,並相應地設定本機 Infinispan 叢集。

    如需更多詳細資訊,請參閱 管理跨站點連線 文件。

    1. 建立 service-account-token 密碼類型,如下所示。相同的 YAML 檔案可用於兩個 OpenShift 叢集。

      xsite-sa-secret-token.yaml
      apiVersion: v1
      kind: Secret
      metadata:
        name: ispn-xsite-sa-token (1)
        annotations:
          kubernetes.io/service-account.name: "xsite-sa" (2)
      type: kubernetes.io/service-account-token
      1 密碼名稱。
      2 服務帳戶名稱。
    2. 在兩個 OpenShift 叢集中建立服務帳戶並產生存取權杖。

      Site-A 中建立服務帳戶
      kubectl create sa -n keycloak xsite-sa
      oc policy add-role-to-user view -n keycloak -z xsite-sa
      kubectl create -f xsite-sa-secret-token.yaml
      kubectl get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-A-token.txt
      Site-B 中建立服務帳戶
      kubectl create sa -n keycloak xsite-sa
      oc policy add-role-to-user view -n keycloak -z xsite-sa
      kubectl create -f xsite-sa-secret-token.yaml
      kubectl get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-B-token.txt
    3. 下一步是將來自 Site-A 的權杖部署到 Site-B,反之亦然

      Site-B 權杖部署到 Site-A
      kubectl create secret generic -n keycloak xsite-token-secret \
        --from-literal=token="$(cat Site-B-token.txt)"
      Site-A 權杖部署到 Site-B
      kubectl create secret generic -n keycloak xsite-token-secret \
        --from-literal=token="$(cat Site-A-token.txt)"
  4. 建立 TLS 密碼

    在本指南中,Infinispan 使用 OpenShift 路由進行跨站點通訊。它使用 TLS 的 SNI 擴展將流量導向正確的 Pod。為此,JGroups 使用 TLS socket,這需要具有正確憑證的金鑰儲存庫和信任儲存庫。

    如需更多資訊,請參閱 保護跨站點連線 文件或此 紅帽開發人員指南

    在 OpenShift 密碼中上傳金鑰儲存庫和信任儲存庫。密碼包含檔案內容、存取密碼和儲存類型。建立憑證和儲存的說明不在本指南的範圍內。

    若要將金鑰儲存庫上傳為密碼,請使用以下命令

    部署金鑰儲存庫
    kubectl -n keycloak create secret generic xsite-keystore-secret \
      --from-file=keystore.p12="./certs/keystore.p12" \ (1)
      --from-literal=password=secret \ (2)
      --from-literal=type=pkcs12 (3)
    1 金鑰儲存庫的檔案名稱和路徑。
    2 存取金鑰儲存庫的密碼。
    3 金鑰儲存庫類型。

    若要將信任儲存庫上傳為密碼,請使用以下命令

    部署信任儲存庫
    kubectl -n keycloak create secret generic xsite-truststore-secret \
            --from-file=truststore.p12="./certs/truststore.p12" \  (1)
            --from-literal=password=caSecret \  (2)
            --from-literal=type=pkcs12  (3)
    1 信任儲存庫的檔案名稱和路徑。
    2 存取信任儲存庫的密碼。
    3 信任儲存庫類型。
    金鑰儲存庫和信任儲存庫必須在兩個 OpenShift 叢集中上傳。
  5. 為啟用了跨站點的 Infinispan 建立叢集

    設定跨站點 文件提供了有關如何建立和設定已啟用跨站點的 Infinispan 叢集的所有資訊,包括先前的步驟。

    本指南提供了一個基本範例,使用先前步驟中命令建立的憑證、權杖和 TLS 金鑰儲存庫/信任儲存庫。

    Site-AInfinispan CR
    apiVersion: infinispan.org/v1
    kind: Infinispan
    metadata:
      name: infinispan (1)
      namespace: keycloak
      annotations:
        infinispan.org/monitoring: 'true' (2)
    spec:
      replicas: 3
      jmx:
        enabled: true
      security:
        endpointSecretName: connect-secret (3)
      service:
        type: DataGrid
        sites:
          local:
            name: site-a (4)
            expose:
              type: Route (5)
            maxRelayNodes: 128
            encryption:
              transportKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              routerKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              trustStore:
                secretName: xsite-truststore-secret (9)
                filename: truststore.p12 (10)
          locations:
            - name: site-b (11)
              clusterName: infinispan
              namespace: keycloak (12)
              url: openshift://api.site-b (13)
              secretName: xsite-token-secret (14)
    1 叢集名稱
    2 允許 Prometheus 監控叢集。
    3 如果使用自訂憑證,請在此處設定密碼名稱。
    4 本機站點的名稱,在此案例中為 Site-A
    5 使用 OpenShift 路由公開跨站點連線。
    6 金鑰儲存庫存在的密碼名稱,如上一個步驟中所定義。
    7 金鑰儲存庫中憑證的別名。
    8 金鑰儲存庫的密碼金鑰(檔案名稱),如上一個步驟中所定義。
    9 信任儲存庫存在的密碼名稱,如上一個步驟中所定義。
    10 金鑰儲存庫的信任儲存庫金鑰(檔案名稱),如上一個步驟中所定義。
    11 遠端站點的名稱,在此案例中為 Site-B
    12 來自遠端站點的 Infinispan 叢集的命名空間。
    13 遠端站點的 OpenShift API URL。
    14 具有用於驗證遠端站點的存取權杖的密碼。

    對於 Site-BInfinispan CR 看起來與上述類似。請注意第 4、11 和 13 點中的差異。

    Site-BInfinispan CR
    apiVersion: infinispan.org/v1
    kind: Infinispan
    metadata:
      name: infinispan (1)
      namespace: keycloak
      annotations:
        infinispan.org/monitoring: 'true' (2)
    spec:
      replicas: 3
      jmx:
        enabled: true
      security:
        endpointSecretName: connect-secret (3)
      service:
        type: DataGrid
        sites:
          local:
            name: site-b (4)
            expose:
              type: Route (5)
            maxRelayNodes: 128
            encryption:
              transportKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              routerKeyStore:
                secretName: xsite-keystore-secret (6)
                alias: xsite (7)
                filename: keystore.p12 (8)
              trustStore:
                secretName: xsite-truststore-secret (9)
                filename: truststore.p12 (10)
          locations:
            - name: site-a (11)
              clusterName: infinispan
              namespace: keycloak (12)
              url: openshift://api.site-a (13)
              secretName: xsite-token-secret (14)
  6. 為 Keycloak 建立快取。

    Keycloak 需要存在以下快取:actionTokensauthenticationSessionsloginFailureswork

    Infinispan 快取 CR 允許在 Infinispan 叢集中部署快取。根據 跨站點文件 的說明,每個快取都需要啟用跨站點。該文件包含有關本指南所使用選項的更多詳細資訊。以下範例顯示 Site-ACache CR。

    1. Site-A 中,使用以下內容為上述每個快取建立 Cache CR。這是 authenticationSessions 快取的範例

    apiVersion: infinispan.org/v2alpha1
    kind: Cache
    metadata:
      name: authenticationsessions
      namespace: keycloak
    spec:
      clusterName: infinispan
      name: authenticationSessions
      template: |-
        distributedCache:
          mode: "SYNC"
          owners: "2"
          statistics: "true"
          remoteTimeout: "5000"
          encoding:
            media-type: "application/x-protostream"
          locking:
            acquireTimeout: "4000"
          transaction:
            mode: "NON_XA" (1)
            locking: "PESSIMISTIC" (2)
          stateTransfer:
            chunkSize: "16"
          backups:
            site-b: (3)
              backup:
                strategy: "SYNC" (4)
                timeout: "4500" (5)
                failurePolicy: "FAIL" (6)
                stateTransfer:
                  chunkSize: "16"
    1 交易模式。
    2 交易使用的鎖定模式。
    3 遠端站點名稱。
    4 跨站點通訊策略,在此案例中為 SYNC
    5 跨站點複寫逾時。
    6 跨站點複寫失敗策略。

    上述範例是達到最佳資料一致性的建議組態。

    背景資訊

    當兩個站點同時修改條目時,可能會在作用中-作用中設定中發生死鎖。

    transaction.mode: NON_XA 確保在發生此情況時會回滾交易,以保持資料一致性。在這種情況下,需要設定 backup.failurePolicy: FAIL。它會擲回一個錯誤,允許安全地回滾交易。發生此情況時,Keycloak 將嘗試重試。

    transaction.locking: PESSIMISTIC 是唯一支援的鎖定模式;由於其網路成本,不建議使用 OPTIMISTIC。相同的設定還可以防止在一個站點無法連線時更新該站點。

    backup.strategy: SYNC 確保在 Keycloak 請求完成時,資料在另一個站點中可見並儲存。

    在死鎖情境中,可以減少 locking.acquireTimeout 以快速失敗。backup.timeout 必須始終高於 locking.acquireTimeout

    對於 Site-BCache CR 類似,除了上述圖表中第 3 點概述的 backups.<name> 之外。

    Site-B 中的 authenticationSessions Cache CR
    apiVersion: infinispan.org/v2alpha1
    kind: Cache
    metadata:
      name: authenticationsessions
      namespace: keycloak
    spec:
      clusterName: infinispan
      name: authenticationSessions
      template: |-
        distributedCache:
          mode: "SYNC"
          owners: "2"
          statistics: "true"
          remoteTimeout: "5000"
          encoding:
            media-type: "application/x-protostream"
          locking:
            acquireTimeout: "4000"
          transaction:
            mode: "NON_XA" (1)
            locking: "PESSIMISTIC" (2)
          stateTransfer:
            chunkSize: "16"
          backups:
            site-a: (3)
              backup:
                strategy: "SYNC" (4)
                timeout: "4500" (5)
                failurePolicy: "FAIL" (6)
                stateTransfer:
                  chunkSize: "16"

驗證部署

確認已形成 Infinispan 叢集,並且在 OpenShift 叢集之間已建立跨站點連線。

等待直到形成 Infinispan 叢集
kubectl wait --for condition=WellFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
等待直到建立 Infinispan 跨站點連線
kubectl wait --for condition=CrossSiteViewFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan

將 Infinispan 與 Keycloak 連接

現在 Infinispan 伺服器正在執行,以下是將其連接到 Keycloak 所需的相關 Keycloak CR 變更。這些變更將在 使用 Keycloak Operator 部署高可用性 Keycloak 指南中需要。

  1. 建立一個密碼,其中包含使用者名稱和密碼,以連線到外部 Infinispan 部署

    apiVersion: v1
    kind: Secret
    metadata:
      name: remote-store-secret
      namespace: keycloak
    type: Opaque
    data:
      username: ZGV2ZWxvcGVy # base64 encoding for 'developer'
      password: c2VjdXJlX3Bhc3N3b3Jk # base64 encoding for 'secure_password'
  2. 使用如下所示的 additionalOptions 擴充 Keycloak 自訂資源。

    以下 CR 中省略了所有記憶體、資源和資料庫組態,因為它們已在 使用 Keycloak Operator 部署高可用性 Keycloak 指南中說明。管理員應保持這些組態不變。

    apiVersion: k8s.keycloak.org/v2alpha1
    kind: Keycloak
    metadata:
      labels:
        app: keycloak
      name: keycloak
      namespace: keycloak
    spec:
      additionalOptions:
        - name: cache-remote-host (1)
          value: "infinispan.keycloak.svc"
        - name: cache-remote-port (2)
          value: "11222"
        - name: cache-remote-username (3)
          secret:
            name: remote-store-secret
            key: username
        - name: cache-remote-password (4)
          secret:
            name: remote-store-secret
            key: password
        - name: spi-connections-infinispan-quarkus-site-name (5)
          value: keycloak
    1 遠端 Infinispan 叢集的主機名稱。
    2 遠端 Infinispan 叢集的埠。這是可選的,預設為 11222
    3 密碼 namekey,其中包含 Infinispan 使用者名稱憑證。
    4 密碼 namekey,其中包含 Infinispan 密碼憑證。
    5 spi-connections-infinispan-quarkus-site-name 是任意的 Infinispan 站點名稱,當使用遠端儲存時,Keycloak 需要此名稱才能部署 Infinispan 快取。此站點名稱僅與 Infinispan 快取相關,並且不需要與外部 Infinispan 部署的任何值相符。如果您在跨 DC 設定中為 Keycloak 使用多個站點(例如 使用 Infinispan Operator 部署高可用性 Infinispan),則每個站點中的站點名稱必須不同。

架構

這使用由 TLS 1.3 保護的 TCP 連線將 Keycloak 連線到 Infinispan。它使用 Keycloak 的信任儲存庫來驗證 Infinispan 的伺服器憑證。由於 Keycloak 是使用其 Operator 在下列先決條件中列出的 OpenShift 上部署的,因此 Operator 已將 service-ca.crt 新增至信任儲存庫,該信任儲存庫用於簽署 Infinispan 的伺服器憑證。在其他環境中,將必要的憑證新增至 Keycloak 的信任儲存庫。

下一步

在 Aurora AWS 資料庫和 Infinispan 部署並執行後,請使用 使用 Keycloak Operator 部署高可用性 Keycloak 指南中的步驟來部署 Keycloak,並將其連接到所有先前建立的建構模組。

相關選項

cache-remote-host

遠端儲存組態的遠端伺服器主機名稱。

它會取代透過 XML 檔案指定的組態中 remote-server 標籤的 host 屬性(請參閱 cache-config-file 選項)。如果指定此選項,則也需要 cache-remote-usernamecache-remote-password,並且 XML 檔案中不應存在相關組態。

CLI: --cache-remote-host
Env: KC_CACHE_REMOTE_HOST

cache-remote-password

用於驗證遠端儲存的遠端伺服器的密碼。

它會取代透過 XML 檔案指定的組態中 digest 標籤的 password 屬性(請參閱 cache-config-file 選項)。如果指定此選項,則也需要 cache-remote-username,並且 XML 檔案中不應存在相關組態。

CLI: --cache-remote-password
Env: KC_CACHE_REMOTE_PASSWORD

僅在設定遠端主機時可用

cache-remote-port

遠端儲存組態中遠端伺服器的連接埠。

它會取代透過 XML 檔案指定的組態中 remote-server 標籤的 port 屬性(請參閱 cache-config-file 選項)。

CLI: --cache-remote-port
Env: KC_CACHE_REMOTE_PORT

僅在設定遠端主機時可用

11222 (預設值)

cache-remote-tls-enabled

啟用 TLS 支援以與安全的遠端 Infinispan 伺服器通訊。

建議在生產環境中啟用。

CLI: --cache-remote-tls-enabled
Env: KC_CACHE_REMOTE_TLS_ENABLED

僅在設定遠端主機時可用

true (預設值), false

cache-remote-username

用於遠端儲存的遠端伺服器驗證的使用者名稱。

它會取代透過 XML 檔案指定的組態中 digest 標籤的 username 屬性(請參閱 cache-config-file 選項)。如果指定了此選項,則也必須指定 cache-remote-password,並且 XML 檔案中不應存在相關組態。

CLI: --cache-remote-username
Env: KC_CACHE_REMOTE_USERNAME

僅在設定遠端主機時可用

本頁內容