1. ETCD:Kubernetes的"记忆水晶"

作为分布式键值数据库,ETCD承载着Kubernetes集群的所有状态数据。就像人体的海马体存储记忆,ETCD记录了Pod部署、Service配置、节点状态等关键信息。2021年某知名云厂商的集群故障事件中,正是因为缺少有效备份,导致600+节点集群瘫痪12小时。

2. 两种ETCD备份姿势

(技术栈:etcdctl v3.5+)

ETCDCTL_API=3 
etcdctl --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key \
  snapshot save /var/lib/etcd-backup/snapshot-$(date +%s).db

# 自动备份脚本(部署于集群Master节点)
#!/bin/bash
BACKUP_DIR="/opt/k8s-backup/etcd-$(date +%Y%m%d)"
mkdir -p $BACKUP_DIR

# 创建快照(保留最近7天数据)
etcdctl snapshot save $BACKUP_DIR/snapshot.db \
  --endpoints=https://localhost:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/server.crt \
  --key=/etc/kubernetes/pki/etcd/server.key

# 打包上传OSS(以阿里云为例)
tar -czf $BACKUP_DIR.tar.gz $BACKUP_DIR 
ossutil64 cp $BACKUP_DIR.tar.gz oss://k8s-backup-bucket/etcd/
find /opt/k8s-backup/ -type d -mtime +7 -exec rm -rf {} \;

# 设置Cron定时任务(每天凌晨3点执行)
0 3 * * * /usr/local/bin/etcd_backup.sh >> /var/log/etcd-backup.log 2>&1

3. 灾难恢复实战手册(模拟整个集群崩溃场景)

# 准备恢复环境(使用kubeadm初始化后的干净节点)
systemctl stop kube-apiserver etcd

# 清空原始数据(危险操作!确保已经备份)
rm -rf /var/lib/etcd/*

# 执行恢复操作(注意保留原集群配置)
etcdctl snapshot restore /mnt/backup/snapshot-20231111.db \
  --data-dir=/var/lib/etcd/restored \
  --name master01 \
  --initial-cluster "master01=https://10.0.0.1:2380" \
  --initial-cluster-token my-etcd-cluster

# 修改etcd服务配置
vim /etc/kubernetes/manifests/etcd.yaml
...
  volumes:
  - hostPath:
      path: /var/lib/etcd/restored  # 关键修改点
      type: DirectoryOrCreate
    name: etcd-data
...

# 重启服务观察状态
systemctl restart etcd
etcdctl endpoint health --cluster

4. 关联技术:Velero的跨云逃生方案

(技术栈:AWS S3 + Velero v1.10)

# 安装Velero客户端(MacOS示例)
brew install velero

# 创建备份存储桶(AWS S3操作)
aws s3api create-bucket --bucket my-k8s-backup-2023 \
  --region us-west-2 \
  --create-bucket-configuration LocationConstraint=us-west-2

# 部署Velero到集群(注意访问密钥提前配置)
velero install \
  --provider aws \
  --plugins velero/velero-plugin-for-aws:v1.6.1 \
  --bucket my-k8s-backup-2023 \
  --backup-location-config region=us-west-2 \
  --snapshot-location-config region=us-west-2 \
  --use-volume-snapshots=false \
  --secret-file ./credentials-velero

# 创建全集群备份(包含ETCD与资源声明)
velero backup create full-cluster-backup \
  --include-cluster-resources=true \
  --include-namespaces='*' \
  --exclude-resources=events,events.events.k8s.io

# 模拟灾难恢复
velero restore create --from-backup full-cluster-backup

5. 典型应用场景分析

  • 版本升级回退:当kubeadm升级导致API版本不兼容时,快速回退到健康状态
  • 误操作救援:开发人员误删Namespace后的数据抢救
  • 多云迁移:跨云厂商集群搬迁时保持服务连续性
  • 安全事件处置:遭勒索软件攻击后的快速重建

6. 技术方案优缺点对比

ETCD原生备份
✅ 优点:原子性完整备份、恢复速度快(平均5分钟)、依赖项少
❌ 缺点:无法细粒度恢复、需要处理证书认证、单备份点风险

Velero方案
✅ 优点:支持资源过滤、整合存储快照、可视化操作
❌ 缺点:需额外存储成本、网络带宽消耗较大、学习曲线陡峭

7. 避坑指南:血的教训总结

  • 证书时效性:某次恢复失败因使用过期证书(建议定期轮换)
  • 元数据一致性:曾出现因未备份--data-dir外的配置文件导致恢复后API Server无法连接
  • 存储隔离原则:避免将备份文件存储在原集群的PersistentVolume中(产生循环依赖)
  • 恢复验证流程:必须在预发环境测试恢复后执行kubectl auth check和网络策略检测

8. 总结:构建备份防御体系

就像优秀的水手永远不会只依赖一个救生圈,完整的Kubernetes灾备体系应包括:

  • 时间维度:每小时增量备份 + 每日全量备份
  • 空间维度:本地SSD + 跨区对象存储 + 异地归档
  • 技术维度:ETCD快照 + 资源声明备份 + 持久卷快照
  • 流程维度:备份验证自动化脚本 + 季度灾备演练