1、玩转k8s之velero部署与实践
这是velero很重要的部分很多人无法理解在此我将详解,velero只有两种备份volume方式,一种是opt-in包含模式 一种是opt-out排除模式。请注意,velero在还原时会丢弃原来使用的nodePort信息他会为service生成新的nodePort,如需要继续使用备份前的nodePort请加上–preserve-nodeports。此步骤需要在master节点进行,因为 veler
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、部署前置要求
- velero 客户端需要能够连接 kube-apiserver 服务
- 已经安装好 minio 或者兼容S3的存储服务 作为S3存储
3、下载velero
此步骤需要在master节点进行,因为 velero 需要 rbac 权限操作集群,我的k8s版本为1.21.x此处我将选择1.9.0版本
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、参数描述
- –bucket velero 此处的velero为minio的存储桶bucket名称必须预先创建,例如–bucket k8s
- –secret-file ./credentials-velero 此处文件为上述配置,由它来提供velero连接到minio的配置秘钥信息
- –use-volume-snapshots=false 例如有一些csi是不支持卷快照功能的,例如nfs,local,如果使用此等csi需要配置成为false,后续使用use-restic备份技术,打包这些csi的卷内容进行备份
- –use-restic 使用restic备份技术,将卷内容加密打包存储到bucket中,restic无视csi类型,它支持k8s中的任意volume卷
- –default-volumes-to-restic 表示默认备份使用restic来备份卷内容,需要搭配–use-restic一起使用
- –kubeconfig /root/.kube/config 表示velero需要rbac权限,连接k8s调用资源导入导出备份等
- –wait 等待完成
2、plugin兼容性
此处我们选择v1.5.0版本对应velero的v1.9.x版本
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
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资源中的内容以达到你期望的执行间隔。希望各位可以留意这一点
更多推荐
所有评论(0)