1.2. VolSync 持久性卷复制服务
VolSync 是一种 Kubernetes 操作器,支持异步复制集群中的持久性卷,或者在集群中使用存储类型不兼容进行复制的集群间复制。它使用容器存储接口(CSI)来克服兼容性限制。在您的环境中部署 VolSync Operator 后,您可以使用它来创建和维护持久数据的副本。VolSync 只能在位于 4.8 或更高版本的 Red Hat OpenShift Container Platform 集群上复制持久性卷声明。
重要: VolSync 只支持复制带有 volumeMode
的 Filesystem
的持久性卷声明。如果您没有选择 volumeMode
,则默认为 Filesystem
。
1.2.1. 使用 VolSync 复制持久性卷
您可以使用三种支持的方法来复制带有 VolSync 的持久性卷,这取决于您拥有的同步位置数量: Rsync、restic 或 Rclone。
1.2.1.1. 先决条件
在集群上安装 VolSync 前,您必须满足以下要求:
- 配置了运行 Red Hat Advanced Cluster Management 版本 2.4 或更高版本的 hub 集群的 Red Hat OpenShift Container Platform 环境
- 至少配置两个由同一 Red Hat Advanced Cluster Management hub 集群管理的集群
-
使用 VolSync 配置的集群之间的网络连接。如果集群不在同一网络中,您可以配置 Submariner multicluster networking 和 service discovery,并使用
ServiceType
的ClusterIP
值来联网集群,或使用带有LoadBalancer
值的ServiceType
的负载均衡器。 - 您用于源持久性卷的存储驱动程序必须与 CSI 兼容,并能够支持快照。
1.2.1.2. 在受管集群上安装 VolSync
要启用 VolSync 将一个集群上的持久性卷声明复制到另一个集群的持久性卷声明,您必须在源和目标受管集群中安装 VolSync。
VolSync 不创建自己的命名空间,因此它与其他 OpenShift Container Platform all-namespace operator 相同的命名空间中。对 VolSync 的 Operator 设置所做的任何更改也会影响同一命名空间中的其他 Operator,例如,如果您更改为手动批准频道更新。
您可以使用两种方式之一在环境中的两个集群中安装 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
替换为其他受管集群的名称。应该在每个对应受管集群的命名空间中自动创建一个
ManagedClusterAddOn
资源。
1.2.1.2.2. 使用 ManagedClusterAddOn 安装 VolSync
要通过手动添加 ManagedClusterAddOn
在受管集群中安装 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
为其他受管集群重复上述步骤。
应该在每个对应受管集群的命名空间中自动创建一个
ManagedClusterAddOn
资源。
1.2.1.3. 配置 Rsync 复制
您可以使用 Rsync 复制创建持久性卷的 1:1 异步复制。您可以使用基于 Rsync 的复制进行灾难恢复,或者将数据发送到远程站点。
以下示例演示了如何使用 Rsync 方法配置。有关 Rsync 的更多信息,请参阅 VolSync 文档中的使用情况。
1.2.1.3.1. 在受管集群中配置 Rsync 复制
对于基于 Rsync 的复制,请在源和目标集群上配置自定义资源。自定义资源使用 address
值将源连接到目的地,sshKeys
则用于确保传输的数据安全。
注: 您必须将 address
和 sshKeys
的值从目的地复制到源,因此请在配置源前配置目的地。
本例显示了一个步骤,将 Rsync 复制的配置从使用 source-ns
命名空间中的 source
集群中的持久性卷声明,改为使用 destination-ns
命名空间中的 destination
集群上的持久性卷声明。如果需要,您可以将这些值替换为其他值。
配置您的目标集群。
在目标集群中运行以下命令以创建命名空间:
oc 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
资源:oc create -n <destination-ns> -f replication_destination.yaml
将
destination-ns
替换为目的地所在的命名空间的名称。创建
replicationdestination
资源后,将以下参数和值添加到资源中:参数 值 .status.rsync.address
用于连接的目标集群的 IP 地址,用于启用源和目标集群进行通信。
.status.rsync.sshKeys
启用保护从源集群到目标集群的数据传输的 SSH 密钥文件的名称。
运行以下命令复制
.status.rsync.address
的值,以便在源集群中使用:ADDRESS=`oc get replicationdestination <destination> -n <destination-ns> --template={{.status.rsync.address}}` echo $ADDRESS
将
destination
替换为复制目标自定义资源的名称。将
destination-ns
替换为目的地所在的命名空间的名称。输出结果应该类似以下示例,这适用于 Amazon Web Services 环境:
a831264645yhrjrjyer6f9e4a02eb2-5592c0b3d94dd376.elb.us-east-1.amazonaws.com
运行以下命令复制 secret 的名称,以及作为
.status.rsync.sshKeys
的值提供的 secret 的内容。SSHKEYS=`oc get replicationdestination <destination> -n <destination-ns> --template={{.status.rsync.sshKeys}}` echo $SSHKEYS
将
destination
替换为复制目标自定义资源的名称。将
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
替换为复制源自定义资源的名称。有关如何替换此功能的说明,请参阅此流程的第 3-vi 步。将
source-ns
替换为源所在持久性卷声明的命名空间。有关如何替换此功能的说明,请参阅此流程的第 3-vi 步。将
persistent_volume_claim
替换为源持久性卷声明的名称。使用您从
ReplicationDestination
的.status.rsync.sshKeys
字段复制的密钥替换mysshkeys
。将
my.host.com
替换为您在配置ReplicationDestination
的.status.rsync.address
字段复制的主机地址。如果您的存储驱动程序支持克隆,使用
Clone
作为copyMethod
的值,则可能是更精简的复制过程。storageClassName
和volumeSnapshotClassName
是可选参数。如果您使用与环境默认值不同的存储类和卷快照类名称,请指定这些值。现在,您可以设置持久性卷的同步方法。
通过针对目标集群输入以下命令从目标集群复制 SSH secret:
oc 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 文件:
oc create -f /tmp/secret.yaml
在源集群中,输入以下命令替换
ReplicationSource
对象中的address
和sshKeys
的值来修改replication_source.yaml
文件:sed -i "s/<my.host.com>/$ADDRESS/g" replication_source.yaml sed -i "s/<mysshkeys>/$SSHKEYS/g" replication_source.yaml oc create -n <source> -f replication_source.yaml
将
my.host.com
替换为您在配置ReplicationDestination
的.status.rsync.address
字段复制的主机地址。使用您从
ReplicationDestination
的.status.rsync.sshKeys
字段复制的密钥替换mysshkeys
。使用源所在的持久性卷声明的名称替换
source
。注: 您必须在与要复制的持久性卷声明相同的命名空间中创建该文件。
在
ReplicationSource
对象中运行以下命令来验证复制是否完成:oc describe ReplicationSource -n <source-ns> <source>
将
source-ns
替换为源所在持久性卷声明的命名空间。将
source
替换为复制源自定义资源的名称。如果复制成功,输出应类似以下示例:
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
没有列出时间,则复制不会完成。
您有原始持久性卷声明的副本。
1.2.1.4. 配置剩余的备份
基于 restic 的备份将持久性卷的 restic 备份副本复制到在 restic-config.yaml
secret 文件中指定的位置。剩余的备份不会在集群之间同步数据,而是提供数据备份。
完成以下步骤以配置基于剩余的备份:
通过创建类似以下 YAML 内容的 secret 来指定存储备份镜像的存储库:
apiVersion: v1 kind: Secret metadata: name: restic-config type: Opaque stringData: RESTIC_REPOSITORY: <my-restic-repository> RESTIC_PASSWORD: <my-restic-password> AWS_ACCESS_KEY_ID: access AWS_SECRET_ACCESS_KEY: password
将
my-restic-repository
替换为您要存储备份文件的 S3 存储桶存储库的位置。将
my-restic-password
替换为访问存储库所需的加密密钥。如果需要,将
access
和password
替换为您的供应商凭证。如需更多信息,请参阅准备新存储库。如果您需要准备新存储库,请参阅为流程准备新存储库。如果使用这个步骤,请跳过运行
restic init
命令的步骤来初始化存储库。VolSync 在第一个备份过程中自动初始化存储库。重要:当将多个持久性卷声明备份到同一 S3 存储桶时,存储桶的路径对于每个持久性卷声明来说必须是唯一的。每个持久性卷声明都使用单独的
ReplicationSource
备份,每个声明都需要单独的 restic-config secret。通过共享相同的 S3 存储桶,每个
ReplicationSource
具有对整个 S3 存储桶的写入访问权限。通过创建类似以下 YAML 内容的
ReplicationSource
对象来配置备份策略:apiVersion: volsync.backube/v1alpha1 kind: ReplicationSource metadata: name: mydata-backup spec: sourcePVC: <source> trigger: schedule: "*/30 * * * *" #\* restic: pruneIntervalDays: 14 repository: <restic-config> retain: hourly: 6 daily: 5 weekly: 4 monthly: 2 yearly: 1 copyMethod: Clone # The StorageClass to use when creating the PiT copy (same as source PVC if omitted) #storageClassName: my-sc-name # The VSC to use if the copy method is Snapshot (default if omitted) #volumeSnapshotClassName: my-vsc-name
使用您要备份的持久性卷声明替换
source
。将
schedule
值替换为运行备份的频率。这个示例有每 30 分钟的调度。如需更多信息,请参阅调度同步。将
PruneIntervalDays
值替换为重新打包数据实例之间经过的天数,以节省空间。修剪操作可在其运行时生成大量 I/O 流量。将
restic-config
替换为在第 1 步中创建的 secret 的名称。将
retain
的值设置为备份镜像的保留策略。最佳实践: 将
Clone
用于CopyMethod
的值,以确保保存点镜像。有关备份选项的更多信息,请参阅 VolSync 文档中的备份选项。
注:默认情况下,Restic movers 在没有 root 权限的情况下运行。如果要以 root 用户身份运行 restic movers,请运行以下命令将升级的权限注解添加到您的命名空间。
oc annotate namespace <namespace> volsync.backube/privileged-movers=true
将 <namespace>
替换为您的命名空间的名称。
1.2.1.4.1. 恢复剩余的备份
您可以将复制的数据从其余备份恢复到新的持久性卷声明。最佳实践:仅将一个备份恢复到新的持久性卷声明中。要恢复剩余的备份,请完成以下步骤:
创建新的持久性卷声明,使其包含类似以下示例的新数据:
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: <pvc-name> spec: accessModes: - ReadWriteOnce resources: requests: storage: 3Gi
将
pvc-name
替换为新持久性卷声明的名称。创建一个
ReplicationDestination
自定义资源,该资源类似以下示例来指定恢复数据的位置:apiVersion: volsync.backube/v1alpha1 kind: ReplicationDestination metadata: name: <destination> spec: trigger: manual: restore-once restic: repository: <restic-repo> destinationPVC: <pvc-name> copyMethod: Direct
将
destination
替换为复制目的地 CR 的名称。使用存储源的仓库的路径替换
restic-repo
。使用您要恢复数据的新持久性卷声明的名称替换
pvc-name
。使用现有的持久性卷声明,而不是置备一个新的持久性卷声明。
恢复过程只需要完成一次,本例恢复最新的备份。有关恢复选项的更多信息,请参阅 VolSync 文档中的恢复选项。
1.2.1.5. 配置 Rclone 复制
Rclone 备份通过中间对象存储位置(如 AWS S3)使用 Rclone 将单个持久性卷复制到多个位置。将数据分发到多个位置时非常有用。
完成以下步骤以配置 Rclone 复制:
创建一个类似以下示例的
ReplicationSource
自定义资源:apiVersion: volsync.backube/v1alpha1 kind: ReplicationSource metadata: name: <source> namespace: <source-ns> spec: sourcePVC: <source-pvc> trigger: schedule: "*/6 * * * *" #\* rclone: rcloneConfigSection: <intermediate-s3-bucket> rcloneDestPath: <destination-bucket> rcloneConfig: <rclone-secret> copyMethod: Snapshot storageClassName: <my-sc-name> volumeSnapshotClassName: <my-vsc>
将
source-pvc
替换为复制源自定义资源的名称。将
source-ns
替换为源所在持久性卷声明的命名空间。使用您要复制的持久性卷声明替换
source
。将
schedule
值替换为运行复制的频率。这个示例有每 6 分钟的调度。这个值必须在引号内。如需更多信息,请参阅调度同步。将
intermediate-s3-bucket
替换为 Rclone 配置文件配置部分的路径。将
destination-bucket
替换为您要复制文件的对象存储桶的路径。将
rclone-secret
替换为包含您的 Rclone 配置信息的 secret 名称。将
copyMethod
的值设置为Clone
、Direct
或Snapshot
。这个值指定是否生成点时复制,如果是,则使用什么方法生成它。将
my-sc-name
替换为您要用于点复制的存储类的名称。如果没有指定,则使用源卷的存储类。如果您将
my-vsc
指定为copyMethod
,则将my-vsc
替换为VolumeSnapshotClass
的名称。对于其他类型的copyMethod
,这并不是必需的。创建一个类似以下示例的
ReplicationDestination
自定义资源:apiVersion: volsync.backube/v1alpha1 kind: ReplicationDestination metadata: name: database-destination namespace: dest spec: trigger: schedule: "3,9,15,21,27,33,39,45,51,57 * * * *" #/* rclone: rcloneConfigSection: <intermediate-s3-bucket> rcloneDestPath: <destination-bucket> rcloneConfig: <rclone-secret> copyMethod: Snapshot accessModes: [ReadWriteOnce] capacity: 10Gi storageClassName: <my-sc> volumeSnapshotClassName: <my-vsc>
将
schedule
值替换为将复制移到目的地的频率。源和目标的调度必须是偏移的,以允许数据在从目的地拉取前完成复制。这个示例有每 6 分钟的调度,将偏移 3 分钟。这个值必须在引号内。如需更多信息,请参阅调度同步。将
intermediate-s3-bucket
替换为 Rclone 配置文件配置部分的路径。将
destination-bucket
替换为您要复制文件的对象存储桶的路径。将
rclone-secret
替换为包含您的 Rclone 配置信息的 secret 名称。将
copyMethod
的值设置为Clone
、Direct
或Snapshot
。这个值指定是否生成点时复制,如果是,则使用什么方法生成它。accessModes
的值指定持久性卷声明的访问模式。有效值为ReadWriteOnce
或ReadWriteMany
。capacity
指定目标卷的大小,它必须足够大来包含传入的数据。将
my-sc
替换为您要用作点时副本的存储类的名称。如果没有指定,则使用系统存储类。如果您将
my-vsc
指定为copyMethod
,则将my-vsc
替换为VolumeSnapshotClass
的名称。对于其他类型的copyMethod
,这并不是必需的。如果没有包括,则使用系统默认VolumeSnapshotClass
。
注:默认情况下,Rclone movers 运行没有 root 权限。如果要以 root 用户身份运行 Rclone movers,请运行以下命令将升级的权限注解添加到您的命名空间。
oc annotate namespace <namespace> volsync.backube/privileged-movers=true
将 <namespace>
替换为您的命名空间的名称。
1.2.2. 将复制镜像转换为可用的持久性卷声明
您可能需要使用复制镜像来恢复数据,或者创建持久性卷声明的新实例。镜像的副本必须转换为持久性卷声明,然后才能使用它。要将复制镜像转换为持久性卷声明,请完成以下步骤:
复制完成后,输入以下命令识别
ReplicationDestination
对象的最新快照:$ kubectl get replicationdestination <destination> -n <destination-ns> --template={{.status.latestImage.name}}
记录下在创建持久性卷声明时的最新快照值。
将
destination
替换为复制目的地的名称。将
destination-ns
替换为您的目的地的命名空间。创建一个类似以下示例的
pvc.yaml
文件:apiVersion: v1 kind: PersistentVolumeClaim metadata: name: <pvc-name> namespace: <destination-ns> spec: accessModes: - ReadWriteOnce dataSource: kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io name: <snapshot_to_replace> resources: requests: storage: 2Gi
将
pvc-name
替换为您的新持久性卷声明的名称。将
destination-ns
替换为持久性卷声明所在的命名空间。使用您在上一步中找到的
VolumeSnapshot
名称替换snapshot_to_replace
。最佳实践:当值至少与初始源持久性卷声明大小相同时,您可以使用不同的值更新
resources.requests.storage
。输入以下命令验证您的持久性卷声明是否在环境中运行:
$ kubectl get pvc -n <destination-ns>
您的原始备份镜像作为主持久性卷声明运行。
1.2.3. 调度同步
在确定如何启动复制时,从三个选项中选择:始终运行、按计划或手动运行。调度复制是一个经常选择的选项。
Schedule 选项在计划的时间运行复制。调度由 cronspec
定义,因此调度可配置为间隔或特定时间。调度值的顺序为:
"minute (0-59) hour (0-23) day-of-month (1-31) month (1-12) day-of-week (0-6)"
复制将在调度的时间发生时开始。您为此复制选项的设置可能类似以下内容:
spec: trigger: schedule: "*/6 * * * *"
启用其中一种方法后,同步调度会根据您配置的方法运行。
如需了解更多信息和选项,请参阅 VolSync 文档。