Kubernetes概念:ETCD 的本质与备份恢复实践
目录
一、ETCD 的本质
1. 数据模型:键值存储 (Key-Value Store)
2. 核心特性:分布式能力
3. 与典型数据库对比
二、ETCD 备份与恢复
1. 核心概念
2. 备份方法
方法 1:使用 etcdctl snapshot save(推荐)
方法 2:复制数据目录(不推荐生产环境)
3. 恢复方法
步骤
三、最佳实践与注意事项
总结
一、ETCD 的本质
ETCD 的本质是一个 分布式、可靠、一致的键值(Key-Value)存储数据库。
它不同于 MySQL 或 PostgreSQL 这样的关系型数据库(RDBMS),也不同于 MongoDB 这样的文档数据库,而是专为分布式系统场景设计的 强一致性键值存储。
1. 数据模型:键值存储 (Key-Value Store)
- 键 (Key):字节序列,按字典顺序排列,支持范围查询。
- 值 (Value):字节序列,可以是 JSON、Protobuf、文本等,ETCD 不关心具体格式。
- 操作:支持 PUT、GET、DELETE,以及 WATCH(监听变化) 和事务操作。
与 Redis 相似,但 Redis 偏重于高性能缓存和复杂数据结构,ETCD 则偏重 强一致性与持久化。
2. 核心特性:分布式能力
特性 | 解释 | 重要性 |
---|---|---|
强一致性 (Strong Consistency) | 使用 Raft 共识算法,保证所有节点数据一致。 | Kubernetes 各组件依赖一致的集群状态。 |
高可用性 (High Availability) | 通常部署奇数节点(3/5),可容忍部分节点故障。 | 避免单点故障,保证集群稳定。 |
持久化 (Persistence) | 使用 WAL + 快照保证数据安全与快速恢复。 | 防止断电或重启导致数据丢失。 |
Watch 机制 | 客户端可订阅键变化,ETCD 主动推送。 | K8s 各组件实时感知集群状态。 |
3. 与典型数据库对比
特性 | ETCD | Redis | MySQL/PostgreSQL |
---|---|---|---|
主要目标 | 分布式协调、配置存储 | 缓存、消息队列 | 通用业务数据存储 |
数据模型 | 键值对 | 丰富数据结构 | 表/行/列 |
一致性模型 | 强一致性 (CP) | 可选 AP/CP | ACID |
持久化 | 默认核心功能 | 可选 | 默认核心功能 |
查询能力 | 简单(键/范围查询) | 简单到中等 | SQL(复杂查询、聚合) |
典型应用 | K8s 元数据、服务发现 | 缓存、排行榜 | 用户订单、财务系统 |
结论:
ETCD 是一个 分布式键值数据库,其核心价值是 通过 Raft 实现强一致性,最适合存储 系统状态信息和配置,而不是业务数据。它是 Kubernetes 的“大脑”,是云原生系统的基石。
二、ETCD 备份与恢复
1. 核心概念
- ETCD:存储 Kubernetes 的所有元数据(Pod、Service、Deployment、ConfigMap 等)。
- 备份:保存 ETCD 数据目录的快照。
- 恢复:使用快照回滚 ETCD 状态,会覆盖当前数据。
2. 备份方法
方法 1:使用 etcdctl snapshot save
(推荐)
可在线备份,无需停止服务。
前提:安装 etcdctl
工具,并具备证书(若启用 TLS)。
# 设置环境变量
export ETCDCTL_API=3
export ENDPOINTS=https://127.0.0.1:2379
export ETCDCTL_CACERT=/etc/kubernetes/pki/etcd/ca.crt
export ETCDCTL_CERT=/etc/kubernetes/pki/etcd/server.crt
export ETCDCTL_KEY=/etc/kubernetes/pki/etcd/server.key# 创建快照
etcdctl --endpoints=$ENDPOINTS --cacert=$ETCDCTL_CACERT --cert=$ETCDCTL_CERT --key=$ETCDCTL_KEY snapshot save /opt/etcd-backup/snapshot-$(date +%F-%H%M%S).db# 验证快照
etcdctl snapshot status /opt/etcd-backup/snapshot-*.db --write-out=table
方法 2:复制数据目录(不推荐生产环境)
需要停止 ETCD,风险较高。
sudo systemctl stop etcd
sudo tar -czf /opt/etcd-backup/etcd-data-$(date +%F).tar.gz /var/lib/etcd
sudo systemctl start etcd
3. 恢复方法
恢复操作会覆盖所有现有数据,需谨慎执行。
步骤
- 停止服务
sudo systemctl stop kube-apiserver
sudo systemctl stop etcd
- 清理旧数据
sudo rm -rf /var/lib/etcd/*
- 从快照恢复
export ETCDCTL_API=3etcdctl snapshot restore /opt/etcd-backup/snapshot.db --data-dir=/var/lib/etcd/new --name=master-1 --initial-advertise-peer-urls=https://192.168.1.101:2380 --initial-cluster=master-1=https://192.168.1.101:2380,master-2=https://192.168.1.102:2380 --initial-cluster-token=etcd-cluster-1
- 移动数据并重启
sudo mv /var/lib/etcd/new/* /var/lib/etcd/
sudo chown -R etcd:etcd /var/lib/etcd
sudo systemctl start etcd
- 验证健康状态并重启 API Server
etcdctl endpoint health
sudo systemctl start kube-apiserver
kubectl get nodes
kubectl get pods --all-namespaces
三、最佳实践与注意事项
- 定期自动化备份:使用
cronjob
或脚本每日执行,并上传至安全存储(如 S3、NFS)。 - 备份保留策略:例如保留最近 7 天快照,并定期清理旧备份。
- 演练恢复流程:在测试环境定期演练,确保灾难发生时能快速恢复。
- 配置文件备份:同时备份
/etc/kubernetes/
和/etc/etcd/
下的静态 Pod 清单和证书文件。 - 使用专业工具:生产环境推荐 Velero 等工具,支持更细粒度的 Kubernetes 资源与持久卷备份。
总结
ETCD 是 Kubernetes 的 中央档案室:
- 它不处理业务数据,而是存储系统状态与配置。
- 它的本质是 分布式强一致性键值数据库。
- 对于 Kubernetes 集群而言,ETCD 的备份与恢复是运维的最后防线。
定期备份、妥善保存快照、演练恢复,是保证 Kubernetes 集群稳定运行的核心工作。