配置持久卷声明的灾难恢复

要实现应用 PVC 的跨集群灾难恢复,请使用 Alauda Build of VolSync

概述

Alauda Build of VolSync 是一个 operator,用于在集群内或跨集群异步复制持久卷。VolSync 提供的复制与存储系统无关,允许对通常不支持远程复制的存储类型进行复制。此外,它还能跨不同类型(及厂商)的存储进行复制。

术语

术语说明
Primary Cluster活跃的生产站点。
Secondary Cluster备用恢复站点;保持待命状态,准备在灾难发生时接管。
Stateful Application使用 PVC 进行数据持久化的应用。
ReplicationSourceReplicationSource 是 VolSync 资源,用于定义源 PVC 和复制数据搬运方式,使您能够将 PVC 数据复制或同步到远程位置。
ReplicationDestinationReplicationDestination 是 VolSync 资源,用于定义 VolSync 复制或同步的目标位置。
Data MoversVolSync 的数据搬运器负责将数据从一个位置复制到另一个位置。

支持的搬运器包括:
  • Rclone
  • Restic
  • Rsync

前提条件

  • 下载 与您的平台架构对应的 Alauda Build of VolSync 安装包。
  • 使用上传软件包机制将 Alauda Build of VolSync 安装包上传到主集群和备集群。
  • 在主集群和备集群均已部署 Alauda Container Platform Snapshot Management
  • PVC 使用的存储必须由 CSI 供应,并支持 快照 功能。

部署 Alauda Build of VolSync

  1. 登录,进入 Administrator 页面。

  2. 点击 Marketplace > OperatorHub 进入 OperatorHub 页面。

  3. 找到 Alauda Build of VolSync,点击 Install,进入 Install Alauda Build of VolSync 页面。

    配置参数:

    参数推荐配置
    Channel默认通道为 stable
    Installation ModeCluster:集群内所有命名空间共享一个 Operator 实例进行创建和管理,资源占用较低。
    Installation Place选择 Recommended,命名空间仅支持 volsync-system
    Upgrade StrategyManual:Operator Hub 有新版本时,需要手动确认升级 Operator 到最新版本。

配置定时同步

配置 PVC 的定时同步后,VolSync 会按照指定的时间间隔自动将数据从 ReplicationSource 同步到 ReplicationDestination

本节介绍从主集群同步到备集群的配置步骤。若需从备集群同步到主集群,请将以下示例中的集群角色(主集群和备集群)互换。

创建 rsync-tls 数据搬运 Secret

主集群备集群 上创建该 Secret;如果 Secret 已存在则跳过此步骤。

命令
示例
apiVersion: v1
data:
  psk.txt: <psk>
kind: Secret
metadata:
  name: <name>
  namespace: <namespace>
type: Opaque

参数说明

参数说明
nameSecret 的名称
namespaceSecret 所在的命名空间,应与应用相同
psk此字段遵循 stunnel 期望的格式:<id>:<至少 32 个十六进制数字>
例如,1:23b7395fafc3e842bd8ac0fe142e6ad1

创建 ReplicationDestination 资源

备集群 创建 ReplicationDestination

命令
示例
cat << EOF | kubectl create -f -
apiVersion: volsync.backube/v1alpha1
kind: ReplicationDestination
metadata:
  name: rd-<pvc-name>
  namespace: <namespace>
spec:
  rsyncTLS:
    copyMethod: Snapshot
    destinationPVC: <pvc-name>
    keySecret: <key-secret>
    serviceType: <service-type>
    storageClassName: <storageclass-name>
    volumeSnapshotClassName: <volumesnapshotclass-name>
    moverSecurityContext:
      fsGroup: 65534
      runAsGroup: 65534
      runAsNonRoot: true
      runAsUser: 65534
      seccompProfile:
        type: RuntimeDefault
EOF

参数说明

参数说明
namespace命名空间,应与应用相同
pvc-name预先存在的 PVC 名称,应用所使用的
key-secret包含 TLS-PSK 密钥的 Secret 名称,用于与源端认证,参见步骤 1
service-typeVolSync 创建一个 Service 以允许源端连接目标端。此字段决定该 Service 的类型。允许值为 ClusterIPLoadBalancerNodePort
storageclass-name应用 PVC 使用的 storageclass 名称
volumesnapshotclass-name对应应用 PVC 的 volumesnapshotclass 名称
NOTE

关于 Service 类型

如果指定为 ClusterIP,Service 会从“集群网络”地址池中分配一个 IP 地址。默认情况下,这些地址集群外不可访问,因此不适合跨集群复制。但某些网络插件如 Submariner 可以桥接集群网络,使其成为可行选项。

如果指定为 LoadBalancer,会分配一个外部可访问的 IP 地址。这需要集群支持负载均衡器,如云厂商提供的负载均衡器或物理集群中的 MetalLB。虽然这是云环境中分配可访问地址最简单的方法,但负载均衡器通常会产生额外费用且数量有限。

创建 ReplicationSource 资源

主集群 创建 ReplicationSource

命令
示例
cat << EOF | kubectl create -f -
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
  name: rs-<pvc-name>
  namespace: <namespace>
spec:
  rsyncTLS:
    address: <address>
    copyMethod: Snapshot
    keySecret: <key-secret>
    port: <port>
    storageClassName: <storageclass-name>
    volumeSnapshotClassName: <volumesnapshotclass-name>
    moverSecurityContext:
      fsGroup: 65534
      runAsGroup: 65534
      runAsNonRoot: true
      runAsUser: 65534
      seccompProfile:
        type: RuntimeDefault
  sourcePVC: <pvc-name>
  trigger:
    schedule: <schedule>
EOF

参数说明

参数说明
namespace命名空间名称,应与应用相同
pvc-name应用 PVC 的名称
key-secretvolsync Secret 名称,参见步骤 1
address指定复制目标的 ssh 服务器地址,可直接取自 ReplicationDestination 的 .status.rsync.address 字段。
port连接目标的服务端口
storageclass-name应用 PVC 使用的 storageclass 名称
volumesnapshotclass-name对应应用 PVC 的 volumesnapshotclass 名称
schedule同步计划,使用 cronspec 定义,支持灵活的时间间隔、具体时间和/或日期设置。

检查同步状态

ReplicationSource 查看同步状态

命令
示例
kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status}'

最近一次同步完成时间为 .status.lastSyncTime,耗时 .status.lastSyncDuration 秒。

下一次计划同步时间为 .status.nextSyncTime

配置一次性同步

一次性同步由手动触发。通过在 ReplicationSource 资源的 trigger 规范下设置唯一字符串的 manual 字段来控制。应用配置后,同步任务会立即执行一次。

创建一次性 ReplicationSource 资源

命令
示例
cat << EOF | kubectl create -f -
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
  name: rs-<pvc-name>-latest
  namespace: <namespace>
spec:
  rsyncTLS:
    address: <address>
    copyMethod: Snapshot
    keySecret: <key-secret>
    port: <port>
    storageClassName: <storageclass-name>
    volumeSnapshotClassName: <volumesnapshotclass-name>
    moverSecurityContext:
      fsGroup: 65534
      runAsGroup: 65534
      runAsNonRoot: true
      runAsUser: 65534
      seccompProfile:
        type: RuntimeDefault
  sourcePVC: <pvc-name>
  trigger:
    manual: <manual-id>
EOF

定时同步的唯一区别是 .spec.trigger 设置为 manual

检查同步状态

命令
示例
kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'

如果输出与 <manual-id> 匹配,则同步完成。

启用应用 PVC 的灾难恢复

部署有状态应用

  1. 主集群 部署有状态应用
点击查看
cat << EOF | kubectl create -f -
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: sc-cephfs
  volumeMode: Filesystem

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ubuntu
  namespace: default
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: ubuntu
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: ubuntu
    spec:
      affinity: {}
      containers:
        - command:
            - sleep
            - infinity
          image: registry.alauda.cn:60070/ops/ubuntu:latest
          imagePullPolicy: Always
          name: ubuntu
          resources: {}
          securityContext:
            allowPrivilegeEscalation: false
            capabilities:
              drop:
                - ALL
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          volumeMounts:
            - mountPath: /data
              name: data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      terminationGracePeriodSeconds: 30
      volumes:
        - name: data
          persistentVolumeClaim:
            claimName: pvc-01
EOF
  1. 备集群 创建应用 PVC

    cat << EOF | kubectl create -f -
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: pvc-01
      namespace: default
    spec:
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: 10Gi
      storageClassName: sc-cephfs
      volumeMode: Filesystem
    EOF

配置 PVC 灾难恢复

设置 主集群到备集群 的同步

参见配置定时同步

计划迁移

用户场景

在主集群和备集群均正常运行的情况下,将业务服务从主集群迁移至备集群。

操作流程

  1. 缩减应用 Pod

    缩减所有使用灾难恢复 PVC 的应用 Pod,位于 主集群

  2. 删除 ReplicationSource 资源

    删除 主集群 上的 ReplicationSource

    命令
    示例
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  3. 创建一次性同步

    主集群 发起同步任务,确保 备集群 数据为最新。

    主集群 创建 ReplicationSource

    参见配置一次性同步

  4. 删除一次性同步

    一次性同步完成后,删除一次性 ReplicationSource 资源

    命令
    示例
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  5. 删除 ReplicationDestination 资源

    删除 备集群 上的 ReplicationDestination

    命令
    示例
    kubectl -n <namespace> delete ReplicationDestination <rd-name>
  6. 扩展应用 Pod

    扩展所有使用灾难恢复 PVC 的应用 Pod,位于 备集群

  7. 设置备集群到主集群的同步

    通过在 主集群 创建 ReplicationDestination,在 备集群 创建 ReplicationSource,设置 PVC 灾难恢复的 备集群到主集群 同步。

    参见配置定时同步

故障切换

用户场景

主集群突发宕机后,将服务切换至备集群。

操作流程

为确保数据完整性(防止主集群同步时发生故障),在 备集群 进行本地同步。以应用 PVC 最近快照恢复的 PVC 作为源,应用当前 PVC 作为目标,执行数据同步。

  1. 恢复 PVC

    备集群ReplicationDestination 恢复 PVC

    命令
    示例
    cat << EOF | kubectl create -f -
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: restored-<pvc-name>
      namespace: <namespace>
    spec:
      accessModes: [<access-modes>]
      dataSourceRef:
        kind: ReplicationDestination
        apiGroup: volsync.backube
        name: <rd-name>
      resources:
        requests:
          storage: <pvc-size>
      storageClassName: <storageclass-name>
    EOF
  2. 创建本地 ReplicationSource 资源

    备集群 创建 ReplicationSource 资源

    命令
    示例
    cat << EOF | kubectl create -f -    
    apiVersion: volsync.backube/v1alpha1
    kind: ReplicationSource
    metadata:
      name: rs-<pvc-name>-local
      namespace: <namespace>
    spec:
      rsyncTLS:
        address: <address>
        copyMethod: Snapshot
        keySecret: <key-secret>
        port: <port>
        storageClassName: <storageclass-name>
        volumeSnapshotClassName: <volumesnapshotclass-name>
        moverSecurityContext:
          fsGroup: 65534
          runAsGroup: 65534
          runAsNonRoot: true
          runAsUser: 65534
          seccompProfile:
            type: RuntimeDefault
      sourcePVC: restored-<pvc-name>
      trigger:
        manual: <manual-id>
    EOF

    参数参见配置一次性同步

  3. 等待同步完成

    命令
    示例
    kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'

    如果输出与 <manual-id> 匹配,则同步完成。

  4. 删除本地 ReplicationSource

    删除 备集群 上的本地 ReplicationSource

    命令
    示例
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  5. 删除 ReplicationDestination

    删除 备集群 上的 ReplicationDestination

    命令
    示例
    kubectl -n <namespace> delete ReplicationDestination <rd-name>
  6. 扩展应用 Pod

    扩展 备集群 上所有应用 Pod。

故障恢复后切换回主集群(Failback)

用户场景

主集群已恢复并正常运行,需要将服务切换回主集群。

操作流程

  1. 缩减主集群应用 Pod

    主集群恢复后,应用 Pod 会自动恢复,但需先缩减服务以停止流量。同步完备集群最新数据到主集群后,再扩展应用恢复正常运行。

  2. 删除主集群 ReplicationSource

    需先删除主集群故障前创建的 ReplicationSource

    命令
    示例
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  3. 从备集群同步最新数据

    设置 备集群到主集群 的一次性同步。

    在主集群创建 ReplicationDestination,在备集群创建一次性 ReplicationSource

    参见配置一次性同步

  4. 删除 ReplicationDestination 和 ReplicationSource

    数据同步完成后,删除一次性资源。

    删除备集群的 ReplicationSource

    命令
    示例
    kubectl -n <namespace> delete ReplicationSource <rs-name>

    删除主集群的 ReplicationDestination

    命令
    示例
    kubectl -n <namespace> delete ReplicationDestination <rd-name>
  5. 迁移应用

    缩减 备集群 应用 Pod

    扩展 主集群 应用 Pod

  6. 设置主集群到备集群的同步

    参见配置定时同步