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

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

NOTE

从 ACP 4.5 开始,Alauda Build of VolSync 更名为 Alauda Storage Volume Replication。从 Customer Portal 下载插件时,请搜索 Alauda Storage Volume Replication。在更名之前发布的插件软件包上传后,平台中仍会显示 Alauda Build of VolSync。

概述

Alauda Build of VolSync 是一个 operator,可在集群内或跨集群对持久卷执行异步复制。VolSync 提供的复制独立于存储系统,因此可以在通常不支持远程复制的存储类型之间进行复制。此外,它还可以在不同类型(以及不同供应商)的存储之间进行复制。

术语

术语说明
主集群活跃的生产站点。
辅助集群待机恢复站点;保持待机状态,以便在发生灾难时接管。
有状态应用使用 PVC 持久化数据的应用。
ReplicationSourceReplicationSource 是一种 VolSync 资源,可用于定义源 PVC 和复制移动器类型,从而将 PVC 数据复制或同步到远程位置
ReplicationDestinationReplicationDestination 是一种 VolSync 资源,可用于定义 VolSync 复制或同步的目标位置。
数据移动器VolSync 的数据移动器负责将数据从一个位置复制到另一个位置。

支持的移动器:
  • Rclone
  • Restic
  • Rsync

前提条件

  • 下载与平台架构对应的 Alauda Storage Volume Replication(此前名为 Alauda Build of VolSync)安装包。
  • 在主集群和辅助集群中,使用 Upload Packages 机制上架 Alauda Storage Volume Replication(此前名为 Alauda Build of VolSync)安装包。
  • Alauda Container Platform Snapshot Management 已部署在主集群和辅助集群中。
  • PVC 使用的存储必须由 CSI 进行置备,并支持 snapshot 功能。

部署 Alauda Build of VolSync

  1. 登录并前往管理员页面。

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

  3. 找到 Alauda Storage Volume Replication(更名前发布的软件包显示为 Alauda Build of VolSync),点击安装,然后前往 Install Alauda Storage Volume Replication 页面。

    配置参数:

    参数建议配置
    Channel默认通道为 stable。
    安装模式Cluster:集群中的所有命名空间共享一个 Operator 实例,用于创建和管理,从而降低资源使用量。
    安装位置选择 Recommended,Namespace 仅支持 volsync-system。
    升级策略Manual:Operator Hub 中有新版本时,需要手动确认才能将 Operator 升级到最新版本。

配置计划同步

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

本节介绍如何将数据从主集群同步到辅助集群。若要从辅助集群同步到主集群,请交换以下示例中的集群角色(主集群和辅助集群)。

创建 rsync-tls Data Mover Secret

在主集群和辅助集群上创建 Secret;如果 Secret 已存在,则跳过此步骤。

Command
Example
apiVersion: v1
data:
  psk.txt: <psk>
kind: Secret
metadata:
  name: <name>
  namespace: <namespace>
type: Opaque

参数:

参数说明
nameSecret 的名称
namespaceSecret 所在的命名空间,应与应用程序相同
psk此字段遵循 stunnel 所需的格式:<id>:<at least 32 hex digits>。
例如:1:23b7395fafc3e842bd8ac0fe142e6ad1。

创建 ReplicationDestination Resource

在辅助集群上创建 ReplicationDestination

Command
Example
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 的名称,应用程序使用该 PVC
key-secret包含用于与源端进行连接身份验证的 TLS-PSK 密钥的 Secret 名称,在步骤 1中创建
service-typeVolSync 创建一个 Service,以便源端连接到目标端。此字段用于确定该 Service 的类型。允许的值为 ClusterIP、LoadBalancer 或 NodePort。
storageclass-name应用程序 PVC 使用的 storageclass 名称
volumesnapshotclass-name与应用程序 PVC 对应的 volumesnapshotclass 名称
NOTE

关于 Service 类型

如果指定 ClusterIP,Service 将从“集群网络”地址池中分配一个 IP 地址。默认情况下,这些地址无法从集群外部访问,因此不适合跨集群复制。但是,Submariner 等各种网络插件可以桥接集群网络,因此此选项也适用。

如果指定 LoadBalancer,将分配一个可从外部访问的 IP 地址。这要求集群支持负载均衡器,例如各云服务提供商提供的负载均衡器;对于物理集群,则需要 MetalLB。虽然这是在云环境中分配可访问地址的最简单方法,但负载均衡器通常会产生额外成本,且数量有限。

创建 ReplicationSource Resource

在主集群上创建 ReplicationSource

Command
Example
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

参数:

参数说明
namespaceNamespace 的名称,与应用程序相同
pvc-name应用程序 PVC 的名称
key-secret在步骤 1中创建的 volsync Secret 的名称
addressreplication destination 的 SSH 服务器地址。可以直接从 ReplicationDestination 的 .status.rsync.address 字段中获取。
port用于连接目标端的 Service 端口
storageclass-name应用程序 PVC 使用的 storageclass 名称
volumesnapshotclass-name与应用程序 PVC 对应的 volumesnapshotclass 名称
schedule同步计划,由 cronspec 定义,因此具有很大的灵活性。既可以指定时间间隔,也可以指定特定的时间和/或日期。

检查同步状态

检查 ReplicationSource 的同步状态

Command
Example
kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status}'

上次同步于 .status.lastSyncTime 完成,耗时 .status.lastSyncDuration 秒。

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

配置一次性同步

一次性同步由手动触发。通过在 ReplicationSource 资源的触发器规范中为 manual 字段设置唯一字符串来控制此操作。应用配置后,同步作业会立即运行一次。

创建一次性 ReplicationSource 资源

Command
Example
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。

检查同步状态

Command
Example
kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'

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

为应用 PVC 启用灾难恢复

部署有状态应用

  1. 在 Primary 集群上部署有状态应用
单击以查看
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. 在 Secondary 集群上创建应用 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 灾难恢复

设置 Primary-to-Secondary 同步

参阅配置计划同步

计划迁移

用户场景:

在两个集群均正常运行时,将业务服务从 Primary 集群迁移到 Secondary 集群。

操作步骤

  1. 缩减应用 Pod

    在 Primary 集群上缩减所有使用 dr PVC 的应用 Pod。

  2. 删除 ReplicationSource 资源

    在 Primary 集群上删除 ReplicationSource

    Command
    Example
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  3. 创建一次性同步

    从 Primary 集群发起同步任务,以确保 Secondary 集群中的数据为 up-to-date。

    在 Primary 集群上创建 ReplicationSource

    参阅配置一次性同步

  4. 删除一次性同步

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

    Command
    Example
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  5. 删除 ReplicationDestination 资源

    在 Secondary 集群上删除 ReplicationDestination

    Command
    Example
    kubectl -n <namespace> delete ReplicationDestination <rd-name>
  6. 扩展应用 Pod

    在 Secondary 集群上扩展所有使用 dr PVC 的应用 Pod。

  7. 设置 Secondary 到 Primary 的同步

    通过在 Primary 集群上创建 ReplicationDestination,并在 Secondary 集群上创建 ReplicationSource,设置 Secondary-to-Primary 集群同步以实现 PVC 灾难恢复。

    参阅配置计划同步

Failover

用户场景:

Primary 集群意外关闭后,将服务切换到 Secondary 集群。

操作步骤

为确保数据完整性(如果 Primary 集群在同步期间发生故障),请在 Secondary 集群上执行本地同步。使用从应用 PVC 的最新快照恢复的 PVC 作为源,并使用应用当前的 PVC 作为目标,执行数据同步。

  1. 恢复 PVC

    在 Secondary 集群上从 ReplicationDestination 恢复 PVC

    Command
    Example
    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 资源

    在 Secondary 集群上创建 ReplicationSource 资源

    Command
    Example
    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. 等待同步完成

    Command
    Example
    kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'

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

  4. 删除本地 ReplicationSource

    在 Secondary 集群上删除本地 ReplicationSource

    Command
    Example
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  5. 删除 ReplicationDestination

    在 Secondary 集群上删除 ReplicationDestination

    Command
    Example
    kubectl -n <namespace> delete ReplicationDestination <rd-name>
  6. 扩展应用 Pod

    在 Secondary 集群上扩展所有应用 Pod。

故障恢复(灾难恢复后)

用户场景:

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

操作步骤

  1. 缩减 Primary 集群上的应用 Pod

    主集群恢复在线后,应用 Pod 将自动恢复。但是,必须先缩减服务以停止流量。将最新数据从辅助集群同步到主集群后,即可扩展应用以恢复正常运行。

  2. 删除 Primary 集群上的 ReplicationSource

    需要先删除 Primary 集群发生故障前创建的 ReplicationSource。

    Command
    Example
    kubectl -n <namespace> delete ReplicationSource <rs-name>
  3. 从 Secondary 集群同步最新数据

    设置 Secondary-to-Primary 一次性同步。

    在 Primary 集群上创建 ReplicationDestination,然后在 Secondary 集群上创建一次性 ReplicationSource

    参考配置一次性同步

  4. 删除 ReplicationDestination 和 ReplicationSource

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

    在 Secondary 集群上删除 ReplicationSource

    Command
    Example
    kubectl -n <namespace> delete ReplicationSource <rs-name>

    在 Primary 集群上删除 ReplicationDestination

    Command
    Example
    kubectl -n <namespace> delete ReplicationDestination <rd-name>
  5. 迁移应用

    缩减 Secondary 集群上的应用 Pod

    扩展 Primary 集群上的应用 Pod

  6. 设置 Primary 到 Secondary 的同步

    参考配置计划同步