跳转至

Kubernetes ETCD 工作原理详解:为什么说 ETCD 是整个集群的大脑?

文章摘要

ETCD 是 Kubernetes 控制平面的核心组件之一。

集群中的 Pod、Node、Deployment、Service、ConfigMap、Secret 等几乎所有资源信息,最终都会存储在 ETCD 中。

可以说:

没有 ETCD,就没有 Kubernetes。

本文将详细讲解 ETCD 的工作原理、数据存储机制、Raft 一致性算法、Leader 选举以及生产环境中的备份恢复方案。


学习目标

阅读完本文后,你将掌握:

  • ETCD 是什么
  • ETCD 在 Kubernetes 中的作用
  • Kubernetes 数据存储流程
  • Key-Value 存储机制
  • Raft 一致性算法
  • Leader 选举原理
  • 数据备份与恢复
  • 生产环境最佳实践

适用人群

本文适合:

  • Kubernetes 初学者
  • Linux 运维工程师
  • DevOps 工程师
  • 云计算学习者
  • Kubernetes 面试准备人员

什么是 ETCD?

ETCD 是一个:

分布式 Key-Value 数据库

由:

CoreOS 公司的 李响、Brandon Philips、Alex Polvi

发起的开源项目,后来成为:

CNCF(云原生计算基金会) 的托管项目


简单理解:

MySQL
存表

Redis
存Key

ETCD
存集群状态

例如:

当我们执行:

kubectl create deployment nginx

实际上:

Deployment配置


API Server


ETCD

最终被保存到了 ETCD。


ETCD 在 Kubernetes 中的位置

            kubectl

          API Server


              ETCD


           Scheduler
           Controller Manager
           Kubelet

这里有一个非常重要的知识点:

Kubernetes 只有 API Server 可以直接访问 ETCD。

其它组件:

  • Scheduler
  • Controller Manager
  • Kubelet
  • Kube-Proxy

都不会直接访问 ETCD。

必须经过 API Server。


为什么 Kubernetes 需要 ETCD?

假设没有 ETCD。

当 API Server 重启后:

Deployment信息丢失

Node信息丢失

Pod信息丢失

整个集群将无法运行。


因此 Kubernetes 需要:

可靠存储

高可用

强一致性

的数据中心。

这就是 ETCD 的职责。


ETCD 存储了什么?

很多新人认为:

ETCD 只存 Pod

实际上远不止这些。


例如:

Node

kind: Node

Pod

kind: Pod

Deployment

kind: Deployment

Service

kind: Service

ConfigMap

kind: ConfigMap

Secret

kind: Secret

RBAC

Role
RoleBinding
ClusterRole

几乎所有 Kubernetes 资源都会存储到 ETCD。


ETCD 的 Key-Value 结构

ETCD 本质是:

Key → Value

结构。

例如:

Key:
/registry/pods/default/nginx

Value:
Pod配置JSON

再例如:

Key:
/registry/deployments/default/nginx

可以理解成:

文件路径
对应资源内容

Kubernetes 数据写入流程

例如:

kubectl apply -f nginx.yaml

执行后:

第一步

请求到达:

API Server

第二步

API Server 校验:

认证

授权

准入控制

第三步

写入:

ETCD

第四步

返回成功。


流程如下:

kubectl


API Server


ETCD

Kubernetes 数据读取流程

例如:

kubectl get pod

流程:

kubectl


API Server


ETCD


返回结果

因此:

ETCD 是 Kubernetes 唯一可信数据源。


什么是 Raft 一致性算法?

ETCD 最核心的技术之一。


为什么需要它?

假设:

ETCD01

ETCD02

ETCD03

组成集群。


如果:

ETCD01

写入数据。

如何保证:

ETCD02

ETCD03

数据也一致?


Raft 就是解决这个问题的。


ETCD 集群架构

生产环境通常:

ETCD01

ETCD02

ETCD03

三节点部署。


结构:

      Leader

      /   \

Follower Follower

任何时刻:

只能有一个 Leader

Leader 选举

例如:

ETCD01
Leader

突然宕机:

ETCD01
Down

剩余节点:

ETCD02

ETCD03

开始选举。


最终:

ETCD02
Leader

成为新 Leader。


整个过程通常:

秒级完成

写入为什么必须经过 Leader?

例如:

写入Deployment

请求到达:

Leader

Leader:

记录日志

同步Follower

多数节点确认

完成后:

写入成功

这称为:

多数派机制(Quorum)

什么是 Quorum?

三节点集群:

ETCD01

ETCD02

ETCD03

至少需要:

2个节点

存活。


因为:

3 / 2 + 1 = 2

五节点:

至少3个节点

存活。


因此:

双节点ETCD

实际上是不推荐的。


为什么生产环境推荐奇数节点?

推荐:

3节点

5节点

7节点

不推荐:

2节点

4节点

例如:

4节点

允许损坏:

1个节点

而:

3节点

同样允许损坏:

1个节点

资源浪费。


如何查看 ETCD 数据?

查看所有 Key:

etcdctl get "" --prefix --keys-only

查看具体资源:

etcdctl get /registry/pods/default/nginx

生产环境一般不建议直接修改。


ETCD 数据备份

这是最重要的运维工作之一。


创建快照:

etcdctl snapshot save backup.db

查看状态:

etcdctl snapshot status backup.db

建议:

每日备份

异地保存

定期验证恢复

ETCD 数据恢复

恢复:

etcdctl snapshot restore backup.db

恢复后:

重新启动ETCD

即可。


生产环境最佳实践

使用独立 ETCD 集群

大型生产环境推荐:

ETCD独立部署

SSD 存储

ETCD 对磁盘延迟非常敏感。

推荐:

NVMe SSD

定期压缩数据

查看:

etcdctl endpoint status

执行:

etcdctl compact

避免数据库膨胀。


定期备份

这是最重要的一条。


常见故障排查

ETCD 空间不足

查看:

etcdctl endpoint status

Leader 频繁切换

检查:

网络延迟

磁盘性能

CPU负载

API Server 无法启动

优先检查:

ETCD状态

集群资源全部消失

优先检查:

ETCD数据

是否损坏。


运维排查命令

查看成员:

etcdctl member list

查看健康状态:

etcdctl endpoint health

查看状态:

etcdctl endpoint status

查看告警:

etcdctl alarm list

面试常见问题

ETCD 的作用是什么?

存储 Kubernetes 集群状态数据。


哪个组件直接访问 ETCD?

API Server。


为什么使用 Raft?

保证数据强一致性。


为什么推荐 3 节点 ETCD?

满足高可用且资源利用率最佳。


为什么必须定期备份 ETCD?

因为 Kubernetes 的核心数据都存储在其中。


FAQ

删除 ETCD 会怎样?

整个 Kubernetes 控制面将无法正常工作。


ETCD 可以用 MySQL 替代吗?

不能。

Kubernetes 仅支持 ETCD。


ETCD 存储容器镜像吗?

不存储。

仅存储元数据。


生产实践

在一次 Kubernetes 1.34→1.35 升级过程中,由于 kubelet 参数异常,导致 ETCD Static Pod 无法正常重建,最终出现:

static Pod hash for component etcd
did not change after 5m0s
这说明 ETCD 是控制平面升级过程中最敏感的组件。


总结

ETCD 是 Kubernetes 最核心的数据存储组件。

它负责:

  • 存储集群状态
  • 保证数据一致性
  • 提供高可用能力
  • 支撑整个控制平面运行

可以记住一句话:

API Server 是 Kubernetes 的入口,而 ETCD 是 Kubernetes 的记忆库。


相关阅读