3.14. 使用 Data Grid Operator 部署用于 HA 的 Data Grid
在 OpenShift 上的多可用区部署 Data Grid 以实现高可用性。
本章论述了在多集群环境(跨站点)中部署 Data Grid 所需的步骤。为了简单起见,本主题使用最小的配置,允许红帽构建 Keycloak 与外部 Data Grid 一起使用。
本章假定两个 OpenShift 集群名为 Site-A 和 Site-B。
这是一个构建块,它遵循 多集群部署 一章中介绍的概念。如需了解概述,请参阅 多集群部署 章节。
对于外部 Data Grid 部署,只支持 Data Grid 版本 8.5.3 或最新的补丁版本。
3.14.1. 架构 复制链接链接已复制到粘贴板!
此设置会在具有低延迟网络连接的两个站点中部署两个同步复制 Data Grid 集群。例如,在这种情况下,可能是一个 AWS 区域的两个可用区。
为了简单起见,红帽构建的 Keycloak, loadbalancer 和 database 已从下图中删除。
3.14.2. 先决条件 复制链接链接已复制到粘贴板!
- 正在运行的 OpenShift 集群
- 了解 Data Grid Operator
3.14.3. 流程 复制链接链接已复制到粘贴板!
- 安装 Data Grid Operator
配置用于访问 Data Grid 集群的凭证。
红帽构建的 Keycloak 需要此凭证才能与 Data Grid 集群进行身份验证。以下
identity.yaml文件使用 admin 权限设置用户名和密码credentials: - username: developer password: strong-password roles: - admincredentials: - username: developer password: strong-password roles: - adminCopy to Clipboard Copied! Toggle word wrap Toggle overflow identity.yaml可以在 secret 中设置为以下之一:作为 OpenShift 资源:
凭证 Secret
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 前面示例 base64 编码中的 identity
.yaml。
使用 CLI
oc create secret generic connect-secret --from-file=identities.yaml
oc create secret generic connect-secret --from-file=identities.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 如需了解更多详细信息,请参阅配置身份验证文档。https://docs.redhat.com/en/documentation/red_hat_data_grid/8.5/html-single/data_grid_operator_guide/index#configuring-authentication
这两个 OpenShift 集群上都必须执行这些命令。
创建一个服务帐户。
在集群间建立连接需要服务帐户。Data Grid Operator 用来检查远程站点的网络配置,并相应地配置本地 Data Grid 集群。
如需了解更多详细信息,请参阅管理跨站点连接 文档。
按照如下所示,创建一个
service-account-token机密类型:同一 YAML 文件可用于两个 OpenShift 集群。xsite-sa-secret-token.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建服务帐户,并在两个 OpenShift 集群中生成访问令牌。
在
Site-A中创建服务帐户oc create sa -n keycloak xsite-sa oc policy add-role-to-user view -n keycloak -z xsite-sa oc create -f xsite-sa-secret-token.yaml oc get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-A-token.txtoc create sa -n keycloak xsite-sa oc policy add-role-to-user view -n keycloak -z xsite-sa oc create -f xsite-sa-secret-token.yaml oc get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-A-token.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在
Site-B中创建服务帐户oc create sa -n keycloak xsite-sa oc policy add-role-to-user view -n keycloak -z xsite-sa oc create -f xsite-sa-secret-token.yaml oc get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-B-token.txtoc create sa -n keycloak xsite-sa oc policy add-role-to-user view -n keycloak -z xsite-sa oc create -f xsite-sa-secret-token.yaml oc get secrets ispn-xsite-sa-token -o jsonpath="{.data.token}" | base64 -d > Site-B-token.txtCopy to Clipboard Copied! Toggle word wrap Toggle overflow 下一步是将来自
Site-A的令牌部署到Site-B,反向部署:将
Site-B令牌部署到Site-Aoc create secret generic -n keycloak xsite-token-secret \ --from-literal=token="$(cat Site-B-token.txt)"
oc create secret generic -n keycloak xsite-token-secret \ --from-literal=token="$(cat Site-B-token.txt)"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
Site-A令牌部署到Site-Boc create secret generic -n keycloak xsite-token-secret \ --from-literal=token="$(cat Site-A-token.txt)"
oc create secret generic -n keycloak xsite-token-secret \ --from-literal=token="$(cat Site-A-token.txt)"Copy to Clipboard Copied! Toggle word wrap Toggle overflow
创建 TLS secret
在本章中,Data Grid 使用 OpenShift 路由进行跨站点通信。它使用 TLS 的 SNI 扩展将流量定向到正确的 Pod。为达到此目的,JGroups 使用 TLS 套接字,这需要一个含有正确证书的 Keystore 和 Truststore。
如需更多信息,请参阅安全 跨站点连接 文档或本 红帽开发人员指南。
上传 OpenShift Secret 中的 Keystore 和 Truststore。secret 包含文件内容、访问它的密码以及存储的类型。创建证书和存储的说明超出了本章的讨论范围。
要将 Keystore 作为 Secret 上传,请使用以下命令:
部署密钥存储
oc -n keycloak create secret generic xsite-keystore-secret \ --from-file=keystore.p12="./certs/keystore.p12" \ --from-literal=password=secret \ --from-literal=type=pkcs12
oc -n keycloak create secret generic xsite-keystore-secret \ --from-file=keystore.p12="./certs/keystore.p12" \1 --from-literal=password=secret \2 --from-literal=type=pkcs123 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要将 Truststore 上传为 Secret,请使用以下命令:
部署 Truststore
oc -n keycloak create secret generic xsite-truststore-secret \ --from-file=truststore.p12="./certs/truststore.p12" \ --from-literal=password=caSecret \ --from-literal=type=pkcs12oc -n keycloak create secret generic xsite-truststore-secret \ --from-file=truststore.p12="./certs/truststore.p12" \1 --from-literal=password=caSecret \2 --from-literal=type=pkcs123 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意keystore 和 Truststore 必须在两个 OpenShift 集群中上传。
为启用了跨站点的 Data Grid 创建一个集群
设置跨站点 文档提供了关于如何在启用了跨站点的情况下创建和配置 Data Grid 集群的所有信息,包括前面的步骤。
本章提供了一个基本示例,它使用前面步骤中命令创建的凭据、令牌和 TLS Keystore/Truststore。
Site-A的InfinispanCRCopy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 集群名称
- 2
- 允许 Prometheus 监控集群。
- 3
- 如果使用自定义凭证,请在此处配置 secret 名称。
- 4
- 本地站点的名称,本例中为
Site-A。 - 5
- 使用 OpenShift Route 公开跨站点连接。
- 6 9
- 上一步中定义的 Keystore 所在的 secret 名称。
- 7 10
- Keystore 中证书的别名。
- 8 11
- 上一步中定义的密钥存储的机密密钥(filename)。
- 12
- Truststore 存在于上一步中定义的 secret 名称。
- 13
- 上一步中定义的密钥存储的 Truststore 密钥(filename)。
- 14
- 远程站点的名称,本例中为
Site-B。您可以在红帽构建的 Keycloak 选项cache-remote-backup-sites中使用这个值来创建自动缓存。 - 15
- 来自远程站点的 Data Grid 集群的命名空间。
- 16
- 远程站点的 OpenShift API URL。
- 17
- 带有访问令牌的 secret,以向远程站点进行身份验证。
对于
Site-B,InfinispanCR 类似于上述内容。请注意点 4、11 和 13 的不同。Site-B的InfinispanCRCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为红帽构建的 Keycloak 创建缓存。
如果不存在,Red Hat build of Keycloak 会自动在第一次启动时创建所需的缓存。
重要它要求红帽构建的 Keycloak 部署到两个集群中,因为红帽构建的 Keycloak 不会启动,直到两个集群中都存在所有缓存。
要
缓存CR 是在 OpenShift 中继续进行的建议方法。为了生效,必须在任何红帽构建的 Keycloak Pod 启动前部署CacheCR。以下示例显示了
Site-A的CacheCR。在
Site-A中,为上述每个缓存创建一个缓存 CR,其内容如下:cache
actionTokensCopy to Clipboard Copied! Toggle word wrap Toggle overflow Cache
authenticationSessionsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 缓存
loginFailuresCopy to Clipboard Copied! Toggle word wrap Toggle overflow 缓存
工作Copy to Clipboard Copied! Toggle word wrap Toggle overflow
上面的例子是建议配置来实现最佳数据一致性。
背景信息
当两个站点同时修改条目时,主动设置中可能会出现死锁。
transaction.mode: NON_DURABLE_XA确保在发生这种情况时事务被回滚一致。本例中需要设置backup.failurePolicy: FAIL。它将抛出一个错误,允许安全回滚事务。当发生这种情况时,红帽构建的 Keycloak 将尝试重试。transaction.locking: PESSIMISTIC是唯一支持的锁定模式;由于网络成本,不建议使用OPTIMISTIC。相同的设置也会阻止在一个站点更新,而其他站点无法访问。backup.strategy: SYNC确保数据在完成红帽构建的 Keycloak 请求时可见并存储在其他站点。注意在死锁场景中,可以将
locking.acquireTimeout减少为快速失败。backup.timeout必须始终高于locking.acquireTimeout。对于
Site-B,缓存CR 非常相似,但 backup.<name> 在上图的第 3 点概述。Site-B中的actionTokens缓存示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow == 验证部署
确认 Data Grid 集群已形成,且跨站点连接已在 OpenShift 集群之间建立。
等待 Data Grid 集群被形成
oc wait --for condition=WellFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
oc wait --for condition=WellFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
等待 Data Grid 跨站点连接建立
oc wait --for condition=CrossSiteViewFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
oc wait --for condition=CrossSiteViewFormed --timeout=300s infinispans.infinispan.org -n keycloak infinispan
3.14.4. 使用红帽构建的 Keycloak 连接 Data Grid 复制链接链接已复制到粘贴板!
现在,Data Grid 服务器正在运行,以下是需要与红帽构建的 Keycloak CR 更改相关的红帽构建,以将其连接到红帽构建的 Keycloak。在使用 Operator 部署 Red Hat build of HA 中, 需要这些更改。
使用用户名和密码创建一个 Secret,以连接到外部 Data Grid 部署:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
additionalOptions扩展 Red Hat build of Keycloak 自定义资源,如下所示。注意所有内存、资源和数据库配置都会从 CR 跳过,因为 使用 Operator 部署红帽构建的 Keycloak for HA 所述。管理员应使这些配置保持不变。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要使用
cache-remote-backup-sites选项仅在本地站点中创建缓存。您还必须在其他集群中部署KeycloakCR,才能创建缓存,否则红帽构建的 Keycloak 无法启动,直到它们存在为止。
3.14.4.1. 架构 复制链接链接已复制到粘贴板!
这使用 TLS 1.3 保护的 TCP 连接将 Keycloak 的红帽构建连接到 Data Grid。它使用红帽构建的 Keycloak 的信任存储来验证 Data Grid 的服务器证书。因为红帽构建的 Keycloak 是使用 OpenShift 在下面列出的先决条件中的 Operator 部署,Operator 已将 service-ca.crt 添加到用于为 Data Grid 的服务器证书签名的信任存储中。在其他环境中,将所需的证书添加到红帽构建的 Keycloak 的信任存储中。
3.14.5. 后续步骤 复制链接链接已复制到粘贴板!
在部署并运行 AWS Aurora 数据库和 Data Grid 后,请使用 使用 Operator 部署红帽构建的 Keycloak for HA 中的步骤来部署红帽构建的 Keycloak,并将其连接到之前创建的构建块。
3.14.6. 相关选项 复制链接链接已复制到粘贴板!
| value | |
|---|---|
|
CLI: 仅在设置远程主机时可用 | |
|
CLI: | |
|
CLI: 仅在设置远程主机时可用 | |
|
CLI: 仅在设置远程主机时可用 | (默认) |
|
CLI: 仅在设置远程主机时可用 |
|
|
CLI: 仅在设置远程主机时可用 |