【K8s笔记】etcd

etcd

etcd 是 Kubernetes 集群中最核心的分布式键值数据库,仅运行在master node上面。它的主要作用是存储和管理整个集群的所有配置信息和状态数据。你可以把它理解为 Kubernetes 的“大脑”或“账本”。


etcd 的主要作用

  1. 保存集群状态

    • 所有 Kubernetes 对象(如 Pod、Service、Deployment、ConfigMap、Secret 等)的数据,都会被存储在 etcd 里。
    • 任何对集群资源的变更(比如创建、删除 Pod),最终都会同步到 etcd 中。
  2. 分布式一致性存储

    • etcd 采用 Raft 算法,保证数据的高可用和一致性。
    • 即使有部分节点宕机,只要大多数 etcd 节点存活,数据就不会丢失。
  3. 为 kube-apiserver 提供后端存储

    • kube-apiserver 作为 API 网关,所有的读写操作最终都要落到 etcd 上。
    • 没有 etcd,apiserver 就无法存储或获取集群状态。

etcd 在 Kubernetes 架构中的位置

1
2
3
4
5
6
7
8
9
10
11
12
13
+--------------------+
| kubectl/client |
+---------+----------+
|
v
+--------------------+
| kube-apiserver |
+---------+----------+
|
v
+--------------------+
| etcd |
+--------------------+

你可以这样理解

  • etcd = 集群数据库
    • 保存了所有 Kubernetes 资源对象的“源数据”。
  • etcd 挂了,集群不可用
    • 如果 etcd 挂了,Kubernetes 控制面就无法工作,集群会失去管理能力。

总结一句话

etcd 是 Kubernetes 的分布式数据库,负责存储整个集群的所有状态和配置信息,是集群的“单一真相源”。

etcdctl

etcdctl 是 etcd 的官方命令行客户端工具,用于与 etcd 集群进行交互和管理。


详细解释

1. etcd 是什么?

  • etcd 是一个分布式的、强一致性的 key-value 存储系统。
  • 在 Kubernetes 中,etcd 作为集群的“数据库”,存储所有集群状态和对象(如 Pod、Service、ConfigMap 等)。

2. etcdctl 的作用

  • etcdctl 是 etcd 提供的命令行工具,可以用来:
    • 读写 key-value 数据
    • 查询、修改、删除数据
    • 检查 etcd 集群健康状态
    • 备份与恢复 etcd 数据
    • 管理 etcd 集群成员

3. 常用命令示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看 etcd 集群健康状况
etcdctl endpoint health

# 查看所有 key
etcdctl get "" --prefix --keys-only

# 读取某个 key 的值
etcdctl get /registry/pods/default/nginx-xxx

# 写入一个 key
etcdctl put foo bar

# 删除一个 key
etcdctl del foo

4. 注意事项

  • 使用 etcdctl 需要有 etcd 集群的访问地址和认证信息(如证书)。
  • 生产环境操作 etcd 要非常小心,因为误操作可能导致整个集群不可用。

总结

etcdctl 是 etcd 的官方命令行管理工具,主要用于管理、查询、备份 etcd 存储的数据。

etcd集群和k8s集群的关系是什么

etcd集群Kubernetes集群之间的关系是 Kubernetes 架构中的一个核心点。下面用通俗易懂的方式详细说明:


1. etcd集群是什么?

  • etcd 是一个分布式的、强一致性的键值(key-value)数据库。
  • 它可以组成集群(多个 etcd 节点),以保证高可用和数据一致性。

2. k8s集群是什么?

  • Kubernetes(k8s)集群是由一组节点(master 节点和 worker 节点)组成的容器编排系统。
  • 它负责自动化应用的部署、扩展和管理。

3. 二者的关系

etcd 是 Kubernetes 的“数据库”

  • Kubernetes 所有的集群状态、对象数据(如 Pod、Deployment、Service、ConfigMap 等)都存储在 etcd 集群中。
  • Kubernetes 的各个组件(如 kube-apiserver、controller-manager、scheduler 等)都通过 kube-apiserver 访问 etcd,读写集群的所有数据。

关系图解

1
2
3
4
5
6
+-------------------+        +-------------------+
| | | |
| Kubernetes | | etcd |
| 组件 |<------>| 分布式数据库 |
| (apiserver等) | | |
+-------------------+ +-------------------+
  • kube-apiserver 负责所有与 etcd 的交互,其他组件都通过 apiserver 进行间接访问。

举例说明

  • 你用 kubectl create pod 创建一个 Pod,apiserver 会把 Pod 对象写入 etcd。
  • 你用 kubectl get pods 查询 Pod,apiserver 会从 etcd 读取数据返回给你。

4. 一句话总结

etcd集群是Kubernetes集群的数据存储后端,Kubernetes集群的所有状态和对象都依赖etcd集群来保存和同步。


5. 拓展补充

  • etcd 挂了,Kubernetes 就会丢失“记忆”,无法管理现有和新建的对象。(已经运行的 Pod 短时间内不受影响,但无法做任何更改)
  • 生产环境一般都部署高可用的 etcd 集群(3/5/7 个节点),以防单点故障。

etcd和k8s是分开来部署的吗

**etcd 和 Kubernetes(k8s)到底是分开部署,还是一起部署?**下面详细解答:


1. etcd 和 Kubernetes 是两个独立的软件

  • etcd 是一个分布式的键值数据库,专门用来存储 Kubernetes 的所有配置信息和状态数据。
  • Kubernetes 是一个容器编排平台,负责管理、调度和运行容器。

2. 部署关系有两种常见方式

方式一:分开部署(推荐生产环境)

  • etcd 作为独立进程(或独立容器)运行。
  • Kubernetes 控制面组件(如 kube-apiserver、controller-manager、scheduler)通过网络访问 etcd。
  • etcd 可以和 k8s 控制面组件在同一台服务器(master node)上,也可以在独立服务器上。

优点:

  • 灵活,易于维护和升级。
  • etcd 可以独立扩容、备份和恢复。

生产环境推荐这样做!


方式二:随 Kubernetes 一起部署(常见于测试或小型集群)

  • 有些安装工具(如 kubeadm、minikube、k3s)会自动在 master 节点上把 etcd 部署好,用户不用手动操作。
  • etcd 进程和 k8s 控制面组件通常在同一台机器上。

优点:

  • 部署简单,适合学习和开发环境。
  • 但不利于大规模扩展和高可用。

3. 实际部署示意图

假设有三台 master 节点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+--------------------------+
| Master Node 1 |
| - kube-apiserver |
| - controller-manager |
| - scheduler |
| - etcd |
+--------------------------+
| Master Node 2 |
| - kube-apiserver |
| - controller-manager |
| - scheduler |
| - etcd |
+--------------------------+
| Master Node 3 |
| - kube-apiserver |
| - controller-manager |
| - scheduler |
| - etcd |
+--------------------------+

etcd 虽然和 k8s 控制面组件在同一台机器,但它们是独立进程,配置和管理是分开的。


4. 总结一句话

etcd 和 Kubernetes 是两个独立的软件,可以部署在一起(同一台服务器上),也可以分开(不同服务器),但它们始终是各自独立的进程和服务。

k8s是怎么访问etcd的

1. 访问 etcd 的主体是谁?

Kubernetes 并不是所有组件都直接访问 etcd,只有 kube-apiserver 会直接与 etcd 通信

  • kube-apiserver 是 Kubernetes 控制面的核心组件,所有集群状态的读写都要经过它。
  • 其他组件(如 controller-manager、scheduler、kubectl、kubelet 等)都不会直接访问 etcd,而是通过和 kube-apiserver 交互来间接操作集群状态。

2. 通信方式

  • kube-apiserver 通过 gRPC(HTTP/2)协议,使用 etcd 的官方客户端库,直接访问 etcd。
  • 访问方式是本地 socket网络地址(通常是 https://<etcd-endpoint>:2379,2379 是 etcd 默认监听端口)。
  • 通信过程通常是加密的(使用 TLS 证书)。

3. 访问流程简图

1
[用户/组件] ---> (HTTP/REST API) ---> [kube-apiserver] ---> (gRPC) ---> [etcd]
  • 用户用 kubectl 或其他方式调用 Kubernetes API。
  • kube-apiserver 处理 API 请求,并将相关数据存储到 etcd,或从 etcd 读取数据。

4. 访问示例(配置片段)

在 kube-apiserver 的启动参数里,指定 etcd 的访问地址和证书:

1
2
3
4
--etcd-servers=https://etcd1:2379,https://etcd2:2379
--etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
--etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
--etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client.key

5. 总结一句话

Kubernetes 只有 kube-apiserver 直接通过 gRPC 协议访问 etcd,其它组件都间接通过 kube-apiserver 读写集群状态。

除了k8s以及其衍生产品,还有什么产品使用etcd?

虽然 etcd 因为 Kubernetes 而广为人知,但其实 etcd 作为一个高可用、分布式、一致性强的键值存储系统,在云原生、分布式系统、微服务等场景下有着广泛应用。下面列举一些除了 Kubernetes 及其生态之外,常见的使用 etcd 的场景和项目:


1. 服务发现与配置中心

  • CoreOS Fleet
    早期 CoreOS 推出的分布式 init 系统,用 etcd 存储和协调服务的状态。
  • SkyDNS
    用 etcd 存储服务信息,实现服务发现,后来成为 kube-dns 的基础。
  • Confd
    一个通用的配置管理工具,支持 etcd 作为后端,将 etcd 的数据渲染到本地配置文件。
  • Vulcand
    一个基于 etcd 的现代 HTTP 反向代理和负载均衡器。

2. 微服务注册与发现

  • Traefik
    现代反向代理,支持 etcd 作为后端存储,用于动态服务发现和路由。
  • go-micro
    Go 语言微服务框架,支持 etcd 作为服务注册与发现的后端。

3. 分布式锁、协调与选举

  • etcd 自身提供的分布式锁/leader election
    很多分布式应用直接用 etcd 的原子操作和租约机制实现分布式锁和主节点选举。
  • OpenShift
    Red Hat 的容器平台,底层也是用 etcd 做一致性存储和协调。

4. 云原生基础设施

  • Cloud Foundry Diego
    Cloud Foundry 的调度系统 Diego 用 etcd 存储元数据和协调任务。
  • Rancher
    虽然现在主推 K8s,但早期 Rancher 也用 etcd 作为元数据存储。

5. 数据库与存储系统

  • TiKV
    分布式事务性 Key-Value 数据库,内部元数据管理部分用 etcd。
  • Rook
    云原生存储编排器,使用 etcd 作为元数据一致性存储。

6. 其他分布式系统

  • Calico
    云原生网络方案,早期版本用 etcd 存储网络策略和状态(现在也支持 K8s CRD 作为后端)。
  • cilium
    也是云原生网络方案,可以用 etcd 作为存储后端。

7. 自研系统与定制化场景

  • 很多企业自研的微服务平台、分布式任务调度、配置中心、分布式锁服务等,都会用 etcd 作为底层一致性存储和协调工具。

总结

etcd 不只是 Kubernetes 的“数据库”,它是分布式系统领域通用的高可用一致性存储与协调组件。
只要你的系统需要:

  • 分布式一致性存储
  • 配置中心、服务发现
  • 分布式锁、主从选举
    等场景,都可以考虑用 etcd!

【K8s笔记】etcd
https://学习.fun/k8s-note/k8s-etcd/
Author
Stephen Zeng
Posted on
April 29, 2025
Licensed under