Kubernetes 备份与灾难恢复:Velero 实战指南

为什么需要 Kubernetes 集群备份?

在云原生环境中,虽然 Kubernetes 提供了高可用和自愈能力,但人为误操作、软件缺陷、数据中心故障等风险依然存在。2022年 Flexera 报告显示,35%的企业经历过因配置错误导致的云服务中断,而平均恢复时间超过4小时。

Velero 核心架构

Velero(原名 Heptio Ark)是 Kubernetes 官方推荐的集群备份工具,采用客户端-服务端架构:

图1

主要组件:

  • Velero Server:运行在集群中的控制器,处理备份/恢复操作
  • Restic:可选组件,用于无快照支持的卷数据备份
  • 对象存储:保存备份数据的持久化存储

安装与配置 Velero

以 AWS S3 为例的安装步骤:

# 下载 Velero 客户端
wget https://github.com/vmware-tanzu/velero/releases/download/v1.9.0/velero-v1.9.0-linux-amd64.tar.gz
tar -xvf velero-v1.9.0-linux-amd64.tar.gz
sudo mv velero-v1.9.0-linux-amd64/velero /usr/local/bin/

# 创建 S3 存储桶
aws s3api create-bucket --bucket my-velero-backups --region us-west-2

# 安装 Velero 到集群
velero install \
    --provider aws \
    --plugins velero/velero-plugin-for-aws:v1.5.0 \
    --bucket my-velero-backups \
    --backup-location-config region=us-west-2 \
    --snapshot-location-config region=us-west-2 \
    --secret-file ./credentials-velero

数据一致性保障策略

1. 应用级一致性

对于有状态应用(如数据库),确保备份时应用处于一致状态:

# 在备份时执行 pre/post hook 的注解示例
annotations:
  backup.velero.io/pre-backup-hook: |
    {
      "exec": {
        "container": "mysql",
        "command": ["/bin/sh", "-c", "mysql -u root -p$MYSQL_ROOT_PASSWORD -e 'FLUSH TABLES WITH READ LOCK'"]
      }
    }
  backup.velero.io/post-backup-hook: |
    {
      "exec": {
        "container": "mysql",
        "command": ["/bin/sh", "-c", "mysql -u root -p$MYSQL_ROOT_PASSWORD -e 'UNLOCK TABLES'"]
      }
    }

2. 存储卷快照

Velero 支持与云提供商的原生快照集成:

# 创建带卷快照的备份
velero backup create cluster-backup --include-namespaces=production --snapshot-volumes

备份策略实践

建议采用分级备份策略:

  1. 日常增量备份:每小时执行,保留24小时

    velero schedule create daily-backup \
        --schedule="@every 1h" \
        --include-namespaces=production \
        --ttl 24h
  2. 每周全量备份:保留4周

    velero schedule create weekly-full-backup \
        --schedule="@weekly" \
        --include-namespaces=production \
        --ttl 720h
  3. 每月归档备份:手动创建,异地存储

容灾演练与恢复流程

1. 定期演练步骤

  1. 创建隔离的测试集群
  2. 从备份恢复关键组件
  3. 验证应用功能与数据完整性
  4. 记录恢复时间指标(RTO)和数据丢失量(RPO)
# 恢复演练命令示例
velero restore create --from-backup cluster-backup --namespace-mappings production:production-test

2. 真实灾难恢复流程

  1. 评估损失范围

    velero backup get # 查看可用备份
    velero backup describe <backup-name> # 检查备份内容
  2. 分阶段恢复

    # 先恢复关键基础设施
    velero restore create --from-backup cluster-backup --include-resources persistentvolumes,persistentvolumeclaims
    
    # 再恢复核心应用
    velero restore create --from-backup cluster-backup --include-namespaces=core-system
    
    # 最后恢复其他组件
    velero restore create --from-backup cluster-backup --exclude-namespaces=core-system,kube-system

最佳实践建议

  1. 备份策略

    • 遵循 3-2-1 规则:3份备份,2种介质,1份异地
    • 对关键命名空间和应用单独配置备份策略
  2. 安全考虑

    • 加密备份存储(使用云提供商加密或 Velero 的 --cacert 参数)
    • 定期轮换备份存储的访问凭证
  3. 监控告警

    • 监控备份作业失败情况
    • 设置备份存储容量告警
  4. 文档维护

    • 记录恢复操作手册
    • 保持团队灾难恢复培训

常见问题排查

  1. 备份卡住

    kubectl -n velero get pods # 检查 Velero pod 状态
    velero backup logs <backup-name> # 查看详细日志
  2. 恢复失败

    • 检查目标集群是否有资源冲突
    • 验证存储类是否兼容
  3. 性能优化

    • 对大型集群使用 --parallelism 参数
    • 调整 restic--workers 数量

总结

Velero 作为 Kubernetes 生态的标准备份方案,配合合理的策略和定期演练,可以为企业提供可靠的灾备能力。关键是要:

  • 根据业务需求设计备份频率和保留策略
  • 验证备份的可恢复性而不仅仅是备份的成功率
  • 将灾备流程纳入 CI/CD 管道进行自动化测试
生产环境建议:至少每季度执行一次全流程的灾难恢复演练,并将 RTO/RPO 指标纳入 SLA 监控。

添加新评论