6.3. 流程
- 安装 Data Grid Operator
配置凭据以访问 Data Grid 集群。
红帽构建的 Keycloak 需要此凭证才能与 Data Grid 集群进行身份验证。以下
identity.yaml
文件使用 admin 权限设置用户名和密码credentials: - username: developer password: strong-password roles: - admin
identity.yaml
可以在 secret 中设置为以下之一:作为 Kubernetes 资源:
凭证 Secret
apiVersion: v1 kind: Secret type: Opaque metadata: name: connect-secret namespace: keycloak data: identities.yaml: Y3JlZGVudGlhbHM6CiAgLSB1c2VybmFtZTogZGV2ZWxvcGVyCiAgICBwYXNzd29yZDogc3Ryb25nLXBhc3N3b3JkCiAgICByb2xlczoKICAgICAgLSBhZG1pbgo= 1
- 1
- 上例 base64 编码的 identity
.yaml
。
使用 CLI
oc create secret generic connect-secret --from-file=identities.yaml
如需了解更多详细信息,请参阅配置身份验证文档。https://docs.redhat.com/en/documentation/red_hat_data_grid/8.4/html-single/data_grid_operator_guide/index#configuring-authentication
这些命令必须在两个 OpenShift 集群上执行。
创建一个服务帐户。
在集群间建立连接需要服务帐户。Data Grid Operator 使用它来从远程站点检查网络配置,并相应地配置本地 Data Grid 集群。
如需了解更多详细信息,请参阅管理跨站点连接 文档。
按照如下所示,创建
service-account-token
secret 类型:两个 OpenShift 集群中都可以使用相同的 YAML 文件。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
创建服务帐户并在两个 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.txt
在
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.txt
下一步是将令牌从
Site-A
部署到Site-B
,反向部署:将
Site-B
令牌部署到Site-A
oc create secret generic -n keycloak xsite-token-secret \ --from-literal=token="$(cat Site-B-token.txt)"
将
Site-A
令牌部署到Site-B
oc create secret generic -n keycloak xsite-token-secret \ --from-literal=token="$(cat Site-A-token.txt)"
创建 TLS secret
在本章中,Data Grid 使用 OpenShift 路由进行跨站点通信。它使用 TLS 的 SNI 扩展将流量定向到正确的 Pod。为实现这一目标,JGroups 使用 TLS 套接字,这需要一个含有正确证书的密钥存储和 Truststore。
如需更多信息,请参阅安全 跨站点连接 文档或本 红帽开发人员指南。
在 OpenShift Secret 中上传 Keystore 和 Truststore。secret 包含文件内容、访问它的密码,以及存储的类型。创建证书和存储的说明超出了本指南的范围。
要将密钥存储上传为 Secret,请使用以下命令:
部署密钥存储
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=pkcs12 3
要将 Truststore 作为一个 Secret 上传,请使用以下命令:
部署 Truststore
oc -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
注意密钥存储和 Truststore 必须在两个 OpenShift 集群中上传。
为启用了 Cross-Site 的 Data Grid 创建集群
设置跨站点 文档提供了关于如何在启用了跨站点的情况下创建和配置 Data Grid 集群的所有信息,包括前面的步骤。
本章中提供了一个基本示例,它使用从前面的步骤中创建的凭证、令牌和 TLS Keystore/Truststore。
Site-A
的Infinispan
CRapiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan 1 namespace: keycloak annotations: infinispan.org/monitoring: 'true' 2 spec: replicas: 3 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 9 alias: xsite 10 filename: keystore.p12 11 trustStore: secretName: xsite-truststore-secret 12 filename: truststore.p12 13 locations: - name: site-b 14 clusterName: infinispan namespace: keycloak 15 url: openshift://api.site-b 16 secretName: xsite-token-secret 17
- 1
- 集群名称
- 2
- 允许 Prometheus 监控集群。
- 3
- 如果使用自定义凭证,请在此处配置 secret 名称。
- 4
- 本地站点的名称,本例中为
Site-A
。 - 5
- 使用 OpenShift 路由公开跨站点连接。
- 6 9
- 上一步中定义的 Keystore 的 secret 名称。
- 7 10
- Keystore 中证书的别名。
- 8 11
- 上一步中定义的 Keystore 的 secret 密钥(filename)。
- 12
- 上一步中定义的 Truststore 的 secret 名称。
- 13
- 上一步中定义的 Keystore 的 Truststore 密钥(filename)。
- 14
- 远程站点的名称,本例中为
Site-B
。 - 15
- 远程站点的 Data Grid 集群的命名空间。
- 16
- 远程站点的 OpenShift API URL。
- 17
- 有权在远程站点进行身份验证的 secret。
对于
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 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 9 alias: xsite 10 filename: keystore.p12 11 trustStore: secretName: xsite-truststore-secret 12 filename: truststore.p12 13 locations: - name: site-a 14 clusterName: infinispan namespace: keycloak 15 url: openshift://api.site-a 16 secretName: xsite-token-secret 17
为红帽构建的 Keycloak 创建缓存。
红帽构建的 Keycloak 需要存在以下缓存:
会话
,actionTokens
,authenticationSessions
,offlineSessions
,clientSessions
,offlineClientSessions
,loginFailures
, 和work
。Data Grid Cache CR 允许在 Data Grid 集群中部署缓存。需要为每个缓存启用跨站点文档,如 跨站点文档 所述。文档包含有关本章使用的选项的更多详细信息。以下示例显示了
Site-A
的Cache
CR。Site-A
中的会话apiVersion: infinispan.org/v2alpha1 kind: Cache metadata: name: sessions namespace: keycloak spec: clusterName: infinispan name: sessions template: |- distributedCache: mode: "SYNC" owners: "2" statistics: "true" remoteTimeout: 14000 stateTransfer: chunkSize: 16 backups: mergePolicy: ALWAYS_REMOVE 1 site-b: 2 backup: strategy: "SYNC" 3 timeout: 13000 stateTransfer: chunkSize: 16
对于
Site-B
,缓存
CR 类似于第 2 点。Site-B
中的会话apiVersion: infinispan.org/v2alpha1 kind: Cache metadata: name: sessions namespace: keycloak spec: clusterName: infinispan name: sessions template: |- distributedCache: mode: "SYNC" owners: "2" statistics: "true" remoteTimeout: 14000 stateTransfer: chunkSize: 16 backups: mergePolicy: ALWAYS_REMOVE 1 site-a: 2 backup: strategy: "SYNC" 3 timeout: 13000 stateTransfer: chunkSize: 16