在K8S中,etcd 适应的场景?
当然。在 Kubernetes 中,etcd 是集群唯一可靠的“唯一数据源”(Single Source of Truth)。它的所有设计特性和适用场景都围绕着这一核心地位展开。
简单来说,etcd 是 Kubernetes 集群的“大脑核心”,所有集群状态数据都安全地存储于此。
etcd 的核心适用场景
由于其强一致性、高可用性和watch机制等特性,etcd 完美适应以下 Kubernetes 核心场景:
1. 集群状态存储 (Cluster State Storage) - 最主要场景
这是 etcd 在 K8S 中最根本的职责。它持久化存储所有 API 对象的状态,包括:
- 工作负载对象:Pod、Deployment、StatefulSet、DaemonSet、Job、CronJob 等的定义和当前状态。
- 网络配置:Service、Endpoint、Ingress 等,记录着如何访问应用。
- 配置信息:ConfigMap、Secret,这些敏感和非敏感的配置数据。
- 身份与权限:ServiceAccount、Role、RoleBinding (RBAC) 规则。
- 节点状态:Node 对象的动态状态,记录每个工作节点的健康状况、资源容量等。
任何 kubectl get 命令返回的信息,几乎都来自于 etcd。
2. 服务发现 (Service Discovery)
虽然服务发现的具体实现是由 kube-proxy 和 DNS 插件(如 CoreDNS)完成的,但其数据来源是 etcd。
- 当创建一个新的 Service 时,其信息会被写入 etcd。
- Endpoints Controller 会监听 Pod 的变化,并更新该 Service 对应的 Endpoints 对象(记录着所有健康 Pod 的 IP 地址),这个对象也存储在 etcd 中。
kube-proxy和 CoreDNS 会 watch(监听) etcd 中这些 Service 和 Endpoints 对象的变化,并实时更新本地的 iptables 规则或 DNS 记录。
3. 集群协调与调度决策的基石 (Coordination)
Kubernetes 的“控制器模式”和“调度器”严重依赖 etcd 来做出决策。
- 调度器(Scheduler):在调度一个 Pod 时,调度器需要从 etcd 中读取所有 Node 的当前状态(如剩余资源),并根据策略选择最合适的节点。这个决策结果(Pod 绑定到某个 Node)也会写回 etcd。
- 控制器管理器(Controller Manager):各种控制器(如 Deployment Controller)持续地 watch etcd 中对象的状态,并将实际状态与期望状态进行对比。如果实际状态不符(例如,Pod 副本数少了),它们会采取行动(创建新的 Pod),并将新的状态写入 etcd。
4. 分布式系统协调 (Distributed Coordination)
etcd 可以作为分布式锁和领导者选举的基础设施。
- 虽然 Kubernetes 自身的组件(如
kube-controller-manager和kube-scheduler)在高可用模式下已经使用“领导者选举”机制来避免脑裂,这个机制通常就是基于 etcd 实现的。 - 你可以利用 etcd 为你自己在集群中运行的自定义控制器或操作器(Operator)实现分布式协调功能。
为什么 etcd 如此适合这些场景?(其设计特性)
etcd 的这些特性与 Kubernetes 的需求完美契合:
-
强一致性 (Strong Consistency):基于 Raft 共识算法,所有读写操作都是线性一致的(Linearizable)。这意味着无论客户端连接到哪个 etcd 节点,读到的数据都是最新的、一致的。这对于做出正确的调度决策和确保集群状态的一致性至关重要。这是 Kubernetes 选择 etcd 而非其他最终一致性数据库的最主要原因。
-
高可用性 (High Availability):通过集群模式,etcd 可以部署多个节点(通常是 3、5、7 个)。即使少数节点发生故障,集群依然能够正常提供服务,保证了 Kubernetes 控制平面的韧性。
-
Watch 机制 (Watch API):客户端可以对 etcd 中的 key 或目录变更(如创建、更新、删除)建立监听。当变化发生时,etcd 会主动通知所有监听的客户端。这是 Kubernetes 控制器模式能够实时、高效工作的基础,无需轮询。
-
简单且可靠的键值存储 (Simple & Reliable KV Store):Kubernetes 的 API 对象都是以 JSON 或 Protocol Buffers 格式存储的。etcd 提供的简单键值模型(支持前缀查询和范围查询)足够满足需求,避免了复杂查询带来的性能和复杂度问题。
-
安全性 (Security):支持客户端证书认证(TLS)和基于角色的访问控制(RBAC),可以与 Kubernetes 的安全模型很好地集成。
什么数据不适合存放在 etcd 中?
理解 etcd 的适用场景,也要清楚它的不适用场景:
- 应用业务数据:例如,你运行的 MySQL 数据库的数据、用户上传的文件等。这些数据应该存储在专用的数据库或对象存储中。
- 日志数据:容器日志、事件日志等量大、频繁写入且无需强一致性的数据。应使用 ELK、Loki 等日志系统。
- 大容量二进制文件:etcd 设计用于存储元数据(通常是小尺寸的键值对),不适合存储大型文件(如软件安装包、镜像文件),这会严重降低性能并导致集群不稳定。
- 监控时间序列数据:Prometheus 等监控系统有自己的高效时序数据库,不适合存入 etcd。
总结
| 特性 | 如何服务于 Kubernetes 场景 |
|---|---|
| 强一致性 | 确保所有组件(Scheduler, Controller)看到的集群状态是一致的,避免决策冲突。 |
| 高可用性 | 作为控制平面的核心,其自身高可用是整个集群高可用的基石。 |
| Watch 机制 | 使控制器能够实时、高效地响应集群变化,实现声明式 API 的闭环控制。 |
| 简单 KV 模型 | 完美匹配 Kubernetes 存储 API 对象元数据的需求,简单高效。 |
因此,etcd 是 Kubernetes 集群状态管理的唯一真理之源,其所有特性都是为了可靠、一致、高效地存储和管理这些至关重要的元数据而设计的。 任何对 etcd 的操作都应当非常谨慎,因为它一旦损坏或丢失数据,整个集群将无法恢复。
浙公网安备 33010602011771号