Data Grid Operator 指南
在 OpenShift 上创建 Data Grid 集群
摘要
Red Hat Data Grid
数据网格是一个高性能、分布式内存数据存储。
- 无架构数据结构
- 灵活性将不同的对象存储为键值对。
- 基于网格的数据存储
- 设计为在集群间分发和复制数据。
- 弹性扩展
- 动态调整节点数,以在不中断服务的情况下满足需求。
- 数据互操作性
- 在来自不同端点的网格中存储、检索和查询数据。
data Grid 文档
有关 Data Grid 的文档可以通过红帽客户门户网站获得。
数据网格下载
访问 Data Grid Software Downloads on the Red Hat Customer Portal(Red Hat Customer Portal)。
您必须有一个红帽帐户才能访问和下载数据网格软件。
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始: master、slave、blacklist 和 whitelist。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
对红帽文档提供反馈
我们非常感谢您对我们的技术内容提供反馈,并鼓励您告诉我们您的想法。如果您想添加评论,提供见解、纠正拼写错误甚至询问问题,您可以在文档中直接这样做。
您必须有一个红帽帐户并登录到客户门户网站。
要从客户门户网站提交文档反馈,请执行以下操作:
- 选择 Multi-page HTML 格式。
- 点文档右上角的 反馈 按钮。
- 突出显示您要提供反馈的文本部分。
- 点高亮文本旁的添加反馈对话框。
- 在页面右侧的文本框中输入您的反馈,然后单击 Submit。
每次提交反馈时,我们都会自动创建跟踪问题。打开在点 Submit 后显示的链接,并开始监视问题或添加更多注释。
感谢您的宝贵反馈。
第 1 章 data Grid Operator
Data Grid Operator 提供了操作智能,并降低了在 Kubernetes 和 Red Hat OpenShift 上部署 Data Grid 的管理复杂性。
1.1. data Grid Operator 部署
安装 Data Grid Operator 时,它会将 Kubernetes API 与自定义资源定义(CRD)扩展,以便在 Red Hat OpenShift 中部署和管理 Data Grid 集群。
要与 Data Grid Operator 交互,OpenShift 用户通过 OpenShift Web 控制台或 oc
客户端应用自定义资源(CR)。Data Grid Operator 侦听 Infinispan
CR,并自动置备原生资源,如 StatefulSets 和 Secret,您的 Data Grid 部署需要。Data Grid Operator 还根据 Infinispan
CR 中的规格配置 Data Grid 服务,包括集群的 pod 数量和用于跨站点复制的备份位置。
图 1.1. 自定义资源

1.2. 集群管理
单个 Data Grid Operator 安装可以在单独的命名空间中管理多个 Data Grid 集群。每次用户应用 CR 来修改部署时,Data Grid Operator 会将更改应用到所有 Data Grid 集群。
图 1.2. Operator 受管集群

1.3. 资源协调
Data Grid Operator 将自定义资源(如 Cache
CR)与 Data Grid 集群中的资源协调。
双向协调将 CR 与通过 Data Grid 控制台、命令行界面(CLI)或其他客户端应用程序对 Data Grid 资源做出的更改同步,反之亦然。例如,如果您通过 Data Grid Console 创建缓存,则 Data Grid Operator 添加了一个声明的 Kubernetes 表示。
要执行协调数据网格 Operator,为每个 Data Grid 集群创建一个 监听器
pod,它检测到 Infinispan
资源的修改。
关于协调备注
-
当您通过 Data Grid Console、CLI 或其他客户端应用程序创建缓存时,Data Grid Operator 会创建一个对应的
Cache
CR,其名称符合 Kubernetes 命名策略。 -
Data Grid Operator 所创建的 Data Grid 资源声明 Kubernetes 表示与
监听程序
pod 链接。
删除Infinispan
CR 会删除任何关联的资源声明。
第 2 章 将原生 Data Grid CLI 安装为客户端插件
Data Grid 提供了一个编译到原生可执行文件的命令行界面(CLI),您可以作为 oc
客户端的插件进行安装。然后,您可以使用 oc
客户端:
- 创建 Data Grid Operator 订阅并删除 Data Grid Operator 安装。
- 设置数据网格集群和配置服务。
- 通过远程 shell 使用 Data Grid 资源。
2.1. 安装原生 Data Grid CLI 插件
将原生 Data Grid 命令行界面(CLI)安装为 oc
客户端的插件。
先决条件
-
有
oc
客户端。 - 从 Data Grid 软件下载原生 Data Grid CLI 发行版本。
流程
-
为原生 Data Grid CLI 发行版提取
.zip
归档。 将原生可执行文件或创建硬链接复制到名为"kubectl-infinispan"的文件中,例如:
cp redhat-datagrid-cli kubectl-infinispan
-
将
kubectl-infinispan
添加到PATH
中。 验证是否安装了 CLI。
oc plugin list The following compatible plugins are available: /path/to/kubectl-infinispan
使用
infinispan --help
命令查看可用的命令。oc infinispan --help
其他资源
2.2. kubectl-infinispan 命令引用
本节提供有关客户端 kubectl-infinispan
插件的一些详情。
使用 --help
参数查看每个命令的可用选项和描述的完整列表。
例如,oc infinispan create cluster --help
打印用于创建 Data Grid 集群的所有命令选项。
命令 | 描述 |
| 创建 Data Grid Operator 订阅并默认安装到全局命名空间中。 |
| 创建 Data Grid 集群。 |
| 显示正在运行的 Data Grid 集群。 |
| 在 Data Grid 集群中启动交互式远程 shell 会话。 |
| 删除 Data Grid 集群。 |
| 删除 Data Grid Operator 安装和所有受管资源。 |
第 3 章 安装 Data Grid Operator
将 Data Grid Operator 安装到 OpenShift 命名空间中,以创建和管理 Data Grid 集群。
3.1. Installing Data Grid Operator on Red Hat OpenShift
在 OpenShift 上创建 Data Grid Operator 订阅,以便您可以安装不同的 Data Grid 版本并接收自动更新。
自动更新首先应用到 Data Grid Operator,然后为每个 Data Grid 节点应用。Data Grid Operator 会一次更新一个节点,并安全地关闭每个节点,然后在进入下一个节点前将其重新使用更新版本在线。
先决条件
- 访问在 OpenShift 上运行的 OperatorHub。一些 OpenShift 环境(如 OpenShift Container Platform)可能需要管理员凭证。
- 如果计划将其安装到特定命名空间中,则有一个适用于 Data Grid Operator 的 OpenShift 项目。
流程
- 登录 OpenShift Web 控制台。
- 进入 OperatorHub。
- 查找并选择 Data Grid Operator。
- 选择 Install 并继续 Create Operator Subscription。
指定订阅的选项。
- 安装模式
- 您可以将 Data Grid Operator 安装到 特定命名空间 或所有 命名空间中。
- 更新频道
- 获取 Data Grid Operator 8.3.x 的更新。
- 批准策略
- 从 8.3.x 频道自动安装更新,或需要在安装后进行批准。
- 选择 Subscribe 以安装 Data Grid Operator。
- 导航到 Installed Operators 以验证 Data Grid Operator 安装。
3.2. 使用原生 CLI 插件安装 Data Grid Operator
使用原生 Data Grid CLI 插件安装 Data Grid Operator,kubectl-infinispan
。
先决条件
-
在您的
PATH
中有kubectl-infinispan
。
流程
运行
oc infinispan install
命令以创建 Data Grid Operator 订阅,例如:oc infinispan install --channel=8.3.x --source=redhat-operators --source-namespace=openshift-marketplace
验证安装。
oc get pods -n openshift-operators | grep infinispan-operator NAME READY STATUS infinispan-operator-<id> 1/1 Running
使用 oc infinispan install --help
用于命令选项和描述。
3.3. 使用 OpenShift 客户端安装 Data Grid Operator
您可以使用 oc
客户端创建 Data Grid Operator 订阅作为通过 OperatorHub 安装或原生 Data Grid CLI 的替代选择。
先决条件
-
有
oc
客户端。
流程
设置项目。
创建
OperatorGroup
资源。控制所有 Data Grid 集群
oc apply -f - << EOF apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: datagrid namespace: ${INSTALL_NAMESPACE} EOF
控制特定的数据网格集群
oc apply -f - << EOF apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: datagrid namespace: ${INSTALL_NAMESPACE} spec: targetNamespaces: - ${WATCH_NAMESPACE} EOF
为 Data Grid Operator 创建订阅。
oc apply -f - << EOF apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: datagrid-operator namespace: ${INSTALL_NAMESPACE} spec: channel: 8.3.x installPlanApproval: Automatic name: datagrid source: redhat-operators sourceNamespace: openshift-marketplace EOF
注意如果要手动从 8.3.x 频道批准更新,请将
spec.installPlanApproval
字段的值改为Manual
。验证安装。
oc get pods -n ${INSTALL_NAMESPACE} NAME READY STATUS infinispan-operator-<id> 1/1 Running
第 4 章 创建 Data Grid 集群
创建在使用 Infinispan
CR 或 oc
客户端的原生 Data Grid CLI 插件的 OpenShift 上运行的 Data Grid 集群。
4.1. Infinispan 自定义资源(CR)
Data Grid Operator 添加了一个类型为 Infinispan
的新自定义资源(CR),可让您将 Data Grid 集群作为 OpenShift 中的复杂单元处理。
Data Grid Operator 侦听您用于实例化和配置 Data Grid 集群和管理 OpenShift 资源(如 StatefulSet 和 Services)的 Infinispan
自定义资源(CR)。
Infinispan
CR
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 service: type: DataGrid
字段 | 描述 |
---|---|
|
声明 |
|
声明 |
| 指定 Data Grid 集群的名称。 |
| 指定 Data Grid 集群中的 pod 数量。 |
| 指定要创建的 Data Grid 服务类型。 |
4.2. 创建 Data Grid 集群
使用原生 CLI 插件创建 Data Grid 集群,kubectl-infinispan
。
先决条件
- 安装 Data Grid Operator。
-
在您的
PATH
中有kubectl-infinispan
。
流程
运行
infinispan create cluster
命令。例如,创建一个带有两个 pod 的 Data Grid 集群,如下所示:
oc infinispan create cluster --replicas=3 -Pservice.type=DataGrid infinispan
watch Data Grid Operator 创建 Data Grid pod。
oc get pods -w
后续步骤
创建 Data Grid 集群后,使用 oc
对 Infinispan
CR 应用更改并配置您的 Data Grid 服务。
您还可以使用 kubectl-infinispan
删除 Data Grid 集群,并根据需要重新创建它们。
oc infinispan delete cluster infinispan
4.3. 验证 Data Grid 集群视图
确认 Data Grid pod 已成功组成集群。
先决条件
- 至少创建一个 Data Grid 集群。
流程
检索 Data Grid Operator 的
Infinispan
CR。oc get infinispan -o yaml
响应表示 Data Grid pod 已接收集群视图,如下例所示:
conditions: - message: 'View: [infinispan-0, infinispan-1]' status: "True" type: wellFormed
对于自动化脚本执行以下操作:
oc wait --for condition=wellFormed --timeout=240s infinispan/infinispan
从日志中检索集群视图
您还可以从 Data Grid 日志获取 cluster 视图,如下所示:
oc logs infinispan-0 | grep ISPN000094
INFO [org.infinispan.CLUSTER] (MSC service thread 1-2) \ ISPN000094: Received new cluster view for channel infinispan: \ [infinispan-0|0] (1) [infinispan-0] INFO [org.infinispan.CLUSTER] (jgroups-3,infinispan-0) \ ISPN000094: Received new cluster view for channel infinispan: \ [infinispan-0|1] (2) [infinispan-0, infinispan-1]
4.4. 修改 Data Grid 集群
通过提供带有自定义 Infinispan
CR 的 Data Grid Operator 来配置 Data Grid 集群。
先决条件
- 安装 Data Grid Operator。
- 至少创建一个 Data Grid 集群。
-
有
oc
客户端。
流程
创建一个定义
Infinispan
CR 的 YAML 文件。例如,创建一个
my_infinispan.yaml
文件,该文件将 Data Grid pod 的数量更改为 2:cat > cr_minimal.yaml<<EOF apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 service: type: DataGrid EOF
应用您的
Infinispan
CR。oc apply -f my_infinispan.yaml
watch Data Grid Operator 扩展 Data Grid pod。
oc get pods -w
4.5. 停止并启动 Data Grid 集群
以安全的方式停止和启动 Data Grid pod,以正确保留集群状态。
Data Grid 服务 pod 集群必须在关闭前重启具有相同 pod 数量。这允许 Data Grid 恢复集群中的数据分布。在 Data Grid Operator 完全重启集群后,您可以安全地添加和删除 pod。
流程
将
spec.replicas
字段更改为0
以停止 Data Grid 集群。spec: replicas: 0
重启集群前,确保您有正确的 pod 数量。
oc get infinispan infinispan -o=jsonpath='{.status.replicasWantedAtRestart}'
将
spec.replicas
字段更改为同一数量的 pod,以重启 Data Grid 集群。spec: replicas: 6
第 5 章 配置 Data Grid 集群
将自定义 Data Grid 配置应用到 Data Grid Operator 管理的集群。
5.1. 将自定义配置应用到 Data Grid 集群
将 Data Grid 配置添加到 ConfigMap
,并使其可用于 Data Grid Operator。然后,Data Grid Operator 可将自定义配置应用到您的 Data Grid 集群。
Data Grid Operator 在自定义配置之上应用默认配置,以确保它能够继续管理您的 Data Grid 集群。
应用 cache-container
元素或字段以外的自定义配置时要小心。您可以将自定义配置应用到底层 Data Grid 服务器机制,如端点、安全域和集群传输。更改此配置可能会导致您的 Data Grid 部署造成错误,并导致服务停机。
使用 Data Grid Helm Chart 在 OpenShift 上部署完全可配置数据网格服务器实例的集群。
先决条件
- 具有 XML、YAML 或 JSON 格式的有效 Data Grid 配置。
流程
将 Data Grid 配置添加到
ConfigMap
的data
字段中的infinispan-config.[xml|yaml|json]
键。XML
apiVersion: v1 kind: ConfigMap metadata: name: cluster-config namespace: rhdg-namespace data: infinispan-config.xml: > <infinispan> <!-- Custom configuration goes here. --> </infinispan>
YAML
apiVersion: v1 kind: ConfigMap metadata: name: cluster-config namespace: rhdg-namespace data: infinispan-config.yaml: > infinispan: # Custom configuration goes here.
JSON
apiVersion: v1 kind: ConfigMap metadata: name: cluster-config namespace: rhdg-namespace data: infinispan-config.json: > { "infinispan": { } }
从 YAML 文件创建
ConfigMap
。oc apply -f cluster-config.yaml
使用
Infinispan
CR 中的spec.configMapName
字段指定ConfigMap
的名称,然后应用更改。spec: configMapName: "cluster-config"
后续步骤
如果集群已在运行 Data Grid Operator,重启它以应用配置。每次修改 ConfigMap
中的 Data Grid 配置时,Data Grid Operator 会检测更新并重启集群以应用更改。
其他资源
5.2. 自定义 Data Grid 配置
您可以将 Data Grid 配置添加到 XML、YAML 或 JSON 格式的 ConfigMap
中。
缓存模板
XML
<infinispan> <cache-container> <distributed-cache-configuration name="base-template"> <expiration lifespan="5000"/> </distributed-cache-configuration> <distributed-cache-configuration name="extended-template" configuration="base-template"> <encoding media-type="application/x-protostream"/> <expiration lifespan="10000" max-idle="1000"/> </distributed-cache-configuration> </cache-container> </infinispan>
YAML
infinispan: cacheContainer: caches: base-template: distributedCacheConfiguration: expiration: lifespan: "5000" extended-template: distributedCacheConfiguration: configuration: "base-template" encoding: mediaType: "application/x-protostream" expiration: lifespan: "10000" maxIdle: "1000"
JSON
{ "infinispan" : { "cache-container" : { "caches" : { "base-template" : { "distributed-cache-configuration" : { "expiration" : { "lifespan" : "5000" } } }, "extended-template" : { "distributed-cache-configuration" : { "configuration" : "base-template", "encoding": { "media-type": "application/x-protostream" }, "expiration" : { "lifespan" : "10000", "max-idle" : "1000" } } } } } } }
多个缓存
XML
<infinispan xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:13.0 https://infinispan.org/schemas/infinispan-config-13.0.xsd urn:infinispan:server:13.0 https://infinispan.org/schemas/infinispan-server-13.0.xsd" xmlns="urn:infinispan:config:13.0" xmlns:server="urn:infinispan:server:13.0"> <cache-container name="default" statistics="true"> <distributed-cache name="mycacheone" mode="ASYNC" statistics="true"> <encoding media-type="application/x-protostream"/> <expiration lifespan="300000"/> <memory max-size="400MB" when-full="REMOVE"/> </distributed-cache> <distributed-cache name="mycachetwo" mode="SYNC" statistics="true"> <encoding media-type="application/x-protostream"/> <expiration lifespan="300000"/> <memory max-size="400MB" when-full="REMOVE"/> </distributed-cache> </cache-container> </infinispan>
YAML
infinispan: cacheContainer: name: "default" statistics: "true" caches: mycacheone: distributedCache: mode: "ASYNC" statistics: "true" encoding: mediaType: "application/x-protostream" expiration: lifespan: "300000" memory: maxSize: "400MB" whenFull: "REMOVE" mycachetwo: distributedCache: mode: "SYNC" statistics: "true" encoding: mediaType: "application/x-protostream" expiration: lifespan: "300000" memory: maxSize: "400MB" whenFull: "REMOVE"
JSON
{ "infinispan" : { "cache-container" : { "name" : "default", "statistics" : "true", "caches" : { "mycacheone" : { "distributed-cache" : { "mode": "ASYNC", "statistics": "true", "encoding": { "media-type": "application/x-protostream" }, "expiration" : { "lifespan" : "300000" }, "memory": { "max-size": "400MB", "when-full": "REMOVE" } } }, "mycachetwo" : { "distributed-cache" : { "mode": "SYNC", "statistics": "true", "encoding": { "media-type": "application/x-protostream" }, "expiration" : { "lifespan" : "300000" }, "memory": { "max-size": "400MB", "when-full": "REMOVE" } } } } } } }
日志配置
您还可以以 XML 格式包括 Apache Log4j 配置作为 ConfigMap
的一部分。
使用 Infinispan
CR 中的 spec.logging.categories
字段来调整 Data Grid 集群的日志级别。只有在需要高级基于文件的日志记录功能时才添加 Apache Log4j 配置。
apiVersion: v1 kind: ConfigMap metadata: name: logging-config namespace: rhdg-namespace data: infinispan-config.xml: > <infinispan> <!-- Add custom Data Grid configuration if required. --> <!-- You can provide either Data Grid configuration, logging configuration, or both. --> </infinispan> log4j.xml: > <?xml version="1.0" encoding="UTF-8"?> <Configuration name="ServerConfig" monitorInterval="60" shutdownHook="disable"> <Appenders> <!-- Colored output on the console --> <Console name="STDOUT"> <PatternLayout pattern="%d{HH:mm:ss,SSS} %-5p (%t) [%c] %m%throwable%n"/> </Console> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="STDOUT" level="TRACE"/> </Root> <Logger name="org.infinispan" level="TRACE"/> </Loggers> </Configuration>
第 6 章 升级 Data Grid 集群
当有新版本可用时,Data Grid Operator 会处理 Data Grid 集群升级。
热进行滚动升级作为技术预览提供。
6.1. 技术预览功能
红帽产品服务级别协议(SLA)不支持技术预览功能,且可能无法完成。
红帽不推荐在生产环境中使用技术预览功能或功能。这些功能可让您早期访问将来的产品功能,这些功能可在开发过程中测试并提供反馈意见。
如需更多信息,请参阅红帽技术预览功能支持范围。
6.2. Data Grid 集群升级
spec.upgrades.type
字段控制在新版本可用时如何升级您的 Data Grid Operator。集群升级有两种类型:
shutdown
- 升级带有服务停机的数据网格集群。这是默认的升级类型。
HotRodRolling
- 在没有服务停机时间的情况下升级数据网格集群。
关闭升级
要执行关闭升级,Data Grid Operator 执行以下操作:
- 正常关闭现有集群。
- 删除现有集群。
- 使用目标版本创建新集群。
热升级
要执行 Hot Rod 滚动升级,Data Grid Operator 执行以下操作:
- 使用与现有集群一起运行的目标版本创建一个新的 Data Grid 集群。
- 创建远程缓存存储,将数据从现有集群转移到新集群。
- 将所有客户端重定向到新集群。
- 当所有数据和客户端连接都转移到新集群时,删除所有现有集群。
您不应该通过缓存执行 Hot Rod 滚动升级,从而支持使用持久缓存存储进行传递。如果升级没有成功完成,则 passivation 可能会导致数据丢失,当 Data Grid Operator 回滚目标集群时。
如果您的缓存配置启用传递,您应该执行关闭升级。
6.3. 使用停机升级 Data Grid 集群
升级具有停机时间的 Data Grid 集群会导致服务中断,但不需要任何额外的功能。
先决条件
如果需要,请配置持久的缓存存储来在升级过程中保留您的数据。
重要开始升级过程 Data Grid Operator 会关闭现有集群。如果您没有配置持久缓存存储,则会导致数据丢失。
流程
确保
Shutdown
设置为spec.upgrades.type
字段的值,这是默认值。spec: upgrades: type: Shutdown
- 如有必要,应用您的更改。
当它检测到新的 Data Grid 版本时,Data Grid Operator 会自动升级您的集群,或提示您在继续前手动批准升级。
6.4. 为 Data Grid 集群执行热升级
执行 Hot Rod 滚动升级可让您迁移到一个新的数据网格版本,而不造成服务中断。但是,这个升级类型需要额外的容量,并临时导致两个具有不同版本的同时运行的集群。
流程
将
HotRodRolling
指定为spec.upgrades.type
字段的值。spec: upgrades: type: HotRodRolling
- 应用您的更改。
当它检测到新的 Data Grid 版本时,Data Grid Operator 会自动升级您的集群,或提示您在继续前手动批准升级。
第 7 章 设置数据网格服务
使用 Data Grid Operator 创建 Cache 服务或 Data Grid 服务 pod 的集群。
7.1. 服务类型
服务是有状态的应用程序,基于 Data Grid Server 镜像,提供灵活、强大的内存数据存储。在创建 Data Grid
集群时,您可以使用 spec.service.type
字段指定 DataGrid 或 Cache
作为服务类型。
DataGrid
服务类型- 部署具有完整配置和功能的 Data Grid 集群。
缓存
服务类型- 使用最小配置部署 Data Grid 集群。
红帽建议为集群推荐 DataGrid
服务类型,因为它可让您:
- 使用跨站点复制在全局集群中备份数据。
- 使用任何有效的配置创建缓存。
- 添加基于文件的缓存存储,以在持久性卷中保存数据。
- 使用 Data Grid Query API 在缓存间查询值。
- 使用高级数据网格的特性和功能。
Cache
服务类型旨在提供一种便捷方式,使用最小配置创建低延迟数据存储。Infinispan
CRD 上的附加开发显示,Cache
CR 提供了实现此目标的一种更好方法,从而让用户更多选择,减少部署开销。因此,在下一个版本的 Infinispan
CRD 中计划将缓存服务类型删除,不再处于主动开发中。
DataGrid
服务类型将继续从新功能和改进工具中受益,以自动化复杂的操作,如集群升级和数据迁移。
7.2. 创建 Data Grid 服务 pod
要使用自定义缓存定义以及 Data Grid 功能(如跨站点复制),请创建 Data Grid 服务 pod 集群。
流程
创建一个
Infinispan
CR,设置spec.service.type: DataGrid
,并配置任何其他 Data Grid 服务资源。apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 service: type: DataGrid
重要在创建 pod 后,您无法更改
spec.service.type
字段。要更改服务类型,必须删除现有 pod 并创建新 pod。-
应用您的
Infinispan
CR 来创建集群。
7.2.1. data Grid service CR
本主题描述了 Data Grid 服务 pod 的 Infinispan
CR。
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan annotations: infinispan.org/monitoring: 'true' spec: replicas: 6 upgrades: type: Shutdown service: type: DataGrid container: storage: 2Gi # The ephemeralStorage and storageClassName fields are mutually exclusive. ephemeralStorage: false storageClassName: my-storage-class sites: local: name: azure expose: type: LoadBalancer locations: - name: azure url: openshift://api.azure.host:6443 secretName: azure-token - name: aws clusterName: infinispan namespace: rhdg-namespace url: openshift://api.aws.host:6443 secretName: aws-token security: endpointSecretName: endpoint-identities endpointEncryption: type: Secret certSecretName: tls-secret container: extraJvmOpts: "-XX:NativeMemoryTracking=summary" cpu: "2000m:1000m" memory: "2Gi:1Gi" logging: categories: org.infinispan: debug org.jgroups: debug org.jgroups.protocols.TCP: error org.jgroups.protocols.relay.RELAY2: error expose: type: LoadBalancer configMapName: "my-cluster-config" configListener: enabled: true affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: infinispan-pod clusterName: infinispan infinispan_cr: infinispan topologyKey: "kubernetes.io/hostname"
字段 | 描述 |
---|---|
| 为您的 Data Grid 集群命名。 |
|
为集群自动创建 |
| 指定集群中的 pod 数量。 |
| 控制当有新版本可用时,Data Grid Operator 如何升级您的 Data Grid 集群。 |
|
配置类型 Data Grid 服务。 |
| 为 Data Grid 服务 pod 配置存储资源。 |
| 配置跨站点复制。 |
| 指定包含 Data Grid 用户凭证的身份验证 secret。 |
| 指定 TLS 证书和密钥存储来加密客户端连接。 |
| 为 Data Grid pod 指定 JVM、CPU 和内存资源。 |
| 配置数据网格日志类别。 |
| 控制如何在网络上公开 Data Grid 端点。 |
|
指定包含 Data Grid 配置的 |
|
在每个 Data Grid 集群中创建一个
|
| 配置用于保证 Data Grid 可用性的反关联性策略。 |
7.3. 分配存储资源
您可以为 Data Grid 服务 pod 分配存储,但不能为缓存服务 pod。
默认情况下,Data Grid Operator 为持久性卷声明分配 1Gi
。但是,您应该调整 Data Grid 服务 pod 可用的存储量,以便 Data Grid 可在关闭过程中保留集群状态。
如果可用容器存储小于可用内存,则可能会发生数据丢失。
流程
-
使用
spec.service.container.storage
字段分配存储资源。 根据需要配置
ephemeralStorage
字段或storageClassName
字段。注意这些字段是互斥的。仅为您的
Infinispan
CR 添加其中之一。- 应用更改。
临时存储
spec: service: type: DataGrid container: storage: 2Gi ephemeralStorage: true
StorageClass
对象的名称
spec: service: type: DataGrid container: storage: 2Gi storageClassName: my-storage-class
字段 | 描述 |
---|---|
| 指定 Data Grid 服务 pod 的存储量。 |
|
定义存储是临时还是永久的。将值设为 |
|
指定用于持久性卷声明(PVC)的 |
7.3.1. 持久性卷声明 (PVC)
Data Grid Operator 创建一个持久性卷声明(PVC),并将容器存储挂载到:
/opt/infinispan/server/data
缓存
在创建缓存时,Data Grid 会在集群重启后永久存储其配置,以便缓存可用。这适用于 Cache 服务和 Data Grid 服务 pod。
data
在缓存服务 pod 的集群中,数据一直是易失性。关闭集群时,会永久丢失数据。
如果您希望 Data Grid 服务 pod 在集群关闭过程中保留数据,使用基于文件的 缓存存储,方法是将 <file-store
/> 元素添加到 Data Grid 缓存配置中。
7.4. 分配 CPU 和内存
使用 Infinispan
CR 为 Data Grid pod 分配 CPU 和内存资源。
在创建 Data Grid pod 时,Data Grid Operator 从 OpenShift 调度程序请求 1Gi 内存。默认情况下不绑定 CPU 请求。
流程
-
使用
spec.container.cpu
字段分配 CPU 单元数。 使用
spec.container.memory
字段分配内存量(以字节为单位)。cpu
和memory
字段的值格式为 <limit>:<requests>
。例如,cpu: "2000m:1000m"
将 pod 限制为 CPU 最多2000m
,并在启动时为每个 pod 请求1000m
的 CPU。指定单个值可同时设置限制和请求。应用您的
Infinispan
CR。如果集群正在运行,Data Grid Operator 会重启 Data Grid pod,以使更改生效。
spec: container: cpu: "2000m:1000m" memory: "2Gi:1Gi"
7.5. 设置 JVM 选项
在启动时向 Data Grid pod 传递额外的 JVM 选项。
流程
-
使用
Infinispan
CR 中的spec.container
文件配置 JVM 选项。 应用您的
Infinispan
CR。如果集群正在运行,Data Grid Operator 会重启 Data Grid pod,以使更改生效。
JVM 选项
spec: container: extraJvmOpts: "-<option>=<value>" routerExtraJvmOpts: "-<option>=<value>" cliExtraJvmOpts: "-<option>=<value>"
字段 | 描述 |
---|---|
| 为 Data Grid 服务器指定额外的 JVM 选项。 |
| 为 Gossip 路由器指定额外的 JVM 选项。 |
| 为 Data Grid CLI 指定额外的 JVM 选项。 |
7.6. 在 Infinispan
CR 中禁用 FIPS 模式
Red Hat OpenShift Container Platform 可以使用特定的联邦信息处理标准(FIPS)组件来确保 OpenShift 集群满足 FIPS 合规审核的要求。当您希望 Data Grid 实例在启用了 FIPS 模式的任何 OpenShift 集群上运行时,这可能会导致问题。Data Grid 8.3 不支持 FIPS 模式,因此您必须在 Infinispan
CR 中禁用 FIPS 模式。
在 Infinispan
CR 中禁用 FIPS 模式后,任何使用 JVM 的组件(如 Data Grid Server、Data Grid CLI 或 Gossip 路由器)忽略 FIPS 模式。这是因为 JVM 不再在实现启动时加载与 FIPS 相关的加密库。
只有在 OpenShift 集群启用了 FIPS 模式时,您需要在 Infinispan
CR 配置中显式禁用 FIPS 模式。
先决条件
-
在 OpenShift 上创建
Infinispan
CR,以便您的 Data Grid Operator 可以与 OpenShift 交互。
流程
使用
Infinispan
CR 中的spec.container
字段配置 JVM 选项。spec: container: extraJvmOpts: "-Dcom.redhat.fips=false" cliExtraJvmOpts: "-Dcom.redhat.fips=false" routerExtraJvmOpts: "-Dcom.redhat.fips=false"
-
应用您的
Infinispan
CR。
7.7. 调整日志级别
当您需要调试问题时,请更改不同 Data Grid 日志类别的级别。您还可以调整日志级别,以减少特定类别的消息数量,以最小化容器资源的使用。
流程
使用
Infinispan
CR 中的spec.logging.categories
字段配置 Data Grid logging。spec: logging: categories: org.infinispan: debug org.jgroups: debug
- 应用更改。
根据需要从 Data Grid pod 检索日志。
oc logs -f $POD_NAME
7.7.1. 日志参考
查找有关日志类别和级别的信息。
表 7.1. 日志类别
根类别 | 描述 | 默认级别 |
---|---|---|
| data Grid 信息 |
|
| 集群传输信息 |
|
表 7.2. 日志级别
日志级别 | 描述 |
---|---|
| 提供有关应用程序运行状态的详细信息。这是最详细的日志级别。 |
| 表示单个请求或活动的进度。 |
| 表示应用程序的整体进度,包括生命周期事件。 |
| 表示会导致错误或降级性能的情况。 |
| 表示可能阻止操作或活动成功的错误,但不会阻止应用程序运行。 |
垃圾回收(GC)信息
默认情况下,Data Grid Operator 不会记录 GC 信息。您可以使用以下 JVM 选项将 GC 消息定向到 stdout
:
extraJvmOpts: "-Xlog:gc*:stdout:time,level,tags"
7.8. 创建缓存服务 pod
使用缓存服务 pod 创建 Data Grid 集群,用于具有最小配置的易变的低延迟数据存储。
缓存服务 pod 仅提供易失性存储,这意味着当您修改 Infinispan
CR 或更新您的 Data Grid 集群版本时,您会丢失所有数据。
流程
创建一个
Infinispan
CR,它将设置spec.service.type: Cache
,并配置任何其他缓存服务资源。apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 service: type: Cache
-
应用您的
Infinispan
CR 来创建集群。
7.8.1. 缓存服务 CR
本主题论述了用于缓存服务 pod 的 Infinispan
CR。
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan annotations: infinispan.org/monitoring: 'true' spec: replicas: 2 upgrades: type: Shutdown service: type: Cache replicationFactor: 2 autoscale: maxMemUsagePercent: 70 maxReplicas: 5 minMemUsagePercent: 30 minReplicas: 2 security: endpointSecretName: endpoint-identities endpointEncryption: type: Secret certSecretName: tls-secret container: extraJvmOpts: "-XX:NativeMemoryTracking=summary" cpu: "2000m:1000m" memory: "2Gi:1Gi" logging: categories: org.infinispan: trace org.jgroups: trace expose: type: LoadBalancer affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: infinispan-pod clusterName: infinispan infinispan_cr: infinispan topologyKey: "kubernetes.io/hostname"
字段 | 描述 |
---|---|
| 为您的 Data Grid 集群命名。 |
|
为集群自动创建 |
| 指定集群中的 pod 数量。如果启用自动扩展功能,此字段指定初始 pod 数量。 |
| 控制当有新版本可用时,Data Grid Operator 如何升级您的 Data Grid 集群。 |
|
配置类型 Data Grid 服务。值为 |
| 设置集群中每个条目的副本数。缓存服务 pod 的默认是两个,复制每个缓存条目以避免数据丢失。 |
| 启用并配置自动扩展。 |
| 指定包含 Data Grid 用户凭证的身份验证 secret。 |
| 指定 TLS 证书和密钥存储来加密客户端连接。 |
| 为 Data Grid pod 指定 JVM、CPU 和内存资源。 |
| 配置数据网格日志类别。 |
| 控制如何在网络上公开 Data Grid 端点。 |
| 配置用于保证 Data Grid 可用性的反关联性策略。 |
7.9. 自动缩放
Data Grid Operator 可以通过根据内存使用情况创建或删除 pod,监控 Cache 服务 pod 的默认缓存,以自动扩展集群或缩减。
自动扩展仅适用于缓存服务 pod 的集群。data Grid Operator 不会为 Data Grid 服务 pod 集群执行自动扩展。
当您启用自动扩展时,您可以定义内存使用量阈值,以便 Data Grid Operator 决定何时需要创建或删除 pod。Data Grid Operator 会监控默认缓存的统计信息,当内存用量达到配置的阈值时,扩展集群或缩减集群。
最大阈值
此阈值为集群中 pod 在扩展或执行驱除前可以使用的内存量设置一个上限。当 Data Grid Operator 检测到任何节点可以提供您配置的最大内存量时,它会创建一个新节点(如果可能)。如果 Data Grid Operator 无法创建新节点,那么当内存用量达到 100% 时,它会执行驱除。
最小阈值
这个阈值在 Data Grid 集群中为内存用量设置一个较低边界。当 Data Grid Operator 检测到内存用量低于最小值时,它会关闭 pod。
仅限默认缓存
自动扩展功能仅适用于默认的缓存。如果您计划在集群中添加其他缓存,则不应将 autoscale
字段包含在 Infinispan
CR 中。在这种情况下,您应该使用驱除来控制每个节点上的数据容器的大小。
7.9.1. 配置自动扩展
如果使用 Cache 服务 pod 创建集群,您可以将 Data Grid Operator 配置为自动扩展集群。
流程
将
spec.autoscale
资源添加到您的Infinispan
CR 以启用自动扩展。注意为
autoscale.disabled
字段设置为true
来禁用自动扩展。使用以下字段为自动扩展配置阈值:
字段 描述 spec.autoscale.maxMemUsagePercent
指定一个最大阈值,以百分比表示每个节点上的内存用量。
spec.autoscale.maxReplicas
指定集群的最大缓存服务 pod 数量。
spec.autoscale.minMemUsagePercent
指定集群内存用量的最小阈值,以百分比表示。
spec.autoscale.minReplicas
指定集群的最小缓存服务 pod 数量。
例如,将以下内容添加到您的
Infinispan
CR 中:spec: service: type: Cache autoscale: disabled: false maxMemUsagePercent: 70 maxReplicas: 5 minMemUsagePercent: 30 minReplicas: 2
- 应用更改。
7.10. 为 Data Grid 资源添加标签和注解
将键/值标签和注解附加到 Data Grid Operator 创建和管理的 pod 和服务。标签可帮助您识别对象之间的关系以更好地组织和监控 Data Grid 资源。注解是任意标识客户端应用程序或部署和管理工具的元数据。
红帽订阅标签会自动应用到 Data Grid 资源。
流程
-
打开您的
Infinispan
CR 进行编辑。 在
metadata.annotations
部分为 Data Grid 资源附加标签和注解。-
在
metadata.annotations
部分中直接定义注解的值。 -
使用
metadata.labels
字段为标签定义值。
-
在
-
应用您的
Infinispan
CR。
自定义注解
apiVersion: infinispan.org/v1 kind: Infinispan metadata: annotations: infinispan.org/targetAnnotations: service-annotation1, service-annotation2 infinispan.org/podTargetAnnotations: pod-annotation1, pod-annotation2 service-annotation1: value service-annotation2: value pod-annotation1: value pod-annotation2: value
自定义标签
apiVersion: infinispan.org/v1 kind: Infinispan metadata: annotations: infinispan.org/targetLabels: service-label1, service-label2 infinispan.org/podTargetLabels: pod-label1, pod-label2 labels: service-label1: value service-label2: value pod-label1: value pod-label2: value # The operator does not attach these labels to resources. my-label: my-value environment: development
7.11. 使用环境变量添加标签和注解
为 Data Grid Operator 设置环境变量,以添加自动传播到所有 Data Grid pod 和服务的标签和注解。
流程
使用 spec.config.env
字段在 Data Grid Operator 订阅中添加标签和注解,如下所示:
使用
oc edit subscription
命令。oc edit subscription {subscription_name} -n openshift-operators
使用红帽 OpenShift 控制台。
- 进入 Operators > Installed Operators > Subscription。
- 从 Actions 菜单中选择 Edit Subscription。
带有环境变量的标签和注解
spec: config: env: - name: INFINISPAN_OPERATOR_TARGET_LABELS value: | {"service-label1":"value", service-label1":"value"} - name: INFINISPAN_OPERATOR_POD_TARGET_LABELS value: | {"pod-label1":"value", "pod-label2":"value"} - name: INFINISPAN_OPERATOR_TARGET_ANNOTATIONS value: | {"service-annotation1":"value", "service-annotation2":"value"} - name: INFINISPAN_OPERATOR_POD_TARGET_ANNOTATIONS value: | {"pod-annotation1":"value", "pod-annotation2":"value"}
第 8 章 配置身份验证
应用程序用户需要凭证才能访问 Data Grid 集群。您可以使用默认生成的凭证或自行添加。
8.1. 默认凭证
data Grid Operator 为以下用户生成 base64 编码凭证:
User | Secret 名称 | 描述 |
---|---|---|
|
| 默认应用用户的凭证。 |
|
| Data Grid Operator 用来与 Data Grid 资源交互的凭证。 |
8.2. 检索凭证
从身份验证 secret 获取凭证以访问 Data Grid 集群。
流程
从身份验证 secret 检索凭据。
oc get secret infinispan-generated-secret
Base64decode 凭证。
oc get secret infinispan-generated-secret -o jsonpath="{.data.identities\.yaml}" | base64 --decode
8.3. 添加自定义用户凭证
使用自定义凭证配置对 Data Grid 集群端点的访问。
修改 spec.security.endpointSecretName
会触发集群重启。
流程
使用您要添加的凭证创建一个 identity
.yaml
文件。credentials: - username: myfirstusername password: changeme-one - username: mysecondusername password: changeme-two
从 identity
.yaml
创建身份验证 secret。oc create secret generic --from-file=identities.yaml connect-secret
在
Infinispan
CR 中指定带有spec.security.endpointSecretName
的身份验证 secret,然后应用更改。spec: security: endpointSecretName: connect-secret
8.4. 更改 Operator 密码
如果您不想使用自动生成的密码,您可以更改 operator
用户的密码。
流程
更新
infinispan-generated-operator-secret
secret 中的password
键,如下所示:oc patch secret infinispan-generated-operator-secret -p='{"stringData":{"password": "supersecretoperatorpassword"}}'
注意您应该只更新
generated-operator-secret
secret 中的密码密钥。更新密码时,Data Grid Operator 会自动刷新该 secret 中的其他密钥。
8.5. 禁用用户身份验证
允许用户在不提供凭证的情况下访问 Data Grid 集群和操作数据。
如果通过 spec.expose.type
从 OpenShift 集群外访问端点,则不要禁用身份验证。您应该只针对开发环境禁用身份验证。
流程
在
Infinispan
CR 中,将false
设置为spec.security.endpointAuthentication
字段的值。spec: security: endpointAuthentication: false
- 应用更改。
第 9 章 配置客户端证书身份验证
将客户端信任存储添加到您的项目,并将 Data Grid 配置为只允许来自提供有效证书的客户端的连接。这通过确保客户端受公共证书颁发机构(CA)信任,从而提高安全性。
9.1. 客户端证书身份验证
客户端证书身份验证基于客户端存在的证书限制在内向连接。
您可以使用以下策略之一将 Data Grid 配置为使用信任存储:
validate
要验证客户端证书,Data Grid 需要一个信任存储,其中包含签名颁发机构的任何部分,通常是 root CA 证书。提供 CA 签名的证书的任何客户端都可以连接到 Data Grid。
如果您使用 Validate
策略验证客户端证书,还必须配置客户端以提供有效的 Data Grid 凭证。
身份验证
除了 root CA 证书外,还需要包含所有公共客户端证书的信任存储。只有显示签名证书的客户端才能连接到 Data Grid。
如果使用 Authenticate
策略来验证客户端证书,您必须确保证书包含有效的 Data Grid 凭证,作为可分辨名称(DN)的一部分。
9.2. 启用客户端证书身份验证
要启用客户端证书身份验证,您要将 Data Grid 配置为通过 Validate
或 Authenticate
策略使用信任存储。
流程
在
Infinispan
CR 中,将Validate
或Authenticate
设置为spec.security.endpointEncryption.clientCert
字段的值。注意默认值为
None
。使用
spec.security.endpointEncryption.clientCertSecretName
字段指定包含客户端信任存储的 secret。默认情况下,Data Grid Operator 需要一个名为 <
cluster-name>-client-cert-secret 的信任存储 secret
。注意该 secret 必须对 OpenShift 集群中的每个
Infinispan
CR 实例是唯一的。当您删除Infinispan
CR 时,OpenShift 还自动删除相关的 secret。spec: security: endpointEncryption: type: Secret certSecretName: tls-secret clientCert: Validate clientCertSecretName: infinispan-client-cert-secret
- 应用更改。
后续步骤
为 Data Grid Operator 提供包含所有客户端证书的信任存储。或者,您也可以提供 PEM 格式的证书,并让 Data Grid 生成客户端信任存储。
9.3. 提供客户端信任存储
如果您有包含所需证书的信任存储,您可以将其提供给 Data Grid Operator。
数据网格只支持 PKCS12
格式的信任存储。
流程
将包含客户端信任存储的 secret 名称指定为
metadata.name
字段的值。注意name 必须与
spec.security.endpointEncryption.clientCertSecretName
字段的值匹配。-
使用
stringData.truststore-password
字段提供信任存储的密码。 使用
data.truststore.p12
字段指定信任存储。apiVersion: v1 kind: Secret metadata: name: infinispan-client-cert-secret type: Opaque stringData: truststore-password: changme data: truststore.p12: "<base64_encoded_PKCS12_trust_store>"
- 应用更改。
9.4. 提供客户端证书
Data Grid Operator 可使用 PEM 格式从证书生成信任存储。
流程
将包含客户端信任存储的 secret 名称指定为
metadata.name
字段的值。注意name 必须与
spec.security.endpointEncryption.clientCertSecretName
字段的值匹配。-
指定签名证书或 CA 证书捆绑包,作为
data.trust.ca
字段的值。 如果您使用
Authenticate
策略来验证客户端身份,请为可以连接到 Data Grid 端点的每个客户端添加证书,并使用data.trust.cert.<name>
字段。注意在生成信任存储时,Data Grid Operator 使用 <
name
> 值作为证书的别名。(可选)使用
stringData.truststore-password
字段提供信任存储的密码。如果没有提供,Data Grid Operator 会将 "password" 设置为信任存储密码。
apiVersion: v1 kind: Secret metadata: name: infinispan-client-cert-secret type: Opaque stringData: truststore-password: changme data: trust.ca: "<base64_encoded_CA_certificate>" trust.cert.client1: "<base64_encoded_client_certificate>" trust.cert.client2: "<base64_encoded_client_certificate>"
- 应用更改。
第 10 章 配置加密
使用 Red Hat OpenShift 服务证书或自定义 TLS 证书加密客户端和 Data Grid pod 之间的连接。
10.1. 使用 Red Hat OpenShift 服务证书加密
data Grid Operator 会自动生成由 Red Hat OpenShift 服务 CA 签名的 TLS 证书。然后,Data Grid Operator 将证书和密钥存储在 secret 中,以便您可以检索它们并与远程客户端使用。
如果 Red Hat OpenShift 服务 CA 可用,Data Grid Operator 会在 Infinispan
CR 中添加以下 spec.security.endpointEncryption
配置:
spec: security: endpointEncryption: type: Service certServiceName: service.beta.openshift.io certSecretName: infinispan-cert-secret
字段 | 描述 |
---|---|
| 指定提供 TLS 证书的服务。 |
|
使用 PEM 格式指定服务证书和密钥的 secret。默认为 < |
服务证书使用 Data Grid 集群的内部 DNS 名称作为通用名称(CN),例如:
Subject: CN = example-infinispan.mynamespace.svc
因此,服务证书只能在 OpenShift 中被完全信任。如果要加密与 OpenShift 外部运行的客户端的连接,您应该使用自定义 TLS 证书。
服务证书有效期为一年,并在其过期前自动替换。
10.2. 检索 TLS 证书
从加密 secret 获取 TLS 证书以创建客户端信任存储。
流程
从加密 secret 检索
tls.crt
,如下所示:oc get secret infinispan-cert-secret -o jsonpath='{.data.tls\.crt}' | base64 --decode > tls.crt
10.3. 禁用加密
您可以禁用加密,以便客户端不需要 TLS 证书来与 Data Grid 建立连接。
如果通过 spec.expose.type
从 OpenShift 集群外访问端点,则不要禁用加密。您应该只针对开发环境禁用加密。
流程
将
None
设置为您的Infinispan
CR 中的spec.security.endpointEncryption.type
字段的值。spec: security: endpointEncryption: type: None
- 应用更改。
10.4. 使用自定义 TLS 证书
使用自定义 PKCS12 密钥存储或 TLS 证书/密钥对加密客户端和 Data Grid 集群之间的连接。
先决条件
创建密钥存储或证书机密。
注意该 secret 必须对 OpenShift 集群中的每个
Infinispan
CR 实例是唯一的。当您删除Infinispan
CR 时,OpenShift 还自动删除相关的 secret。
流程
在 OpenShift 命名空间中添加加密 secret,例如:
oc apply -f tls_secret.yaml
使用
Infinispan
CR 中的spec.security.endpointEncryption.certSecretName
字段指定加密 secret。spec: security: endpointEncryption: type: Secret certSecretName: tls-secret
- 应用更改。
10.4.1. 自定义加密 secret
添加密钥存储或证书/密钥对到安全 Data Grid 连接的自定义加密 secret 必须包含特定的字段。
密钥存储 secret
apiVersion: v1 kind: Secret metadata: name: tls-secret type: Opaque stringData: alias: server password: changeme data: keystore.p12: "MIIKDgIBAzCCCdQGCSqGSIb3DQEHA..."
字段 | 描述 |
---|---|
| 指定密钥存储的别名。 |
| 指定密钥存储密码。 |
| 添加 base64 编码的密钥存储。 |
证书 secret
apiVersion: v1 kind: Secret metadata: name: tls-secret type: Opaque data: tls.key: "LS0tLS1CRUdJTiBQUk ..." tls.crt: "LS0tLS1CRUdJTiBDRVl ..."
字段 | 描述 |
---|---|
| 添加 base64 编码的 TLS 密钥。 |
| 添加 base64 编码的 TLS 证书。 |
第 11 章 配置用户角色和权限
通过为用户配置基于角色的访问控制(RBAC)来保护对 Data Grid 服务的访问。这要求您为用户分配角色,以便他们有权访问缓存和数据网格资源。
11.1. 启用安全授权
默认情况下,禁用授权,以确保与 Infinispan
CR 实例向后兼容。完成以下步骤,为 Data Grid 用户启用授权和使用基于基于角色的访问控制(RBAC)。
流程
将
true
设置为您在Infinispan
CR 中的spec.security.authorization.enabled
字段的值。spec: security: authorization: enabled: true
- 应用更改。
11.2. 用户角色和权限
Data Grid Operator 提供了一组与不同权限关联的默认角色。
表 11.1. 默认角色和权限
角色 | 权限 | 描述 |
---|---|---|
| ALL | 超级用户拥有所有权限,包括控制 Cache Manager 生命周期。 |
| ALL_READ, ALL_WRITE, LISTEN, EXEC, MONITOR, CREATE |
除了 |
| ALL_READ, ALL_WRITE, LISTEN, EXEC, MONITOR |
除了 |
| ALL_READ, MONITOR |
除了监控权限外,还具有对 Data Grid |
| MONITOR | 您可以查看 Data Grid 集群的统计信息。 |
data Grid Operator 凭证
Data Grid Operator 生成用于通过 Data Grid 集群进行身份验证的凭证来执行内部操作。默认情况下,在启用安全授权时,会自动为 Data Grid Operator 凭证分配 admin
角色。
其他资源
- 安全授权如何工作 (数据网格安全指南)。
11.3. 为用户分配角色和权限
为用户授予控制用户是否被授权访问 Data Grid 集群资源的用户。角色可以有不同的权限级别,从只读到不受限制的访问权限。
用户隐式获取授权。例如,"admin"会自动获得 admin
权限。名为 "deployer" 的用户自动具有 deployer
角色,以此类推。
流程
创建一个
identity.yaml
文件,为用户分配角色。credentials: - username: admin password: changeme - username: my-user-1 password: changeme roles: - admin - username: my-user-2 password: changeme roles: - monitor
从 identity
.yaml
创建身份验证 secret。如有必要,请先删除现有 secret。
oc delete secret connect-secret --ignore-not-found oc create secret generic --from-file=identities.yaml connect-secret
在
Infinispan
CR 中指定带有spec.security.endpointSecretName
的身份验证 secret,然后应用更改。spec: security: endpointSecretName: connect-secret
11.4. 添加自定义角色和权限
您可以使用不同的权限组合定义自定义角色。
流程
-
打开您的
Infinispan
CR 进行编辑。 通过
spec.security.authorization.roles
字段指定自定义角色及其关联的权限。spec: security: authorization: enabled: true roles: - name: my-role-1 permissions: - ALL - name: my-role-2 permissions: - READ - WRITE
- 应用更改。
第 12 章 配置对 Data Grid 的网络访问
公开 Data Grid 集群,以便您可以访问 Data Grid Console、Data Grid 命令行界面(CLI)、REST API 和 Hot Rod 端点。
12.1. 为内部连接获取服务
默认情况下,Data Grid Operator 创建一个服务,它提供从 OpenShift 上运行的客户端访问 Data Grid 集群的服务。
此内部服务的名称与您的 Data Grid 集群相同,例如:
metadata: name: infinispan
流程
检查内部服务是否可用:
oc get services
12.2. 通过 LoadBalancer 服务公开 Data Grid
使用 LoadBalancer
服务使 Data Grid 集群可供 OpenShift 外部运行的客户端使用。
要使用未加密的 Hot Rod 客户端连接访问数据网格,您必须使用 LoadBalancer
服务。
流程
-
在
Infinispan
CR 中包含spec.expose
。 -
使用
spec.expose.type
字段将LoadBalancer
指定为服务类型。 (可选)指定服务通过
spec.expose.port
字段公开的网络端口。spec: expose: type: LoadBalancer port: 65535
- 应用更改。
验证
-external
服务是否可用。oc get services | grep external
12.3. 通过 NodePort 服务公开 Data Grid
使用 NodePort
服务在网络上公开 Data Grid 集群。
流程
-
在
Infinispan
CR 中包含spec.expose
。 -
使用
spec.expose.type
字段将NodePort
指定为服务类型。 配置通过
spec.expose.nodePort
字段公开 Data Grid 的端口。spec: expose: type: NodePort nodePort: 30000
- 应用更改。
验证
-external
服务是否可用。oc get services | grep external
12.4. 通过路由公开数据网格
使用 OpenShift Route
和 passthrough 加密使 Data Grid 集群在网络上可用。
流程
-
在
Infinispan
CR 中包含spec.expose
。 -
使用
spec.expose.type
字段将Route
指定为服务类型。 (可选)添加带有
spec.expose.host
字段的主机名。spec: expose: type: Route host: www.example.org
- 应用更改。
验证路由是否可用。
oc get routes
路由
端口
创建路由时,它会在网络上公开一个端口,该端口接受客户端连接,并将流量重定向到侦听端口 11222
的 Data Grid 服务。
可用的 路由
端口取决于您是否使用加密。
端口 | 描述 |
---|---|
| 禁用加密。 |
| 启用加密。 |
12.5. 网络服务
Data Grid Operator 创建和管理网络服务的参考信息。
服务 | 端口 | 协议 | 描述 |
---|---|---|---|
|
| TCP |
访问 OpenShift 集群中的 Data Grid 端点,或者从 OpenShift |
|
| TCP | Data Grid pod 的集群发现。 |
|
| TCP |
从 |
|
| TCP | JGroup RELAY2 通道,用于跨站点通信. |
第 13 章 设置跨站点复制
通过将地理分布式集群配置为统一服务来确保 Data Grid Operator 的可用性。
您可以通过以下方法配置集群来执行跨站点复制:
- Data Grid Operator 管理的连接。
- 您配置和管理的连接。
您可以在同一 Infinispan
CR 中为 Data Grid 集群使用受管和手动连接。您必须确保 Data Grid 集群以每个站点相同的方法建立连接。
13.1. 跨站点复制公开类型
您可以使用 NodePort
服务、LoadBalancer
服务或 OpenShift Route
处理 Data Grid 集群间备份操作的网络流量。在开始设置跨站点复制前,您应该确定红帽 OpenShift 集群可用的公开类型。在某些情况下,您可能需要在配置公开类型前置备服务。
NodePort
NodePort
是一个服务,可在 30000
到 32767
范围内接受静态端口的网络流量,它位于 OpenShift 集群外部的 IP 地址。
要将 NodePort
用作跨站点复制的公开类型,管理员必须为每个 OpenShift 节点置备外部 IP 地址。在大多数情况下,管理员必须为那些外部 IP 地址配置 DNS 路由。
LoadBalancer
LoadBalancer
是一个服务,它将网络流量定向到 OpenShift 集群中正确节点。
无论您可以使用 LoadBalancer
作为公开类型进行跨站点复制,都取决于主机平台。AWS 支持网络负载均衡器(NLB),而有些其他云平台则不支持。要使用 LoadBalancer
服务,管理员必须首先创建一个由 NLB 支持的 ingress 控制器。
Route
OpenShift 路由
允许 Data Grid 集群通过公共安全 URL 相互连接。
数据网格使用带有 SNI 标头的 TLS,以通过 OpenShift Route
在集群间发送备份请求。为此,您必须添加带有 TLS 证书的密钥存储,以便 Data Grid 可以加密网络流量以进行跨站点复制。
当将 Route
指定为用于跨站点复制的公开类型时,Data Grid Operator 会为它管理的每个 Data Grid 集群创建一个带有 TLS 透传加密的路由。您可以为 Route
指定主机名,但您无法指定已经创建的 Route
。
其他资源
13.2. 受管跨站点复制
Data Grid Operator 可以发现在不同数据中心中运行的 Data Grid 集群来组成全局集群。
当您配置托管的跨站点连接时,Data Grid Operator 会在每个 Data Grid 集群中创建路由器 Pod。data Grid pod 使用 & lt;cluster_name>-site
服务连接到这些路由器 Pod 并发送备份请求。
路由器 pod 维护所有 pod IP 地址记录并解析 RELAY 消息标头,以将备份请求转发到正确的 Data Grid 集群。如果路由器 pod 崩溃,则所有 Data Grid pod 开始使用任何其他可用的路由器 Pod,直到 OpenShift 恢复它。
为了管理跨站点连接,Data Grid Operator 使用 Kubernetes API。每个 OpenShift 集群都必须具有对远程 Kubernetes API 的网络访问权限,以及每个备份集群的服务帐户令牌。
在 Data Grid Operator 发现您配置的所有备份位置前,Data Grid 集群不会开始运行。
13.2.1. 为受管跨站点连接创建服务帐户令牌
在 OpenShift 集群上生成服务帐户令牌,以允许 Data Grid Operator 自动发现 Data Grid 集群并管理跨站点连接。
先决条件
确保所有 OpenShift 集群都可以访问 Kubernetes API。
Data Grid Operator 使用这个 API 来管理跨站点连接。注意Data Grid Operator 不修改远程 Data Grid 集群。服务帐户令牌通过 Kubernetes API 提供只读访问。
流程
- 登录 OpenShift 集群。
创建一个服务帐户。
例如,在 LON 中创建服务帐户:
oc create sa lon serviceaccount/lon created
使用以下命令将 view 角色添加到服务帐户:
oc policy add-role-to-user view system:serviceaccount:<namespace>:lon
如果使用
NodePort
服务在网络中公开 Data Grid 集群,还必须将cluster-reader
角色添加到服务帐户:oc adm policy add-cluster-role-to-user cluster-reader -z <service-account-name> -n <namespace>
- 在其他 OpenShift 集群上重复前面的步骤。
- 在每个 OpenShift 集群上交换服务帐户令牌。
其他资源
13.2.2. 交换服务帐户令牌
在 OpenShift 集群中创建服务帐户令牌后,您要将它们添加到每个备份位置的 secret 中。例如,在 LON 中,您可以为 NYC 添加服务帐户令牌。在 NYC 中,您可以为 LON 添加服务帐户令牌。
先决条件
从每个服务帐户获取令牌。
使用以下命令,或从 OpenShift Web 控制台获取令牌:
oc sa get-token lon eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9...
流程
- 登录 OpenShift 集群。
使用以下命令为备份位置添加服务帐户令牌:
oc create secret generic <token-name> --from-literal=token=<token>
例如,在 NYC 登录 OpenShift 集群,并按照如下所示创建一个
lon-token
secret:oc create secret generic lon-token --from-literal=token=eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9...
- 在其他 OpenShift 集群上重复前面的步骤。
13.2.3. 配置托管的跨站点连接
配置 Data Grid Operator,以使用 Data Grid 集群建立跨站点视图。
先决条件
-
确定适合用于跨站点复制的公开类型。
如果使用 OpenShift路由
,您必须添加带有 TLS 证书的密钥存储和安全跨站点连接。 - 为每个 Data Grid 集群创建并交换 Red Hat OpenShift 服务帐户令牌。
流程
-
为每个 Data Grid 集群创建一个
Infinispan
CR。 -
使用
spec.service.sites.local.name
指定本地站点的名称。 为跨站点复制配置公开类型。
将
spec.service.sites.local.expose.type
字段的值设置为以下之一:-
NodePort
-
LoadBalancer
-
Route
-
另外,还可使用以下字段指定端口或自定义主机名:
-
如果使用
NodePort
服务,spec.service.sites.local.expose.nodePort
。 -
spec.service.sites.local.expose.port
(如果使用LoadBalancer
服务)。 -
如果使用 OpenShift
路由
,spec.service.sites.local.expose.routeHostName
。
-
如果使用
指定可使用
service.sites.local.maxRelayNodes
字段发送 RELAY 消息的 pod 数量。提示配置集群中的所有 pod,以发送
RELAY
消息以提高性能。如果所有 Pod 直接发送备份请求,则 pod 不需要转发备份请求。-
为每个 Data Grid 集群提供名称、URL 和 secret,它们充当
spec.service.sites.locations
的备份位置。 如果远程站点上的 Data Grid 集群名称或命名空间与本地站点不匹配,请使用
clusterName
和namespace
字段指定这些值。以下是 LON 和 NYC 的
Infinispan
CR 定义示例:LON
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 3 service: type: DataGrid sites: local: name: LON expose: type: LoadBalancer port: 65535 maxRelayNodes: 1 locations: - name: NYC clusterName: <nyc_cluster_name> namespace: <nyc_cluster_namespace> url: openshift://api.rhdg-nyc.openshift-aws.myhost.com:6443 secretName: nyc-token logging: categories: org.jgroups.protocols.TCP: error org.jgroups.protocols.relay.RELAY2: error
NYC
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: nyc-cluster spec: replicas: 2 service: type: DataGrid sites: local: name: NYC expose: type: LoadBalancer port: 65535 maxRelayNodes: 1 locations: - name: LON clusterName: infinispan namespace: rhdg-namespace url: openshift://api.rhdg-lon.openshift-aws.myhost.com:6443 secretName: lon-token logging: categories: org.jgroups.protocols.TCP: error org.jgroups.protocols.relay.RELAY2: error
重要务必调整
Infinispan
CR 中的日志类别,以降低 JGroups TCP 和 RELAY2 协议的日志级别。这可防止大量日志文件使用容器存储。spec: logging: categories: org.jgroups.protocols.TCP: error org.jgroups.protocols.relay.RELAY2: error
-
使用任何其他 Data Grid 服务资源配置
Infinispan
CR,然后应用更改。 验证 Data Grid 集群是否组成了跨站点视图。
检索
Infinispan
CR。oc get infinispan -o yaml
-
检查
type: CrossSiteViewFormed
条件。
后续步骤
如果您的集群形成了跨站点视图,您可以开始向缓存添加备份位置。
其他资源
13.3. 手动配置跨站点连接
您可以指定静态网络连接详情,以便使用在 OpenShift 外部运行的 Data Grid 集群来执行跨站点复制。在访问 Kubernetes API 的任何场景中,在运行 Data Grid 的 OpenShift 集群外都不需要手动跨站点连接。
先决条件
-
确定适合用于跨站点复制的公开类型。
如果使用 OpenShift路由
,您必须添加带有 TLS 证书的密钥存储和安全跨站点连接。 确保每个 Data Grid 集群和每个 <
cluster-name>-site 服务都
有正确的主机名和端口。手动连接 Data Grid 集群以形成跨站点视图,需要 Data Grid 服务的可预测网络位置,这意味着您需要在创建网络位置前了解网络位置。
流程
-
为每个 Data Grid 集群创建一个
Infinispan
CR。 -
使用
spec.service.sites.local.name
指定本地站点的名称。 为跨站点复制配置公开类型。
将
spec.service.sites.local.expose.type
字段的值设置为以下之一:-
NodePort
-
LoadBalancer
-
Route
-
另外,还可使用以下字段指定端口或自定义主机名:
-
如果使用
NodePort
服务,spec.service.sites.local.expose.nodePort
。 -
spec.service.sites.local.expose.port
(如果使用LoadBalancer
服务)。 -
如果使用 OpenShift
路由
,spec.service.sites.local.expose.routeHostName
。
-
如果使用
为每个 Data Grid 集群提供名称和静态 URL,它们充当
spec.service.sites.locations
的备份位置,例如:LON
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 3 service: type: DataGrid sites: local: name: LON expose: type: LoadBalancer port: 65535 maxRelayNodes: 1 locations: - name: NYC url: infinispan+xsite://infinispan-nyc.myhost.com:7900 logging: categories: org.jgroups.protocols.TCP: error org.jgroups.protocols.relay.RELAY2: error
NYC
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 service: type: DataGrid sites: local: name: NYC expose: type: LoadBalancer port: 65535 maxRelayNodes: 1 locations: - name: LON url: infinispan+xsite://infinispan-lon.myhost.com logging: categories: org.jgroups.protocols.TCP: error org.jgroups.protocols.relay.RELAY2: error
重要务必调整
Infinispan
CR 中的日志类别,以降低 JGroups TCP 和 RELAY2 协议的日志级别。这可防止大量日志文件使用容器存储。spec: logging: categories: org.jgroups.protocols.TCP: error org.jgroups.protocols.relay.RELAY2: error
-
使用任何其他 Data Grid 服务资源配置
Infinispan
CR,然后应用更改。 验证 Data Grid 集群是否组成了跨站点视图。
检索
Infinispan
CR。oc get infinispan -o yaml
-
检查
type: CrossSiteViewFormed
条件。
后续步骤
如果您的集群形成了跨站点视图,您可以开始向缓存添加备份位置。
其他资源
13.4. 用于配置跨站点复制的资源
下表提供了跨站点资源的字段和描述。
表 13.1. service.type
字段 | 描述 |
---|---|
| 数据网格仅支持跨站点复制与 Data Grid 服务集群。 |
表 13.2. service.sites.local
字段 | 描述 |
---|---|
| 为运行 Data Grid 集群的本地网站命名。 |
|
指定用于跨站点复制的网络服务。数据网格集群使用此服务进行通信并执行备份操作。您可以将值设为 |
|
如果您通过 |
|
如果您通过 |
|
如果您通过 OpenShift |
|
指定为跨站点复制发送 RELAY 消息的最大 pod 数量。默认值为: |
表 13.3. service.sites.locations
字段 | 描述 |
---|---|
| 提供所有备份位置的连接信息。 |
|
指定与 |
| 指定用于受管连接的 Kubernetes API 的 URL 或用于手动连接的静态 URL。
使用
请注意,
为静态主机名和端口使用 |
| 指定包含备份站点服务帐户令牌的 secret。 |
| 如果位于备份位置的集群名称与本地站点中的集群名称不同,请指定集群名称。 |
| 如果 Data Grid 集群的命名空间与本地站点的命名空间不匹配,则指定 backup 位置的 Data Grid 集群的命名空间。 |
受管跨站点连接
spec: service: type: DataGrid sites: local: name: LON expose: type: LoadBalancer maxRelayNodes: 1 locations: - name: NYC clusterName: <nyc_cluster_name> namespace: <nyc_cluster_namespace> url: openshift://api.site-b.devcluster.openshift.com:6443 secretName: nyc-token
手动跨站点连接
spec: service: type: DataGrid sites: local: name: LON expose: type: LoadBalancer port: 65535 maxRelayNodes: 1 locations: - name: NYC url: infinispan+xsite://infinispan-nyc.myhost.com:7900
13.5. 保护跨站点连接
添加密钥存储和信任存储,以便 Data Grid 集群可以保护跨站点复制流量。
您必须添加密钥存储,以使用 OpenShift Route
作为公开类型,以进行跨站点复制。如果使用 NodePort
或 LoadBalancer
作为公开类型,保护跨站点连接是可选的。
先决条件
具有 PKCS12 密钥存储,数据网格可用于加密和解密 RELAY 信息。
您必须提供密钥存储,以转发 pod 和路由器 Pod 来保护跨站点连接。
密钥存储可以是转发 pod 和路由器 Pod 的相同,或者您可以为它们分别提供单独的密钥存储。
您也可以将相同的密钥存储用于每个 Data Grid 集群或每个集群的唯一密钥存储。(可选)有一个信任存储,其中包含证书链或根 CA 证书的一部分,用于验证 Data Grid 转发 pod 和路由器 Pod 的公共证书。
默认情况下,Data Grid 使用 Java 信任存储来验证公共证书。
流程
创建跨站点加密 secret。
- 创建密钥存储机密。
- 如果您不想使用默认的 Java 信任存储存储,则创建信任存储 secret。
-
为每个 Data Grid 集群修改
Infinispan
CR,以指定encryption.transportKeyStore.secretName
和encryption.routerKeyStore.secretName
字段的 secret 名称。 配置任何其他字段以根据需要加密 RELAY 消息,然后应用更改。
apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 expose: type: LoadBalancer service: type: DataGrid sites: local: name: SiteA # ... encryption: protocol: TLSv1.3 transportKeyStore: secretName: transport-tls-secret alias: transport filename: keystore.p12 routerKeyStore: secretName: router-tls-secret alias: router filename: keystore.p12 trustStore: secretName: truststore-tls-secret filename: truststore.p12 locations: # ...
13.5.1. 用于配置跨站点加密的资源
下表提供了用于加密跨站点连接的字段和描述。
表 13.4. service.type.sites.local.encryption
字段 | 描述 |
---|---|
|
指定用于跨站点连接的 TLS 协议。默认值为 |
| 配置用于中继 pod 的密钥存储机密。 |
| 为路由器 Pod 配置密钥存储机密。 |
| 配置可选信任存储 secret,用于中继 pod 和路由器 pod。 |
表 13.5. service.type.sites.local.encryption.transportKeyStore
字段 | 描述 |
---|---|
| 指定包含转发 Pod 可用于加密和解密 RELAY 消息的密钥存储的机密。此字段是必需的。 |
|
(可选)指定密钥存储中的证书别名。默认值为 |
|
(可选)指定密钥存储的文件名。默认值为 |
表 13.6. service.type.sites.local.encryption.routerKeyStore
字段 | 描述 |
---|---|
| 指定包含路由器 Pod 可用于加密和解密 RELAY 消息的密钥存储的机密。此字段是必需的。 |
|
(可选)指定密钥存储中的证书别名。默认值为 |
|
(可选)指定密钥存储的文件名。默认值为 |
表 13.7. service.type.sites.local.encryption.trustStore
字段 | 描述 |
---|---|
|
(可选)指定包含信任存储的 secret,以验证转发 pod 和路由器 Pod 的公共证书。默认值为 < |
|
(可选)指定信任存储的文件名。默认值为 |
13.5.2. 跨站点加密 secret
跨站点复制加密 secret 添加密钥存储和可选信任存储,以保护跨站点连接。
跨站点加密 secret
apiVersion: v1 kind: Secret metadata: name: tls-secret type: Opaque stringData: password: changeme type: pkcs12 data: <file-name>: "MIIKDgIBAzCCCdQGCSqGSIb3DQEHA..."
字段 | 描述 |
---|---|
| 指定密钥存储或信任存储的密码。 |
|
(可选)指定密钥存储或信任存储类型。默认值为 |
| 添加 base64 编码的密钥存储或信任存储。 |
13.6. 在同一 OpenShift 集群中配置站点
为了评估和演示,您可以将 Data Grid 配置为在同一个 OpenShift 集群中的不同 pod 间备份。
使用 ClusterIP
作为公开类型用于跨站点复制,仅用于演示目的。最好使用此公开类型对笔记本电脑或该性质执行临时概念验证部署。
流程
-
为每个 Data Grid 集群创建一个
Infinispan
CR。 -
使用
spec.service.sites.local.name
指定本地站点的名称。 -
将
ClusterIP
设置为spec.service.sites.local.expose.type
字段的值。 -
提供作为带有
spec.service.sites.locations.clusterName
的备份位置的 Data Grid 集群的名称。 如果两个 Data Grid 集群的名称相同,请使用
spec.service.sites.locations.namespace
指定备份位置的命名空间。apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: example-clustera spec: replicas: 1 expose: type: LoadBalancer service: type: DataGrid sites: local: name: SiteA expose: type: ClusterIP maxRelayNodes: 1 locations: - name: SiteB clusterName: example-clusterb namespace: cluster-namespace
-
使用任何其他 Data Grid 服务资源配置
Infinispan
CR,然后应用更改。 验证 Data Grid 集群是否组成了跨站点视图。
检索
Infinispan
CR。oc get infinispan -o yaml
-
检查
type: CrossSiteViewFormed
条件。
第 14 章 监控 Data Grid 服务
Data Grid 会公开指标数据,供 Prometheus 和 Grafana 用于监控和视觉化集群状态。
本文档解释了如何在 OpenShift Container Platform 中设置监控。如果您正在使用社区 Prometheus 部署,您可能会发现这些说明作为一个常规指南很有用。但是,您应该参阅 Prometheus 文档以了解安装和使用说明。
请参阅 Prometheus Operator 文档。
14.1. 创建 Prometheus 服务监控器
data Grid Operator 会自动创建一个 Prometheus ServiceMonitor
,从您的 Data Grid 集群中提取指标。
流程
在 OpenShift Container Platform 上为用户定义的项目启用监控。
当 Operator 检测到 Infinispan
CR 时,监控注解设置为 true
时,Data Grid Operator 会进行以下操作:
-
创建名为 <
cluster_name>-monitor
的ServiceMonitor
。 如果还没有显式设置值,将
infinispan.org/monitoring: 'true'
注解添加到Infinispan
CR 元数据中:apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan annotations: infinispan.org/monitoring: 'true'
要通过 Data Grid 进行身份验证,Prometheus 使用 operator
凭证。
验证
您可以检查 Prometheus 是否提取 Data Grid 指标,如下所示:
- 在 OpenShift Web 控制台中,选择 < ;/> Developer 视角,然后选择 Monitoring。
- 为您的 Data Grid 集群运行的命名空间打开 Dashboard 标签页。
打开 Metrics 选项卡,并确认您可以查询 Data Grid 指标,例如:
vendor_cache_manager_default_cluster_size
其他资源
14.1.1. 禁用 Prometheus 服务监控器
如果您不希望 Prometheus 为 Data Grid 集群提取指标,可以禁用 ServiceMonitor
。
流程
在
Infinispan
CR 中,将'false'
设置为infinispan.org/monitoring
注解的值。apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan annotations: infinispan.org/monitoring: 'false'
- 应用更改。
14.2. 安装 Grafana Operator
为了支持各种需求,Data Grid Operator 与 Grafana Operator 社区版本集成,以创建用于 Data Grid 服务的仪表板。
在 Grafana 与 OpenShift 用户工作负载监控集成前,唯一的选择是依赖于社区版本。您可以从 OperatorHub 在 OpenShift 上安装 Grafana Operator,并为 alpha 频道创建订阅。
但是,作为所有社区 Operator 的政策,红帽并不认证 Grafana Operator,而且其不支持 Data Grid。安装 Grafana Operator 时,系统会提示您确认有关社区版本的警告,然后才能继续。
14.3. 创建 Grafana 数据源
创建一个 GrafanaDatasource
CR,以便您可以在 Grafana 仪表板中视觉化 Data Grid 指标。
先决条件
-
有
oc
客户端。 -
具有
cluster-admin
访问 OpenShift Container Platform。 - 在 OpenShift Container Platform 上为用户定义的项目启用监控。
-
从 alpha 频道安装 Grafana Operator,并创建
Grafana
CR。
流程
创建一个
ServiceAccount
,使 Grafana 从 Prometheus 读取 Data Grid 指标。apiVersion: v1 kind: ServiceAccount metadata: name: infinispan-monitoring
应用
ServiceAccount
。oc apply -f service-account.yaml
为
ServiceAccount
授予cluster-monitoring-view
权限。oc adm policy add-cluster-role-to-user cluster-monitoring-view -z infinispan-monitoring
创建 Grafana 数据源。
检索
ServiceAccount
的令牌。oc serviceaccounts get-token infinispan-monitoring
定义在
spec.datasources.secureJsonData.httpHeaderValue1
字段中包含令牌的GrafanaDataSource
,如下例所示:apiVersion: integreatly.org/v1alpha1 kind: GrafanaDataSource metadata: name: grafanadatasource spec: name: datasource.yaml datasources: - access: proxy editable: true isDefault: true jsonData: httpHeaderName1: Authorization timeInterval: 5s tlsSkipVerify: true name: Prometheus secureJsonData: httpHeaderValue1: >- Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6Imc4O... type: prometheus url: 'https://thanos-querier.openshift-monitoring.svc.cluster.local:9091'
应用
GrafanaDataSource
。oc apply -f grafana-datasource.yaml
后续步骤
使用 Data Grid Operator 配置属性启用 Grafana 仪表板。
14.4. 配置 Data Grid 仪表板
Data Grid Operator 提供了全局配置属性,可让您为 Data Grid 集群配置 Grafana 仪表板。
您可以在 Data Grid Operator 正在运行时修改全局配置属性。
先决条件
- data Grid Operator 必须监视运行 Grafana Operator 的命名空间。
流程
在 Data Grid Operator 命名空间中创建一个名为
infinispan-operator-config
的ConfigMap
。apiVersion: v1 kind: ConfigMap metadata: name: infinispan-operator-config data: grafana.dashboard.namespace: infinispan grafana.dashboard.name: infinispan grafana.dashboard.monitoring.key: middleware
使用
data.grafana.dashboard.namespace
属性指定 Data Grid 集群的命名空间。注意删除此属性的值将删除仪表板。更改该值会将仪表板移到该命名空间。
-
使用
data.grafana.dashboard.name
属性为仪表板指定一个名称。 -
如有必要,使用
data.grafana.dashboard.monitoring.key
属性指定一个监控密钥。 创建
infinispan-operator-config
或更新配置。oc apply -f infinispan-operator-config.yaml
打开 Grafana UI,该 UI 位于:
oc get routes grafana-route -o jsonpath=https://"{.spec.host}"
第 15 章 使用反关联性保证可用性
Kubernetes 包括可保护工作负载免受单点故障的反关联性功能。
15.1. 反关联性策略
一个集群中的每个 Data Grid 节点都在一个在集群中的 OpenShift 节点上运行的 pod 中运行。每个 Red Hat OpenShift 节点在物理主机系统上运行。反关联性通过分布跨 OpenShift 节点的 Data Grid 节点来实现,确保在出现硬件故障时,您的 Data Grid 集群仍仍然可用。
data Grid Operator 提供了两个反关联性策略:
kubernetes.io/hostname
- data Grid 副本 Pod 调度到不同的 OpenShift 节点上。
topology.kubernetes.io/zone
- data Grid 副本 pod 调度到多个区域。
容错
反关联性策略以不同的方式保证集群可用性。
只有在 OpenShift 节点或区的数量大于 Data Grid 节点的数量时才应用以下部分。
在不同的 OpenShift 节点上调度 pod
为以下类型的缓存提供 x
节点故障:
-
复制:
x = spec.replicas - 1
-
分布式:
x = num_owners - 1
在多个区调度 pod
在存在 x
区时为以下类型的缓存提供 x
区故障的容错:
-
复制:
x = spec.replicas - 1
-
分布式:
x = num_owners - 1
spec.replicas
- 定义每个 Data Grid 集群中的 pod 数量。
num_owners
- 是缓存配置属性,用于定义缓存中每个条目的副本数。
15.2. 配置反关联性
指定 OpenShift 为您的 Data Grid 集群调度 pod 的位置,以确保可用性。
流程
-
将
spec.affinity
块添加到您的Infinispan
CR。 - 根据需要配置反关联性策略。
-
应用您的
Infinispan
CR。
15.2.1. 反关联性策略配置
在 Infinispan
CR 中配置反关联性策略,以控制 OpenShift 调度 Data Grid 副本 pod。
拓扑键 | 描述 |
---|---|
| 在多个区域间调度 Data Grid 副本 pod。 |
| 将 Data Grid 副本 pod 调度到不同的 OpenShift 节点上。 |
在不同的 OpenShift 节点上调度 pod
如果您没有在 Infinispan
CR 中配置 spec.affinity
字段,则 Data Grid Operator 使用的反关联性策略如下:
spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: infinispan-pod clusterName: <cluster_name> infinispan_cr: <cluster_name> topologyKey: "kubernetes.io/hostname"
需要不同的节点
在以下示例中,如果不同的节点不可用,OpenShift 不会调度 Data Grid pod:
spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: infinispan-pod clusterName: <cluster_name> infinispan_cr: <cluster_name> topologyKey: "topology.kubernetes.io/hostname"
为确保可以将 Data Grid 副本 pod 调度到不同的 OpenShift 节点上,可用的 OpenShift 节点数量必须大于 spec.replicas
的值。
在多个 OpenShift 区间调度 pod
在调度 pod 时,以下示例首选多个区域,但如果无法在不同的区间调度 Data Grid 副本 pod:
spec: affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchLabels: app: infinispan-pod clusterName: <cluster_name> infinispan_cr: <cluster_name> topologyKey: "topology.kubernetes.io/zone" - weight: 90 podAffinityTerm: labelSelector: matchLabels: app: infinispan-pod clusterName: <cluster_name> infinispan_cr: <cluster_name> topologyKey: "kubernetes.io/hostname"
需要多个区
以下示例仅在调度 Data Grid 副本 pod 时使用区策略:
spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchLabels: app: infinispan-pod clusterName: <cluster_name> infinispan_cr: <cluster_name> topologyKey: "topology.kubernetes.io/zone"
第 16 章 使用 Data Grid Operator 创建缓存
使用 Cache
CR 使用 Data Grid Operator 添加缓存配置并控制 Data Grid 如何存储数据。
16.1. data Grid 缓存
缓存配置定义了数据存储的特性和功能,且必须与 Data Grid 模式有效。数据网格建议使用 XML 或 JSON 格式创建定义缓存配置的独立文件。您应该将 Data Grid 配置与应用程序代码分开,以便更轻松地验证,并避免在 Java 或其它客户端语言中维护 XML 代码段的情况。
要使用在 OpenShift 上运行的 Data Grid 集群创建缓存,您应该:
-
使用
Cache
CR 作为通过 OpenShift 前端创建缓存的机制。 -
使用
Batch
CR 一次从独立配置文件创建多个缓存。 - 访问数据网格控制台并以 XML 或 JSON 格式创建缓存。
您可以使用 Hot Rod 或 HTTP 客户端,但 Data Grid 建议 缓存
CR 或 Batch
CR,除非您的具体用例需要编程远程缓存创建。
cache CR
-
cache
CR 仅适用于 Data Grid 服务 pod。 -
每个
缓存
CR 对应于 Data Grid 集群上的单个缓存。
16.2. 使用 Cache CR 创建缓存
完成以下步骤,使用 XML 或 YAML 格式的有效配置在 Data Grid 服务集群中创建缓存。
流程
-
在
metadata.name
字段中创建一个带有唯一值的Cache
CR。 -
使用
spec.clusterName
字段指定目标 Data Grid 集群。 使用
spec.name
字段命名缓存。注意缓存配置中的
name
属性不会生效。如果您没有使用spec.name
字段指定名称,则缓存将使用metadata.name
字段的值。-
使用
spec.template
字段添加缓存配置。 应用
Cache
CR,例如:oc apply -f mycache.yaml cache.infinispan.org/mycachedefinition created
缓存 CR 示例
XML
apiVersion: infinispan.org/v2alpha1 kind: Cache metadata: name: mycachedefinition spec: clusterName: infinispan name: myXMLcache template: <distributed-cache mode="SYNC" statistics="true"><encoding media-type="application/x-protostream"/><persistence><file-store/></persistence></distributed-cache>
YAML
apiVersion: infinispan.org/v2alpha1 kind: Cache metadata: name: mycachedefinition spec: clusterName: infinispan name: myYAMLcache template: |- distributedCache: mode: "SYNC" owners: "2" statistics: "true" encoding: mediaType: "application/x-protostream" persistence: fileStore: ~
16.3. 添加持久缓存存储
您可以将持久缓存存储添加到 Data Grid 服务 pod,以将数据保存到持久性卷中。
数据网格在 /opt/infinispan/server/data
目录中创建单一文件缓存存储 .dat
文件。
流程
在 Data Grid 缓存中
的持久性
配置中添加 <file-store
/> 元素,如下例所示:<distributed-cache name="persistent-cache" mode="SYNC"> <encoding media-type="application/x-protostream"/> <persistence> <file-store/> </persistence> </distributed-cache>
16.4. 在缓存服务 pod 中添加缓存
缓存服务 pod 包含使用推荐的设置的默认缓存配置。此默认缓存允许您开始使用 Data Grid,而无需创建缓存。
由于默认缓存提供了推荐的设置,因此您应该只创建缓存作为默认副本。如果您希望多个自定义缓存,您应该创建 Data Grid 服务 pod 而不是 Cache 服务 pod。
流程
- 访问 Data Grid 控制台,以 XML 或 JSON 格式提供默认配置的副本。
使用 Data Grid CLI 从默认缓存中创建副本,如下所示:
[//containers/default]> create cache --template=default mycache
16.4.1. 默认缓存配置
本节论述了 Cache 服务 pod 的默认缓存配置。
<distributed-cache name="default" mode="SYNC" owners="2"> <memory storage="OFF_HEAP" max-size="<maximum_size_in_bytes>" when-full="REMOVE" /> <partition-handling when-split="ALLOW_READ_WRITES" merge-policy="REMOVE_ALL"/> </distributed-cache>
默认缓存:
- 使用同步分布来在集群中存储数据。
- 在集群中,为每个条目创建两个副本。
- 将缓存条目存储为字节,保存在原生内存(off-heap)中。
- 以字节为单位定义数据容器的最大大小。data Grid Operator 在创建 pod 时计算最大大小。
- 驱除缓存条目以控制数据容器的大小。您可以启用自动扩展,以便 Data Grid Operator 在内存用量增加而不是删除条目时添加 pod。
- 使用冲突解决策略,允许对缓存条目进行读写操作,即使网段所有者位于不同的分区中。
- 指定当 Data Grid 检测到冲突时从缓存中删除条目的合并策略。
第 17 章 运行批处理操作
Data Grid Operator 提供了一个 Batch
CR,可让您在批量创建 Data Grid 资源。批处理
CR 在批处理模式中使用 Data Grid 命令行界面(CLI)来执行一系列操作。
修改 批处理
CR 实例没有影响。批处理操作是修改 Data Grid 资源的"一次性"事件。要更新 CR 的 .spec
字段,或者在批处理操作失败时,您必须创建 Batch
CR 的新实例。
17.1. 运行内联批处理操作
如果不需要单独的配置工件,请将您的批处理操作直接包含在 Batch
CR 中。
流程
创建一个
批处理
CR。-
指定希望批量操作作为
spec.cluster
字段的值运行的 Data Grid 集群的名称。 添加每个 CLI 命令,以在
spec.config
字段中的一行中运行。apiVersion: infinispan.org/v2alpha1 kind: Batch metadata: name: mybatch spec: cluster: infinispan config: | create cache --template=org.infinispan.DIST_SYNC mycache put --cache=mycache hello world put --cache=mycache hola mundo
-
指定希望批量操作作为
应用您的
批处理
CR。oc apply -f mybatch.yaml
-
检查
Batch
CR 中的status.Phase
字段,以验证操作成功完成。
17.2. 为批处理操作创建 ConfigMap
创建一个 ConfigMap
,以便其他文件(如 Data Grid 缓存配置)可用于批处理操作。
先决条件
为了进行演示,您应该在启动流程前将一些配置工件添加到主机文件系统中:
创建一个
/tmp/mybatch
目录,您可以在其中添加一些文件。mkdir -p /tmp/mybatch
创建数据网格缓存配置。
cat > /tmp/mybatch/mycache.xml<<EOF <distributed-cache name="mycache" mode="SYNC"> <encoding media-type="application/x-protostream"/> <memory max-count="1000000" when-full="REMOVE"/> </distributed-cache> EOF
流程
创建包含您要运行的所有命令的
批处理
文件。例如,以下
批处理
文件创建一个名为"mycache"的缓存,并为其添加两个条目:create cache mycache --file=/etc/batch/mycache.xml put --cache=mycache hello world put --cache=mycache hola mundo
重要ConfigMap
挂载于/etc/batch
的 Data Grid pod。您必须使用该路径在批处理操作中添加 all--file=
指令。确保您的批处理操作需要的所有配置工件与
批处理
文件位于同一个目录中。ls /tmp/mybatch batch mycache.xml
从目录中创建
ConfigMap
。oc create configmap mybatch-config-map --from-file=/tmp/mybatch
17.3. 使用 ConfigMap 运行批处理操作
运行包括配置工件的批处理操作。
先决条件
-
创建一个
ConfigMap
,其中包含您的批处理操作需要的任何文件。
流程
-
创建一个
Batch
CR,将 Data Grid 集群名称指定为spec.cluster
字段的值。 使用
spec.configMap
字段设置包含批处理
文件和配置工件的ConfigMap
名称。cat > mybatch.yaml<<EOF apiVersion: infinispan.org/v2alpha1 kind: Batch metadata: name: mybatch spec: cluster: infinispan configMap: mybatch-config-map EOF
应用您的
批处理
CR。oc apply -f mybatch.yaml
-
检查
Batch
CR 中的status.Phase
字段,以验证操作成功完成。
17.4. 批处理状态消息
使用 Batch
CR 中的 status.Phase
字段验证批处理操作并进行故障排除。
阶段 | 描述 |
---|---|
| 所有批处理操作都已成功完成。 |
| 批处理操作排队,资源正在初始化。 |
| 批处理操作已就绪,可启动。 |
| 批处理操作正在进行中。 |
| 一个或多个批处理操作不成功。 |
失败的操作
批处理操作不是原子的。如果批处理脚本中的命令失败,它不会影响其他操作或导致它们回滚。
如果您的批处理操作有任何服务器或语法错误,您可以在 status.Reason
字段中查看 Batch
CR 中的日志消息。
17.5. 批处理操作示例
使用这些示例批处理操作作为使用 Batch
CR 创建和修改 Data Grid 资源的起点。
您只能通过 ConfigMap
将配置文件传递给 Data Grid Operator。
ConfigMap
在 /etc/batch
的 Data Grid pod 中挂载,因此您必须使用该路径添加所有 --file=
指令。
17.5.1. 缓存
- 从配置文件创建多个缓存。
echo "creating caches..." create cache sessions --file=/etc/batch/infinispan-prod-sessions.xml create cache tokens --file=/etc/batch/infinispan-prod-tokens.xml create cache people --file=/etc/batch/infinispan-prod-people.xml create cache books --file=/etc/batch/infinispan-prod-books.xml create cache authors --file=/etc/batch/infinispan-prod-authors.xml echo "list caches in the cluster" ls caches
- 从文件创建模板,然后从模板创建缓存。
echo "creating caches..." create cache mytemplate --file=/etc/batch/mycache.xml create cache sessions --template=mytemplate create cache tokens --template=mytemplate echo "list caches in the cluster" ls caches
17.5.2. 计数器
使用 Batch
CR 创建多个计数器,可以递增和缩减记录对象计数。
您可以使用计数器来生成标识符、作为速率限制器,或者跟踪访问资源的次数。
echo "creating counters..." create counter --concurrency-level=1 --initial-value=5 --storage=PERSISTENT --type=weak mycounter1 create counter --initial-value=3 --storage=PERSISTENT --type=strong mycounter2 create counter --initial-value=13 --storage=PERSISTENT --type=strong --upper-bound=10 mycounter3 echo "list counters in the cluster" ls counters
17.5.3. protobuf schema
注册 Protobuf 模式以在缓存中查询值。protobuf schema(.proto
文件)提供有关自定义实体和控制字段索引的元数据。
echo "creating schema..." schema --upload=person.proto person.proto schema --upload=book.proto book.proto schema --upload=author.proto book.proto echo "list Protobuf schema" ls schemas
17.5.4. 任务
上传实现 org.infinispan.tasks.ServerTask
或与 javax.script
脚本 API 兼容的任务。
echo "creating tasks..." task upload --file=/etc/batch/myfirstscript.js myfirstscript task upload --file=/etc/batch/mysecondscript.js mysecondscript task upload --file=/etc/batch/mythirdscript.js mythirdscript echo "list tasks" ls tasks
其他资源
第 18 章 备份和恢复 Data Grid 集群
Data Grid Operator 可让您备份和恢复 Data Grid 集群状态,用于灾难恢复,并在集群间迁移 Data Grid 资源。
18.1. 备份和恢复 CR
CR 在运行时保存内存数据,以便您可以轻松重新创建 Data Grid 集群。
备份和恢复
应用 Backup
或 Restore
CR 会创建一个新 pod,将 Data Grid 集群加入为零容量成员,这意味着不需要集群重新平衡或状态传输才能加入。
对于备份操作,pod 会迭代缓存条目和其他资源,并在持久性卷(PV)上的 /opt/infinispan/backups
目录中创建存档(一个 .zip
文件)。
执行备份不会影响性能,因为 Data Grid 集群中的其他 pod 只需要在迭代缓存条目时响应备份 pod。
对于恢复操作,pod 从 PV 上的存档检索 Data Grid 资源,并将其应用到 Data Grid 集群。
当备份或恢复操作完成后,pod 会离开集群并被终止。
协调
data Grid Operator 不协调
CR,这意味着备份和恢复操作为 "one-time" 事件。
备份和恢复
修改现有的 Backup
或 Restore
CR 实例不会执行操作或产生任何影响。如果要更新 .spec
字段,您必须创建 Backup
或 Restore
CR 的新实例。
18.2. 备份 Data Grid 集群
创建将 Data Grid 集群状态存储到持久性卷的备份文件。
先决条件
-
使用
spec.service.type: DataGrid
创建Infinispan
CR。 确保到 Data Grid 集群没有活跃的客户端连接。
数据网格备份不提供快照隔离,数据修改不会在备份缓存后写入存档。
要归档集群的确切状态,您应该在备份前始终断开所有客户端。
流程
-
使用
metadata.name
字段命名Backup
CR。 -
使用
spec.cluster
字段指定 Data Grid 集群进行备份。 配置持久性卷声明(PVC),将备份归档添加到带有 spec.volume.storage 和
spec.volume.storage
.storageClassNameapiVersion: infinispan.org/v2alpha1 kind: Backup metadata: name: my-backup spec: cluster: source-cluster volume: storage: 1Gi storageClassName: my-storage-class
(可选)包含
spec.resources
字段来指定您要备份的 Data Grid 资源。如果您没有包含任何
spec.resources
字段,Backup
CR 会创建一个包含所有 Data Grid 资源的存档。如果您指定了spec.resources
字段,则Backup
CR 会创建一个仅包含这些资源的存档。spec: ... resources: templates: - distributed-sync-prod - distributed-sync-dev caches: - cache-one - cache-two counters: - counter-name protoSchemas: - authors.proto - books.proto tasks: - wordStream.js
您还可以使用
*
通配符字符,如下例所示:spec: ... resources: caches: - "*" protoSchemas: - "*"
应用
备份
CR。oc apply -f my-backup.yaml
验证
检查
status.phase
字段在Backup
CR 中状态为Succeeded
,且 Data Grid 日志有以下以下信息:ISPN005044: Backup file created 'my-backup.zip'
运行以下命令检查备份是否已成功创建:
oc describe Backup my-backup
18.3. 恢复 Data Grid 集群
从备份归档中恢复 Data Grid 集群状态。
先决条件
-
在源集群中
创建备份 CR。 创建目标 Data Grid 集群 Data Grid 服务 pod。
注意如果您恢复了现有缓存,操作会覆盖缓存中的数据,但不会覆盖缓存配置。
例如,您要在源集群中备份一个名为
mycache
的分布式缓存。然后,您会在作为复制缓存存在的目标集群上恢复mycache
。在本例中,源集群中的数据会被恢复,mycache
继续在目标集群中有一个复制的配置。确保没有到您要恢复的目标 Data Grid 集群的活动客户端连接。
从备份中恢复的缓存条目可能会覆盖较新的缓存条目。
例如,客户端执行cache.put(k=2)
操作,然后恢复包含k=1
的备份。
流程
-
使用
metadata.name
字段命名Restore
CR。 -
指定用于
spec.backup
字段的备份 CR。 使用
spec.cluster
字段指定要恢复的 Data Grid 集群。apiVersion: infinispan.org/v2alpha1 kind: Restore metadata: name: my-restore spec: backup: my-backup cluster: target-cluster
(可选)添加
spec.resources
字段以只恢复特定资源。spec: ... resources: templates: - distributed-sync-prod - distributed-sync-dev caches: - cache-one - cache-two counters: - counter-name protoSchemas: - authors.proto - books.proto tasks: - wordStream.js
应用您的
Restore
CR。oc apply -f my-restore.yaml
验证
检查
status.phase
字段在Restore
CR 中状态为Succeeded
,且 Data Grid 日志有以下以下信息:ISPN005045: Restore 'my-backup' complete
然后,您应该打开 Data Grid Console 或建立 CLI 连接,以验证数据和 Data Grid 资源是否按预期恢复。
18.4. 备份和恢复状态
CR 包括一个 备份和恢复
status.phase
字段,它为操作的每个阶段提供状态。
状态 | 描述 |
---|---|
| 系统已接受请求,控制器正在准备底层资源来创建 pod。 |
| 控制器已成功准备了所有底层资源。 |
| pod 被创建,操作正在进行 Data Grid 集群。 |
| 这个操作已在 Data Grid 集群上成功完成,pod 被终止。 |
| 操作没有成功完成,pod 被终止。 |
| 控制器无法获取 pod 的状态,或决定操作的状态。此条件通常表示 pod 的临时通信错误。 |
18.4.1. 处理失败的备份和恢复操作
如果 Backup
或 Restore
CR 的 status.phase
字段是 Failed
,您应该在重新尝试操作前检查 pod 日志以确定根本原因。
流程
检查执行失败操作的 pod 的日志。
在删除
Backup
或Restore
CR 之前,Pod 将被终止,但仍保持可用。oc logs <backup|restore_pod_name>
- 解决 pod 日志所示的任何错误条件或其他故障原因。
-
创建
Backup
或Restore
CR 的新实例,并再次尝试操作。
第 19 章 将自定义代码部署到 Data Grid
将自定义代码(如脚本和事件监听器)添加到您的 Data Grid 集群。
在将自定义代码部署到 Data Grid 集群之前,您需要使其可用。为此,您可以复制持久性卷(PV)中的工件,请从 HTTP 或 FTP 服务器下载工件,也可以使用这两种方法。
19.1. 将代码工件复制到 Data Grid 集群
将您的工件添加到持久性卷(PV)中,然后将其复制到 Data Grid pod。
此流程解释了如何使用挂载持久性卷声明(PVC)的临时 pod:
- 可让您在 PV 中添加代码工件(最好是写入操作)。
- 允许 Data Grid pod 从 PV 加载代码工件(格式是一个读取操作)。
要执行这些读写操作,您需要特定的 PV 访问模式。但是,对不同的 PVC 访问模式的支持取决于平台。
本文档范围超出了本文档,以提供使用不同平台创建 PVC 的说明。为简单起见,以下流程显示一个带有 ReadWriteMany
访问模式的 PVC。
在某些情况下,只有 ReadOnlyMany
或 ReadWriteOnce
访问模式可用。您可以通过重新声明并重复使用具有相同 spec.volumeName
的 PVC 来结合使用这些访问模式。
使用 ReadWriteOnce
访问模式会导致所有 Data Grid pod 调度到同一 OpenShift 节点上。
流程
切换到 Data Grid 集群的命名空间。
oc project rhdg-namespace
为您的自定义代码工件创建一个 PVC,例如:
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: datagrid-libs spec: accessModes: - ReadWriteMany resources: requests: storage: 100Mi
应用 PVC。
oc apply -f datagrid-libs.yaml
创建挂载 PVC 的 pod,例如:
apiVersion: v1 kind: Pod metadata: name: datagrid-libs-pod spec: securityContext: fsGroup: 2000 volumes: - name: lib-pv-storage persistentVolumeClaim: claimName: datagrid-libs containers: - name: lib-pv-container image: registry.redhat.io/datagrid/datagrid-8-rhel8:8.3 volumeMounts: - mountPath: /tmp/libs name: lib-pv-storage
将 pod 添加到 Data Grid 命名空间,并等待它就绪。
oc apply -f datagrid-libs-pod.yaml oc wait --for=condition=ready --timeout=2m pod/datagrid-libs-pod
将代码工件复制到 pod,以便它们加载到 PVC 中。
例如,要从本地
libs
目录中复制代码工件,请执行以下操作:oc cp --no-preserve=true libs datagrid-libs-pod:/tmp/
删除 pod。
oc delete pod datagrid-libs-pod
在
Infinispan
CR 中使用spec.dependencies.volumeClaimName
指定持久性卷,然后应用更改。apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 dependencies: volumeClaimName: datagrid-libs service: type: DataGrid
如果在持久性卷中更新自定义代码,您必须重启 Data Grid 集群,以便它可以加载更改。
19.2. 下载代码工件
将您的工件添加到 HTTP 或 FTP 服务器中,以便 Data Grid Operator 将其下载到每个 Data Grid 节点上的 {lib_path}
目录中。
下载文件时,Data Grid Operator 可以自动检测文件类型。在下载完成后,Data Grid Operator 还会将归档文件(如 zip
或 tgz
)提取到文件系统。
每个同时 Data Grid Operator 创建一个 Data Grid 节点,它会将工件下载到节点。当 Data Grid Operator 在终止后重新创建 pod 时,下载也会发生。
先决条件
- 在 HTTP 或 FTP 服务器中托管您的代码工件。
流程
将
spec.dependencies.artifacts
字段添加到您的Infinispan
CR。-
指定要通过
HTTP
或FTP
下载的文件位置,作为spec.dependencies.artifacts.url
字段的值。 (可选)指定一个 checksum,使用
spec.dependencies.artifacts.hash
字段验证下载的完整性。hash
字段要求值采用 <algorithm>:<checksum>
; 的格式,其中 <algorithm
> 是sha1|sha224|sha256|sha384|sha512|md5
。如果需要,使用
spec.dependencies.artifacts.type
字段设置文件类型。如果文件类型没有包含在 URL 中,或者文件类型实际与 URL 中扩展名不同,则您应该明确设置文件类型。
注意如果您设置了
type: file
,Data Grid Operator 会在不将其提取至文件系统的情况下以原样下载该文件。apiVersion: infinispan.org/v1 kind: Infinispan metadata: name: infinispan spec: replicas: 2 dependencies: artifacts: - url: http://example.com:8080/path hash: sha256:596408848b56b5a23096baa110cd8b633c9a9aef2edd6b38943ade5b4edcd686 type: zip service: type: DataGrid
-
指定要通过
- 应用更改。
第 20 章 从 Data Grid 集群发送云事件
通过将 CloudEvents
发送到 Apache Kafka 主题,将 Data Grid 配置为 Knative 源。
使用 Red Hat OpenShift Serverless 发送云事件作为技术预览提供。
20.1. 技术预览功能
红帽产品服务级别协议(SLA)不支持技术预览功能,且可能无法完成。
红帽不推荐在生产环境中使用技术预览功能或功能。这些功能可让您早期访问将来的产品功能,这些功能可在开发过程中测试并提供反馈意见。
如需更多信息,请参阅红帽技术预览功能支持范围。
20.2. 云事件
当缓存中的条目被创建、更新、删除或过期时,您可以从 Data Grid 集群发送 CloudEvents
。
Data Grid 以 JSON 格式将结构化事件发送到 Kafka,如下例所示:
{ "specversion": "1.0", "source": "/infinispan/<cluster_name>/<cache_name>", "type": "org.infinispan.entry.created", "time": "<timestamp>", "subject": "<key-name>", "id": "key-name:CommandInvocation:node-name:0", "data": { "property": "value" } }
字段 | 描述 |
---|---|
|
带有 |
| 条目值. |
| 条目键,转换为字符串. |
| 事件生成的标识符。 |
20.3. 启用云事件
配置 Data Grid 以发送 CloudEvents
。
先决条件
- 设置侦听 Data Grid 主题的 Kafka 集群。
流程
将
spec.cloudEvents
添加到您的Infinispan
CR。-
使用
spec.cloudEvents.acks
字段配置确认数量。值为 "0"、"1" 或 "all"。 -
列出 Kafka 服务器,其中 Data Grid 使用
spec.cloudEvents.bootstrapServers
字段将事件发送到。 使用
spec.cloudEvents.cacheEntriesTopic
字段指定 Data Grid 事件的 Kafka 主题。spec: cloudEvents: acks: "1" bootstrapServers: my-cluster-kafka-bootstrap_1.<namespace_1>.svc:9092,my-cluster-kafka-bootstrap_2.<namespace_2>.svc:9092 cacheEntriesTopic: target-topic
-
使用
- 应用您的更改。
第 21 章 建立远程客户端连接
从 Data Grid Console、命令行界面(CLI)和远程客户端连接到 Data Grid 集群。
21.1. 客户端连接详情
到 Data Grid 的客户端连接需要以下信息:
- Hostname
- 端口
- 身份验证凭证(如果需要)
- TLS 证书(如果使用加密)
主机名
您所使用的主机名取决于客户端是否与 Data Grid 在相同的 OpenShift 集群上运行。
在同一 OpenShift 集群上运行的客户端应用程序使用 Data Grid 集群的内部服务名称。
metadata: name: infinispan
在不同的 OpenShift 或 OpenShift 外部运行的客户端应用程序使用主机名,具体取决于数据网格在网络上公开的方式。
LoadBalancer
服务使用负载均衡器的 URL。NodePort
服务使用节点主机名。Red Hat OpenShift Route
使用您定义的自定义主机名或系统生成的主机名。
端口
OpenShift 和 LoadBalancer
服务上的客户端连接使用端口 11222
。
NodePort
服务使用 30000
到 60000
范围中的端口。路由使用端口 80
(未加密)或 443
(加密)。
21.2. 使用远程 shell 连接到 Data Grid 集群
启动到 Data Grid 集群的远程 shell 会话,并使用命令行界面(CLI)使用 Data Grid 资源并执行管理操作。
先决条件
-
在您的
PATH
中有kubectl-infinispan
。 - 具有有效的 Data Grid 凭证。
流程
运行
infinispan shell
命令连接到您的 Data Grid 集群。oc infinispan shell <cluster_name>
注意如果您可以访问身份验证 secret,且只有一个 Data Grid 用户,
kubectl-infinispan
插件会自动检测到您的凭证并对 Data Grid 进行身份验证。如果您的部署有多个 Data Grid 凭证,请使用--username
参数指定用户,并在提示时输入对应的密码。根据需要执行 CLI 操作。
提示按 Tab 键或使用
--help
参数查看可用选项和帮助文本。-
使用
quit
命令结束远程 shell 会话。
其他资源
21.3. 访问 Data Grid Console
访问控制台以创建缓存、执行管理操作并监控您的 Data Grid 集群。
先决条件
-
在网络上公开数据网格,以便您可以通过浏览器访问控制台。
例如,配置LoadBalancer
服务或创建路由
。
流程
从位于
$HOSTNAME 的任何浏览器访问控制台:$PORT
.将
$HOSTNAME:$PORT
替换为 Data Grid 可用的网络位置。
21.4. 热 Rod 客户端
hot Rod 是一个二进制 TCP 协议,Data Grid 为使用远程客户端提供高性能数据传输功能。
客户端智能
Hot Rod 协议包括为客户端提供缓存拓扑视图的机制。客户端智能通过减少读写操作的网络跃点数量来提高性能。
在同一 OpenShift 集群中运行的客户端可以访问 Data Grid pod 的内部 IP 地址,您可以使用任何客户端智能。
HASH_DISTRIBUTION_AWARE
是默认的智能机制,使客户端能够将请求路由到主所有者,为 Hot Rod 客户端提供最佳性能。
BASIC
智能
热备份客户端必须在以下情况下使用 BASIC
智能:
-
通过
LoadBalancer
、NodePort
或 OpenShiftRoute
连接到 Data Grid。 - 在使用跨站点复制时,切换到不同的 OpenShift 集群。
OpenShift 集群管理员可以定义将流量限制到 Data Grid 的网络策略。在某些情况下,网络隔离策略需要您使用 BASIC
智能,即使客户端在同一 OpenShift 集群中运行,但不同的命名空间也是如此。
21.4.1. 热备份客户端配置 API
您可以使用 ConfigurationBuilder
接口以编程方式配置 Hot Rod 客户端连接。
将以下示例中的 $SERVICE_HOSTNAME
替换为您的 Data Grid 集群的内部服务名称。
metadata: name: infinispan
对于 OpenShift
ConfigurationBuilder
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.client.hotrod.configuration.SaslQop; import org.infinispan.client.hotrod.impl.ConfigurationProperties; ... ConfigurationBuilder builder = new ConfigurationBuilder(); builder.addServer() .host("$HOSTNAME") .port(ConfigurationProperties.DEFAULT_HOTROD_PORT) .security().authentication() .username("username") .password("changeme") .realm("default") .saslQop(SaslQop.AUTH) .saslMechanism("SCRAM-SHA-512") .ssl() .sniHostName("$SERVICE_HOSTNAME") .trustStoreFileName("/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt") .trustStoreType("pem");
hotrod-client.properties
# Connection infinispan.client.hotrod.server_list=$HOSTNAME:$PORT # Authentication infinispan.client.hotrod.use_auth=true infinispan.client.hotrod.auth_username=developer infinispan.client.hotrod.auth_password=$PASSWORD infinispan.client.hotrod.auth_server_name=$CLUSTER_NAME infinispan.client.hotrod.sasl_properties.javax.security.sasl.qop=auth infinispan.client.hotrod.sasl_mechanism=SCRAM-SHA-512 # Encryption infinispan.client.hotrod.sni_host_name=$SERVICE_HOSTNAME infinispan.client.hotrod.trust_store_file_name=/var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt infinispan.client.hotrod.trust_store_type=pem
Outside OpenShift
ConfigurationBuilder
import org.infinispan.client.hotrod.configuration.ClientIntelligence; import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; import org.infinispan.client.hotrod.configuration.SaslQop; ... ConfigurationBuilder builder = new ConfigurationBuilder(); builder.addServer() .host("$HOSTNAME") .port("$PORT") .security().authentication() .username("username") .password("changeme") .realm("default") .saslQop(SaslQop.AUTH) .saslMechanism("SCRAM-SHA-512") .ssl() .sniHostName("$SERVICE_HOSTNAME") //Create a client trust store with tls.crt from your project. .trustStoreFileName("/path/to/truststore.pkcs12") .trustStorePassword("trust_store_password") .trustStoreType("PCKS12"); builder.clientIntelligence(ClientIntelligence.BASIC);
hotrod-client.properties
# Connection infinispan.client.hotrod.server_list=$HOSTNAME:$PORT # Client intelligence infinispan.client.hotrod.client_intelligence=BASIC # Authentication infinispan.client.hotrod.use_auth=true infinispan.client.hotrod.auth_username=developer infinispan.client.hotrod.auth_password=$PASSWORD infinispan.client.hotrod.auth_server_name=$CLUSTER_NAME infinispan.client.hotrod.sasl_properties.javax.security.sasl.qop=auth infinispan.client.hotrod.sasl_mechanism=SCRAM-SHA-512 # Encryption infinispan.client.hotrod.sni_host_name=$SERVICE_HOSTNAME # Create a client trust store with tls.crt from your project. infinispan.client.hotrod.trust_store_file_name=/path/to/truststore.pkcs12 infinispan.client.hotrod.trust_store_password=trust_store_password infinispan.client.hotrod.trust_store_type=PCKS12
21.4.2. 配置 Hot Rod 客户端以进行证书身份验证
如果启用客户端证书身份验证,则客户端必须在使用 Data Grid 协商连接时显示有效的证书。
验证策略
如果使用 Validate
策略,则必须为客户端配置密钥存储,以便它们出现签名证书。您还必须使用 Data Grid 凭证以及任何合适的身份验证机制来配置客户端。
验证策略
如果使用 Authenticate
策略,您必须为客户端配置包含签名证书的密钥存储和有效的 Data Grid 凭证,作为可分辨名称(DN)的一部分。热备份客户端还必须使用 EXTERNAL
身份验证机制。
如果启用安全授权,您应该从客户端证书分配具有适当权限的角色的通用名称(CN)。
以下示例显示了使用 Authenticate
策略进行客户端证书验证的 Hot Rod 客户端配置:
import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; ... ConfigurationBuilder builder = new ConfigurationBuilder(); builder.security() .authentication() .saslMechanism("EXTERNAL") .ssl() .keyStoreFileName("/path/to/keystore") .keyStorePassword("keystorepassword".toCharArray()) .keyStoreType("PCKS12");
21.4.3. 从 Hot Rod 客户端创建缓存
您可以使用 Hot Rod 客户端在 OpenShift 上运行的 Data Grid 集群上远程创建缓存。但是,Data Grid 建议您使用 Data Grid Console、CLI 或 cache CR 而不是 Hot Rod 客户端创建 缓存
。
以编程方式创建缓存
以下示例演示了如何将缓存配置添加到 ConfigurationBuilder
中,然后使用 RemoteCacheManager
创建它们:
import org.infinispan.client.hotrod.DefaultTemplate; import org.infinispan.client.hotrod.RemoteCache; import org.infinispan.client.hotrod.RemoteCacheManager; ... builder.remoteCache("my-cache") .templateName(DefaultTemplate.DIST_SYNC); builder.remoteCache("another-cache") .configuration("<infinispan><cache-container><distributed-cache name=\"another-cache\"><encoding media-type=\"application/x-protostream\"/></distributed-cache></cache-container></infinispan>"); try (RemoteCacheManager cacheManager = new RemoteCacheManager(builder.build())) { // Get a remote cache that does not exist. // Rather than return null, create the cache from a template. RemoteCache<String, String> cache = cacheManager.getCache("my-cache"); // Store a value. cache.put("hello", "world"); // Retrieve the value and print it. System.out.printf("key = %s\n", cache.get("hello"));
本例演示了如何使用 XMLStringConfiguration()
方法创建名为 CacheWithXMLConfiguration 的缓存,以将缓存配置作为 XML 传递:
import org.infinispan.client.hotrod.RemoteCacheManager; import org.infinispan.commons.configuration.XMLStringConfiguration; ... private void createCacheWithXMLConfiguration() { String cacheName = "CacheWithXMLConfiguration"; String xml = String.format("<distributed-cache name=\"%s\">" + "<encoding media-type=\"application/x-protostream\"/>" + "<locking isolation=\"READ_COMMITTED\"/>" + "<transaction mode=\"NON_XA\"/>" + "<expiration lifespan=\"60000\" interval=\"20000\"/>" + "</distributed-cache>" , cacheName); manager.administration().getOrCreateCache(cacheName, new XMLStringConfiguration(xml)); System.out.println("Cache with configuration exists or is created."); }
使用 Hot Rod 客户端属性
当您为不存在的命名缓存调用 cacheManager.getCache()
调用时,Data Grid 从 Hot Rod 客户端属性创建它们,而不是返回 null。
在 hotrod-client.properties
中添加缓存配置,如下例所示:
# Add cache configuration infinispan.client.hotrod.cache.my-cache.template_name=org.infinispan.DIST_SYNC infinispan.client.hotrod.cache.another-cache.configuration=<infinispan><cache-container><distributed-cache name=\"another-cache\"/></cache-container></infinispan> infinispan.client.hotrod.cache.my-other-cache.configuration_uri=file:/path/to/configuration.xml
21.5. 访问 REST API
数据网格提供了一个 RESTful 接口,您可以使用 HTTP 客户端进行交互。
先决条件
-
在网络上公开数据网格,以便您访问 REST API。
例如,配置LoadBalancer
服务或创建路由
。
流程
使用
$HOSTNAME:$PORT/rest/v2
中的任何 HTTP 客户端访问 REST API。将
$HOSTNAME:$PORT
替换为 Data Grid 侦听客户端连接的网络位置。
其他资源