1.2. VolSync 持久性卷复制服务(技术预览)
VolSync 是一种 Kubernetes 操作器,支持异步复制集群中的持久性卷,或者在集群中使用存储类型不兼容进行复制的集群间复制。它使用容器存储接口(CSI)来克服兼容性限制。在您的环境中部署 VolSync Operator 后,您可以使用它来创建和维护持久数据的副本。VolSync 只能在位于版本 4.8 或更高版本的 Red Hat OpenShift Container Platform 集群中复制持久性卷声明。
1.2.1. 使用 VolSync 复制持久性卷 复制链接链接已复制到粘贴板!
您可以使用三种方法复制 VolSync 的持久性卷,这取决于您拥有的同步位置数量。本例中使用 Rsync 方法。有关其他方法以及 Rsync 的更多信息,请参阅 VolSync 文档中的使用情况。
rsync 复制常用于持久性卷的一个一对一复制。这用于将数据复制到远程站点。
VolSync 不自行创建命名空间,因此它与其他 OpenShift Container Platform all-namespace operator 位于同一个命名空间中。您对 VolSync 的 operator 设置所做的任何更改都会影响同一命名空间中的其他 Operator,例如,如果您更改为手动批准频道更新。
1.2.1.1. 先决条件 复制链接链接已复制到粘贴板!
在集群上安装 VolSync 前,您必须满足以下要求:
- 配置了 Red Hat OpenShift Container Platform 环境,运行 Red Hat Advanced Cluster Management 版本 2.4 或更高版本、hub 集群
- 至少两个由同一 Red Hat Advanced Cluster Management hub 集群管理的集群
-
您要通过 VolSync 配置的集群之间的网络连接;如果集群不位于同一网络中,您可以配置 Submariner 多集群联网和服务发现,并使用
ServiceType的ClusterIP值来联网 集群,或使用 ServiceType 值为ServiceType的负载均衡器。 - 您用于源持久性卷的存储驱动程序必须与 CSI 兼容,并能够支持快照。
1.2.1.2. 在受管集群上安装 VolSync 复制链接链接已复制到粘贴板!
要启用 VolSync,将一个集群上的持久性卷声明复制到另一个集群的持久性卷声明中,您必须在源和目标集群上安装 VolSync。
您可以使用以下任一方法在环境中的两个集群中安装 VolSync。您可以向 hub 集群中的每个受管集群添加标签,也可以手动创建并应用 ManagedClusterAddOn,如下所示:
1.2.1.2.1. 使用标签安装 VolSync 复制链接链接已复制到粘贴板!
通过添加标签,在受管集群中安装 VolSync。
从 Red Hat Advanced Cluster Management 控制台完成以下步骤:
-
从 hub 集群控制台的
Clusters页面选择其中一个受管集群来查看其详情。 在 Labels 字段中,添加以下标签:
addons.open-cluster-management.io/volsync=true
addons.open-cluster-management.io/volsync=trueCopy to Clipboard Copied! Toggle word wrap Toggle overflow VolSync 服务 pod 已安装在受管集群上。
- 添加相同的标签,标记其他受管集群。
在每个受管集群中运行以下命令,以确认已安装了 VolSync Operator:
oc get csv -n openshift-operators
oc get csv -n openshift-operatorsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 安装时,会列出 VolSync 的 Operator。
-
从 hub 集群控制台的
使用命令行界面完成以下步骤:
- 在 hub 集群中启动一个命令行会话。
输入以下命令将标签添加到第一个集群:
oc label managedcluster <managed-cluster-1> "addons.open-cluster-management.io/volsync"="true"
oc label managedcluster <managed-cluster-1> "addons.open-cluster-management.io/volsync"="true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
managed-cluster-1替换为一个受管集群的名称。输入以下命令将标签添加到第二个集群:
oc label managedcluster <managed-cluster-2> "addons.open-cluster-management.io/volsync"="true"
oc label managedcluster <managed-cluster-2> "addons.open-cluster-management.io/volsync"="true"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
managed-cluster-2替换为其他受管集群的名称。在每个对应受管集群的命名空间的 hub 集群上自动创建一个
ManagedClusterAddOn资源。
1.2.1.2.2. 使用 ManagedClusterAddOn 安装 VolSync 复制链接链接已复制到粘贴板!
要通过手动添加 ManagedClusterSetAddOn 在受管集群中安装 VolSync,请完成以下步骤:
在 hub 集群中,创建一个名为
volsync-mcao.yaml的 YAML 文件,其中包含类似以下示例的内容:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
managed-cluster-1-namespace替换为其中一个受管集群的命名空间。此命名空间与受管集群的名称相同。注: 名称必须是
volsync。输入类似以下示例的命令,将该文件应用到您的配置中:
oc apply -f volsync-mcao.yaml
oc apply -f volsync-mcao.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 为其他受管集群重复上述步骤。
在每个对应受管集群的命名空间的 hub 集群上自动创建一个
ManagedClusterAddOn资源。
1.2.1.3. 在受管集群中配置 Rsync 复制 复制链接链接已复制到粘贴板!
对于基于 Rsync 的复制,请在源和目标集群上配置自定义资源。自定义资源使用 address 值将源连接到目的地,sshKeys 则用于确保传输的数据安全。
注: 您必须将 address 和 sshKeys 的值从目的地复制到源,因此请在配置源前配置目的地。
本例显示了一个步骤,将 Rsync 复制的配置从使用 source-ns 命名空间中的 source 集群中的持久性卷声明,改为使用 destination-ns 命名空间中的 destination 集群上的持久性卷声明。如果需要,您可以将这些值替换为其他值。
配置您的目标集群。
在目标集群中运行以下命令以创建命名空间:
kubectl create ns <destination-ns>
$ kubectl create ns <destination-ns>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
destination-ns替换为将要包含目标持久性卷声明的命名空间的名称。复制以下 YAML 内容,以创建名为
replication_destination.yaml的新文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意:
容量值应与正在复制的持久卷声明的容量匹配。将
destination替换为复制目的地 CR 的名称。将
destination-ns替换为目的地所在的命名空间的名称。在本例中,使用
LoadBalancer的ServiceType值。负载均衡器服务由源集群创建,以便您的源集群可以将信息传送到不同的目标受管集群。如果您的源和目标集群位于相同的集群中,或者配置了 Submariner 网络服务,您可以使用ClusterIP作为服务类型。请注意配置源集群时要指向的 secret 的地址和名称。storageClassName和volumeSnapshotClassName是可选参数。指定您的环境的值,特别是您使用的存储类和卷快照类名称与您的环境的默认值不同。在目标集群中运行以下命令以创建
replicationdestination资源:kubectl create -n <destination-ns> -f replication_destination.yaml
$ kubectl create -n <destination-ns> -f replication_destination.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
destination-ns替换为目的地所在的命名空间的名称。创建
replicationdestination资源后,将以下参数和值添加到资源中:Expand 参数 值 .status.rsync.address用于连接的目标集群的 IP 地址,用于启用源和目标集群进行通信。
.status.rsync.sshKeys启用保护从源集群到目标集群的数据传输的 SSH 密钥文件的名称。
运行以下命令复制
.status.rsync.address的值,以便在源集群中使用:ADDRESS=`kubectl get replicationdestination <destination> -n <destination-ns> --template={{.status.rsync.address}}` echo $ADDRESS$ ADDRESS=`kubectl get replicationdestination <destination> -n <destination-ns> --template={{.status.rsync.address}}` $ echo $ADDRESSCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
destination替换为复制目的地 CR 的名称。将
destination-ns替换为目的地所在的命名空间的名称。输出结果应该类似以下示例,这适用于 Amazon Web Services 环境:
a831264645yhrjrjyer6f9e4a02eb2-5592c0b3d94dd376.elb.us-east-1.amazonaws.com
a831264645yhrjrjyer6f9e4a02eb2-5592c0b3d94dd376.elb.us-east-1.amazonaws.comCopy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令复制 secret 的名称,以及作为
.status.rsync.sshKeys的值提供的 secret 的内容。SSHKEYS=`kubectl get replicationdestination <destination> -n <destination-ns> --template={{.status.rsync.sshKeys}}` echo $SSHKEYS$ SSHKEYS=`kubectl get replicationdestination <destination> -n <destination-ns> --template={{.status.rsync.sshKeys}}` $ echo $SSHKEYSCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
destination替换为复制目的地 CR 的名称。将
destination-ns替换为目的地所在的命名空间的名称。在配置源时,您必须在源集群中输入它。输出应该是 SSH 密钥 secret 文件的名称,该文件可能类似以下名称:
volsync-rsync-dst-src-destination-name
volsync-rsync-dst-src-destination-nameCopy to Clipboard Copied! Toggle word wrap Toggle overflow
找到您要复制的源持久性卷声明。
注: 源持久性卷声明必须位于 CSI 存储类中。
创建
ReplicationSource项。复制以下 YAML 内容,在源集群上创建一个名为
replication_source.yaml的新文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
source替换为复制源 CR 的名称。有关如何 自动替换该流程 的说明,请参阅此流程的第 3 步。将
source-ns替换为源所在持久性卷声明的命名空间。有关如何 自动替换该流程 的说明,请参阅此流程的第 3 步。将
persistent_volume_claim替换为源持久性卷声明的名称。使用您从
ReplicationDestination的.status.rsync.sshKeys字段复制的密钥替换mysshkeys。将
my.host.com替换为您在配置ReplicationDestination的.status.rsync.address字段复制的主机地址。如果您的存储驱动程序支持克隆,使用
Clone作为copyMethod的值,则可能是更精简的复制过程。storageClassName和volumeSnapshotClassName是可选参数。如果您使用与环境默认值不同的存储类和卷快照类名称,请指定这些值。现在,您可以设置持久性卷的同步方法。
通过针对目标集群输入以下命令从目标集群复制 SSH secret:
kubectl get secret -n <destination-ns> $SSHKEYS -o yaml > /tmp/secret.yaml
$ kubectl get secret -n <destination-ns> $SSHKEYS -o yaml > /tmp/secret.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
destination-ns替换为目标所在持久性卷声明的命名空间。输入以下命令在
vi编辑器中打开 secret 文件:vi /tmp/secret.yaml
$ vi /tmp/secret.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在目标集群的 open secret 文件中进行以下更改:
-
将命名空间更改为源集群的命名空间。本例中是
source-ns。 -
删除所有者引用(
.metadata.ownerReferences)。
-
将命名空间更改为源集群的命名空间。本例中是
在源集群中,在源集群中输入以下命令来创建 secret 文件:
kubectl create -f /tmp/secret.yaml
$ kubectl create -f /tmp/secret.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 在源集群中,使用以下命令将
ReplicationSource对象中的地址和sshKeys值替换为来自目标集群的值来修改replication_source.yaml文件:sed -i "s/<my.host.com>/$ADDRESS/g" replication_source.yaml sed -i "s/<mysshkeys>/$SSHKEYS/g" replication_source.yaml kubectl create -n <source> -f replication_source.yaml
$ sed -i "s/<my.host.com>/$ADDRESS/g" replication_source.yaml $ sed -i "s/<mysshkeys>/$SSHKEYS/g" replication_source.yaml $ kubectl create -n <source> -f replication_source.yamlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 将
my.host.com替换为您在配置ReplicationDestination的.status.rsync.address字段复制的主机地址。使用您从
ReplicationDestination的.status.rsync.sshKeys字段复制的密钥替换mysshkeys。使用源所在的持久性卷声明的名称替换
source。注: 您必须在与要复制的持久性卷声明相同的命名空间中创建该文件。
在
ReplicationSource对象中运行以下命令来验证复制是否完成:kubectl describe ReplicationSource -n <source-ns> <source>
$ kubectl describe ReplicationSource -n <source-ns> <source>Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将
source-ns替换为源所在持久性卷声明的命名空间。将
source替换为复制源 CR 的名称。如果复制成功,输出应类似以下示例:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果
Last Sync Time没有列出时间,则复制不会完成。
有原始持久性卷声明的副本。