K8s 系列 | 第 26 天:集群备份与恢复:etcd 快照 + Velero 方案


title: “K8s 系列 | 第 26 天:集群备份与恢复:etcd 快照 + Velero 方案”
tags:
– Kubernetes
– K8s系列
– DevOps
– 备份恢复
– etcd
– Velero
– 数据保护


第 26/30 天 | 系列目录见文末

K8s 系列 | 第 26 天:集群备份与恢复:etcd 快照 + Velero 方案

引言

在生产环境中,Kubernetes 集群承载着关键业务应用和数据。然而,任何系统都可能面临风险:硬件故障、操作失误、网络分区、勒索软件攻击……如果没有完善的备份恢复策略,一次事故就可能导致整个集群不可用,造成严重后果。

K8s 的备份恢复需要解决两个层面的问题:

  1. 控制平面数据——etcd 中存储的集群状态(资源对象、配置、状态)
  2. 工作负载数据——PV 中持久化的应用数据

本文将深入讲解 etcd 快照备份机制和 Velero 集群备份恢复方案,帮助你构建生产级的 K8s 数据保护体系。


一、etcd 快照:控制平面的生命线

1.1 为什么要备份 etcd?

etcd 是 K8s 的”大脑”,存储了所有集群资源对象的状态:

  • Pod、Deployment、Service、ConfigMap、Secret 等 API 对象的定义
  • 集群节点信息、RBAC 配置
  • 所有资源的当前状态和期望状态

etcd 不可用 = 集群不可管理。虽然存量的 Pod 会继续运行,但你无法创建、更新或删除任何资源。

1.2 手动创建 etcd 快照

kubeadm 部署的集群可以通过 etcdctl 工具直接备份:

# 设置 etcd API 版本
export ETCDCTL_API=3

# 使用证书参数创建快照
sudo ETCDCTL_API=3 etcdctl 
  --cacert=/etc/kubernetes/pki/etcd/ca.crt 
  --cert=/etc/kubernetes/pki/etcd/server.crt 
  --key=/etc/kubernetes/pki/etcd/server.key 
  snapshot save /backup/etcd-snapshot-$(date +%Y%m%d-%H%M%S).db

验证快照文件完整性:

# 检查快照状态
sudo ETCDCTL_API=3 etcdctl 
  --cacert=/etc/kubernetes/pki/etcd/ca.crt 
  --cert=/etc/kubernetes/pki/etcd/server.crt 
  --key=/etc/kubernetes/pki/etcd/server.key 
  snapshot status /backup/etcd-snapshot-20260712-080000.db

# 输出示例:
# b512d3c6, 56342, 3.5.0, 36 MB

1.3 etcd 快照恢复流程

当集群完全损坏时,使用快照恢复到某个时间点:

# 1. 停止 etcd 和 API server 相关组件
sudo systemctl stop kubelet
# 如果使用容器化 etcd:
docker stop $(docker ps | grep etcd | awk '{print $1}')
docker stop $(docker ps | grep kube-apiserver | awk '{print $1}')

# 2. 从快照恢复(会在指定目录生成一个新的数据目录)
sudo ETCDCTL_API=3 etcdctl snapshot restore /backup/etcd-snapshot-20260712-080000.db 
  --data-dir /var/lib/etcd-restored 
  --name master 
  --initial-cluster master=https://10.0.0.10:2380 
  --initial-cluster-token etcd-cluster-restore 
  --initial-advertise-peer-urls https://10.0.0.10:2380

# 3. 将恢复的数据目录替换到 etcd 配置中
sudo mv /var/lib/etcd /var/lib/etcd.bak
sudo mv /var/lib/etcd-restored /var/lib/etcd

# 4. 启动 etcd 和 kubelet
sudo systemctl start kubelet

注意:etcd 快照恢复会抹掉恢复时间点之后的所有变更,属于粗粒度的全量恢复方式。高频备份(至少每天一次)是控制恢复时间点窗口的关键。

1.4 定时自动化 etcd 备份

建议配置 cron 作业自动执行 etcd 快照并保留最近 N 份:

#!/bin/bash
# /usr/local/bin/etcd-backup.sh
BACKUP_DIR="/backup/etcd"
RETENTION_DAYS=30
TIMESTAMP=$(date +%Y%m%d-%H%M%S)

mkdir -p $BACKUP_DIR

ETCDCTL_API=3 etcdctl 
  --cacert=/etc/kubernetes/pki/etcd/ca.crt 
  --cert=/etc/kubernetes/pki/etcd/server.crt 
  --key=/etc/kubernetes/pki/etcd/server.key 
  snapshot save $BACKUP_DIR/snapshot-$TIMESTAMP.db

# 保留最近 30 天的备份
find $BACKUP_DIR -name "snapshot-*.db" -mtime +$RETENTION_DAYS -delete

# 同步到远端存储(如 S3)
aws s3 cp $BACKUP_DIR/snapshot-$TIMESTAMP.db s3://my-cluster-backup/etcd/

Cron 配置(每天凌晨 2 点执行):

0 2 * * * /usr/local/bin/etcd-backup.sh

二、Velero:集群级备份恢复方案

etcd 快照只能恢复控制平面数据,但生产集群还需要保护 PV 中的持久化数据。Velero 是目前最流行的 K8s 集群备份恢复工具,由 VMware 开源。

2.1 Velero 核心架构

Velero 由两部分组成:

组件 说明
Velero 服务端 运行在集群中的 Deployment,负责执行备份/恢复操作
velero CLI 客户端命令行工具,用于管理备份任务
存储后端插件 对接 AWS S3、GCS、Azure Blob、MinIO 等对象存储
Volume 快照插件 对接云厂商存储快照 API 或开源方案(如 restic)

工作流程:

velero backup create → Velero 服务端 → API 对象 → 对象存储
                                    → PV 快照 → 云存储 / restic 备份

2.2 安装 Velero

使用 Helm 安装是推荐方式,这里展示如何对接 MinIO(自建 S3 兼容存储):

# values.yaml
configuration:
  provider: aws
  backupStorageLocation:
    name: default
    bucket: velero-backups
    config:
      region: us-east-1
      s3ForcePathStyle: "true"
      s3Url: http://minio.minio-system:9000
  volumeSnapshotLocation:
    name: default
    config:
      region: us-east-1
  defaultVolumesToFsBackup: true  # 使用 restic 备份 PV 数据

initContainers:
  - name: velero-plugin-for-aws
    image: velero/velero-plugin-for-aws:v1.9.0
    volumeMounts:
      - mountPath: /target
        name: plugins

credentials:
  useSecret: true
  secretContents:
    cloud: |
      [default]
      aws_access_key_id = minioadmin
      aws_secret_access_key = minioadmin

安装命令:

helm repo add vmware-tanzu https://vmware-tanzu.github.io/helm-charts
helm repo update
helm install velero vmware-tanzu/velero 
  --namespace velero-system 
  --create-namespace 
  -f values.yaml

2.3 创建备份

# 备份所有命名空间下的资源
velero backup create daily-backup-$(date +%Y%m%d) 
  --ttl 720h  # 保留 30 天

# 备份指定命名空间
velero backup create ns-production 
  --include-namespaces production 
  --default-volumes-to-fs-backup

# 按标签选择备份
velero backup create app-myapp 
  --selector app=myapp 
  --include-cluster-resources=false

# 排除特定资源
velero backup create exclude-configmaps 
  --exclude-resources configmaps,secrets

2.4 查看和管理备份

# 查看所有备份
velero backup get

# 查看备份详情
velero backup describe daily-backup-20260712 --details

# 删除备份
velero backup delete daily-backup-20260711

2.5 执行恢复

# 恢复到原集群
velero restore create --from-backup daily-backup-20260712

# 恢复到新集群(迁移场景)
velero restore create 
  --from-backup daily-backup-20260712 
  --namespace-mappings production:staging

# 选择性恢复
velero restore create 
  --from-backup daily-backup-20260712 
  --include-namespaces production 
  --include-resources deployments,services

# 验证恢复结果
velero restore get
velero restore describe <restore-name>

2.6 备份调度器

设置定期自动备份:

# 创建每日凌晨 3 点的备份调度
velero schedule create daily-full 
  --schedule="0 3 * * *" 
  --ttl 720h 
  --default-volumes-to-fs-backup

# 查看调度
velero schedule get

# 暂停调度
velero schedule pause daily-full

# 恢复调度
velero schedule unpause daily-full

对应的 YAML 配置:

apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: daily-full
  namespace: velero-system
spec:
  schedule: "0 3 * * *"
  template:
    ttl: 720h
    defaultVolumesToFsBackup: true

三、生产环境备份策略建议

3.1 分层备份架构

推荐采用三层备份策略,兼顾控制面和数据面:

层级 内容 工具 频率 RPO
L1 – etcd 快照 集群状态、资源对象 etcdctl 每 2-4 小时 ≤ 4h
L2 – Velero 备份 API 对象 + PV 数据 Velero + restic 每天 ≤ 24h
L3 – 异地容灾 全部备份同步到异地 rsync / Velero 多存储 实时/每天 ≤ 24h

3.2 备份验证

备份没有验证等于没有备份!定期执行恢复演练

# 在测试集群中验证备份的可恢复性
velero restore create 
  --from-backup daily-backup-20260712 
  --namespace-mappings production:test-restore

3.3 常见备份场景配置

# 生产环境完整备份调度
apiVersion: velero.io/v1
kind: Schedule
metadata:
  name: production-full-backup
  namespace: velero-system
spec:
  schedule: "0 2 * * *"
  template:
    includedNamespaces:          # 备份所有业务命名空间
      - production
      - staging
      - monitoring
    excludedNamespaces:          # 排除系统组件
      - velero-system
      - kube-system
    defaultVolumesToFsBackup: true
    ttl: 744h                    # 保留 31 天
    snapshotMoveData: true       # 使用 Data Mover 提高 PV 备份效率

四、常见问题

Q1:etcd 快照恢复后,Velero 备份还能用吗?

可以。两者相互独立:etcd 快照恢复的是集群状态,Velero 备份可以覆盖更细粒度的恢复。建议先恢复 etcd 快照让集群可用,再用 Velero 恢复特定命名空间的应用和数据。

Q2:restic 备份 PV 会影响应用性能吗?

restic 使用文件系统级别的快照,通过 hostPath 挂载的方式读取 PV 数据,对运行中的应用影响较小。但备份期间会有 I/O 开销,建议在业务低峰期执行备份。

Q3:大规模集群(1000+ 节点)备份需要注意什么?

  • etcd 快照会变大(可能 > 1GB),确保备份路径有足够磁盘空间
  • Velero 备份大量资源时可能超时,使用 --parallel 参数调整并发数
  • 考虑拆分备份策略:按命名空间或应用分组分时段备份

Q4:Velero 能跨 K8s 版本恢复吗?

一般建议在相同或相近的 K8s 版本间恢复。跨大版本(如 1.24 → 1.28)恢复可能遇到 API 资源版本兼容性问题,建议先在测试集群验证。


总结

备份方案 保护范围 适用场景
etcd snapshot 集群控制平面 灾难恢复、集群重建
Velero(对象) API 资源对象 细粒度恢复、迁移
Velero + restic API 资源 + PV 数据 全量备份恢复

核心原则
– 所有备份必须定期验证可恢复性
– 保留多地、多份备份(3-2-1 原则)
– 备份不仅是技术问题,更是运维规范——文档化恢复流程


下期预告

第 27 天:滚动更新与回滚策略:实现零停机发布

应用更新最怕的是什么?服务中断!下期我们将深入 Deployment 的滚动更新机制、健康检查探针配置、蓝绿部署和金丝雀发布策略,教你如何在不影响用户的情况下安全发布应用。


📚 系列目录

阶段 文章
第 1 周:基础入门 第 1-7 天:概念 → 集群搭建 → Pod → Deployment → Service → Namespace → ConfigMap/Secret
第 2 周:存储与网络 第 8-14 天:Volume → StorageClass → StatefulSet → Ingress → NetworkPolicy → Headless Service → CSI
第 3 周:调度与资源 第 15-21 天:Taint/Toleration → Affinity → HPA → VPA → Job/CronJob → PriorityClass → LimitRange
第 4 周:生产运维 第 22-28 天:监控 → 日志 → RBAC → Helm → 备份恢复(本篇) → 滚动更新 → 集群升级
第 5 周:进阶 第 29-30 天:多集群管理 → 踩坑实录

上一篇:第 25 天 → Helm Charts:包管理器使用与 Chart 开发实战
下一篇:第 27 天 → 滚动更新与回滚策略:实现零停机发布

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容