1.21.3. 在受管集群中配置 Rsync 复制

对于基于 Rsync 的复制,请在源和目标集群上配置自定义资源。自定义资源使用 address 值将源连接到目的地,sshKeys 则用于确保传输的数据安全。

注: 您必须将 addresssshKeys 的值从目的地复制到源,因此请在配置源前配置目的地。

本例显示了一个步骤,将 Rsync 复制的配置从使用 source-ns 命名空间中的 source 集群中的持久性卷声明,改为使用 destination-ns 命名空间中的 destination 集群上的持久性卷声明。如果需要,您可以将这些值替换为其他值。

  1. 配置您的目标集群。

    1. 在目标集群中运行以下命令以创建命名空间:

      $ kubectl create ns <destination-ns>

      destination-ns 替换为将要包含目标持久性卷声明的命名空间的名称。

    2. 复制以下 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 替换为目的地所在的命名空间的名称。

      在本例中,使用 LoadBalancerServiceType 值。负载均衡器服务由源集群创建,以便您的源集群可以将信息传送到不同的目标受管集群。如果您的源和目标集群位于相同的集群中,或者配置了 Submariner 网络服务,您可以使用 ClusterIP 作为服务类型。请注意配置源集群时要指向的 secret 的地址和名称。

      storageClassNamevolumeSnapshotClassName 是可选参数。指定您的环境的值,特别是您使用的存储类和卷快照类名称与您的环境的默认值不同。

    3. 在目标集群中运行以下命令以创建 replicationdestination 资源:

      $ kubectl create -n <destination-ns> -f replication_destination.yaml

      destination-ns 替换为目的地所在的命名空间的名称。

      创建 replicationdestination 资源后,将以下参数和值添加到资源中:

      参数value

      .status.rsync.address

      用于连接的目标集群的 IP 地址,用于启用源和目标集群进行通信。

      .status.rsync.sshKeys

      启用保护从源集群到目标集群的数据传输的 SSH 密钥文件的名称。

    4. 运行以下命令复制 .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
    5. 运行以下命令复制 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
  2. 找到您要复制的源持久性卷声明。

    注: 源持久性卷声明必须位于 CSI 存储类中。

  3. 创建 ReplicationSource 项。

    1. 复制以下 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: csi-aws-vsc

      source 替换为复制源 CR 的名称。有关如何替换此功能的步骤,请参阅此流程中的第 3-vi 步。

      source-ns 替换为源所在持久性卷声明的命名空间。有关如何替换此功能的步骤,请参阅此流程中的第 3-vi 步。

      persistent_volume_claim 替换为源持久性卷声明的名称。

      使用您从 ReplicationDestination.status.rsync.sshKeys 字段复制的密钥替换 mysshkeys

      my.host.com 替换为您在配置 ReplicationDestination.status.rsync.address 字段复制的主机地址。

      如果您的存储驱动程序支持克隆,使用 Clone 作为 copyMethod 的值,则可能是更精简的复制过程。

      storageClassNamevolumeSnapshotClassName 是可选参数。如果您使用与环境默认值不同的存储类和卷快照类名称,请指定这些值。

      现在,您可以设置持久性卷的同步方法。

    2. 通过针对目标集群输入以下命令从目标集群复制 SSH secret:

      $ kubectl get secret -n <destination-ns> $SSHKEYS -o yaml > /tmp/secret.yaml

      destination-ns 替换为目标所在持久性卷声明的命名空间。

    3. 输入以下命令在 vi 编辑器中打开 secret 文件:

      $ vi /tmp/secret.yaml
    4. 在目标集群的 open secret 文件中进行以下更改:

      • 将命名空间更改为源集群的命名空间。本例中是 source-ns
      • 删除所有者引用(.metadata.ownerReferences)。
    5. 在源集群中,在源集群中输入以下命令来创建 secret 文件:

      $ kubectl create -f /tmp/secret.yaml
    6. 在源集群中,使用以下命令将 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

      注: 您必须在与要复制的持久性卷声明相同的命名空间中创建该文件。

    7. 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 没有列出时间,则复制不会完成。