使用Velero进行集群备份、恢复与迁移
前言:
一般来说大家都用 etcd 备份恢复 k8s 集群,但是有时候我们可能误操删掉了一个 namespace,假设这个 namespaces 里面有上百个服务,瞬间没了,怎么办?
velero 可以帮助我们:
灾备场景,提供备份恢复 k8s 集群的能力
迁移场景,提供拷贝集群资源到其他集群的能力(复制同步开发,测试,生产环境的集群配置,简化环境配置)
下面我就介绍一下如何使用 Velero 完成备份和迁移。
- Velero 地址:
https://github.com/vmware-tanzu/velero
- ACK 插件地址:
https://github.com/AliyunContainerService/velero-plugin
Velero 是 VMWare 开源的 k8s 集群备份、迁移工具。可以帮助我们完成 k8s 的例行备份工作,以便在出现上面问题的时候可以快速进行恢复。同时也提供了集群迁移功能,可以将 k8s 资源迁移到其他 k8s 集群的功能。Velero 将集群资源保存在对象存储中,默认情况下可以使用 AWS、Azure、GCP 的对象存储,同时也给出了插件功能用来拓展其他平台的存储,这里我们用到的就是阿里云的对象存储 OSS,阿里云也提供了 Velero 的插件,用于将备份存储到 OSS 中。下面我就介绍一下如何在阿里云容器服务 ACK 使用 Velero 完成备份和迁移。
Velero 工作原理
Velero 首先会在集群中创建各种 CRD 以及相关的控制器,通过对 CRD 对象的操作完成备份、恢复行为。Velero 的工作原理图如下:
Velero 客户端调用 Kubernetes API 服务器创建 Backup 对象。
BackupController 监听 Backup 对象变化,以执行备份过程。
备份时,BackupController 通过 API Server 查询相关数据。
备份后,BackupController 将数据上传到对象存储。
安装 Velero 服务
Velero 由客户端和服务端组成,服务器部署在目标 k8s 集群上,而客户端则是运行在本地的命令行工具。
前往 Velero 的 Release 页面 下载客户端,直接在 GitHub 上下载即可
[root@k8s-master-01 ~]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.4.0/velero-v1.4.0-linux-amd64.tar.gz
解压 release 包
[root@k8s-master-01 ~]# tar xf velero-v1.4.0-linux-amd64.tar.gz
将 release 包中的二进制文件 velero 移动到 $PATH 中的某个目录下,(一般情况 /usr/local/bin/ )
[root@k8s-master-01 ~]# mv velero /usr/local/bin/
[root@k8s-master-01 ~]# ls /usr/local/bin/velero
/usr/local/bin/velero
执行 velero -h 测试
创建 OSS bucket
创建一个 OSS bucket 用于存储备份文件,这里也可以用已有的 bucket,之后会在 bucket 中创建 test 目录,这里建议在已有的 bucket 中创建一个子目录用于存储备份文件。
创建 OSS Bucket 过程~~~~
创建 OSS 的时候一定要选对区域,要和 ACK 集群在同一个区域,存储类型和读写权限选择标准存储和私有:
创建阿里云 RAM 用户
用于操作 OSS 以及 ACK 资源,新建权限策略,
策略内容:(进行测试时)
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "oss:*",
"Resource": ["acs:oss:*:*:pps-k8s-backup/*", "acs:oss:*:*:pps-k8s-backup"]
}
]
}
在新建用户的时候要选择 编程访问,来获取 AccessKeyID 和 AccessKeySecret。
部署服务端
- 拉取 Velero 插件 :
git clone https://github.com/AliyunContainerService/velero-plugin
- 修改配置:
修改 install/credentials-velero 文件,
将新建用户中获得的 AccessKeyID 和 AccessKeySecret 填入,这里的 OSS EndPoint 为之前 OSS 的访问域名(注:这里需要选择外网访问的 EndPoint。)
[root@k8s-master-01 velero-plugin]# more install/credentials-velero
ALIBABA_CLOUD_ACCESS_KEY_ID=<ALIBABA_CLOUD_ACCESS_KEY_ID>
ALIBABA_CLOUD_ACCESS_KEY_SECRET=<ALIBABA_CLOUD_ACCESS_KEY_SECRET>
ALIBABA_CLOUD_OSS_ENDPOINT=<ALIBABA_CLOUD_OSS_ENDPOINT>
- 修改 install/01-velero.yaml,将 OSS 配置填入:
---
apiVersion: velero.io/v1
kind: BackupStorageLocation
metadata:
labels:
component: velero
name: default
namespace: velero
spec:
config:
region: cn-shenzhen # 地域 如果是深圳 变为 cn-shenzhen
objectStorage:
bucket: pps-k8s-backup # OSS bucket 名称
prefix: "test" # bucket 子目录,也就是说存放备份数据的目录
provider: alibabacloud
---
apiVersion: velero.io/v1
kind: VolumeSnapshotLocation
metadata:
labels:
component: velero
name: default
namespace: velero
spec:
config:
region: cn-shenzhen # 地域 如果是深圳 变为 cn-shenzhen
provider: alibabacloud
- k8s 部署 Velero 服务
新建 namespace
kubectl create namespace velero
部署 credentials-velero 的 secret
kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
部署 CRD
kubectl apply -f install/00-crds.yaml
部署 Velero
kubectl apply -f install/01-velero.yaml
- 测试 Velero 状态
[root@k8s-master-01 velero-plugin]# velero version
Client:
Version: v1.4.0
Git commit: 5963650c9d64643daaf510ef93vc4a46b6283392
Server:
Version: v1.2.0
可以看到 Velero 的客户端和服务端已经部署成功。
- 服务端清理
在完成测试或者需要重新安装时,执行如下命令进行清理:
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero
备份测试
[root@k8s-master-01 velero-plugin]# kubectl get pods -n panshi-qtc-dev
panshi-qtc-dev panshi-api3rd-server-7cdb88b4c7-dp7f5 1/1 Running 0 5d1h
panshi-qtc-dev panshi-contract-server-7dc4544966-bxlp7 1/1 Running 0 4d23h
panshi-qtc-dev panshi-pdf-server-7774fc6c48-ljr7j 1/1 Running 0 5d22h
panshi-qtc-dev panshi-storage-server-75b88b8bdf-7f4js 1/1 Running 0 5d1h
panshi-qtc-dev panshi-system-server-7fc894cbff-hxxq9 1/1 Running 0 4d23h
- 使用 velero 对 panshi-qtc-dev 进行备份处理
[root@k8s-master-01 velero-plugin]# velero backup create panshi-backup --include-namespaces panshi-qtc-dev --wait
Backup request "panshi-backup" submitted successfully.
Waiting for backup to complete. You may safely press ctrl-c to stop waiting - your backup will continue in the background.
..
Backup completed with status: Completed. You may check for more information using the commands `velero backup describe panshi-backup` and `velero backup logs panshi-backup`.
- 查看备份是否成功
[root@k8s-master-01 velero-plugin]# velero backup describe panshi-backup
Name: panshi-backup
Namespace: velero
Labels: velero.io/storage-location=default
Annotations: <none>
Phase: Completed
Namespaces:
Included: panshi-qtc-dev
Excluded: <none>
Resources:
Included: *
Excluded: <none>
Cluster-scoped: auto
Label selector: <none>
Storage Location: default
Velero-Native Snapshot PVs: auto
TTL: 720h0m0s
Hooks: <none>
Backup Format Version: 1
Started: 2020-06-17 10:09:28 +0800 CST
Completed: 2020-06-17 10:09:31 +0800 CST
Expiration: 2020-07-17 10:09:28 +0800 CST
Velero-Native Snapshots: <none included>
- 查看 OSS 备份 (默认)
- 在现有集群中删除掉 panshi-qtc-dev 所有资源 (其实只需要 delete namespaces panshi-qtc-dev )
[root@k8s-master-01 velero-plugin]# kubectl delete namespaces panshi-qtc-dev
namespace "panshi-qtc-dev" deleted
[root@k8s-master-01 velero-plugin]# kubectl get pods -n panshi-qtc-dev
No resources found in panshi-qtc-dev namespace.
[root@k8s-master-01 velero-plugin]# kubectl get svc -n panshi-qtc-dev
No resources found in panshi-qtc-dev namespace.
[root@k8s-master-01 velero-plugin]# kubectl get ing -n panshi-qtc-dev
No resources found in panshi-qtc-dev namespace.
[root@k8s-master-01 velero-plugin]# kubectl get namespaces | grep panshi-qtc-dev
- 查看 panshi-qtc-dev 的备份
[root@k8s-master-01 velero-plugin]# velero backup get | grep panshi-backup
panshi-backup Completed 2020-06-17 10:09:28 +0800 CST 29d default <none>
- 使用 panshi-qtc-dev 的备份 对 panshi-qtc-dev 进行恢复
[root@k8s-master-01 velero-plugin]# velero restore create --from-backup panshi-backup --wait
Restore request "panshi-backup-20200617101819" submitted successfully.
Waiting for restore to complete. You may safely press ctrl-c to stop waiting - your restore will continue in the background.
.
Restore completed with status: Completed. You may check for more information using the commands `velero restore describe panshi-backup-20200617101819` and `velero restore logs panshi-backup-20200617101819`.
[root@k8s-master-01 velero-plugin]# kubectl get pods -n panshi-qtc-dev
NAME READY STATUS RESTARTS AGE
panshi-api3rd-server-7cdb88b4c7-dp7f5 1/1 Running 0 26s
panshi-contract-server-7dc4544966-bxlp7 1/1 Running 0 26s
panshi-pdf-server-7774fc6c48-ljr7j 1/1 Running 0 26s
panshi-storage-server-75b88b8bdf-7f4js 1/1 Running 0 26s
panshi-system-server-7fc894cbff-hxxq9 1/1 Running 0 26s
[root@k8s-master-01 velero-plugin]# kubectl get svc -n panshi-qtc-dev
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
panshi-api3rd-server ClusterIP 10.107.61.235 <none> 8899/TCP 33s
panshi-contract-server ClusterIP 10.101.127.48 <none> 8060/TCP 33s
panshi-pdf-server ClusterIP 10.108.234.180 <none> 8940/TCP 33s
panshi-storage-server ClusterIP 10.106.5.116 <none> 9100/TCP 33s
panshi-system-server ClusterIP 10.109.232.187 <none> 8250/TCP 33s
至此 :使用 velero 对集群备份恢复已经实现
- 使用 velero 恢复后观察 OSS
高级用法
- 定时备份
对集群资源进行定时备份,则可在发生意外的情况下,进行恢复(默认情况下,备份保留 30 天)。
# 每日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 进行一次备份 (如panshi-qtc-dev)
velero create schedule <SCHEDULE NAME> --schedule="@every 24h" --include-namespaces panshi-qtc-dev
定时备份的名称为:-
,
恢复命令为:velero restore create --from-backup -
。
备份删除
- 直接执行命令进行删除
velero delete backups <BACKUP_NAME>
备份资源查看
备份查看
velero backup get
查看定时备份
velero schedule get
查看可恢复备份
velero restore get
备份排除项目
可为资源添加指定标签,添加标签的资源在备份的时候被排除。
添加标签
kubectl label -n <ITEM_NAMESPACE> <RESOURCE>/<NAME> velero.io/exclude-from-backup=true
### 为 default namespace 添加标签
kubectl label -n default namespace/default velero.io/exclude-from-backup=true
问题汇总
时区问题
进行定时备份时,发现备份使用的事 UTC 时间,并不是本地时间,经过排查后发现是 velero 镜像的时区问题,将时区调整一致即可。
集群迁移
迁移方法同备份,在备份后切换集群,在新集群恢复备份即可。