此設定在兩個站點中部署兩個同步複寫的 Infinispan 叢集,並具有低延遲網路連線。此情境的一個範例可能是 AWS 區域中的兩個可用性區域。
為了簡單起見,已從以下圖表中移除 Keycloak、負載平衡器和資料庫。
正在執行的 OpenShift 或 Kubernetes 叢集
設定用於存取 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 叢集上執行。
建立服務帳戶。
需要服務帳戶才能在叢集之間建立連線。Infinispan Operator 使用它來檢查遠端站點的網路設定,並相應地設定本機 Infinispan 叢集。
如需更多詳細資訊,請參閱 管理跨站點連線 文件。
建立 service-account-token
密碼類型,如下所示。相同的 YAML 檔案可用於兩個 OpenShift 叢集。
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 | 服務帳戶名稱。 |
在兩個 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
下一步是將來自 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)"
建立 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 叢集中上傳。 |
為啟用了跨站點的 Infinispan 建立叢集
設定跨站點 文件提供了有關如何建立和設定已啟用跨站點的 Infinispan 叢集的所有資訊,包括先前的步驟。
本指南提供了一個基本範例,使用先前步驟中命令建立的憑證、權杖和 TLS 金鑰儲存庫/信任儲存庫。
Site-A
的 Infinispan
CRapiVersion: 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-B
,Infinispan
CR 看起來與上述類似。請注意第 4、11 和 13 點中的差異。
Site-B
的 Infinispan
CRapiVersion: 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)
為 Keycloak 建立快取。
Keycloak 需要存在以下快取:actionTokens
、authenticationSessions
、loginFailures
和 work
。
Infinispan 快取 CR 允許在 Infinispan 叢集中部署快取。根據 跨站點文件 的說明,每個快取都需要啟用跨站點。該文件包含有關本指南所使用選項的更多詳細資訊。以下範例顯示 Site-A
的 Cache
CR。
在 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-B
,Cache
CR 類似,除了上述圖表中第 3 點概述的 backups.<name>
之外。
Site-B
中的 authenticationSessions Cache
CRapiVersion: 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 叢集之間已建立跨站點連線。
kubectl wait --for condition=WellFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
kubectl wait --for condition=CrossSiteViewFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
現在 Infinispan 伺服器正在執行,以下是將其連接到 Keycloak 所需的相關 Keycloak CR 變更。這些變更將在 使用 Keycloak Operator 部署高可用性 Keycloak 指南中需要。
建立一個密碼,其中包含使用者名稱和密碼,以連線到外部 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'
使用如下所示的 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 | 密碼 name 和 key ,其中包含 Infinispan 使用者名稱憑證。 |
4 | 密碼 name 和 key ,其中包含 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,並將其連接到所有先前建立的建構模組。
值 | |
---|---|
|
|
僅在設定遠端主機時可用 |
|
僅在設定遠端主機時可用 |
(預設值) |
僅在設定遠端主機時可用 |
|
僅在設定遠端主機時可用 |