1、官网地址

Velero Docs - Customize Velero Install
https://github.com/vmware-tanzu/velero-plugin-for-aws
https://github.com/vmware-tanzu/velero
https://github.com/AliyunContainerService/velero-plugin

2、部署前置要求

  1. velero 客户端需要能够连接 kube-apiserver 服务
  2. 已经安装好 minio 或者兼容S3的存储服务 作为S3存储

3、下载velero

此步骤需要在master节点进行,因为 velero 需要 rbac 权限操作集群,我的k8s版本为1.21.x此处我将选择1.9.0版本

image.png

mkdir -p /app/velero && cd /app/velero

wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.0/velero-v1.9.0-linux-amd64.tar.gz
tar xf velero-v1.9.0-linux-amd64.tar.gz
cp velero-v1.9.0-linux-amd64/velero /usr/local/bin/

4、部署velero

1、参数描述

  1. –bucket velero 此处的velero为minio的存储桶bucket名称必须预先创建,例如–bucket k8s
  2. –secret-file ./credentials-velero 此处文件为上述配置,由它来提供velero连接到minio的配置秘钥信息
  3. –use-volume-snapshots=false 例如有一些csi是不支持卷快照功能的,例如nfs,local,如果使用此等csi需要配置成为false,后续使用use-restic备份技术,打包这些csi的卷内容进行备份
  4. –use-restic 使用restic备份技术,将卷内容加密打包存储到bucket中,restic无视csi类型,它支持k8s中的任意volume卷
  5. –default-volumes-to-restic 表示默认备份使用restic来备份卷内容,需要搭配–use-restic一起使用
  6. –kubeconfig /root/.kube/config 表示velero需要rbac权限,连接k8s调用资源导入导出备份等
  7. –wait 等待完成

2、plugin兼容性

此处我们选择v1.5.0版本对应velero的v1.9.x版本

image.png

3、多平台部署

请读者结合实际需求,自行决定采取哪种部署方案

1、备份方案

velero install \
  --velero-pod-cpu-request <CPU_REQUEST> \
  --velero-pod-mem-request <MEMORY_REQUEST> \
  --velero-pod-cpu-limit <CPU_LIMIT> \
  --velero-pod-mem-limit <MEMORY_LIMIT> \
  [--use-restic] \
  [--default-volumes-to-restic] \
  [--restic-pod-cpu-request <CPU_REQUEST>] \
  [--restic-pod-mem-request <MEMORY_REQUEST>] \
  [--restic-pod-cpu-limit <CPU_LIMIT>] \
  [--restic-pod-mem-limit <MEMORY_LIMIT>]


# 方案1、不备份volume卷
velero install \
...
--use-volume-snapshots=false \
...

# 方案2、备份volume卷,此方案为手动自定义备份volume卷
velero install \
...
--use-volume-snapshots=false \
--use-restic
...

2、minio方式

此处需要去 minio 中创建 bucket 存储桶,然后创建秘钥key与secret即可

mkdir -p /app/velero && cd /app/velero

cat << EOF | sudo tee credentials-velero >> /dev/null
[default]
aws_access_key_id = ???
aws_secret_access_key = ???
EOF
mkdir -p /app/velero && cd /app/velero

# 备份volume数据
velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.5.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--use-restic \
--kubeconfig /root/.kube/config \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://172.31.0.21:9000 \
--wait

3、阿里云oss

https://github.com/AliyunContainerService/velero-plugin

mkdir -p /app/velero && cd /app/velero

#读者自行前往上述github地址阅读操作aliyun与创建access key,注意不能加上[default],仅需以下两行阿里云配置即可
cat << EOF | sudo tee credentials-velero >> /dev/null
ALIBABA_CLOUD_ACCESS_KEY_ID=???
ALIBABA_CLOUD_ACCESS_KEY_SECRET=???
EOF
# 上文方案2、备份volume数据
velero install \
  --provider alibabacloud \
  --image registry.cn-hangzhou.aliyuncs.com/acs/velero:1.4.2-2b9dce65-aliyun \
  --bucket tqd-velero \
  --secret-file ./credentials-velero \
  --backup-location-config region=cn-hangzhou \
  --use-volume-snapshots=false \
  --use-restic \
  --kubeconfig /root/.kube/config \
  --plugins registry.cn-hangzhou.aliyuncs.com/acs/velero-plugin-alibabacloud:v1.0.0-2d33b89 \
  --wait

4、卸载velero

kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

5、检查状态

kubectl get po -n velero -owide

image.png

6、操作命令

1、基础命令

请注意 ruoyi-cloud-v1 为备份名称,仅作为命令参数参考

1、备份

# 备份创建
velero backup create ? --include-namespaces ?
velero backup create ruoyi-cloud-v1 --include-namespaces ruoyi-cloud

# 备份列表
velero backup get

# 备份删除
velero backup delete ?
velero backup delete ruoyi-cloud-v1

# backup日志
velero backup describe ?
velero backup describe ruoyi-cloud-v1
velero backup logs ?
velero backup logs ruoyi-cloud-v1

2、还原

请注意,velero在还原时会丢弃原来使用的nodePort信息他会为service生成新的nodePort,如需要继续使用备份前的nodePort请加上–preserve-nodeports

# 先kubectl delete ns ??? 再进行还原模拟丢失数据
velero restore create --from-backup ruoyi-cloud-v1 --wait

# 还原的同时不要为service服务生成新端口,继续使用旧端口
velero restore create --preserve-nodeports --wait --from-backup ruoyi-cloud-v1 

# 还原列表
velero restore get

# restore日志
velero restore describe ?
velero restore describe ruoyi-cloud-v1
velero restore logs ?
velero restore logs ruoyi-cloud-v1

3、定时备份

# 列表定时任务
velero schedule get
# 删除定时任务
velero schedule delete ?
velero schedule delete ruoyi-cloud-v1

# 每日1点进行备份
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *"
# 每日1点进行备份,备份保留72小时
velero create schedule <SCHEDULE NAME> --schedule="0 1 * * *" --ttl 72h
# 每5小时进行一次备份
velero create schedule <SCHEDULE NAME> --schedule="@every 5h"
# 每日对 指定 namespace 进行一次备份 (如ruoyi-cloud)
velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces ruoyi-cloud

2、高级操作

Velero Docs - Restic Integration
https://velero.io/docs/v1.9/restic/#backup

这是velero很重要的部分很多人无法理解在此我将详解,velero只有两种备份volume方式,一种是opt-in包含模式 一种是opt-out排除模式。这里我使用pvc模拟,他不仅仅支持pvc,其他格式的例如emptyDir: {}也可以,只要是volumes下面的都支持

  • opt-in包含模式 ,假设有一个sts有状态服务它有10个pvc我们只想备份其中的2个pvc这个时候我们就可以用opt-in包含模式,包含其中的2个pvc备份即可
  • opt-out排除模式,假设有一个sts有状态服务它有10个pvc我们需要备份其中的7个pvc这个时候用排除模式排除掉另外的3个不需要的pvc即可,剩下的pvc全部备份

1、opt-in包含模式

apiVersion: v1
metadata:
  name: sample
  namespace: default
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-webserver
    volumeMounts:
    - name: pvc-volume1
      mountPath: /volume-1
    - name: pvc-volume2
      mountPath: /volume-2
    - name: pvc-volume。。。。。10
      mountPath: /volume-。。。。。10
  volumes:
  - name: pvc-volume1
    persistentVolumeClaim:
      claimName: test-volume-claim1
  - name: pvc-volume2
    persistentVolumeClaim:
      claimName: test-volume-claim2
    # 这里我模拟有10个pvc哈
  - name: pvc-volume。。。。。10
    persistentVolumeClaim:
      claimName: test-volume-claim。。。。。10
    
# 如果我们需要备份pvc-volume1和pvc-volume2这两个volume即给该pod添加annotate注解让velero识别
# 1、添加 annotate 注解,多个volume用逗号分隔
kubectl -n default annotate pod/sample backup.velero.io/backup-volumes=pvc-volume1,pvc-volume2
# 2、执行备份命令即可,切记!!!!不能加上 --default-volumes-to-restic 参数
velero backup create NAME OPTIONS... 

2、opt-out排除模式

apiVersion: v1
metadata:
  name: sample
  namespace: default
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-webserver
    volumeMounts:
    - name: pvc-volume1
      mountPath: /volume-1
    - name: pvc-volume2
      mountPath: /volume-2
    - name: pvc-volume。。。。。10
      mountPath: /volume-。。。。。10
  volumes:
  - name: pvc-volume1
    persistentVolumeClaim:
      claimName: test-volume-claim1
  - name: pvc-volume2
    persistentVolumeClaim:
      claimName: test-volume-claim2
    # 这里我模拟有10个pvc哈
  - name: pvc-volume。。。。。10
    persistentVolumeClaim:
      claimName: test-volume-claim。。。。。10
      
# 我们这里假设有10个pvc,我需要排除pvc-volume1,剩下的9个pvc我都需要执行备份
# 1、添加 annotate 注解,多个volume用逗号分隔
kubectl -n default annotate pod/sample backup.velero.io/backup-volumes-excludes=pvc-volume1
# 2、执行备份命令即可,注意!!!opt-out模式需要加上--default-volumes-to-restic参数
velero backup create BACKUP_NAME --default-volumes-to-restic OTHER_OPTIONS

7、异常排查

# 获取所有备份
root@node1:/app/velero# velero backup get
NAME      STATUS            ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
test-v7   PartiallyFailed   1        0          2023-12-03 15:52:08 +0800 CST   29d       default            <none>
test-v8   Completed         0        0          2023-12-03 15:56:08 +0800 CST   29d       default            <none>

# 使用 velero backup logs test-v7 | grep error 过滤 error 关键词查看异常信息
root@node1:/app/velero# velero backup logs test-v7 |grep error
time="2023-12-03T07:52:33Z" level=info msg="1 errors encountered backup up item" backup=velero/test-v7 logSource="pkg/backup/backup.go:413" name=test-nginx-v1-0
time="2023-12-03T07:52:33Z" level=error msg="Error backing up item" backup=velero/test-v7 error="pod volume backup failed: error running restic backup, stderr=Fatal: unable to open config file: Stat: The specified key does not exist.\nIs there a repository at the following location?\ns3:http://172.31.0.21:9000/tqd-velero/restic/test\n: exit status 1" error.file="/go/src/github.com/vmware-tanzu/velero/pkg/restic/backupper.go:184" error.function="github.com/vmware-tanzu/velero/pkg/restic.(*backupper).BackupPodVolumes" logSource="pkg/backup/backup.go:417" name=test-nginx-v1-0

8、restic定时维护

当执行velero delete backup的时候,他会立刻到bucket中删除backups与restores的相关内容,但是值得一提的是restic中的数据不会立刻被删除,velero有一个Resticrepository的自定义CRD资源,在里面会有restic的定时任务程序,默认7天执行一次,会将没有backup引用的restic废弃数据给删除掉,到那个时候才会真正的从bucket中删除无用的restic数据从而释放硬盘空间,你也可以直接修改这个自定义CRD资源中的内容以达到你期望的执行间隔。希望各位可以留意这一点

image.png
image.png
image.png

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐