二十六、K8s集群备份恢复

二十六、K8s集群备份恢复

1、Velero初识

1.1 K8s集群备份方案对比

  • Etcd
    • 优点:全量备份,包含集群所有空间的所有资源,备份不依赖于任何K8s API和版本,可用于灾难恢复。
    • 缺点:全量恢复,不可恢复部分资源,不支持数据迁移,恢复时需要保持配置统一。
  • GitOps
    • 优点:基于Git仓库备份,符合GitOps规范,支持版本控制、审计和可重复部署。
    • 缺点:配置漂移,资源文件过多,管理复杂。
  • Velero
    • 优点:灵活性高,支持按照命名空间、集群等方式备份,支持定时任务备份、支持备份应用数据、支持跨集群恢复数据、支持细粒度恢复。
    • 缺点:需要S3存储备份数据,备份应用数据功能有限,K8s版本依赖。

1.2 Velero介绍

Velero是一个专为Kubernetes设计的容灾工具,主要用于如下场景:

  • 备份和恢复K8s集群的各类资源
  • 灵活地迁移K8s中的数据
  • 手动及周期性备份和最小范围恢复
  • 对K8s集群进行灾难恢复

Velero核心组件:

  • 服务端:负责处理备份和恢复操作,需要部署在K8s集群中,并且需要配置S3存储后端
  • 客户端:负责与服务端交互,比如备份和恢复等,无需部署,只需要一个客户端工具

1.3 Velero核心资源介绍

  • Backup‌:备份资源,用于执行一次性备份任务,可以基于Schedule资源或者自定义字段创建,备份资源可以指定需要备份或排除的空间、资源类型,同时支持备份的保留时间等。
  • Schedule‌:周期性备份,基于Cron表达式创建周期性的备份任务,包含Backup的所有字段。
  • Restore‌:恢复资源,用于从某个备份中恢复资源,可以指定恢复的资源类型、空间等。
  • BackupStorageLocation‌:备份存储位置,用于指定备份文件的存储位置,比如aws、minio等,同时可以指定对象存储的bucket和prefix。

1.4 Velero工作原理:备份过程

flowchart LR A[手动或自动备份] --> B[创建Backup资源] B --> C[服务端处理] C --> D[执行钩子] D --> E[收集资源] E --> F[上传至对象存储] F --> G[返回结果] G --> H[更新Backup状态]

1.5 Velero工作原理:还原过程

flowchart LR A[用户] --> B[执行还原] B --> C[创建Restore资源] C --> D[服务器处理] D --> E[返回结果] E --> F[创建KS资源] F --> G[下载备份文件] G --> H[更新Restore状态]

2、Velero 部署

2.1 对象存储 Minio 部署

Velero 会把备份文件上传至对象存储,可以使用公有云对象存储或者 Minio 作为存储后端,本次采用 Minio 作为存储后端。

部署 Minio(需要提前安装并启动 Docker):

[root@k8s-bj-master01 ~]# mkdir -p /data/minio && chmod -R 777 /data/minio
[root@k8s-bj-master01 ~]# docker run -d --name minio-server --restart=always --env MINIO_ROOT_USER="user" --env MINIO_ROOT_PASSWORD="password" --env MINIO_DEFAULT_BUCKETS="velerobackup" --publish 9000:9000 --publish 9001:9001 -v /data/minio:/bitnami/minio/data crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/minio:latest

访问测试:

image.png-230.7kB

2.2 Velero 部署

2.2.1 版本确认及下载

部署 Velero 之前,需要找到适合的版本和插件的版本:Velero 版本选择插 件 版 本 选 择

接下来下载客户端工具,选择合适的版本下载即可:

image.png-41.8kB

image.png-91.3kB

2.2.2 Velero 部署

下载离线包并解压:

# 下载安装包
[root@k8s-bj-master01 ~]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.1/velero-v1.17.1-linux-amd64.tar.gz

# 解压
[root@k8s-bj-master01 ~]# tar xf velero-v1.17.1-linux-amd64.tar.gz 
[root@k8s-bj-master01 ~]# mv velero-v1.17.1-linux-amd64/velero /usr/local/bin/
[root@k8s-bj-master01 ~]# chmod +x /usr/local/bin/velero
[root@k8s-bj-master01 ~]# velero version
Client:
	Version: v1.17.1

配置对象存储密码文件:

[root@k8s-bj-master01 ~]# cat > user-minio << EOF
[default]
aws_access_key_id=user
aws_secret_access_key=password
EOF

安装 Velero 服务端:

[root@k8s-bj-master01 ~]# velero install --provider aws --plugins crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/velero-plugin-for-aws:latest --image crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/velero:latest --bucket velerobackup --secret-file ./user-minio --use-volume-snapshots=false --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.200.60:9000 --namespace velero

....
Deployment/velero: attempting to create resource
Deployment/velero: attempting to create resource client
Deployment/velero: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

查看安装进度:

[root@k8s-bj-master01 ~]# kubectl get po -n velero
NAME                     READY   STATUS    RESTARTS   AGE
velero-f4fbf58c6-9gcz6   1/1     Running   0          76s

检查后端存储是否正常:

[root@k8s-bj-master01 ~]# kubectl get BackupStorageLocation -n velero
NAME      PHASE       LAST VALIDATED   AGE   DEFAULT
default   Available   75s              83s   true

3、Velero 初体验

创建测试的 Namespace:

[root@k8s-bj-master01 ~]# kubectl create ns test

创建测试服务:

[root@k8s-bj-master01 ~]# kubectl create deploy krm --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/krm:demo -n test
[root@k8s-bj-master01 ~]# kubectl get po -n test
NAME                 READY   STATUS    RESTARTS   AGE
krm-ddffd55f-q9584   1/1     Running   0          34s

[root@k8s-bj-master01 ~]# kubectl expose deploy krm --port 80 --type NodePort -n test
[root@k8s-bj-master01 ~]# kubectl get svc -n test
NAME   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
krm    NodePort   10.111.234.73   <none>        80:31060/TCP   29s

备份集群:

[root@k8s-bj-master01 ~]# velero backup create test-backup

查看备份进度:

[root@k8s-bj-master01 ~]# velero backup get
NAME          STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
test-backup   Completed   0        0          2025-11-30 16:35:19 +0800 CST   29d       default            <none>

查看 Minio 数据

image.png-129.1kB

也可以通过 kubectl 查看备份详情:

[root@k8s-bj-master01 ~]# kubectl get backup -n velero
NAME          AGE
test-backup   69s

模拟误删 Namespace:

[root@k8s-bj-master01 ~]# kubectl delete ns test

使用 Velero 恢复数据:

[root@k8s-bj-master01 ~]# velero restore create test-restore --from-backup test-backup --include-namespaces test

查看恢复状态:

[root@k8s-bj-master01 ~]# velero restore get
NAME           BACKUP        STATUS      STARTED                         COMPLETED                       ERRORS   WARNINGS   CREATED                         SELECTOR
test-restore   test-backup   Completed   2025-11-30 16:37:49 +0800 CST   2025-11-30 16:37:51 +0800 CST   0        1          2025-11-30 16:37:49 +0800 CST   <none>

恢复操作也可以通过 kubectl 查看恢复配置:

[root@k8s-bj-master01 ~]# kubectl get restore -n velero test-restore
NAME           AGE
test-restore   56s

[root@k8s-bj-master01 ~]# kubectl get restore -n velero test-restore -oyaml
apiVersion: velero.io/v1
kind: Restore
metadata:
  creationTimestamp: "2025-11-30T08:37:49Z"
  finalizers:
  - restores.velero.io/external-resources-finalizer
  generation: 6
  name: test-restore
  namespace: velero
  resourceVersion: "55965"
  uid: aee1f132-7830-4e13-8889-bcbd281bc0d1
spec:
  backupName: test-backup
  excludedResources:
  - nodes
  - events
  - events.events.k8s.io
  - backups.velero.io
  - restores.velero.io
  - resticrepositories.velero.io
  - csinodes.storage.k8s.io
  - volumeattachments.storage.k8s.io
  - backuprepositories.velero.io
  hooks: {}
  includedNamespaces:
  - test
  itemOperationTimeout: 4h0m0s
  uploaderConfig: {}
status:
  completionTimestamp: "2025-11-30T08:37:51Z"
  hookStatus: {}
  phase: Completed
  progress:
    itemsRestored: 9
    totalItems: 9
  startTimestamp: "2025-11-30T08:37:49Z"
  warnings: 1

查看恢复的资源:

[root@k8s-bj-master01 ~]# kubectl get po,svc -n test
NAME                     READY   STATUS    RESTARTS   AGE
pod/krm-ddffd55f-q9584   1/1     Running   0          112s

NAME          TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
service/krm   NodePort   10.96.72.153   <none>        80:31788/TCP   112s

4、Velero 企业实践

4.1 周期性备份任务

Velero 支持定期备份集群,建议为每个集群创建一个每天备份的任务:

[root@k8s-bj-master01 ~]# velero schedule create daily-cluster-backup --schedule="50 08 * * *" --include-namespaces="*" --exclude-namespaces="velero,kube-system" --ttl=720h0m0s
  • --schedule:备份周期,分时日月周,默认为 UTC 时钟
  • -include-namespaces:需要备份的 Namespace,*为所有,逗号分割
  • -exclude-namespaces:需要排除的 Namespace,逗号分割,建议排除 kube-system 和 velero
  • --ttl:备份文件保留的时间,建议保留 30 天以上

查看备份任务:

[root@k8s-bj-master01 ~]# velero schedule get
NAME                   STATUS    CREATED                         SCHEDULE      BACKUP TTL   LAST BACKUP   SELECTOR   PAUSED
daily-cluster-backup   Enabled   2025-11-30 16:46:44 +0800 CST   50 08 * * *   720h0m0s     n/a           <none>     false

暂停备份任务:

[root@k8s-bj-master01 ~]# velero schedule pause daily-cluster-backup

[root@k8s-bj-master01 ~]# velero schedule get
NAME                   STATUS    CREATED                         SCHEDULE      BACKUP TTL   LAST BACKUP   SELECTOR   PAUSED
daily-cluster-backup   Enabled   2025-11-30 16:46:44 +0800 CST   50 08 * * *   720h0m0s     n/a           <none>     true

恢复备份任务:

[root@k8s-bj-master01 ~]# velero schedule unpause daily-cluster-backup

[root@k8s-bj-master01 ~]# velero schedule get
NAME                   STATUS    CREATED                         SCHEDULE      BACKUP TTL   LAST BACKUP   SELECTOR   PAUSED
daily-cluster-backup   Enabled   2025-11-30 16:46:44 +0800 CST   50 08 * * *   720h0m0s     n/a           <none>     false

基于 schedule 立即创建备份任务:

[root@k8s-bj-master01 ~]# velero backup create --from-schedule daily-cluster-backup

[root@k8s-bj-master01 ~]# velero backup get
NAME                                  STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
daily-cluster-backup-20251130084904   Completed   0        0          2025-11-30 16:49:04 +0800 CST   29d       default            <none>

4.2 保留 NodePort 端口号

Velero 恢复数据时,Service 的 NodePort 端口会重新分配,如果用到了 Service 的 NodePort会造成一些故障,此时可以使用--preserve-nodeports 参数保留原端口(生产环境建议每次还原都使用该端口)。

查看当前 NodePort:

[root@k8s-bj-master01 ~]# kubectl get svc -n test
NAME   TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
krm    NodePort   10.96.72.153   <none>        80:31788/TCP   14m

创建备份:

[root@k8s-bj-master01 ~]# velero backup create test-backup2

删除数据(也可以只删除 Service 资源):

[root@k8s-bj-master01 ~]# kubectl delete ns test

还原数据:

[root@k8s-bj-master01 ~]# velero restore create test-restore-with-nodeport --from-backup test-backup2 --include-namespaces test --preserve-nodeports

查看还原的数据:

[root@k8s-bj-master01 ~]# kubectl get svc -n test
NAME   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
krm    NodePort   10.107.192.19   <none>        80:31788/TCP   5s

但是要注意一点,端口容易被占用

4.3 误删资源恢复

假如 K8s 的资源被误删除,也可以通过 Velero 进行恢复,首先模拟删除资源:

[root@k8s-bj-master01 ~]# kubectl get deploy -n test
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
krm    1/1     1            1           4m23s

[root@k8s-bj-master01 ~]# kubectl delete deploy -n test --all
deployment.apps "krm" deleted from test namespace

[root@k8s-bj-master01 ~]# kubectl get deploy -n test
No resources found in test namespace.

使用 Velero 还原数据(建议最小化执行):

[root@k8s-bj-master01 ~]# velero restore create test-ns-restore-deployments --from-backup test-backup2 --include-namespaces=test --include-resources=deployments --preserve-nodeports

查看还原的数据:

[root@k8s-bj-master01 ~]# kubectl get deploy -n test
NAME   READY   UP-TO-DATE   AVAILABLE   AGE
krm    1/1     1            1           13s

4.4 重大上线变更提前备份

如果要对一个系统进行非常大的变更,建议在变更之前提前对某个系统进行全量备份,假设变更失败,可以一键回滚资源。
假如 test 项目今天需要进行上线,可以提前对 test 项目进行备份,命名方式建议 nsName1-nsName2-ns-backup:

[root@k8s-bj-master01 ~]# velero backup create test-ns-backup --include-namespaces=test

[root@k8s-bj-master01 ~]# velero backup get test-ns-backup
NAME             STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
test-ns-backup   Completed   0        0          2025-11-30 17:00:21 +0800 CST   29d       default            <none>

变更服务:

[root@k8s-bj-master01 ~]# kubectl edit deploy -n test krm
image: crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/krm:xxx

[root@k8s-bj-master01 ~]# kubectl delete svc -n test --all
[root@k8s-bj-master01 ~]# kubectl get po -n test
NAME                   READY   STATUS             RESTARTS   AGE
krm-749d5df998-qnjks   0/1     ImagePullBackOff   0          56s
krm-ddffd55f-qbjxh     1/1     Running            0          3m51s
[root@k8s-bj-master01 ~]# kubectl get svc -n test
No resources found in test namespace.

还原数据:

[root@k8s-bj-master01 ~]# velero restore create test-ns-restore --from-backup test-ns-backup --include-namespaces=test --preserve-nodeports

查看还原信息:

[root@k8s-bj-master01 ~]# velero restore get
NAME                          BACKUP           STATUS      STARTED                         COMPLETED                       ERRORS   WARNINGS   CREATED                         SELECTOR
test-ns-restore               test-ns-backup   Completed   2025-11-30 17:03:33 +0800 CST   2025-11-30 17:03:34 +0800 CST   0        2          2025-11-30 17:03:33 +0800 CST   <none>

此时有两个警告,可以通过 describe 查看详情:

[root@k8s-bj-master01 ~]# velero restore describe test-ns-restore
....
  Namespaces:
    test:  could not restore, Pod:krm-ddffd55f-qbjxh already exists. Warning: the in-cluster version is different than the backed-up version
           could not restore, Deployment:krm already exists. Warning: the in-cluster version is different than the backed-up version
....

此时 Service 已还原,但是 Deployment 并未恢复(Velero 默认不还原已经存在的数据):

[root@k8s-bj-master01 ~]# kubectl get svc -n test
NAME   TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
krm    NodePort   10.110.160.71   <none>        80:31788/TCP   2m26s

[root@k8s-bj-master01 ~]# kubectl get po -n test
NAME                   READY   STATUS             RESTARTS   AGE
krm-749d5df998-qnjks   0/1     ImagePullBackOff   0          4m34s
krm-ddffd55f-qbjxh     1/1     Running            0          7m29s

为了还原已存在的数据,可以使用--existing-resource-policy=update 即可:

[root@k8s-bj-master01 ~]# velero restore create test-ns-restore-update --from-backup test-ns-backup --include-namespaces=test --preserve-nodeports --existing-resource-policy=update

查看还原的数据:

[root@k8s-bj-master01 ~]# kubectl get po -n test
NAME                 READY   STATUS    RESTARTS   AGE
krm-ddffd55f-qbjxh   1/1     Running   0          8m20s

4.5 多集群备份

针对不同的集群备份时,不建议备份到同一个位置,可以采用如下方式进行隔离:

  • 不同的 Minio
  • 同一个 Minio,不同的 Bucket
  • 同一个 Bucket,不同的目录

假设对其它集群备份,可以参考如下步骤,首先上传 velero 客户端(velero 指定其它集群的Kubeconfig 也可以):

下载离线包并解压:

# 下载安装包
[root@k8s-nj-master01 ~]# wget https://github.com/vmware-tanzu/velero/releases/download/v1.17.1/velero-v1.17.1-linux-amd64.tar.gz

# 解压
[root@k8s-nj-master01 ~]# tar xf velero-v1.17.1-linux-amd64.tar.gz
[root@k8s-nj-master01 ~]# mv velero-v1.17.1-linux-amd64/velero /usr/local/bin/
[root@k8s-nj-master01 ~]# chmod +x /usr/local/bin/velero
[root@k8s-nj-master01 ~]# velero version
Client:
	Version: v1.17.1

配置对象存储密码文件:

[root@k8s-nj-master01 ~]# cat > user-minio << EOF
[default]
aws_access_key_id=user
aws_secret_access_key=password
EOF

创建新的 Bucket:
image.png-24.5kB

安装 Velero 服务端:

[root@k8s-nj-master01 ~]# velero install --provider aws --plugins crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/velero-plugin-for-aws:latest --image crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/velero:latest --bucket velerobackup-nj --prefix k8s-nj --secret-file ./user-minio --use-volume-snapshots=false --backup-location-config region=minio,s3ForcePathStyle="true",s3Url=http://192.168.200.60:9000 --namespace velero

....
Deployment/velero: attempting to create resource
Deployment/velero: attempting to create resource client
Deployment/velero: created
Velero is installed! ⛵ Use 'kubectl logs deployment/velero -n velero' to view the status.

如果是同一个桶,也可以用--prefix 指定不同的目录也可以。

查看安装进度:

[root@k8s-nj-master01 ~]# kubectl get po -n velero
NAME                     READY   STATUS    RESTARTS   AGE
velero-f4fbf58c6-95gt2   1/1     Running   0          3m32s

检查后端存储是否正常:

[root@k8s-nj-master01 ~]# kubectl get BackupStorageLocation -n velero
NAME      PHASE       LAST VALIDATED   AGE     DEFAULT
default   Available   48s              3m33s   true

备份测试,创建一个测试的 Namespace:

[root@k8s-nj-master01 ~]# kubectl create ns test

创建测试服务:

[root@k8s-nj-master01 ~]# kubectl create deploy krm --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/krm:demo -n test
[root@k8s-nj-master01 ~]# kubectl get po -n test
NAME                 READY   STATUS    RESTARTS   AGE
krm-ddffd55f-45mc8   1/1     Running   0          19s

[root@k8s-nj-master01 ~]# kubectl expose deploy krm --port 80 --type NodePort -n test
[root@k8s-nj-master01 ~]# kubectl get svc -n test
NAME   TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
krm    NodePort   10.103.192.167   <none>        80:30298/TCP   5s

备份集群:

[root@k8s-nj-master01 ~]# velero backup create test-backup

查看备份进度:

[root@k8s-nj-master01 ~]# velero backup get
NAME          STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
test-backup   Completed   0        0          2025-11-30 17:27:28 +0800 CST   29d       default            <none>

其它的操作,如创建周期性备份均一致。

4.6 跨集群恢复/数据迁移

Velero 支持把数据恢复到不同的集群,通常用于创建新环境、迁移和数据恢复,只需要能看到备份文件即可。

备份数据共享的方式一般有两个:

  • 多集群备份至同一个位置(不推荐)
  • 手动处理备份文件

接下来演示把 bj 集群的备份数据恢复到 nj 集群。首先创建一个模拟的 Namespace:

[root@k8s-bj-master01 ~]# kubectl create ns demo

创建测试服务:

[root@k8s-bj-master01 ~]# kubectl create deploy krm --image=crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/krm:demo -n demo
[root@k8s-bj-master01 ~]# kubectl expose deploy krm --port 80 --type NodePort -n demo

备份集群:

[root@k8s-bj-master01 ~]# velero backup create demo-backup

查看备份文件:

image.png-125.4kB

接下来只需要把文件复制一份到 nj 的备份目录即可,可以使用 mc 命令,或者通过 minio 页面下载再上传均可。
本次采用 mc 命令复制数据

[root@k8s-bj-master01 ~]# docker ps
CONTAINER ID   IMAGE                                                                          COMMAND                  CREATED             STATUS             PORTS                                                             NAMES
4bbadc4673b4   crpi-q1nb2n896zwtcdts.cn-beijing.personal.cr.aliyuncs.com/ywb01/minio:latest   "/opt/bitnami/script…"   About an hour ago   Up About an hour   0.0.0.0:9000-9001->9000-9001/tcp, [::]:9000-9001->9000-9001/tcp   minio-server

[root@k8s-bj-master01 ~]# docker exec -ti 4bbadc4673b4 bash

通过 mc 命令查看备份文件:

I have no name!@4bbadc4673b4:/$ mc ls local/
[2025-11-30 08:17:28 UTC]     0B velerobackup/
[2025-11-30 09:24:00 UTC]     0B velerobackup-nj/


I have no name!@4bbadc4673b4:/$ mc ls local/velerobackup/backups/demo-backup
[2025-11-30 09:37:56 UTC]    29B STANDARD demo-backup-csi-volumesnapshotclasses.json.gz
[2025-11-30 09:37:56 UTC]    27B STANDARD demo-backup-itemoperations.json.gz
[2025-11-30 09:37:56 UTC]  25KiB STANDARD demo-backup-logs.gz
[2025-11-30 09:37:56 UTC]    29B STANDARD demo-backup-podvolumebackups.json.gz
[2025-11-30 09:37:56 UTC] 3.3KiB STANDARD demo-backup-resource-list.json.gz
[2025-11-30 09:37:56 UTC]    49B STANDARD demo-backup-results.gz
[2025-11-30 09:37:56 UTC]    27B STANDARD demo-backup-volumeinfo.json.gz
[2025-11-30 09:37:56 UTC]    29B STANDARD demo-backup-volumesnapshots.json.gz
[2025-11-30 09:37:56 UTC] 269KiB STANDARD demo-backup.tar.gz
[2025-11-30 09:37:56 UTC] 3.3KiB STANDARD velero-backup.json

拷贝数据:

I have no name!@4bbadc4673b4:/$ mc cp -r local/velerobackup/backups/demo-backup local/velerobackup-nj/k8s-nj/backups/

查看数据:

I have no name!@4bbadc4673b4:/$ mc ls local/velerobackup-nj/k8s-nj/backups/
[2025-11-30 09:41:49 UTC]     0B demo-backup/
[2025-11-30 09:41:49 UTC]     0B test-backup/

数据复制后,velero 会读取该备份文件,并且会生成对应的 Backup 资源:

[root@k8s-nj-master01 ~]# velero backup get
NAME          STATUS      ERRORS   WARNINGS   CREATED                         EXPIRES   STORAGE LOCATION   SELECTOR
demo-backup   Completed   0        0          2025-11-30 17:37:49 +0800 CST   29d       default            <none>

接下来直接还原即可:

[root@k8s-nj-master01 ~]# velero restore create demo-restore-with-nodeport --from-backup demo-backup --include-namespaces demo --preserve-nodeports

查看还原状态:

[root@k8s-nj-master01 ~]# velero restore get
NAME                         BACKUP        STATUS      STARTED                         COMPLETED                       ERRORS   WARNINGS   CREATED                         SELECTOR
demo-restore-with-nodeport   demo-backup   Completed   2025-11-30 17:43:18 +0800 CST   2025-11-30 17:43:22 +0800 CST   0        1          2025-11-30 17:43:18 +0800 CST   <none>

查看数据:

[root@k8s-nj-master01 ~]# kubectl get po,svc -n demo
NAME                     READY   STATUS    RESTARTS   AGE
pod/krm-ddffd55f-h5lj6   1/1     Running   0          13s

NAME          TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
service/krm   NodePort   10.109.134.105   <none>        80:32107/TCP   12s

5、Velero 卸载

直接使用 Velero 客户端卸载即可:

# velero uninstall -n velero --force

此博客来源于:https://edu.51cto.com/lecturer/11062970.html