配置持久卷声明的灾难恢复
要实现跨集群的原生应用 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 提供的复制独立于存储系统,因此可以在通常不支持远程复制的存储类型之间进行复制。此外,它还可以在不同类型(以及不同供应商)的存储之间进行复制。
术语
前提条件
- 下载与平台架构对应的 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
-
登录并前往管理员页面。
-
点击 Marketplace > OperatorHub,进入 OperatorHub 页面。
-
找到 Alauda Storage Volume Replication(更名前发布的软件包显示为 Alauda Build of VolSync),点击安装,然后前往 Install Alauda Storage Volume Replication 页面。
配置参数:
配置计划同步
为 PVC 配置计划同步后,VolSync 将按照指定的时间间隔,自动将数据从 ReplicationSource 同步到 ReplicationDestination。
本节介绍如何将数据从主集群同步到辅助集群。若要从辅助集群同步到主集群,请交换以下示例中的集群角色(主集群和辅助集群)。
创建 rsync-tls Data Mover Secret
在主集群和辅助集群上创建 Secret;如果 Secret 已存在,则跳过此步骤。
apiVersion: v1
data:
psk.txt: <psk>
kind: Secret
metadata:
name: <name>
namespace: <namespace>
type: Opaque
apiVersion: v1
data:
# echo -n 1:23b7395fafc3e842bd8ac0fe142e6ad1 | base64
psk.txt: MToyM2I3Mzk1ZmFmYzNlODQyYmQ4YWMwZmUxNDJlNmFkMQ==
kind: Secret
metadata:
name: volsync-rsync-tls
namespace: default
type: Opaque
参数:
创建 ReplicationDestination Resource
在辅助集群上创建 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
cat << EOF | kubectl create -f -
apiVersion: volsync.backube/v1alpha1
kind: ReplicationDestination
metadata:
name: rd-pvc-01
namespace: default
spec:
rsyncTLS:
copyMethod: Snapshot
destinationPVC: pvc-01
keySecret: volsync-rsync-tls
serviceType: NodePort
storageClassName: sc-cephfs
volumeSnapshotClassName: csi-cephfs-snapshotclass
moverSecurityContext:
fsGroup: 65534
runAsGroup: 65534
runAsNonRoot: true
runAsUser: 65534
seccompProfile:
type: RuntimeDefault
EOF
参数:
NOTE
关于 Service 类型
如果指定 ClusterIP,Service 将从“集群网络”地址池中分配一个 IP 地址。默认情况下,这些地址无法从集群外部访问,因此不适合跨集群复制。但是,Submariner 等各种网络插件可以桥接集群网络,因此此选项也适用。
如果指定 LoadBalancer,将分配一个可从外部访问的 IP 地址。这要求集群支持负载均衡器,例如各云服务提供商提供的负载均衡器;对于物理集群,则需要 MetalLB。虽然这是在云环境中分配可访问地址的最简单方法,但负载均衡器通常会产生额外成本,且数量有限。
创建 ReplicationSource Resource
在主集群上创建 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
cat << EOF | kubectl create -f -
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
name: rs-pvc-01
namespace: default
spec:
rsyncTLS:
address: 192.168.129.201
copyMethod: Snapshot
keySecret: volsync-rsync-tls
port: 30532
storageClassName: sc-cephfs
volumeSnapshotClassName: csi-cephfs-snapshotclass
moverSecurityContext:
fsGroup: 65534
runAsGroup: 65534
runAsNonRoot: true
runAsUser: 65534
seccompProfile:
type: RuntimeDefault
sourcePVC: pvc-01
trigger:
schedule: "*/10 * * * *"
EOF
参数:
检查同步状态
检查 ReplicationSource 的同步状态
kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status}'
kubectl -n default get ReplicationSource rs-pvc-01 -o jsonpath='{.status}'
上次同步于 .status.lastSyncTime 完成,耗时 .status.lastSyncDuration 秒。
下一次计划同步时间为 .status.nextSyncTime。
配置一次性同步
一次性同步由手动触发。通过在 ReplicationSource 资源的触发器规范中为 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
cat << EOF | kubectl create -f -
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
name: rs-pvc-01-latest
namespace: default
spec:
rsyncTLS:
address: 192.168.129.201
copyMethod: Snapshot
keySecret: volsync-rsync-tls
port: 30532
storageClassName: sc-cephfs
volumeSnapshotClassName: csi-cephfs-snapshotclass
moverSecurityContext:
fsGroup: 65534
runAsGroup: 65534
runAsNonRoot: true
runAsUser: 65534
seccompProfile:
type: RuntimeDefault
sourcePVC: pvc-01
trigger:
manual: latest
与计划同步的唯一区别是,.spec.trigger 应设置为 manual。
检查同步状态
kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'
kubectl -n default get ReplicationSource rs-pvc-01-latest -o jsonpath='{.status.lastManualSync}'
如果输出与 <manual-id> 匹配,则表示同步已完成。
为应用 PVC 启用灾难恢复
部署有状态应用
- 在 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
-
在 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 集群。
操作步骤
-
缩减应用 Pod
在 Primary 集群上缩减所有使用 dr PVC 的应用 Pod。
-
删除 ReplicationSource 资源
在 Primary 集群上删除 ReplicationSource
kubectl -n <namespace> delete ReplicationSource <rs-name>
kubectl -n default delete ReplicationSource rs-pvc-01
-
创建一次性同步
从 Primary 集群发起同步任务,以确保 Secondary 集群中的数据为 up-to-date。
在 Primary 集群上创建 ReplicationSource
参阅配置一次性同步
-
删除一次性同步
一次性同步完成后,删除一次性 ReplicationSource 资源
kubectl -n <namespace> delete ReplicationSource <rs-name>
kubectl -n default delete ReplicationSource rs-pvc-01-latest
-
删除 ReplicationDestination 资源
在 Secondary 集群上删除 ReplicationDestination
kubectl -n <namespace> delete ReplicationDestination <rd-name>
kubectl -n default delete ReplicationDestination rd-pvc-01
-
扩展应用 Pod
在 Secondary 集群上扩展所有使用 dr PVC 的应用 Pod。
-
设置 Secondary 到 Primary 的同步
通过在 Primary 集群上创建 ReplicationDestination,并在 Secondary 集群上创建 ReplicationSource,设置 Secondary-to-Primary 集群同步以实现 PVC 灾难恢复。
参阅配置计划同步
Failover
用户场景:
Primary 集群意外关闭后,将服务切换到 Secondary 集群。
操作步骤
为确保数据完整性(如果 Primary 集群在同步期间发生故障),请在 Secondary 集群上执行本地同步。使用从应用 PVC 的最新快照恢复的 PVC 作为源,并使用应用当前的 PVC 作为目标,执行数据同步。
-
恢复 PVC
在 Secondary 集群上从 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
cat << EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: restored-pvc-01
namespace: default
spec:
accessModes: [ReadWriteMany]
dataSourceRef:
kind: ReplicationDestination
apiGroup: volsync.backube
name: rd-pvc-01
resources:
requests:
storage: 10Gi
storageClassName: sc-cephfs
EOF
-
创建本地 ReplicationSource 资源
在 Secondary 集群上创建 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
cat << EOF | kubectl create -f -
apiVersion: volsync.backube/v1alpha1
kind: ReplicationSource
metadata:
name: rs-pvc-01-local
namespace: default
spec:
rsyncTLS:
address: 192.168.129.201
copyMethod: Snapshot
keySecret: volsync-rsync-tls
port: 30532
storageClassName: sc-cephfs
volumeSnapshotClassName: csi-cephfs-snapshotclass
moverSecurityContext:
fsGroup: 65534
runAsGroup: 65534
runAsNonRoot: true
runAsUser: 65534
seccompProfile:
type: RuntimeDefault
sourcePVC: restored-pvc-01
trigger:
manual: latest
EOF
参数请参阅配置一次性同步
-
等待同步完成
kubectl -n <namespace> get ReplicationSource <rs-name> -o jsonpath='{.status.lastManualSync}'
kubectl -n default get ReplicationSource rs-pvc-01-local -o jsonpath='{.status.lastManualSync}'
如果输出匹配 <manual-id>,则表示同步完成。
-
删除本地 ReplicationSource
在 Secondary 集群上删除本地 ReplicationSource
kubectl -n <namespace> delete ReplicationSource <rs-name>
kubectl -n default delete ReplicationSource rs-pvc-01-local
-
删除 ReplicationDestination
在 Secondary 集群上删除 ReplicationDestination
kubectl -n <namespace> delete ReplicationDestination <rd-name>
kubectl -n default delete ReplicationDestination rd-pvc-01
-
扩展应用 Pod
在 Secondary 集群上扩展所有应用 Pod。
故障恢复(灾难恢复后)
用户场景:
主集群现已恢复并正常运行,因此需要将服务切回主集群。
操作步骤
-
缩减 Primary 集群上的应用 Pod
主集群恢复在线后,应用 Pod 将自动恢复。但是,必须先缩减服务以停止流量。将最新数据从辅助集群同步到主集群后,即可扩展应用以恢复正常运行。
-
删除 Primary 集群上的 ReplicationSource
需要先删除 Primary 集群发生故障前创建的 ReplicationSource。
kubectl -n <namespace> delete ReplicationSource <rs-name>
kubectl -n default delete ReplicationSource rs-pvc-01
-
从 Secondary 集群同步最新数据
设置 Secondary-to-Primary 一次性同步。
在 Primary 集群上创建 ReplicationDestination,然后在 Secondary 集群上创建一次性 ReplicationSource
参考配置一次性同步
-
删除 ReplicationDestination 和 ReplicationSource
数据同步完成后,删除一次性资源
在 Secondary 集群上删除 ReplicationSource
kubectl -n <namespace> delete ReplicationSource <rs-name>
kubectl -n default delete ReplicationSource rs-pvc-01-latest
在 Primary 集群上删除 ReplicationDestination
kubectl -n <namespace> delete ReplicationDestination <rd-name>
kubectl -n default delete ReplicationDestination rd-pvc-01
-
迁移应用
缩减 Secondary 集群上的应用 Pod
扩展 Primary 集群上的应用 Pod
-
设置 Primary 到 Secondary 的同步
参考配置计划同步