侧边栏壁纸
博主头像
张种恩博主等级

一个能运维的 JPG 搬运工

  • 累计撰写 712 篇文章
  • 累计创建 62 个标签
  • 累计收到 32 条评论

目 录CONTENT

文章目录

使用 velero 备份迁移 k8s 集群内的资源

张种恩
2022-12-02 / 0 评论 / 1 点赞 / 86 阅读 / 1,370 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-12-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

介绍

Velero 是由 Vmware 捐献给 CNCF 的,云原生的,对 Kubernetes 进行备份、还原和迁移的工具,它使用 Golang 开发、且开源。

github: https://github.com/vmware-tanzu/velero
官网:https://velero.io/

55c368ec85b5d7809f04c788c12d5b656a9c0a0a58fdaf833e1e90e9a9b9918c

工作原理:

  • 需要部署一个 Velero 服务端到集群,该服务端拥有访问集群资源的权限;
  • 通过 velero 二进制程序部署服务端的同时,其也会向 kubernetes 集群中同时注册一些 crd 资源,这些 crd 资源可以对我们备份、还原的资源做抽象;
  • 通过 crd 资源创建一个备份请求对象,服务端控制器会根据请求内容完成目标预期的备份,并将备份后的文件上传至配置的远端存储(需要支持 S3 协议,如 Ceph、Minio 都可以);
  • 备份完毕后,可以通过获取特定的 crd 资源来查看备份的记录(文件);
  • 通过 crd 资源创建一个还原请求对象,服务端控制器会根据请求内容对应的备份文件,将备份内容恢复到集群;

示例

下面演示一下在两个集群迁移 kubernetes 资源需要进行的动作,以将 a 集群 tmp 名称空间及其下的资源迁移到 b 集群为例。

粗略步骤:

  1. 部署一个 minio,用来作为 Velero 上传备份文件的远端存储;
  2. 在两个 kubernetes 集群中都部署一个 Velero 服务端,这两个服务端的远端存储都配置为上一步部署的 minio,且指定使用同一个 bucket;
  3. 在 a 集群中创建一个对 tmp 名称空间的备份请求,确认备份动作执行完毕;
  4. 因为远端存储是相同的,所以此时可以在 b 集群看到备份的记录文件;
  5. 在 b 集群创建一个还原请求,将 a 集群备份的文件还原到 b 集群;

安装 Minio

我这里直接使用 Docker 安装:

$ docker run --name minio \
    -d \
    --env MINIO_ROOT_USER="root" \
    --env MINIO_ROOT_PASSWORD="root" \
    --publish 9000:9000 \
    --publish 9001:9001 \
    --volume /data/minio:/data \
    bitnami/minio:2022.11.11

在 Minio 创建名为 velero 的 bucket。

下载二进制程序

$ wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.4/velero-v1.9.4-linux-amd64.tar.gz
$ tar -zxvf velero-v1.9.4-linux-amd64.tar.gz
$ cp velero-v1.9.4-linux-amd64/velero /usr/local/bin

部署服务端到集群

创建远端存储认证文件:

$ cat minio-auth.txt 
[default]
aws_access_key_id = root
aws_secret_access_key = admin123

部署服务端到 a 集群:

velero install \
  --kubeconfig ./a.kubeconfig \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.5.0 \
  --bucket velero \
  --secret-file ./minio-auth.txt \
  --use-volume-snapshots=false \
  --namespace velero-system \
  --backup-location-config region=minio,s3ForcePathStyle="true",s3Url="http://10.0.1.200:9000"

部署服务端到 b 集群:

velero install \
  --kubeconfig ./b.kubeconfig \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.5.0 \
  --bucket velero \
  --secret-file ./minio-auth.txt \
  --use-volume-snapshots=false \
  --namespace velero-system \
  --backup-location-config region=minio,s3ForcePathStyle="true",s3Url="http://10.0.1.200:9000"

注意:

  • 使用 --kubeconfig 选项指定部署到的集群;
  • 使用 --namespace 指定部署到的名称空间;
  • 使用 s3Url 指定备份使用的远端存储 Url,这里我指定的是 Minio 地址;

在 a、b 集群确认 Velero 服务端已成功启动并就绪:

$ kubectl get pod -n velero-system 
NAME                     READY   STATUS    RESTARTS   AGE
velero-fbb9469f6-c7t77   1/1     Running   0          14h

a 集群执行备份动作

先查看一下 tmp 名称空间的资源:

$ kubectl get all -n tmp
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-85b98978db-jpt2t   1/1     Running   0          10m

NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
service/nginx   ClusterIP   10.105.123.117   <none>        80/TCP    10m

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           10m

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-85b98978db   1         1         1       10m

使用 velero 二进制程序创建备份请求,通过 --namespace 指定 Velero 服务端所在名称空间,--include-namespaces 指定要备份的名称空间:

$ DATE=`date +%Y%m%d%H%M%S`
$ velero backup create \
  tmp-${DATE} \
  --namespace velero-system \
  --include-namespaces tmp \
  --kubeconfig ./a.kubeconfig
Backup request "tmp-20221202103428" submitted successfully.
Run `velero backup describe tmp-20221202103428` or `velero backup logs tmp-20221202103428` for more details.

查看备份:

$ kubectl -n velero-system get backups.velero.io
NAME                          AGE
tmp-20221202103428            14s

查看备份日志:

$ velero -n velero-system backup logs tmp-20221202103428

登录 Minio 进入名为 velero 的 bucket 可以看到对应的备份文件。

b 集群执行还原动作

先确认在 b 集群也可以看到备份:

$ kubectl -n velero-system get backups.velero.io
NAME                          AGE
tmp-20221202103428            6m15s

使用 velero 二进制程序创建还原请求,通过 --namespace 指定 Velero 服务端所在名称空间,--from-backup 指定要还原的备份文件:

$ velero restore create \
  --namespace velero-system \
  --kubeconfig ./b.kubeconfig \
  --from-backup tmp-20221202103428 --wait
Restore request "tmp-20221202103428-20221202104444" 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 tmp-20221202103428-20221202104444` and `velero restore logs tmp-20221202103428-20221202104444`.

查看还原日志:

$ velero -n velero-system restore logs tmp-20221202103428-20221202104444

查看恢复后的资源:

$ kubectl  get all -n tmp 
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-85b98978db-jpt2t   1/1     Running   0          80s

NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
service/nginx   ClusterIP   10.68.17.205   <none>        80/TCP    80s

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   1/1     1            1           80s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-85b98978db   1         1         1       80s
1

评论区