来自群友
前言:
一般来说大家都用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
创建 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 服务
<a name="yV0ZD"></a>
##### 新建 namespace
kubectl create namespace velero
<a name="Tga7b"></a>
##### 部署 credentials-velero 的 secret
kubectl create secret generic cloud-credentials —namespace velero —from-file cloud=install/credentials-velero
<a name="ybAsr"></a>
##### 部署 CRD
kubectl apply -f install/00-crds.yaml
<a name="iKPhk"></a>
##### 部署 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
<a name="DRvCp"></a>
#### 备份测试
[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:
- 查看OSS备份 (默认)<br />![](https://cdn.nlark.com/yuque/0/2020/png/255717/1593740413547-70b3ef35-46e1-4204-92ea-7f3808bba284.png#align=left&display=inline&height=754&margin=%5Bobject%20Object%5D&originHeight=754&originWidth=1788&size=0&status=done&style=none&width=1788)
- 在现有集群中删除掉 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
- 使用 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 对集群备份恢复已经实现
-
高级用法
定时备份
对集群资源进行定时备份,则可在发生意外的情况下,进行恢复(默认情况下,备份保留 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 镜像的时区问题,将时区调整一致即可。集群迁移
迁移方法同备份,在备份后切换集群,在新集群恢复备份即可。