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
VolSync 服务 pod 已安装在受管集群上。
- 添加相同的标签,标记其他受管集群。
在每个受管集群中运行以下命令,以确认已安装了 VolSync Operator:
oc get csv -n openshift-operators
安装时,会列出 VolSync 的 Operator。
-
从 hub 集群控制台的
使用命令行界面完成以下步骤:
- 在 hub 集群中启动一个命令行会话。
输入以下命令将标签添加到第一个集群:
oc label managedcluster <managed-cluster-1> "addons.open-cluster-management.io/volsync"="true"
将
managed-cluster-1
替换为一个受管集群的名称。输入以下命令将标签添加到第二个集群:
oc label managedcluster <managed-cluster-2> "addons.open-cluster-management.io/volsync"="true"
将
managed-cluster-2
替换为其他受管集群的名称。在每个对应受管集群的命名空间的 hub 集群上自动创建一个
ManagedClusterAddOn
资源。
1.2.1.2.2. 使用 ManagedClusterAddOn 安装 VolSync
要通过手动添加 ManagedClusterSetAddOn
在受管集群中安装 VolSync,请完成以下步骤:
在 hub 集群中,创建一个名为
volsync-mcao.yaml
的 YAML 文件,其中包含类似以下示例的内容:apiVersion: addon.open-cluster-management.io/v1alpha1 kind: ManagedClusterAddOn metadata: name: volsync namespace: <managed-cluster-1-namespace> spec: {}
将
managed-cluster-1-namespace
替换为其中一个受管集群的命名空间。此命名空间与受管集群的名称相同。注: 名称必须是
volsync
。输入类似以下示例的命令,将该文件应用到您的配置中:
oc apply -f volsync-mcao.yaml
为其他受管集群重复上述步骤。
在每个对应受管集群的命名空间的 hub 集群上自动创建一个
ManagedClusterAddOn
资源。
1.2.1.3. 在受管集群中配置 Rsync 复制
对于基于 Rsync 的复制,请在源和目标集群上配置自定义资源。自定义资源使用 address
值将源连接到目的地,sshKeys
则用于确保传输的数据安全。
注: 您必须将 address
和 sshKeys
的值从目的地复制到源,因此请在配置源前配置目的地。
本例显示了一个步骤,将 Rsync 复制的配置从使用 source-ns
命名空间中的 source
集群中的持久性卷声明,改为使用 destination-ns
命名空间中的 destination
集群上的持久性卷声明。如果需要,您可以将这些值替换为其他值。
配置您的目标集群。
在目标集群中运行以下命令以创建命名空间:
$ kubectl create ns <destination-ns>
将
destination-ns
替换为将要包含目标持久性卷声明的命名空间的名称。复制以下 YAML 内容,以创建名为
replication_destination.yaml
的新文件:--- apiVersion: volsync.backube/v1alpha1 kind: ReplicationDestination metadata: name: <destination> namespace: <destination-ns> spec: rsync: serviceType: LoadBalancer copyMethod: Snapshot capacity: 2Gi accessModes: [ReadWriteOnce] storageClassName: gp2-csi volumeSnapshotClassName: csi-aws-vsc
注意:
容量
值应与正在复制的持久卷声明的容量匹配。将
destination
替换为复制目的地 CR 的名称。将
destination-ns
替换为目的地所在的命名空间的名称。在本例中,使用
LoadBalancer
的ServiceType
值。负载均衡器服务由源集群创建,以便您的源集群可以将信息传送到不同的目标受管集群。如果您的源和目标集群位于相同的集群中,或者配置了 Submariner 网络服务,您可以使用ClusterIP
作为服务类型。请注意配置源集群时要指向的 secret 的地址和名称。storageClassName
和volumeSnapshotClassName
是可选参数。指定您的环境的值,特别是您使用的存储类和卷快照类名称与您的环境的默认值不同。在目标集群中运行以下命令以创建
replicationdestination
资源:$ kubectl create -n <destination-ns> -f replication_destination.yaml
将
destination-ns
替换为目的地所在的命名空间的名称。创建
replicationdestination
资源后,将以下参数和值添加到资源中:参数 值 .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
将
destination
替换为复制目的地 CR 的名称。将
destination-ns
替换为目的地所在的命名空间的名称。输出结果应该类似以下示例,这适用于 Amazon Web Services 环境:
a831264645yhrjrjyer6f9e4a02eb2-5592c0b3d94dd376.elb.us-east-1.amazonaws.com
运行以下命令复制 secret 的名称,以及作为
.status.rsync.sshKeys
的值提供的 secret 的内容。$ SSHKEYS=`kubectl get replicationdestination <destination> -n <destination-ns> --template={{.status.rsync.sshKeys}}` $ echo $SSHKEYS
将
destination
替换为复制目的地 CR 的名称。将
destination-ns
替换为目的地所在的命名空间的名称。在配置源时,您必须在源集群中输入它。输出应该是 SSH 密钥 secret 文件的名称,该文件可能类似以下名称:
volsync-rsync-dst-src-destination-name
找到您要复制的源持久性卷声明。
注: 源持久性卷声明必须位于 CSI 存储类中。
创建
ReplicationSource
项。复制以下 YAML 内容,在源集群上创建一个名为
replication_source.yaml
的新文件:--- apiVersion: volsync.backube/v1alpha1 kind: ReplicationSource metadata: name: <source> namespace: <source-ns> spec: sourcePVC: <persistent_volume_claim> trigger: schedule: "*/3 * * * *" rsync: sshKeys: <mysshkeys> address: <my.host.com> copyMethod: Snapshot storageClassName: gp2-csi volumeSnapshotClassName: gp2-csi
将
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
将
destination-ns
替换为目标所在持久性卷声明的命名空间。输入以下命令在
vi
编辑器中打开 secret 文件:$ vi /tmp/secret.yaml
在目标集群的 open secret 文件中进行以下更改:
-
将命名空间更改为源集群的命名空间。本例中是
source-ns
。 -
删除所有者引用(
.metadata.ownerReferences
)。
-
将命名空间更改为源集群的命名空间。本例中是
在源集群中,在源集群中输入以下命令来创建 secret 文件:
$ kubectl create -f /tmp/secret.yaml
在源集群中,使用以下命令将
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
将
my.host.com
替换为您在配置ReplicationDestination
的.status.rsync.address
字段复制的主机地址。使用您从
ReplicationDestination
的.status.rsync.sshKeys
字段复制的密钥替换mysshkeys
。使用源所在的持久性卷声明的名称替换
source
。注: 您必须在与要复制的持久性卷声明相同的命名空间中创建该文件。
在
ReplicationSource
对象中运行以下命令来验证复制是否完成:$ kubectl describe ReplicationSource -n <source-ns> <source>
将
source-ns
替换为源所在持久性卷声明的命名空间。将
source
替换为复制源 CR 的名称。如果复制成功,输出应类似以下示例:
Status: Conditions: Last Transition Time: 2021-10-14T20:48:00Z Message: Synchronization in-progress Reason: SyncInProgress Status: True Type: Synchronizing Last Transition Time: 2021-10-14T20:41:41Z Message: Reconcile complete Reason: ReconcileComplete Status: True Type: Reconciled Last Sync Duration: 5m20.764642395s Last Sync Time: 2021-10-14T20:47:01Z Next Sync Time: 2021-10-14T20:48:00Z
如果
Last Sync Time
没有列出时间,则复制不会完成。
有原始持久性卷声明的副本。