《预防手残 Velero 集群备份部署 初见!》

  1. 1. pre-post()
  2. 2. subject(‘安装 Velero 命令’)
    1. 2.1. macOS with Homebrew
    2. 2.2. Windows with Chocolatey
    3. 2.3. Linux
  3. 3. subject(‘准备S3存储凭证’)
  4. 4. subject(‘安装 Velero’)
  5. 5. subject(‘创建一个七牛备份位置’)
  6. 6. subject(‘小插曲 - 存储位置状态为空或Unavailable’)
  7. 7. subject(‘创建一个备份’)
  8. 8. subject(‘End’)

pre-post()

虽然很早之前就有过用 Velero 对K8S集群备份的了解,但一直没有实施部署,导致由于手欠/BUG对我的K8S造成了一定程度的打击,虽然最后也恢复业务运行了,但着实花了不少时间,而且如果稍微不留神可能会有对整个业务宕机的风险,所以今天就把 Velero 部署起来,并记录一下遇到的一些问题

本文编写使用的环境:

OS: macOS BigSur
Kubernetes: v1.21.2
Velero: v1.6.1

我们照着官网的教程来进行安装,由于踩过网上搜的教程的坑,所以这里以我正确安装的步骤为记录,跳过部分坑

由于我采用的是 CLI 安装方法,故可能相对繁琐一些,如果有兴趣的可以使用 Helm 安装,这里给出官方的说明文档

https://github.com/vmware-tanzu/helm-charts/blob/main/charts/velero/README.md

以下操作均在同一命名空间 velero 进行

subject(‘安装 Velero 命令’)

macOS with Homebrew

1
$ brew install velero

Windows with Chocolatey

1
$ choco install velero

Linux

https://github.com/vmware-tanzu/velero/releases 下载

subject(‘准备S3存储凭证’)

Velero 支持多种存储方式,可以以装插件的形式扩展,这里我用的是 S3 兼容的 Minio

准备一个凭证文件 credentials-velero

1
2
3
4
5
$ cat >> credentials-velero <<EOF
[default]
aws_access_key_id = <accesskey>
aws_secret_access_key = <secretkey>
EOF

Minio 的地址是 http://minio.default.svc:9000

Bucket 是 backups,并且已经赋予了读写权限

subject(‘安装 Velero’)

1
2
3
4
5
6
7
8
$ velero install --namespace velero \
--namespace velero \
--provider aws \
--plugins velero/velero-plugin-for-aws:v1.2.0 \
--bucket backups \
--secret-file ./credentials-velero \
--use-volume-snapshots=false \
--backup-location-config region=minio,s3ForcePathStyle="true",s3Url="http://minio.default.svc:9000",publicUrl=""

部分参数说明:

名称 说明
provider 存储插件
plugins 额外的插件,这里装的是S3插件,我这里使用的是v1.2.0,建议正式安装前查询下最新的版本或使用 latest 作为 image tag
secret-file 凭证文件,提供路径
use-volume-snapshots 启用存储快照,由于我CSI用的本地存储不支持快照,所以设置false
backup-location-config S3插件配置

部分插件配置参数说明:

名称 说明
s3Url S3 API域名
publicUrl 公开域名,用于下载用的,我这里因为没有外部访问所以没设置

具体的插件配置信息可以在这里参考

https://github.com/vmware-tanzu/velero-plugin-for-aws/blob/master/backupstoragelocation.md

可以通过命令来检查运行状态是否安装成功

1
$ kubectl logs deployment/velero -n velero

subject(‘创建一个七牛备份位置’)

安装 Velero 时会提供并创建一个默认的备份位置,但是实际情况下可能会有不同的保存地方,我安装的时候采用的是在集群内部安装的 minio,这里我添加 七牛OSS 存储来保证不会因为集群母鸡宕机而导致备份丢失

虽然 Velero 支持插件扩展存储类型支持,但是目前七牛还没有 Velero 的插件,好在七牛也是 兼容S3 的,所以我们只要使用 aws 插件就可以了

在空间管理里找到 S3域名 复制里面的 Endpoint 域名,我的域名是 s3-cn-east-2.qiniucs.com

同样我们需要先创建一个凭证文件

1
2
3
4
5
$ cat >> credentials-velero-qiniu <<EOF
[default]
aws_access_key_id = <accesskey>
aws_secret_access_key = <secretkey>
EOF

然后将凭证创建为一个 secret

1
$ kubectl create secret generic -n velero credential-qiniu --from-file=qiniu=credentials-velero-qiniu

这里在 velero 命名空间创建一个名为 credential-qiniusecret,包含了一个 键名 为 qiniu 值为文件 credentials-velero-qiniu 的内容

添加存储位置

1
$ velero backup-location create qiniu --bucket k8s-backup --provider aws --config region=cn-east-2,s3ForcePathStyle="true",s3Url=https://s3-cn-east-2.qiniucs.com,publicUrl="https://download.k8s-backup.com" --credential=credential-qiniu=qiniu --default

部分参数说明

名称 说明
credential 凭证secret,格式为 <secret-name>=<key>
default 设置为默认存储位置

检查存储位置状态

1
$ kubectl describe Backupstoragelocations/qiniu -n velero | grep Phase

显示 Available 就创建成功了

subject(‘小插曲 - 存储位置状态为空或Unavailable’)

由于一开始在网上找了其他博客的教程进行安装,所以踩了个坑,这里记录一下,可以跳过这段

先检查 velero 运行日志

1
$ kubectl logs -n velero deploy/velero

返回的日志里有很多 error, 我摘抄一段

1
time="2021-07-18T09:56:11Z" level=error msg="Error getting a backup store" backup-storage-location=qiniu controller=backup-storage-location error="rpc error: code = Unknown desc = config has invalid keys [credentialsFile]; valid keys are [region s3Url publicUrl kmsKeyId s3ForcePathStyle signatureVersion profile serverSideEncryption insecureSkipTLSVerify bucket prefix caCert]" error.file="/go/src/github.com/vmware-tanzu/velero-plugin-for-aws/vendor/github.com/vmware-tanzu/velero/pkg/plugin/framework/validation.go:50" error.function=github.com/vmware-tanzu/velero-plugin-for-aws/vendor/github.com/vmware-tanzu/velero/pkg/plugin/framework.validateConfigKeys logSource="pkg/controller/backup_storage_location_controller.go:100"

这里可以看到,问题出在插件的配置上, config has invalid keys [credentialsFile], 这里配置 credentialsFile 不合法,但是我们并没有提供这个配置,所以我去找了下 Velerovelero-plugin-for-aws 的仓库,并追溯这个参数的来源

通过搜索找到了一个 Velero 的PR, #3443 这个PR提供了 Backupstoragelocations 的外部多凭证支持,并且标记为 v1.6.0

1
$ velero version

通过命令查询客户端和服务端版本发现安装的版本是 v1.6.1, 所以是支持这个特性的

接着找 velero-plugin-for-aws 的仓库源码跟踪 credentialsFile 发现也做了适配,但是通过查询

1
$ kubectl describe -n velero deploy/velero

Init Containers 里发现 velero-velero-plugin-for-aws 的版本是 v1.1.0, 而目前最新版是 v1.2.0,而 credentialsFile 适配也是 v1.2.0 才做的,所以这里是因为网上教程太旧导致安装了旧版出现的问题,通过修改 deploy 的 image 版本解决了这个问题

现在查询状态就是 Avaliable 了,所以这里建议用 latest 作为插件image tag避免安装旧版插件产生其他问题

subject(‘创建一个备份’)

到这里所有配置都搞好了,我们就可以开始手动创建一个新备份了,Velero支持选择性备份,可以针对特别的 Namespace, Selector 等进行备份,更详细的介绍可以移步官方文档

我这里创建一个默认备份,会备份集群的所有描述文件

1
$ velero backup create first

查询备份状态

1
$ velero backup describe first | grep Phase

显示 Completed 就已经备份完成了,可以在Bucket里看到已经上传的备份文件

下载备份

我们还可以通过上述配置的 publicUrl 下载我们的备份文件和备份日志

1
$ velero backup download first

然后就下载到本地了,也可以自己手动去对象存储里下载

subject(‘End’)

到这里初步的体验就结束了,Velero 后续的还有 Volume 备份(不需要快照支持),定时备份等, 更详细的功能可以移步官方文档查看