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快照 + 资源声明备份 + 持久卷快照
- 流程维度:备份验证自动化脚本 + 季度灾备演练