etcd 在 Kubernetes 中的角色
-
核心定位:Kubernetes 的 唯一持久化數據存儲(一致性數據庫)。
-
職責:
- 保存整個集群的期望狀態(desired state),包括節點信息、Pod 清單、Service 定義、ConfigMap、Secrets 等所有 API 對象。
- 提供**強一致性(CP)**保障,保證即使多個 API Server 同時讀寫,也不會出現狀態沖突。
- 支持 Watch 機制:當 etcd 中數據變更時,API Server 能實時推送事件給控制器和客戶端。
-
關鍵關系:
- API Server 是所有組件的 “中樞”,所有讀寫狀態都通過它。
- Controller Manager / Scheduler 都是 被動 響應 API Server 推送的事件(watch)。
- kubelet 負責 Pod 在 Node 上的實際運行,向 API Server 上報狀態。
- CNI/CSI 插件由 kubelet 調用,實現網絡和存儲的實際配置。
數據存儲結構
etcd 是一個 分布式鍵值數據庫,內部使用 BoltDB(B+Tree 存儲) 作為底層存儲引擎。
-
Key 結構(邏輯路徑):
-
Kubernetes 在 etcd 中為每種資源維護一個命名空間式路徑,例如:
/registry/pods/default/nginx-pod /registry/deployments/default/web-deploy /registry/configmaps/kube-system/coredns
-
/registry
是 Kubernetes 存放 API 對象的根前綴。 -
路徑的最后一段是對象的名字(可能還帶命名空間)。
-
-
Value 結構:
- 實際是序列化后的 Protocol Buffers(Protobuf) 或 JSON。
- 內含對象的
metadata
、spec
、status
等字段。 - 同時存儲 ResourceVersion(單調遞增)用于一致性和 Watch。
-
版本控制:
- etcd 每個 key 有 修改版本(mod_revision),整個數據庫有全局遞增 revision。
- Kubernetes API Server 用
resourceVersion
與 etcd revision 對應,保證讀取的一致性快照。
數據寫入流程
以 kubectl apply -f pod.yaml
為例:
-
客戶端提交
kubectl
把 YAML 轉成 Kubernetes API 對象,通過 REST 調用 API Server。 -
API Server 流程
- 認證/鑒權:驗證請求是否合法。
- 準入控制:MutatingAdmissionWebhook 可能修改對象(加默認值),ValidatingAdmissionWebhook 校驗對象合法性。
- 序列化:將對象編碼為 Protobuf。
- 存儲層調用:通過 Kubernetes 的
storage.Interface
調用 etcd v3 gRPC API。
-
etcd 寫入
- etcd leader 接收
Put
請求。 - Leader 將寫請求通過 Raft 共識協議 復制到多數派 Follower 節點。
- 多數節點寫入成功(持久化到本地 BoltDB WAL + B+Tree)后,Leader 提交事務并返回成功。
- 此時
mod_revision
增加,觸發 Watch 事件。
- etcd leader 接收
-
事件分發
- API Server Watch 機制檢測到新 revision,通知各 Controller、Scheduler、kubelet 等。
- 各組件據此執行調度、創建容器等后續動作。
總結
維度 | 說明 |
---|---|
角色 | k8s 的唯一持久化存儲,保存集群所有 API 對象狀態 |
存儲結構 | Key-Value,Key 為 /registry/... 邏輯路徑,Value 為 Protobuf 序列化對象 |
一致性保障 | Raft 共識,強一致性,順序提交 |
寫入流程關鍵點 | API Server → 序列化 → etcd Leader → Raft 復制 → 多數派確認 → 更新 revision → 觸發 Watch |
附件
etcd數據交互
K8s 核心組件調用關系 + etcd 交互點 + Endpoints 數據流
- etcd 只與 API Server 通信
- API Server 如何向 Controller、Scheduler、kubelet、Endpoints Controller 分發事件
- Endpoints / EndpointSlice Controller 如何生成數據并被 kube-proxy/CoreDNS 使用
- Node 上 kubelet 如何調用 CRI、CNI、CSI 執行實際操作