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 | $ cat >> credentials-velero <<EOF |
Minio 的地址是 http://minio.default.svc:9000
Bucket 是 backups
,并且已经赋予了读写权限
subject(‘安装 Velero’)
1 | $ velero install --namespace velero \ |
部分参数说明:
名称 | 说明 |
---|---|
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 | $ cat >> credentials-velero-qiniu <<EOF |
然后将凭证创建为一个
secret
1 | $ kubectl create secret generic -n velero credential-qiniu --from-file=qiniu=credentials-velero-qiniu |
这里在 velero
命名空间创建一个名为 credential-qiniu
的 secret
,包含了一个 键名 为 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
不合法,但是我们并没有提供这个配置,所以我去找了下 Velero
和 velero-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 备份(不需要快照支持),定时备份等, 更详细的功能可以移步官方文档查看