导读:本期聚焦于杨建军创作的《如何用 Velero 实现 Kubernetes 集群的定时备份与恢复?》,敬请观看详情。升级集群失败或误删 Namespace 后,如何快速回滚到上一个稳定状态?如果没有自动化备份,仅靠手动导出资源很难还原 PV、ConfigMap 和 CRD。Velero 作为 Kubernetes 原生的灾备工具,通过 Schedule 资源可以按 cron 表达式定时创建 Backup,再结合对象存储和快照能力,把集群状态持续沉淀下来。本文将介绍 Velero 的备份原理、安装配置、定时备份创建、恢复流程以及监控告警的最佳实践,帮助团队形成一套可演练的集群异地恢复方案。内容覆盖 CSI 快照与文件级备份的选择、备份 TTL 与保留策略、以及从误删除中恢复 Namespace 的具体步骤。

Kubernetes 集群的可靠性不只取决于高可用架构,还取决于出问题后能否快速恢复。etcd 备份能恢复控制平面,但业务应用的持久化数据、配置项、命名空间关系往往散落在多个资源中。Velero 的作用正是在应用层做备份与迁移:它可以把这些 Kubernetes 对象和持久卷数据打包备份到对象存储,并按计划周期执行。

如何用 Velero 实现 Kubernetes 集群的定时备份与恢复?

接下来会从组件原理、安装配置、定时任务、恢复演练几个部分展开。如果你已经在生产环境运行 Kubernetes,建议先在测试集群完整走一遍,尤其是恢复步骤,因为备份从来不是目的,能恢复才是。

一、Velero 的备份原理与组件构成

Velero 的架构并不复杂。部署到集群后,它会在 velero 命名空间运行一个 Deployment,内部通过一系列 CRD 来管理备份和恢复任务。核心 CRD 包括 Backup、Restore、Schedule、BackupStorageLocation 和 VolumeSnapshotLocation。其中 BackupStorageLocation 声明备份数据存到哪里,通常是 S3 兼容对象存储;VolumeSnapshotLocation 声明 PV 快照由哪个 CSI 驱动或云厂商快照服务处理。

一次定时备份的流程大致是这样:Schedule 控制器根据 cron 表达式创建 Backup 对象,Backup 控制器收集指定命名空间内的资源清单,同时通过快照或文件级备份处理持久卷数据,最后把 tar 包和元数据写入对象存储。对象存储里的 layout 按 backup 名称、资源类型分目录,恢复时 Velero 再将这些文件还原成 Kubernetes 对象。

这里有一个容易混淆的点:快照备份和文件级备份不是一回事。云厂商 CSI 快照速度快、对大数据量友好,但只支持有快照能力的卷;Restic 或 Kopia 文件级备份则可以在 Pod 内挂载卷后把文件逐层上传,慢一些但兼容性更好。Velero 1.10 以后推荐使用 node-agent 替代 restic,底层仍可配置 Kopia。

二、安装 Velero 并接入对象存储

安装前需要准备一个 S3 兼容桶。测试环境常用 MinIO,生产环境可用 AWS S3、阿里云 OSS 或腾讯云 COS。以 AWS S3 为例,先创建 IAM 用户并获取 Access Key,然后在目标区域建桶,例如 velero-backup-prod。MinIO 本地部署更简单,但要注意存储目录的持久化,否则 MinIO Pod 重启后备份数据会丢失。

创建凭据文件 credentials-velero,内容格式如下:

[default]
aws_access_key_id = YOUR_ACCESS_KEY
aws_secret_access_key = YOUR_SECRET_KEY

接着执行 Velero CLI 安装命令。假设使用 AWS 插件,桶名 velero-backup-prod,区域 us-east-1:

velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.9.0 \
  --bucket velero-backup-prod \
  --backup-location-config region=us-east-1 \
  --snapshot-location-config region=us-east-1 \
  --secret-file ./credentials-velero \
  --use-node-agent \
  --default-volumes-to-fs-backup

如果使用 MinIO,需要额外指定 s3Url 和 forcePathStyle,例如 --backup-location-config region=minio,s3ForcePathStyle=true,s3Url=http://minio.default:9000,并创建对应的 Secret。安装完成后执行 velero version 和 kubectl get pods -n velero 验证控制器是否正常运行。

安装命令中的 --use-node-agent 会部署一个 DaemonSet,用于处理文件级备份。即使你的云盘支持快照,也建议开启文件级备份,因为 ConfigMap、Secret 等普通资源不用快照,但有些场景下 PVC 可能没有快照能力,文件级备份是兜底方案。

三、创建定时备份 Schedule

Velero 的 Schedule 资源使用标准 cron 表达式控制备份频率。下面是一个每天凌晨 2 点执行、保留 72 小时、备份所有命名空间并同时做卷快照的示例:

apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: daily-backup
  namespace: velero
spec:
  schedule: "0 2 * * *"
  template:
    ttl: 72h
    includedNamespaces:
      - "*"
    storageLocation: default
    snapshotVolumes: true
    labels:
      backup-type: daily

这个 YAML 中的 ttl 表示备份对象在对象存储中的保留时间,超过后 Velero 会自动清理。snapshotVolumes 为 true 时,Velero 会尝试对 PVC 关联的 PV 创建快照。如果你之前设置了 default-volumes-to-fs-backup,那么即使快照失败,文件级备份也会接管。

如果只备份部分命名空间,可以修改 includedNamespaces;也可以使用 excludedNamespaces 排除 kube-system 等无须备份的资源。建议生产环境至少保留每日备份和每周备份两个 Schedule,每日备份 TTL 设为 7 天,每周备份 TTL 设为 30 天,这样既能控制对象存储成本,又有较长时间的回退窗口。

创建完 Schedule 后,可以用 kubectl get schedules -n velero 查看,也可以手动触发一次备份验证配置:

velero backup create manual-backup-$(date +%Y%m%d%H%M%S) --from-schedule daily-backup
velero backup get

当 Manual 备份状态显示 Completed 时,说明对象存储写入和快照流程都没有问题。如果一直卡在 InProgress,可以通过 velero backup describe 查看具体错误,常见原因包括对象存储权限不足、CSI 快照驱动未安装、或节点代理 Pod 未就绪。

四、从定时备份恢复数据

恢复操作可以按整个 Backup 恢复,也可以只恢复某个命名空间或某类资源。发生误删 Namespace 时,最直接的方式是按备份名恢复整个命名空间:

velero restore create --from-backup daily-backup-20250101020000 \
  --include-namespaces production
velero restore get
velero restore describe restore-name

如果需要恢复到不同集群或不同命名空间,可以使用 namespaceMapping 和 restoreOnly 参数。例如把 production 恢复为 staging:

velero restore create --from-backup daily-backup-20250101020000 \
  --namespace-mappings production:staging \
  --restore-only-configmaps,secrets,deployments

恢复持久卷时有一个重要限制:如果原集群已经不存在,或者云厂商快照不可用,快照恢复会失败。这时应确保备份时启用了文件级备份,并在恢复时使用 --restore-volumes=true。文件级备份会把数据还原到新建的 PV 中,虽然速度慢一些,但跨集群、跨存储类都能恢复。

另一个容易忽略的点是 CRD 恢复顺序。Velero 会先恢复 CRD 定义,再恢复自定义资源实例,但如果某些 CRD 的 Webhook 在恢复时还未就绪,可能导致资源校验失败。遇到这种情况,可以先停掉相关 Webhook 或使用 Velero 的 restore hooks 延迟恢复。

五、监控告警与日常维护

定时备份最怕的是“以为在备份,其实早已失败”。所以光创建 Schedule 不够,还要把备份状态接入监控。Velero 从 1.7 开始暴露 Prometheus 指标,包括 velero_backup_success_total、velero_backup_failure_total、velero_backup_last_success_timestamp 等。可以在 Prometheus 中配置告警,当某个 Schedule 超过 24 小时没有成功备份时通知运维。

告警规则示例如下:

groups:
  - name: velero-backup
    rules:
      - alert: VeleroBackupFailed
        expr: increase(velero_backup_failure_total[1h]) > 0
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "Velero 备份失败"
      - alert: VeleroNoRecentBackup
        expr: time() - velero_backup_last_success_timestamp > 86400
        for: 1h
        labels:
          severity: warning
        annotations:
          summary: "Velero 超过一天没有成功备份"

日常维护还包括定期清理过期备份、关注对象存储容量、测试恢复流程。很多团队只在灾难发生后才发现恢复脚本有问题,因此建议每月至少做一次恢复演练。演练不需要真的破坏生产环境,可以恢复到隔离命名空间或临时集群,验证资源完整性和数据一致性。

如果集群规模较大,备份过程中产生的 API 请求可能会对 kube-apiserver 造成压力。可以通过设置 --resource-timeout、--item-operation-timeout 等参数控制单次操作超时,也可以把备份时间安排在业务低谷。对于超过几千个资源的集群,建议拆分多个 Schedule 按命名空间分别备份,避免单个 Backup 任务过大导致超时。

最后提醒一点,备份数据已经进入对象存储后,需要保护好对象存储的访问密钥和桶策略。不要让 Velero 使用的 IAM 用户拥有删除桶的权限,同时开启对象存储版本控制或对象锁,防止误删备份或勒索软件破坏。Velero 本身支持备份加密,但密钥管理要单独规划。

VeleroKubernetes定时备份修改时间:2026-10-06 16:17:56

免责声明:已尽一切努力确保本网站所含信息的准确性。网站作品多为原创整理与精心创作,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们进行处理Email:chomcom@qq.com。
引用或转载本作品时,请注明当前出处:https://www.ipipp.com/html/1006/66515.html,基于非商业用途的前提下,欢迎转载或二创本作品。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。