Skip to content

使用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 的工作原理图如下:

02ad18b151e938b35164d32c7da83ac1 MD5

plain
Velero 客户端调用 Kubernetes API 服务器创建 Backup 对象。
BackupController 监听 Backup 对象变化,以执行备份过程。
备份时,BackupController 通过 API Server 查询相关数据。
备份后,BackupController 将数据上传到对象存储。

安装 Velero 服务

Velero 由客户端和服务端组成,服务器部署在目标 k8s 集群上,而客户端则是运行在本地的命令行工具。

前往 Velero 的 Release 页面 下载客户端,直接在 GitHub 上下载即可

bash
[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 包

bash
[root@k8s-master-01 ~]# tar xf velero-v1.4.0-linux-amd64.tar.gz

将 release 包中的二进制文件 velero 移动到 $PATH 中的某个目录下,(一般情况 /usr/local/bin/ )

bash
[root@k8s-master-01 ~]# mv velero /usr/local/bin/
[root@k8s-master-01 ~]# ls  /usr/local/bin/velero
/usr/local/bin/velero

执行 velero -h 测试

7a65c1caaacc1f507be696aa5e3ba398 MD5

创建 OSS bucket

创建一个 OSS bucket 用于存储备份文件,这里也可以用已有的 bucket,之后会在 bucket 中创建 test 目录,这里建议在已有的 bucket 中创建一个子目录用于存储备份文件。

创建 OSS Bucket 过程~~~~

创建 OSS 的时候一定要选对区域,要和 ACK 集群在同一个区域,存储类型和读写权限选择标准存储和私有:

dfc3e6a8e8805f42dcfd0000f81c63ce MD5

创建阿里云 RAM 用户

用于操作 OSS 以及 ACK 资源,新建权限策略,

61ce59ac64918c27286d8d8cd988350f MD5

策略内容:(进行测试时)

json
{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "oss:*",
      "Resource": ["acs:oss:*:*:pps-k8s-backup/*", "acs:oss:*:*:pps-k8s-backup"]
    }
  ]
}

在新建用户的时候要选择 编程访问,来获取 AccessKeyID 和 AccessKeySecret。

a72d2d86377b7fcb029a1b97fe3e500a MD5

部署服务端

  • 拉取 Velero 插件 :
bash
git clone https://github.com/AliyunContainerService/velero-plugin
  • 修改配置:
    修改 install/credentials-velero 文件,
    将新建用户中获得的 AccessKeyID 和 AccessKeySecret 填入,这里的 OSS EndPoint 为之前 OSS 的访问域名(注:这里需要选择外网访问的 EndPoint。)
    9daa832210a5237d8a2ad566872c4e77 MD5
bash
[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 配置填入:
yaml
---
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
bash
kubectl create namespace velero
部署 credentials-velero 的 secret
bash
kubectl create secret generic cloud-credentials --namespace velero --from-file cloud=install/credentials-velero
部署 CRD
bash
kubectl apply -f install/00-crds.yaml
部署 Velero
bash
kubectl apply -f install/01-velero.yaml
  • 测试 Velero 状态
bash
[root@k8s-master-01 velero-plugin]# velero version
Client:
  Version: v1.4.0
  Git commit: 5963650c9d64643daaf510ef93vc4a46b6283392
Server:
  Version: v1.2.0

可以看到 Velero 的客户端和服务端已经部署成功。

  • 服务端清理

在完成测试或者需要重新安装时,执行如下命令进行清理:

bash
kubectl delete namespace/velero clusterrolebinding/velero
kubectl delete crds -l component=velero

备份测试

bash
[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 进行备份处理
bash
[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`.
  • 查看备份是否成功
bash
[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 备份 (默认)
    8426e5ee32f393321b570283812ce57f MD5
  • 在现有集群中删除掉 panshi-qtc-dev 所有资源 (其实只需要 delete namespaces panshi-qtc-dev )
bash
[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 的备份
bash
[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 进行恢复
bash
[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`.
bash
[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
    45bcd7f661d123cfdb0c8e717cf6f775 MD5

高级用法

  • 定时备份
    对集群资源进行定时备份,则可在发生意外的情况下,进行恢复(默认情况下,备份保留 30 天)。
bash
# 每日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 -

备份删除
  • 直接执行命令进行删除
bash
velero delete backups <BACKUP_NAME>
备份资源查看

备份查看

bash
velero backup get

查看定时备份

bash
velero schedule get

查看可恢复备份

bash
velero restore get
备份排除项目

可为资源添加指定标签,添加标签的资源在备份的时候被排除。

添加标签
bash
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 镜像的时区问题,将时区调整一致即可。

集群迁移

迁移方法同备份,在备份后切换集群,在新集群恢复备份即可。

最近更新