参考来源:

  • velero 官网: https://velero.io/
  • velero 手册: https://velero.io/docs/v1.6/
  • velero 供应商: https://velero.io/docs/v1.6/supported-providers/

    引言

    在运维安全管理中容灾备份是非常重要的一环, 那在Kubernetes集群中如何进行备份和迁移 Kubernetes 资源和持久卷数据。
    常常采用手动进行容灾备份, 如备份资源清单、或者helm模板,但是针对Kubernetes 资源和持久卷(PV/PVC)中得数据无法进行备份迁移,所以在这样得场景下我们就需要 Velero 是一个开源工具。
    并且,kubernetes集群备份也是一个难点。虽然可以通过备份ETCD的方式来实现K8S集群备份,并且可以恢复集群到某一个时刻的状态,但是这种备份方式很难实现恢复单个资源对象,因为ETCD一般使用快照的形式进行备份和恢复
    再有的时候可能有些新同事不熟悉环境导致误操作将某个namespace点击删除,然后导致下面的资源全部丢失,这时候也只能一步一步通过之前的资源清单重新创建,严重的可能会重新部署集群

    velero基础概述

    Velero是一个开源工具,用于安全备份和恢复、执行灾难恢复以及迁移kubernetes集群资源和持久卷
    Velero 可以让您备份您的集群并在丢失时恢复、将集群资源迁移到其他集群、将您的生产集群复制到开发和测试集群, 详细解析说明:
    1.灾难恢复 : 在基础设施丢失、数据损坏和/或服务中断的情况下减少恢复时间。支持 Kubernetes 集群数据备份和恢复
    2.数据迁移 : 通过轻松地将 Kubernetes 资源从一个集群迁移到另一个集群,实现集群可移植性。支持复制当前 Kubernetes 集群的资源到其它 Kubernetes 集群
    3.数据保护 : 提供关键数据保护功能,例如计划备份、保留计划以及用于自定义操作的备份前或备份后挂钩。
    Velero 特点: 您可以备份或恢复集群中的所有对象,也可以按类型、命名空间和/或标签过滤对象。
    1.备份集群 : 使用命名空间或标签选择器为整个集群或集群的一部分备份 Kubernetes 资源和卷。
    2.计划备份 : 设置计划以定期自动启动备份。
    3.备份挂钩 : 配置备份前和备份后挂钩,以在 Velero 备份之前和之后执行自定义操作。
    你可以通过云提供商或本地运行 Velero, 其组件包括在集群上运行的服务器和本地运行的命令行客户端。
    使用Minio服务进行管理存储备份在ETCD的数据、使用velero客户端进行备份和还原操作
    与 Etcd 备份相比,直接备份 Etcd 是将集群的全部资源备份起来。而 Velero 就是可以对 Kubernetes 集群内对象级别进行备份。除了对 Kubernetes 集群进行整体备份外,Velero 还可以通过对 Type、Namespace、Label 等对象进行分类备份或者恢复。
    Velero支持 AWS S3以及兼容S3的存储,比如Minio,ZureBlob存储,Google Cloud存储,同时也给出了插件功能用来拓展其他平台的存储,阿里云也提供了 Velero 的插件,用于将备份存储到 OSS 中

    Velero工作原理

    一般情况下使用Velero主要是从下面几个方面入手

  • 1.按需备份: 将复制的 Kubernetes 对象的 tarball 上传到云对象存储中,调用云提供商 API 以制作持久卷的磁盘快照(如果指定)。

  • 2.计划备份: 由 Cron 表达式指定在循环间隔备份您的数据,计划备份以名称保存-,其中格式为YYYYMMDDhhmmss。
  • 3.容灾恢复: 该恢复操作可以恢复所有对象和持久卷从先前创建的备份,还原的默认名称为-, 恢复的对象还包括一个带有 key velero.io/restore-name 和 value的标签
  • 4.备份过期: 可以通过添加标志来指定—ttl 参数来设置备份得生存时间(默认30天)。到期后则会删除备份资源、来自云对象存储的备份文件、所有 PersistentVolume 快照、所有关联的恢复。
  • 5.对象存储同步: 它会不断检查以确保始终存在正确的备份资源。如果存储桶中有格式正确的备份文件,但 Kubernetes API 中没有相应的备份资源,Velero 会将信息从对象存储同步到 Kubernetes。

工作流程:
当你运行velero backup create test-backup命令。
1.Velero 客户端调用 Kubernetes API 服务器来创建一个Backup对象。
2.该 BackupController 注意到新的 Backup 对象并进行验证。
3.在 BackupController 开始备份过程。它通过向 API 服务器查询资源来收集要备份的数据。
4.将 BackupController 使得对象存储服务的调用-例如,AWS S3 -上传备份文件。
默认情况下 velero backup create 为任何持久卷制作磁盘快照, 可以通过指定附加标志来调整快照—snapshot-volumes=false(使用选项禁用快照)。
实际上 Velero 在 Kubernetes 集群中创建了很多 CRD 以及相关的控制器,进行备份恢复等操作实质上是对相关 CRD 的操作。
Velero 使用 Kubernetes API 服务器的首选版本为每个组/资源备份资源。恢复资源时,目标集群中必须存在相同的 API 组/版本才能成功恢复。

环境部署

先决条件

  • Kubernetes 集群 API Version >= 1.7
  • Kubernetes 集群已部署 DNS 服务器 (例如: CoreDNS)。
  • 在 Minio 中存储备份可用磁盘空间少于 1GB,Minio 将无法运行。(你可以可以使用阿里云或其他云厂商的OSS)
  • velero组件分为两部分,分别是服务端和客户端。服务端运行在你的kubernetes集群中,客户端是一些运行在本地的命令行工具

    下载部署velero客户端

    下载 最新的官方版本的tarball,每个版本的 tarball 都包含velero命令行客户端,,并将elero二进制文件从 Velero 目录移动到 PATH 中的某个位置。
    1. curl -fSL https://github.com/vmware-tanzu/velero/releases/download/v1.6.2/velero-v1.6.2-linux-amd64.tar.gz
    2. tar -zxvf velero-v1.6.2-linux-amd64.tar.gz -C /usr/local/
    3. ln -s /usr/local/velero-v1.6.2-linux-amd64/velero /usr/bin/velero
    验证velero client
    1. [root@kube-master-01 velero]# velero version
    2. Client:
    3. Version: v1.6.2
    4. Git commit: 8c9cdb9603446760452979dc77f93b17054ea1cc
    5. [root@kube-master-01 velero]#

    配置Minio服务

    因为我们使用的是本地存储的方式,所以需要自己搭建一个支持S3协议的对象存储服务
    在本地目录中创建 Velero 特定的凭据文件。
    1. [root@kube-master-01 velero]# cat /tmp/credentials-velero
    2. [default]
    3. aws_access_key_id = minio
    4. aws_secret_access_key = minio123
    5. [root@kube-master-01 velero]#
    修改启动服务器和本地存储服务。
    在Velero解压的目中/velero/examples/minio中修改00-minio-deployment.yaml内容如下
    请注意:对于minio服务的暴露方式我使用的是nodeport ```yaml

apiVersion: v1 kind: Namespace metadata: name: velero


apiVersion: apps/v1 kind: Deployment metadata: namespace: velero name: minio labels: component: minio spec: strategy: type: Recreate selector: matchLabels: component: minio template: metadata: labels: component: minio spec: volumes:

  1. - name: storage
  2. emptyDir: {}
  3. - name: config
  4. emptyDir: {}
  5. containers:
  6. - name: minio
  7. image: minio/minio:latest
  8. imagePullPolicy: IfNotPresent
  9. # 设置静态得Console监控端口(推荐)
  10. args:
  11. - server
  12. - /storage
  13. - --config-dir=/config
  14. - --console-address
  15. - ":31234"
  16. # 注意事项: 主要修改点是以下环境变量名称`MINIO_ROOT_USER|MINIO_ROOT_PASSWORD`否则。
  17. # WARNING: MINIO_ACCESS_KEY and MINIO_SECRET_KEY are deprecated.
  18. # Please use MINIO_ROOT_USER and MINIO_ROOT_PASSWORD
  19. env:
  20. - name: MINIO_ROOT_USER
  21. value: "minio"
  22. - name: MINIO_ROOT_PASSWORD
  23. value: "minio123"
  24. # Pod 暴露 minio 服务和 console web 服务端口以供SVC使用
  25. ports:
  26. - name: web
  27. containerPort: 9000
  28. - name: console
  29. containerPort: 31234
  30. volumeMounts:
  31. - name: storage
  32. mountPath: "/storage"
  33. - name: config
  34. mountPath: "/config"

apiVersion: v1 kind: Service metadata: namespace: velero name: minio labels: component: minio spec:

ClusterIP is recommended for production environments.

Change to NodePort if needed per documentation,

but only if you run Minio in a test/trial environment, for example with Minikube.

type: NodePort ports:

  • name: web port: 9000 targetPort: 9000 nodePort: 30090 protocol: TCP
  • name: console port: 31234 targetPort: 31234 nodePort: 31234 protocol: TCP selector: component: minio

apiVersion: batch/v1 kind: Job metadata: namespace: velero name: minio-setup labels: component: minio spec: template: metadata: name: minio-setup spec: restartPolicy: OnFailure volumes:

  1. - name: config
  2. emptyDir: {}
  3. containers:
  4. - name: mc
  5. image: minio/mc:latest
  6. imagePullPolicy: IfNotPresent
  7. # Minio状态检测
  8. command:
  9. - /bin/sh
  10. - -c
  11. - "mc --config-dir=/config config host add velero http://minio:9000 minio minio123 && mc --config-dir=/config mb -p velero/velero"
  12. volumeMounts:
  13. - name: config
  14. mountPath: "/config"
  1. 注意 Velero 1.6.2 版本中minioyaml配置文件我们需要相应进行改变。<br />注意 提供的 Minio yaml 示例使用"空目录",您的节点需要有足够的可用空间来存储要备份的数据以及 1GB 的可用空间。如果节点没有足够的空间,您可以修改示例 yaml 以使用 Persistent Volume 而不是empty dir。<br />注意 使用 Service 在集群外公开 Minio 时需要Pod暴露两个应用端口即Service 9000Console 默认随机,此时你可以将将 Minio 服务类型从更改ClusterIPNodePort,具体配置查看上述资源清单。
  2. 部署minio资源清单以及服务查看
  3. ```bash
  4. # 使用本地集群minio作为备份存储
  5. kubectl apply -f examples/minio/00-minio-deployment.yaml
  6. [root@kube-master-01 minio]# kubectl get svc -n velero
  7. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  8. minio NodePort 10.1.200.33 <none> 9000:30090/TCP,31234:31234/TCP 65m
  9. [root@kube-master-01 minio]#
  10. [root@kube-master-01 minio]# kubectl get pods -n velero -o wide
  11. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  12. minio-85dfcfdb9-d9x59 1/1 Running 0 65m 10.244.236.67 kube-node-02 <none> <none>
  13. minio-setup-rh8g2 0/1 Completed 0 65m 10.244.10.68 kube-node-01 <none> <none>
  14. [root@kube-master-01 minio]#

打开浏览器访问Minio服务端,此时他会访问跳转到31234端口
用户名:minio
密码:minion123
image.png

安装velero客户端

之前有说过,velero是C/S架构的工具

  1. # 获取指定 minio 服务地址和服务端口
  2. minio_service_ip="172.18.14.102"
  3. minio_service_port=$(kubectl -n velero get svc/minio -o jsonpath='{.spec.ports[0].nodePort}')
  4. # kubernetes Master 节点上安装 velero 或者在其他集群上安装执行
  5. velero install \
  6. --image velero/velero:v1.6.2 \
  7. --provider aws \ #使用的是S3协议
  8. --bucket velero \ #存储桶的名称
  9. --namespace velero \
  10. --plugins velero/velero-plugin-for-aws:v1.2.0 \
  11. --secret-file /tmp/credentials-velero \
  12. --velero-pod-cpu-request 200m \
  13. --velero-pod-mem-request 200Mi \
  14. --velero-pod-cpu-limit 1000m \
  15. --velero-pod-mem-limit 1000Mi \
  16. --use-volume-snapshots=false \
  17. --use-restic \
  18. --restic-pod-cpu-request 200m \
  19. --restic-pod-mem-request 200Mi \
  20. --restic-pod-cpu-limit 1000m \
  21. --restic-pod-mem-limit 1000Mi \
  22. --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://${minio_service_ip}:${minio_service_port}
  23. # 出现下述表示安装成功, 并且此时可以看到相关服务已经正常运行,Job 任务正常完成退出,大量 CRD 被创建。
  24. # Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

在kubernetes主节点中验证查看velero部署得所有服务

  1. [root@kube-master-01 minio]# kubectl get all -n velero
  2. NAME READY STATUS RESTARTS AGE
  3. pod/minio-85dfcfdb9-d9x59 1/1 Running 0 76m
  4. pod/minio-setup-rh8g2 0/1 Completed 0 76m
  5. pod/restic-4sn85 1/1 Running 0 68m
  6. pod/restic-7lnpr 1/1 Running 0 68m
  7. pod/restic-9kvtf 1/1 Running 0 68m
  8. pod/restic-dnm5z 1/1 Running 0 68m
  9. pod/restic-kkbfd 1/1 Running 0 68m
  10. pod/restic-lp82j 1/1 Running 0 68m
  11. pod/restic-p84bq 1/1 Running 0 68m
  12. pod/velero-7b8b8fc8f-5fwtc 1/1 Running 0 68m
  13. NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
  14. service/minio NodePort 10.1.200.33 <none> 9000:30090/TCP,31234:31234/TCP 76m
  15. NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
  16. daemonset.apps/restic 7 7 7 7 7 <none> 68m
  17. NAME READY UP-TO-DATE AVAILABLE AGE
  18. deployment.apps/minio 1/1 1 1 76m
  19. deployment.apps/velero 1/1 1 1 68m
  20. NAME DESIRED CURRENT READY AGE
  21. replicaset.apps/minio-85dfcfdb9 1 1 1 76m
  22. replicaset.apps/velero-7b8b8fc8f 1 1 1 68m
  23. NAME COMPLETIONS DURATION AGE
  24. job.batch/minio-setup 1/1 2m2s 76m
  25. [root@kube-master-01 minio]#
  26. [root@kube-master-01 minio]# kubectl logs -n velero pod/minio-85dfcfdb9-d9x59
  27. API: http://10.244.236.67:9000 http://127.0.0.1:9000
  28. Console: http://10.244.236.67:31234 http://127.0.0.1:31234
  29. Documentation: https://docs.min.io
  30. [root@kube-master-01 minio]#

验证velero服务是否安装成功

  1. [root@kube-master-01 velero]# velero version
  2. Client:
  3. Version: v1.6.2
  4. Git commit: 8c9cdb9603446760452979dc77f93b17054ea1cc
  5. Server:
  6. Version: v1.6.2
  7. [root@kube-master-01 velero]#

备份实践

备份单个资源对象

在velero的解压目录中提供了一个nginx的部署清单,可以使用这个demo进行备份的测试,我这里直接使用的是别的pod进行备份测试

  1. [root@kube-master-01 velero]# velero backup create dingtalk-backup-20211229 --selector app=dingtalk-webhook
  2. Backup request "dingtalk-backup-20211229" submitted successfully.
  3. Run `velero backup describe dingtalk-backup-20211229` or `velero backup logs dingtalk-backup-20211229` for more details.
  4. [root@kube-master-01 velero]#
  5. [root@kube-master-01 velero]# velero backup describe dingtalk-backup-20211229
  6. Name: dingtalk-backup-20211229
  7. Namespace: velero
  8. Labels: velero.io/storage-location=default
  9. Annotations: velero.io/source-cluster-k8s-gitversion=v1.19.3
  10. velero.io/source-cluster-k8s-major-version=1
  11. velero.io/source-cluster-k8s-minor-version=19
  12. Phase: Completed
  13. Errors: 0
  14. Warnings: 0
  15. Namespaces:
  16. Included: *
  17. Excluded: <none>
  18. Resources:
  19. Included: *
  20. Excluded: <none>
  21. Cluster-scoped: auto
  22. Label selector: app=dingtalk-webhook
  23. Storage Location: default
  24. Velero-Native Snapshot PVs: auto
  25. TTL: 720h0m0s
  26. Hooks: <none>
  27. Backup Format Version: 1.1.0
  28. Started: 2021-12-29 16:28:41 +0800 CST
  29. Completed: 2021-12-29 16:28:54 +0800 CST
  30. Expiration: 2022-01-28 16:28:41 +0800 CST
  31. Total items to be backed up: 5
  32. Items backed up: 5
  33. Velero-Native Snapshots: <none included>
  34. [root@kube-master-01 velero]#

登录minio查看备份是否成功
image.png

备份除匹配标签之外的所有对象

  1. [root@kube-master-01 velero]# velero backup create all-backup --selector 'backup notin (ignore)'
  2. Backup request "all-backup" submitted successfully.
  3. Run `velero backup describe all-backup` or `velero backup logs all-backup` for more details.
  4. [root@kube-master-01 velero]# velero backup describe all-backup
  5. Name: all-backup
  6. Namespace: velero
  7. Labels: velero.io/storage-location=default
  8. Annotations: velero.io/source-cluster-k8s-gitversion=v1.19.3
  9. velero.io/source-cluster-k8s-major-version=1
  10. velero.io/source-cluster-k8s-minor-version=19
  11. Phase: Completed
  12. Errors: 0
  13. Warnings: 0
  14. Namespaces:
  15. Included: *
  16. Excluded: <none>
  17. Resources:
  18. Included: *
  19. Excluded: <none>
  20. Cluster-scoped: auto
  21. Label selector: backup notin (ignore)
  22. Storage Location: default
  23. Velero-Native Snapshot PVs: auto
  24. TTL: 720h0m0s
  25. Hooks: <none>
  26. Backup Format Version: 1.1.0
  27. Started: 2021-12-29 16:33:39 +0800 CST
  28. Completed: 2021-12-29 16:34:02 +0800 CST
  29. Expiration: 2022-01-28 16:33:39 +0800 CST
  30. Total items to be backed up: 1190
  31. Items backed up: 1190
  32. Velero-Native Snapshots: <none included>
  33. [root@kube-master-01 velero]#

定期备份

  1. $ velero schedule create nginx-daily --schedule="0 1 * * *" --selector app=nginx
  2. # 或者,您可以使用一些非标准速记 cron 表达式:
  3. $ velero schedule create nginx-daily --schedule="@daily" --selector app=nginx

查看备份

  1. [root@kube-master-01 dingtalk]# velero backup get
  2. NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
  3. all-backup Completed 0 0 2021-12-29 16:33:39 +0800 CST 29d default backup notin (ignore)
  4. dingtalk-backup Completed 0 0 2021-12-29 15:30:29 +0800 CST 29d default app=dingtalk-webhook
  5. dingtalk-backup-20211229 Completed 0 0 2021-12-29 16:28:41 +0800 CST 29d default app=dingtalk-webhook
  6. [root@kube-master-01 dingtalk]#

恢复实践

模拟删除Pod

模拟删除掉dingtalk这个Pod,因为是deployment,所以直接使用资源配置清单模拟删除

  1. [root@kube-master-01 dingtalk]# kubectl delete -f dingtalk-deployment.yaml
  2. deployment.apps "dingtalk-webhook" deleted
  3. service "dingtalk-webhook" deleted
  4. [root@kube-master-01 dingtalk]#

检查Pod是否已经删除

  1. [root@kube-master-01 dingtalk]# kubectl get pods -n kubesphere-monitoring-system -l app=dingtalk-webhook
  2. No resources found in kubesphere-monitoring-system namespace.
  3. [root@kube-master-01 dingtalk]#

模拟恢复Pod资源

利用velero中的备份进行恢复刚才删除的Pod资源

  1. [root@kube-master-01 dingtalk]# velero restore create --from-backup dingtalk-backup-20211229
  2. Restore request "dingtalk-backup-20211229-20211229164228" submitted successfully.
  3. Run `velero restore describe dingtalk-backup-20211229-20211229164228` or `velero restore logs dingtalk-backup-20211229-20211229164228` for more details.
  4. [root@kube-master-01 dingtalk]#

查看恢复状态

  1. #成功恢复后该STATUS列Completed
  2. [root@kube-master-01 dingtalk]# velero restore get
  3. NAME BACKUP STATUS STARTED COMPLETED ERRORS WARNINGS CREATED SELECTOR
  4. dingtalk-backup-20211229-20211229164228 dingtalk-backup-20211229 Completed 2021-12-29 16:42:28 +0800 CST 2021-12-29 16:42:29 +0800 CST 0 0 2021-12-29 16:42:28 +0800 CST <none>
  5. [root@kube-master-01 dingtalk]#
  6. #如果有错误信息可以使用如下命令详细查看
  7. $ velero restore describe dingtalk-backup-20211229-20211229164228
  8. [root@kube-master-01 dingtalk]# kubectl get pods -n kubesphere-monitoring-system -l app=dingtalk-webhook
  9. NAME READY STATUS RESTARTS AGE
  10. dingtalk-webhook-8bc897cd6-hqzzr 1/1 Running 0 2m49s
  11. [root@kube-master-01 dingtalk]#

其他操作

删除创建的备份

  1. [root@kube-master-01 dingtalk]# velero backup delete all-backup
  2. Are you sure you want to continue (Y/N)? y
  3. Request to delete backup "all-backup" submitted successfully.
  4. The backup will be fully deleted after all associated data (disk snapshots, backup files, restores) are removed.
  5. [root@kube-master-01 dingtalk]#
  6. [root@kube-master-01 dingtalk]# velero backup get
  7. NAME STATUS ERRORS WARNINGS CREATED EXPIRES STORAGE LOCATION SELECTOR
  8. dingtalk-backup Completed 0 0 2021-12-29 15:30:29 +0800 CST 29d default app=dingtalk-webhook
  9. dingtalk-backup-20211229 Completed 0 0 2021-12-29 16:28:41 +0800 CST 29d default app=dingtalk-webhook
  10. [root@kube-master-01 dingtalk]#

删除所有备份

  1. [root@kube-master-01 dingtalk]# velero backup delete --all
  2. Are you sure you want to continue (Y/N)? y
  3. Request to delete backup "dingtalk-backup" submitted successfully.
  4. The backup will be fully deleted after all associated data (disk snapshots, backup files, restores) are removed.
  5. Request to delete backup "dingtalk-backup-20211229" submitted successfully.
  6. The backup will be fully deleted after all associated data (disk snapshots, backup files, restores) are removed.
  7. [root@kube-master-01 dingtalk]#
  8. [root@kube-master-01 dingtalk]# velero backup get
  9. [root@kube-master-01 dingtalk]#

卸载velero、minio

  1. [root@kube-master-01 dingtalk]# kubectl delete namespace/velero clusterrolebinding/velero
  2. namespace "velero" deleted
  3. clusterrolebinding.rbac.authorization.k8s.io "velero" deleted
  4. [root@kube-master-01 dingtalk]# kubectl delete crds -l component=velero
  5. customresourcedefinition.apiextensions.k8s.io "backups.velero.io" deleted
  6. customresourcedefinition.apiextensions.k8s.io "backupstoragelocations.velero.io" deleted
  7. customresourcedefinition.apiextensions.k8s.io "deletebackuprequests.velero.io" deleted
  8. customresourcedefinition.apiextensions.k8s.io "downloadrequests.velero.io" deleted
  9. customresourcedefinition.apiextensions.k8s.io "podvolumebackups.velero.io" deleted
  10. customresourcedefinition.apiextensions.k8s.io "podvolumerestores.velero.io" deleted
  11. customresourcedefinition.apiextensions.k8s.io "resticrepositories.velero.io" deleted
  12. customresourcedefinition.apiextensions.k8s.io "restores.velero.io" deleted
  13. customresourcedefinition.apiextensions.k8s.io "schedules.velero.io" deleted
  14. customresourcedefinition.apiextensions.k8s.io "serverstatusrequests.velero.io" deleted
  15. customresourcedefinition.apiextensions.k8s.io "volumesnapshotlocations.velero.io" deleted
  16. [root@kube-master-01 dingtalk]#

在 Docker (KinD) 中使用 Kubernetes 在集群外公开 Minio

  1. # 1.您可以使用端口转发来访问 Minio 存储桶。
  2. MINIO_POD=$(kubectl get pods -n velero -l component=minio -o jsonpath='{.items[0].metadata.name}')
  3. kubectl port-forward $MINIO_POD -n velero 9000:9000
  4. # 2.然后在另一个终端中执行如下命令, 并且将`publicUrl: http://localhost:9000`在该spec.config部分下添加。
  5. kubectl edit backupstoragelocation default -n velero