使用 velero 备份 Kubernetes 集群方案

简介
Velero 是一款云原生时代的灾难恢复和迁移工具,采用 Go 语言编写,并在 github 上进行了开源,开源地址为:https://github.com/vmware-tanzu/velero。Velero 源于西班牙语,意思为帆船,非常符合 Kubernetes 社区的命名风格。
中文社区地址:https://velero.cn/
利用 velero 用户可以安全的备份、恢复和迁移 Kubernetes 集群资源和持久卷。它的基本原理就是将集群的数据,例如集群资源和持久化数据卷备份到对象存储中,在恢复的时候将数据从对象存储中拉取下来。除了灾备之外它还能做资源移转,支持把容器应用从一个集群迁移到另一个集群,这也是 velero 一个非常成功的使用场景。
在资源备份方面,velero 支持将数据备份到众多的云存储中,例如AWS S3或S3兼容的存储系统、Azure Blob、Google Cloud存储、Aliyun OSS等。与备份整个 kubernetes 的数据存储引擎 etcd 相比,velero 的控制更加细化,可以对 Kubernetes 集群内对象级别进行备份,还可以通过对 Type、Namespace、Label 等对象进行分类备份或者恢复。
如何工作
Velero 由以下组件组成:
- 集群中的 Velero 服务器
- CLI 客户端
- 集群中的静态守护程序集
Velero 备份如何工作的图表:
以下是 Velero 恢复工作的方式:
公有云存储备份还原方案
自建存储备份还原方案
先决条件
- Kubernetes 集群版本 1.19 到 1.23 与 DNS
- 安装了 kubectl
- 安装了helm3
- Velero cli 安装 https://Velero.io/docs/main/basic-install/
- 集群部署存储插件
安装 minio 服务
添加 minio 仓库
$ helm repo add bitnami https://charts.bitnami.com/bitnami
$ helm repo update
helm 安装 minio 服务
$ helm install minio bitnami/minio -n minio \
--set global.storageClass=df-nfs-storage \
--set auth.rootUser=admin \
--set auth.rootPassword=erwewrwerewrwerwerw34 \
--set mode=standalone --create-namespace
验证部署
$ kubectl get pods -n minio -w
NAME READY STATUS RESTARTS AGE
minio-75dd97bddd-jqt8p 0/1 ContainerCreating 0 16s
minio-75dd97bddd-jqt8p 0/1 Running 0 39s
minio-75dd97bddd-jqt8p 1/1 Running 0 46s
创建 velero bucket
$ export ROOT_USER=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-user}" | base64 -d)
$ export ROOT_PASSWORD=$(kubectl get secret --namespace minio minio -o jsonpath="{.data.root-password}" | base64 -d)
$ kubectl run --namespace minio minio-client \
--rm --tty -i --restart='Never' \
--env MINIO_SERVER_ROOT_USER=$ROOT_USER \
--env MINIO_SERVER_ROOT_PASSWORD=$ROOT_PASSWORD \
--env MINIO_SERVER_HOST=minio \
--image docker.io/bitnami/minio-client:2022.11.7-debian-11-r0 -- mb minio/velero
部署 velero deployment
创建凭证
在本地目录中创建 credentials-velero
特定的凭据文件:
[default]
aws_access_key_id = admin
aws_secret_access_key = erwewrwerewrwerwerw34
执行安装
$ velero install \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.1.0 \
--bucket velero \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://minio.minio:9000
验证部署
kubectl get pods -n velero
NAME READY STATUS RESTARTS AGE
velero-84bc648cf-gfdhc 0/1 PodInitializing 0 53s
velero-84bc648cf-gfdhc 1/1 Running 0 56s
测试功能
创建测试配置
$ kubectl create ns test
$ kubectl create deploy test --image=nginx -n test
$ kubectl get pods -n test
NAME READY STATUS RESTARTS AGE
test-764c85dd84-mspkg 1/1 Running 0 38s
velero 备份
$ velero backup create test-backup --snapshot-volumes --include-namespaces test
$ velero get backup
NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
test-backup Completed 0 0 2022-11-13 02:42:16 +0800 CST 29d default <none>
模拟误删除 namespace
$ kubectl delete ns test
namespace "test" deleted
$ kubectl get ns test
Error from server (NotFound): namespaces "test" not found
velero 还原
velero restore create --from-backup test-backup --include-namespaces test
查看是否恢复
$ kubectl get all -n test
NAME READY STATUS RESTARTS AGE
pod/test-764c85dd84-mspkg 1/1 Running 0 40s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/test 1/1 1 1 41s
NAME DESIRED CURRENT READY AGE
replicaset.apps/test-764c85dd84 1 1 1 41s
恢复成功
velero 相关命令
备份所有配置(不包含pvc数据)
velero backup create all-aws-df --wait
查看备份
velero get backup
恢复备份
velero restore create --from-backup test-backup #指定对应的备份名称 恢复集群所有备份,(对已经存在的服务不会覆盖)
定期备份
对集群资源进行定时备份,则可在发生意外的情况下,进行恢复(默认情况下,备份保留 30 天)
每日1点进行备份
velero create schedule --schedule="0 1 * * *"
每日1点进行备份,备份保留48小时
velero create schedule --schedule="0 1 * * *" --ttl 48h
每日1点进行备份,备份保留7天
velero create schedule prd-aws-df --schedule="0 1 * * *" --ttl 168h
每6小时进行一次备份
velero create schedule --schedule="@every 6h"
每日对 web namespace 进行一次备份
velero create schedule --schedule="@every 24h" --include-namespaces web
备份带pv的pod
velero backup create pvc-backup --snapshot-volumes --include-namespaces test-velero
恢复带pv的pod
velero restore create --from-backup pvc-backup --restore-volumes
其他
# kubectl delete ns forethought-core func func2 forethought-webclient forethought-kodo middleware utils launcher
velero restore create --from-backup prd-aws-df-20221025010049 --include-namespaces forethought-core,func,func2,forethought-webclient,forethought-kodo,middleware,utils,launcher # 恢复上上个注释删除的的删除内容
velero backup download xxx # 备份导出,可以上传远程存储,做异地
velero get backup #备份查看
velero get schedule #查看定时备份
velero get restore #查看已有的恢复
velero get plugins #查看插件
velero restore create --from-backup all-ns-backup #恢复集群所有备份,(对已经存在的服务不会覆盖)
velero restore create --from-backup all-ns-backup --include-namespaces default,nginx-example #仅恢复 default nginx-example namespace
Velero可以将资源还原到与其备份来源不同的命名空间中。为此,请使用--namespace-mappings标志
velero restore create RESTORE_NAME --from-backup BACKUP_NAME --namespace-mappings old-ns-1:new-ns-1,old-ns-2:new-ns-2
例如下面将test-velero 命名空间资源恢复到test-velero-1下面
velero restore create restore-for-test --from-backup everyday-1-20210203131802 --namespace-mappings test-velero:test-velero-1
#定时备份
velero create schedule prd-aws-df --schedule="0 1 * * *" --ttl 168h
velero 生产环境备份经验
-
设置定时备份
-
没有备份 pvc 数据, 可根据实际情况备份
-
Velero 还原后,有各别 svc label 没设置成功,需要手动处理
-
Velero 还原后,Headless svc 有个 pod-template 需要手动处理
-
定期查看备份是否成功,防止意外发生,追悔莫及
