Kubernetes概念:ETCD 的本质与备份恢复实践

目录

[一、ETCD 的本质](#一、ETCD 的本质)

[1. 数据模型:键值存储 (Key-Value Store)](#1. 数据模型:键值存储 (Key-Value Store))

[2. 核心特性:分布式能力](#2. 核心特性:分布式能力)

[3. 与典型数据库对比](#3. 与典型数据库对比)

[二、ETCD 备份与恢复](#二、ETCD 备份与恢复)

[1. 核心概念](#1. 核心概念)

[2. 备份方法](#2. 备份方法)

[方法 1:使用 etcdctl snapshot save(推荐)](#方法 1:使用 etcdctl snapshot save(推荐))

[方法 2:复制数据目录(不推荐生产环境)](#方法 2:复制数据目录(不推荐生产环境))

[3. 恢复方法](#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. 恢复方法

恢复操作会覆盖所有现有数据,需谨慎执行。

步骤
  1. 停止服务

    sudo systemctl stop kube-apiserver
    sudo systemctl stop etcd

  2. 清理旧数据

    sudo rm -rf /var/lib/etcd/*

  3. 从快照恢复

    export ETCDCTL_API=3

    etcdctl 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

  4. 移动数据并重启

    sudo mv /var/lib/etcd/new/* /var/lib/etcd/
    sudo chown -R etcd:etcd /var/lib/etcd
    sudo systemctl start etcd

  5. 验证健康状态并重启 API Server

    etcdctl endpoint health
    sudo systemctl start kube-apiserver
    kubectl get nodes
    kubectl get pods --all-namespaces


三、最佳实践与注意事项

  1. 定期自动化备份 :使用 cronjob 或脚本每日执行,并上传至安全存储(如 S3、NFS)。
  2. 备份保留策略:例如保留最近 7 天快照,并定期清理旧备份。
  3. 演练恢复流程:在测试环境定期演练,确保灾难发生时能快速恢复。
  4. 配置文件备份 :同时备份 /etc/kubernetes//etc/etcd/ 下的静态 Pod 清单和证书文件。
  5. 使用专业工具 :生产环境推荐 Velero 等工具,支持更细粒度的 Kubernetes 资源与持久卷备份。

总结

ETCD 是 Kubernetes 的 中央档案室

  • 它不处理业务数据,而是存储系统状态与配置。
  • 它的本质是 分布式强一致性键值数据库
  • 对于 Kubernetes 集群而言,ETCD 的备份与恢复是运维的最后防线。

定期备份、妥善保存快照、演练恢复,是保证 Kubernetes 集群稳定运行的核心工作。