etcd一致性架构与Kubernetes存储集群运维 - 第1节

1.1 什么是 etcd

etcd 是一个分布式、高可用的键值(Key-Value)存储系统,由 CoreOS 团队使用 Go 语言开发并开源。它基于 Raft 共识算法 实现数据强一致性,并提供了可靠的 Watch 机制和租约(Lease)管理能力。在云原生生态中,etcd 是 Kubernetes 控制平面的核心数据存储组件,负责保存集群的全部状态信息。

核心特性:

  • 强一致性: 基于 Raft 算法,保证所有节点数据一致。
  • 高可用: 支持集群模式(通常 3 或 5 节点),容忍部分节点故障。
  • 键值存储: 提供简单的 KV API,支持 TTL 和 Watch。
  • 可靠 Watch: 客户端可以监听 key 的变化,实现事件驱动。

1.2 etcd 在 K8s 中的核心地位

在 Kubernetes 架构中,etcd 是唯一的有状态组件,承载着整个集群的“真相来源”(Source of Truth)。所有 API 对象的创建、更新、删除操作,最终都会持久化到 etcd 中。如果 etcd 不可用,Kubernetes 集群将无法进行任何状态变更,但已运行的 Pod 和 Service 仍会继续工作。

关键事实: Kubernetes 本身是无状态的,它的所有状态都委托给 etcd 管理。etcd 的稳定性直接决定了 K8s 集群的可靠性。

下图展示了 etcd 在 Kubernetes 控制平面中的位置与数据流向:

etcd 在 Kubernetes 控制平面中的位置 etcd 在 Kubernetes 控制平面中的位置 kubectl / API 客户端 kube-apiserver etcd 集群(Raft 共识) 节点1 | 节点2 | 节点3 kube-scheduler kube-controller-manager kubelet (通过 API Server) 数据流说明 1. 客户端通过 API Server 操作资源(创建 Pod、更新 Deployment 等)。 2. API Server 将资源对象序列化后写入 etcd,并监听 etcd 的变化。 3. 其他控制面组件通过 API Server 间接读取/监听 etcd 中的数据。

1.3 etcd vs 传统数据库

etcd 虽然具备数据存储能力,但其设计哲学与 MySQL、PostgreSQL 等传统关系型数据库有本质区别。etcd 更关注分布式环境下的 一致性 和 可用性,而非复杂查询或事务处理。

对比维度 etcd 传统数据库(MySQL/PostgreSQL)
数据模型 分层键值(KV),支持目录结构 关系表(Table),支持 SQL 查询
一致性 强一致性(Raft 共识) 通常为最终一致性或可配置
查询能力 基于前缀/范围的简单查询,不支持 SQL 复杂 SQL 查询、JOIN、聚合
事务支持 单 key 或有限的多 key 事务(基于版本号) 完整 ACID 事务
Watch 机制 原生支持,实时推送变更事件 通常需要轮询或触发器
典型场景 服务发现、配置管理、分布式锁 业务数据存储、报表分析
存储引擎 BoltDB(嵌入式 KV 引擎) InnoDB、MyISAM 等

选型建议: 不要用 etcd 存储业务数据或大文件。etcd 的默认存储限制为 2GB(可调整),且不适合频繁的大数据量写入。它专为小数据量、高一致性、高可靠性的元数据场景设计。

下图从架构层面对比 etcd 与传统数据库的差异:

etcd 与传统数据库架构对比 etcd 与传统数据库架构对比 etcd 架构 Raft 共识层 KV API 层 Watch 机制 Lease 管理 BoltDB(单机 KV 引擎) 数据模型:分层 Key-Value 查询:前缀/范围扫描 一致性:强一致(Raft) 传统数据库架构 SQL 解析器 查询优化器 事务管理器 存储引擎 InnoDB / MyISAM 等 数据模型:关系表(Table) 查询:SQL(JOIN、聚合) 一致性:可配置(ACID) etcd 牺牲了复杂查询能力,换来了极致的分布式一致性和实时 Watch 能力。