Longhorn,企业级云原生容器分布式存储 - 备份与恢复

快照

手动快照

snapshot 是 Kubernetes Volume 在任何给定时间点的状态。
要创建现有集群的快照,

  1. 在 Longhorn UI 的顶部导航栏中,单击 Volume。
  2. 单击要为其创建快照的卷的名称。这会导致卷详细信息页面。
  3. 在Snapshots and Backups板块中,单击 Take Snapshot 按钮即可创建快照。
    创建快照后,您将在卷头(Volume Head)之前的卷的快照列表中看到它。

周期性快照和备份

从 Longhorn UI,可以安排周期性快照和备份。
要设置时间表(schedule),您将转到 Longhorn 中的卷详细信息视图。然后你将设置:
• schedule 类型,备份(backup)或快照(snapshot)
• 将创建备份或快照的时间,以 CRON expression 的形式
• 要保留的备份或快照的数量
• 应应用于备份或快照的任何标签(Any labels)
然后 Longhorn 会自动为当时的用户创建快照或备份,只要该卷附加到一个节点。
可以使用 Longhorn UI 或使用 Kubernetes StorageClass 配置周期性快照。

注意:为了避免当卷长时间没有新数据时,recurring jobs 可能会用相同的备份和空快照覆盖旧的备份/快照的问题,Longhorn 执行以下操作:
1. Recurring backup job 仅在自上次备份以来卷有新数据时才进行新备份。
2. Recurring snapshot job 仅在卷头(volume head)中有新数据(实时数据)时才拍摄新快照。

使用 Longhorn UI 设置周期性快照

可以从卷详细信息页面配置周期性快照和备份。要导航到此页面,请单击 Volume,,然后单击卷的名称。

使用 StorageClass 设置 Recurring Jobs

可以在 StorageClass 的 recurringJobs 参数中配置计划备份和快照。
使用这个 StorageClass 创建的任何未来卷都将自动设置这些 recurring jobs。
recurringJobs 字段应遵循以下 JSON 格式:

	kind: StorageClass
	    apiVersion: storage.k8s.io/v1
	    metadata:
	      name: longhorn
	    provisioner: driver.longhorn.io
	    parameters:
	      numberOfReplicas: "3"
	      staleReplicaTimeout: "30"
	      fromBackup: ""
	      recurringJobs: '[
	        {
	          "name":"snap",
	          "task":"snapshot",
	          "cron":"*/1 * * * *",
	          "retain":1
	        },
	        {
	          "name":"backup",
	          "task":"backup",
	          "cron":"*/2 * * * *",
	          "retain":1
	        }
	      ]'

应为每个 recurring job 指定以下参数:

  1. name:一项 job 的名称。不要在一个 recurringJobs 中使用重复的名称。 并且 name 的长度不能超过 8 个字符。
  2. task:一项 job 的类型。它仅支持 snapshot(定期创建快照)或backup(定期创建快照然后进行备份)。
  3. cron:Cron 表达式。它告诉一项 job 的执行时间。
  4. retain:Longhorn 将为一项 job 保留多少快照/备份(snapshots/backups)。应该不少于 1。

分离卷时允许 Recurring Job

Longhorn 提供了 allow-recurring-job-while-volume-detached 设置,即使卷已分离,您也可以进行周期性备份(recurring backup)。您可以在 Longhorn UI 中找到该设置。
启用该设置后,Longhorn 将自动附加卷并在需要执行周期性快照/备份(recurring snapshot/backup)时进行快照/备份。
请注意,在卷自动附加(attached automatically)期间,卷尚未准备好处理工作负载。Workload 必须等到 recurring job 完成。

容灾卷

容灾 (DR) 卷是一种特殊卷,主要用于在整个主集群出现故障时将数据存储在备份集群中。灾难恢复卷用于提高 Longhorn 卷的弹性。
对于灾难恢复卷,Last Backup 表示其原始备份卷的最新备份。
如果代表灾难卷的图标为灰色,则表示该卷正在恢复 Last Backup,并且该卷无法激活。如果图标为蓝色,则表示该卷已恢复 Last Backup。

创建容灾(DR)卷

	先决条件: 设置两个 Kubernetes 集群。它们将被称为集群 A 和集群 B。在两个集群上安装 Longhorn,并在两个集群上设置相同的备份目标。
  1. 在集群 A 中,确保原始卷 X 已创建备份或已安排 recurring backups。
  2. 在集群 B 的备份页面,选择备份卷 X,然后创建容灾卷 Y。强烈建议使用备份卷名作为容灾卷名。
  3. Longhorn 会自动将 DR 卷 Y 附加到随机节点。然后 Longhorn 将开始轮询卷 X 的最后一次备份,并将其增量恢复到卷 Y。

备份

设置备份目标

备份目标是用于访问 Longhorn 中 backupstore 的端点。backupstore 是 NFS 服务器或 S3 兼容服务器,用于存储 Longhorn 卷的备份。备份目标可以在 Settings/General/BackupTarget 中设置。

Longhorn 还支持通过 Longhorn UI 或 Kubernetes Storage Class 为卷设置周期性快照/备份(recurring snapshot/backup)作业。

使用阿里云OSS备份存储

准备工作

  1. 首先在阿里云开通OSS服务,并创建相应的Bucket
  2. 创建服务子账号,授予该账号对应Bucket的访问权限
  3. 记住子账号对应的accessKeyID、accessKeySecret,下边会用到

为 S3 兼容的备份存储启用 virtual-hosted-style 访问

在以下情况下,您可能需要为 S3 兼容的备份存储启用这种新的寻址方法

  1. 您想立即切换到这种新的访问方式,这样您就无需担心 Amazon S3 路径弃用计划;

  2. 您使用的 backupstore 只支持 virtual-hosted-style 的访问,例如:Alibaba Cloud(Aliyun) OSS;

  3. 您已配置 MINIO_DOMAIN 环境变量以启用 MinIO 服务器的 virtual-host-style 请求;

  4. 这个错误 … error: AWS Error: SecondLevelDomainForbidden Please use virtual hosted style to access. … 被触发。
    启用 virtual-hosted-style 访问的方法

  5. 将值为 true 的新字段 VIRTUAL_HOSTED_STYLE 添加到您的备份目标 secret。例如:

     apiVersion: v1
     kind: Secret
     metadata:
       name: oss-backup-target-secret 
       namespace: longhorn-system
     type: Opaque
     data:
       AWS_ACCESS_KEY_ID: bG9uZ2hvcm4tdGVzdC1hY2Nlc3Mta2V5
       AWS_SECRET_ACCESS_KEY: bG9uZ2hvcm4tdGVzdC1zZWNyZXQta2V5
       AWS_ENDPOINTS: aHR0cHM6Ly9taW5pby1zZXJ2aWNlLmRlZmF1bHQ6OTAwMA==
       VIRTUAL_HOSTED_STYLE: dHJ1ZQ== # true		
    

创建secret

在 Longhorn 所在的命名空间(默认为 longhorn-system)中创建一个名称为 oss-backup-target-secret的 Kubernetes secret。secret 必须在 longhorn-system 命名空间中创建,以便 Longhorn 访问它:

kubectl create secret generic oss-backup-target-secret --from-literal=AWS_ACCESS_KEY_ID=<your accessKeyID > --from-literal=AWS_SECRET_ACCESS_KEY=<your accessKeySecret> --from-literal=AWS_ENDPOINTS=<阿里云ENDPOINTS地址> --from-literal=VIRTUAL_HOSTED_STYLE=true -n longhorn-system

在LonghornUI中配置BackupTarget和Secret

  1. 转到 Longhorn UI。在顶部导航栏中,单击 Settings。 在 Backup 部分中,将 Backup Target 设置为:

     s3://<your-bucket-name>@<your-aws-region>/mypath/
     
     attention:
     	your-bucket-name: Bucket名称
     	your-aws-region:Bucket所在区域,例如oss-cn-beijing
     	确保末尾有 /,否则会报错。可以使用子目录(前缀):
    
  2. 在备份部分将 备份目标凭据 Secret(Backup Target Credential Secret) 设置为:oss-backup-target-secret

NFS 备份存储

要将 NFS 服务器用作备份存储,NFS 服务器必须支持 NFSv4。
目标 URL 应如下所示:

nfs://longhorn-test-nfs-svc.default:/opt/backupstore	

创建备份

Longhorn 中的 Backups 是在集群外备份存储中的对象。快照的备份被复制到备份存储,访问备份存储的端点是备份目标。

先决条件: 必须设置备份目标。有关更多信息,请参阅设置备份目标。如果尚未设置 BackupTarget,则会出现错误。

要创建备份,

  1. 导航到 Volume 菜单。
  2. 选择要备份的卷。
  3. 单击 Create Backup。
  4. 添加适当的标签并单击 OK。

Result: 备份已创建。要查看它,请单击顶部导航栏中的 Backup。

从备份恢复

Longhorn 可以轻松地将备份恢复到一个卷。
还原备份时,默认情况下会创建一个同名的卷。如果已存在与备份同名的卷,则不会恢复备份。
要恢复备份,

  1. 导航到 Backup 菜单
  2. 选择您要恢复的备份,然后单击 Restore Latest Backup
  3. 在 Name 字段中,选择要恢复的卷
  4. 单击 OK

Result: 恢复的卷在 Volume 页面上可用。

为 Kubernetes StatefulSets 恢复卷

Longhorn 支持恢复备份,该特性的一个用例是恢复 Kubernetes StatefulSet 中使用的数据,这需要为备份的每个副本恢复一个卷。
要恢复,请按照以下说明操作。下面的示例使用一个 StatefulSet。

  1. 连接到 Web 浏览器中的 Longhorn UI 页面。在 Backup 选项卡下,选择 StatefulSet 卷的名称。单击卷条目的下拉菜单并恢复它,将卷命名为稍后可以轻松引用的 Persistent Volumes。
Backup NameRestored Volume
pvc-01astatefulset-vol-0
pvc-01bstatefulset-vol-1

对需要恢复的每个卷重复此步骤。
例如,如果使用具有名为 pvc-01a 和 pvc-02b 的卷的两个副本恢复 StatefulSet,则恢复可能如下所示:
1. 在 Kubernetes 中,为每个恢复的 Longhorn 卷创建一个 Persistent Volume来绑定它。storage 容量、numberOfReplicas、storageClassName 和 volumeHandle 必须在下面替换。在这个例子中,我们在 Longhorn 中引用了 statefulset-vol-0 和 statefulset-vol-1,并使用 longhorn 作为我们的 storageClassName。

	kind: PersistentVolume
	apiVersion: v1
	metadata:
	  name: statefulset-vol-0
	spec:
	  capacity:
	    storage: 20Gi  # 和Longhron中恢复的卷的大小保持一致
	  storageClassName: longhorn  # must be same name that we will use later
	  volumeMode: Filesystem
	  accessModes:
	    - ReadWriteOnce
	  persistentVolumeReclaimPolicy: Retain
	  csi:
	    driver: driver.longhorn.io  # driver must match this
	    fsType: ext4
	    volumeAttributes:
	      numberOfReplicas: '3'   # Longhorn恢复的卷的副本数
	      staleReplicaTimeout: '30'
	    volumeHandle: statefulset-vol-0  # 在Longhorn中恢复的卷的名称
	---
	kind: PersistentVolume
	apiVersion: v1
	metadata:
	  name: statefulset-vol-1
	spec:
	  capacity:
	    storage: 20Gi  # 和Longhron中恢复的卷的大小保持一致
	  storageClassName: longhorn  # must be same name that we will use later
	  volumeMode: Filesystem
	  accessModes:
	    - ReadWriteOnce
	  persistentVolumeReclaimPolicy: Retain
	  csi:
	    driver: driver.longhorn.io  # driver must match this
	    fsType: ext4
	    volumeAttributes:
	      numberOfReplicas: '3'   # Longhorn恢复的卷的副本数
	      staleReplicaTimeout: '30'
	    volumeHandle: statefulset-vol-1  # 在Longhorn中恢复的卷的名称
  1. 在 namespace 中,将部署 StatefulSet,为上面创建的每个 Persistent Volume 创建 PersistentVolume Claims来进行绑定。Persistent Volume Claim 的名称必须遵循以下命名方案:

     <name of Volume Claim Template>-<name of StatefulSet>-<index>
    
  2. StatefulSet Pod 是零索引(zero-indexed)的。 在这个例子中,Volume Claim Template 的名字是 data,StatefulSet 的名字是 webapp, 并且有两个副本,分别是索引 0 和 1。

     kind: PersistentVolumeClaim
     apiVersion: v1
     metadata:
       name: data-webapp-0
       namespace: database
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 20Gi  # 必须和上边定义的PV中的大小保持一致
       storageClassName: longhorn
       volumeName: statefulset-vol-0   # 上边创建的PV的名字
     ---
     kind: PersistentVolumeClaim
     apiVersion: v1
     metadata:
       name: data-webapp-1
       namespace: database
     spec:
       accessModes:
         - ReadWriteOnce
       resources:
         requests:
           storage: 20Gi  # 必须和上边定义的PV中的大小保持一致
       storageClassName: longhorn
       volumeName: statefulset-vol-1   # 上边创建的PV的名字
    
  3. 创建 StatefulSet:

     apiVersion: apps/v1beta2
     kind: StatefulSet
     metadata:
       name: webapp # match this with the PersistentVolumeClaim naming scheme
     spec:
       selector:
         matchLabels:
           app: nginx # has to match .spec.template.metadata.labels
       serviceName: "nginx"
       replicas: 2 # by default is 1
       template:
         metadata:
           labels:
             app: nginx # has to match .spec.selector.matchLabels
         spec:
           terminationGracePeriodSeconds: 10
           containers:
           - name: nginx
             image: k8s.gcr.io/nginx-slim:0.8
             ports:
             - containerPort: 80
               name: web
             volumeMounts:
             - name: data
               mountPath: /usr/share/nginx/html
       volumeClaimTemplates:
       - metadata:
           name: data # match this with the PersistentVolumeClaim naming scheme
         spec:
           accessModes: [ "ReadWriteOnce" ]
           storageClassName: longhorn # must match name from earlier
           resources:
             requests:
               storage: 20Gi # must match size from earlier
    

Result: 现在应该可以从 StatefulSet Pods 内部访问恢复的数据。

整个恢复流程如下:

  1. 在Longhorn中恢复对应的卷,并为其取一个名字
  2. 在Kubernetes中创建PV,通过volumeHandle关键字来绑定Longhorn中恢复的卷
  3. 在Kubernetes中创建PVC,通过volumeName关键字绑定特定的PV
  4. 创建Deployment或者StatefulSet来使用定义的PVC
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅抒流年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值