Kubernetes控制平面组件:Kubernetes如何使用etcd

云原生学习路线导航页(持续更新中)

  • kubernetes学习系列快捷链接
    • Kubernetes架构原则和对象设计(一)
    • Kubernetes架构原则和对象设计(二)
    • Kubernetes架构原则和对象设计(三)
    • Kubernetes控制平面组件:etcd(一)
    • Kubernetes控制平面组件:etcd(二)
    • Kubernetes控制平面组件:etcd常用配置参数
    • Kubernetes控制平面组件:etcd高可用集群搭建
    • Kubernetes控制平面组件:etcd高可用解决方案
    • kubectl 和 kubeconfig 基本原理
    • kubeadm 升级 k8s集群 1.17到1.20
    • Kubernetes常见问题解答
    • 查看云机器的一些常用配置

本文主要对etcd在kubernetes中的应用进行介绍,包括二者的关系、kubernetes对象存储路径、二者如何交互、生产环境如何部署、最佳实践 以及 一些故障案例分析

1.ETCD 与 Kubernetes 的关系

1.1.ETCD 是 Kubernetes的 默认存储后端

在这里插入图片描述

  • 默认后端:ETCD 是 Kubernetes 默认的存储后端
  • 对象映射
    • Kubernetes 中每个对象都有对应的 storage.go 实现与 ETCD 的交互逻辑(增删改查)
    • 比如 Pod 的 pkg/registry/core/pod/storage/storage.go
    • CRD:API Server 根据 CRD 定义自动生成对应的 REST endpoint,统一存储接口 复用 apiserver/pkg/registry/generic/registry/store.go 的通用存储实现
      // 伪代码展示存储注册过程
      crdStorage := registry.NewREST(scheme, opts)
      apiGroupInfo.VersionedResourcesStorageMap["v1"] = map[string]rest.Storage{"customresources": crdStorage,
      }
      
  • 能否替换kubernetes的后端存储
    • 重写 storage 层成本极高
    • 推荐优化 ETCD 底层存储(如更换 BoltDB)

1.2.ETCD在Kubernetes集群中的位置

在这里插入图片描述

  • etcd属于 Kubernetes集群的 管控组件,apiserver是唯一与其交互的组件

2.API Server 在 ETCD 中对象存储路径

在这里插入图片描述

  • Key 结构:
    /registry/<对象类型>/<namespace>/<name># 示例
    etcdctl get /registry/pods/default/myapp-pod
    
  • 历史特性:
    • 早期版本的 selfLink 字段与 ETCD key 路径一致
    • 新版本已弃用该字段
  • 特殊目录说明
    • /registry:Kubernetes 主数据目录
    • /events:事件数据(可分离存储)

3.API Server 与 ETCD 的交互

在这里插入图片描述

3.1.连接配置

  • apiserver 启动参数-关于etcd的连接配置参数:
    # API Server 启动参数示例
    --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
    
  • API Server 对 ETCD 的健康检查演进:
    • 早期:通过端口探活的简单检测,但端口存活不代表etcd一定可用。不准确
    • 现在:通过调用 ETCD 健康检查 API。准确

3.2.API Server 对 多 ETCD 实例支持

3.2.1.什么是 多ETCD的支持?

  • 如果其他组件也想用ETCD,怎么办?
    • 可以自己再启动一个,不要使用管控端的etcd,只要保证端口不冲突即可
    • 防止有问题影响到kubernetes集群的稳定性
  • 如果Kubernetes中有些数据,数据量大,频繁写,怎么办
    • 可以使用 API Server 的多实例分流机制
      在这里插入图片描述

3.2.2.什么是多实例分流?

  • 多实例分流概念
    • 在多实例分流模式下,Kubernetes 可以将不同类型的对象存储到不同的 ETCD 实例中。
    • 通过这种分离,可以减少主 ETCD 集群的压力,提高整体性能和稳定性。
  • 为什么需要多实例分流?
    • 性能优化:高频变更对象(如 Events)会占用大量资源,影响主 ETCD 性能。
    • 故障隔离:将非核心数据(如审计日志)分离到独立 ETCD,避免影响核心业务。
    • 扩展性:支持大规模集群(如 10万+ Pods)的场景。

3.2.3.如何配置多实例分流?

  • 在 API Server 的启动参数中,通过 --etcd-servers-overrides 指定特定对象的存储位置。

  • 示例配置

    # 主 ETCD 集群
    --etcd-servers=https://etcd-main:2379# 将 events 对象存储到独立 ETCD 集群
    --etcd-servers-overrides=events#https://etcd-events:2379
    

3.2.4.支持分流的对象类型

在这里插入图片描述

3.2.5.分流后的架构

┌───────────┐       ┌──────────────┐
│ API Server├──────►│ 主 ETCD 集群 │
└───────────┘       └──────────────┘││ 分流▼
┌──────────────┐
│ 独立 ETCD 集群│
└──────────────┘

3.2.6.实际应用场景

在这里插入图片描述

  • 大规模集群:
    • 分离 Events 和 CRD 数据
    • 减轻主 ETCD 压力
  • 审计日志:
    • 将审计日志存储到独立 ETCD
    • 避免日志写入影响核心业务
  • 多租户环境:
    • 不同租户使用不同 ETCD 集群
    • 实现资源隔离

3.2.7.注意事项

  • 数据一致性:分流后需确保跨集群数据一致性
  • 运维复杂度:增加独立 ETCD 集群的运维成本
  • 监控报警:需单独监控每个 ETCD 集群的健康状态

3.3.API Server无法实现对象的批处理

  • kubernetes的资源锁resourceVersion,是对象级别的,因此做不到很多对象的批处理
  • 如果自己编写Operator,注意不能在短时间内 进行大量写操作,会影响etcd响应速度
    在这里插入图片描述

3.4.API Server 与 ETCD 交互原理

在这里插入图片描述

3.4.1.交互过程

gRPC over HTTP/2
复用TCP连接
Stream流式处理
API Server
ETCD Cluster
客户端请求
资源对象
  • 通信协议特性:
    • 使用 gRPC 协议(基于 HTTP/2)
    • 报文格式为 Protocol Buffers
    • HTTP/2特性:连接复用
      • 同一个Group下的所有资源,在API Server 与 ETCD 的通信中,都会复用同一个 TCP连接,即 TCP连接复用 特性

3.4.2.连接复用风险场景

# 问题复现条件
集群规模:5000 Nodes
Pod数量:1万+
List操作频率:5000次/分钟(带 --no-cache 参数)
数据量:单次List约100MB
  • Http2 连接复用特性 导致的故障链
    • 同一个Group下的所有资源,在API Server 与 ETCD 的通信中,都会复用同一个 TCP连接
    • 如果当前有Pod资源大量发起请求(比如DemonSet Pod 高频 List 操作占用连接通道),可能就会造成网络拥堵
    • Node资源的请求就发不过去了,节点心跳超时被标记为 NotReady
    • Eviction Controller 驱逐所有节点 Pod
    • 集群服务大面积中断

3.5.什么时候需要到ETCD中查数据?

  • 当我们怀疑apiserver的数据有问题,或者怀疑和etcd数据不一致时,就可以到etcd中查看数据

3.6.API Server中watch对象

  • API Server中也可以watch一个对象,也可以指定resourceVersion来watch
  • 不过我们控制器一般不带resourceVersion,默认是信任apiserver的
    在这里插入图片描述

3.7.API Server支持分页查询

在这里插入图片描述

  • 分页查询会返回一个token,将token提交到apiserver,就会自动帮我们返回下一页

4.生产环境部署注意事项

4.1.集群规模选择

在这里插入图片描述

在这里插入图片描述

  • 生产上建议部署5个etcd节点
    • 1个节点,一旦坏掉,数据就可能丢失了,服务也不可用了
    • 3个节点,如果坏了一个,你需要立马人工介入处理,优先级会非常高。不然再坏一个的话raft投票就无法达到大多数了,etcd集群就变成只读集群了
    • 5个节点,如果坏了一个,没关系,优先级还没有那么高,因为再坏一个raft协议的投票也能正常进行
  • 一般来说,ETCD的节点数量要在规划阶段确定好,尽量避免后期扩冲节点数量
    • 加节点一定是2个2个的加,因为要保证总节点是奇数个
    • 而且扩充节点还需要重新生成证书,很麻烦
  • 补充
    • 节点数越多,就会越慢,因为协商的节点数变多了

4.2.存储优化实践

在这里插入图片描述
在这里插入图片描述

4.2.1.存储方案对比

  • 不能直接全部使用remote storage,写的速度会比较慢,大量请求时可能造成请求积压,影响稳定性
  • 也不能一部分节点用local ssd,一部分用远程,这样的话,远程存储的节点数据永远跟不上,leader要一直向其同步数据

4.2.2.存储配置最佳实践

在这里插入图片描述

# 推荐配置参数
--quota-backend-bytes=8589934592  # 8GB存储配额
--auto-compaction-retention=72h   # 72小时自动压缩
--snapshot-count=10000            # 每10000条日志做快照(修正:原文误作1000)
  • 关键优化点:
    • 使用 本地NVMe SSD(专有磁盘,不要其他进程使用,避免IO竞争)
    • 通过 ionice 提升ETCD进程IO优先级
    • 监控 etcd_debugging_mvcc_db_total_size_in_bytes 指标,如果发现etcd的存储快满了,就及时的压缩或整理碎片
  • 补充:
    • etcd节点的存储默认2GB,不过生产上一般拉满:8GB

4.3.备份与恢复策略

在这里插入图片描述
在这里插入图片描述

4.3.1.备份方案设计

每小时
流式采集
定时快照
Snapshot保存
实时日志
WAL记录
混合恢复方案

4.3.2.备份命令示例

# 创建快照
ETCDCTL_API=3 etcdctl --endpoints=$ENDPOINTS snapshot save snapshot.db# 恢复流程
etcdctl snapshot restore snapshot.db \--data-dir=/var/lib/etcd-restore \--initial-cluster-token=etcd-cluster-1

4.3.3.备份策略参数

在这里插入图片描述

4.4.证书管理与监控

  • 证书管理:使用自动轮换工具(如 cert-manager)
  • 监控指标:重点关注 etcd_server_leader_changes(Leader 切换次数)

4.5.ETCD 数据操作与恢复

4.5.1.危险操作示例

# 删除所有 Pod 数据(慎用!)
etcdctl del /registry/pods --prefix

4.5.2.灾难恢复流程

  • 停止所有 API Server
  • 恢复快照:
    etcdctl snapshot restore /backup/etcd.db
    
  • 重启 ETCD 集群
  • 验证数据一致性

4.6.生产环境调优

在这里插入图片描述

4.6.1.关键性能参数

# Raft协议参数调优(跨地域部署示例)
--heartbeat-interval=300ms     # 心跳间隔(默认100ms)
--election-timeout=3000ms      # 选举超时(默认1000ms)

4.6.2.网络优化措施

在这里插入图片描述

  • 使用 tc 命令优先保障 ETCD 流量
tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dport 2379 0xffff flowid 1:1
  • 跨地域部署保持 RTT < 50ms
  • 禁用 swap 确保内存稳定性

4.7.安全增强方案

在这里插入图片描述

4.7.1.数据加密层级

应用层
KMS加密Secret
传输层
mTLS双向认证
存储层
LUKS磁盘加密

4.7.2.审计日志配置

# 审计策略示例
apiVersion: audit.k8s.io/v1
kind: Policy
rules:
- level: Metadataresources:- group: ""resources: ["secrets"]

5.Kubernetes生产集群中如何搭建ETCD集群

5.1.堆叠式etcd集群的高可用拓扑

在这里插入图片描述

5.1.1.定义

  • 在堆叠式架构中,etcd 集群Kubernetes 控制平面组件部署在同一组节点上。
  • apiserver 到 etcd 的调用,变成本地调用,速度和稳定性很好

5.1.2.特点

  • 每个节点同时运行 etcdKubernetes 控制平面组件
  • 通常用于小型或中等规模的集群。
  • 部署简单,资源利用率高。

5.1.3.优点

  • 部署和维护相对简单。
  • 节省硬件资源,适合资源有限的场景。

5.1.4.缺点

  • 耦合性较高,etcdKubernetes 控制平面组件共享资源,可能相互影响。
  • 扩展性较差,随着集群规模增大,性能可能成为瓶颈。

5.1.5.适用场景

  • 小型或测试环境。
  • 资源有限的场景。

5.2.外部ETCD集群的高可用拓扑-非堆叠式(External)

在这里插入图片描述

5.2.1.定义

在非堆叠式架构中,etcd 集群Kubernetes 控制平面组件分别部署在不同的节点上。

5.2.2.特点

  • etcd 集群独立运行,不与 Kubernetes 控制平面组件共享节点。
  • 通常用于大规模生产环境。

5.2.3.优点

  • 解耦 etcdKubernetes 控制平面组件,避免资源竞争。
  • 扩展性好,可以独立扩展 etcd 集群或 Kubernetes 控制平面。
  • 更高的可靠性和性能。

5.2.4.缺点

  • 需要更多的硬件资源。
  • 部署和维护复杂度较高。

5.2.5.适用场景

  • 大规模生产环境。
  • 对高可用性和性能要求较高的场景。

5.3.对比总结

特性堆叠式(Stacked)非堆叠式(External)
部署方式etcd 和控制平面组件部署在同一节点etcd 和控制平面组件分别部署在不同节点
资源占用较少较多
耦合性
扩展性较差较好
复杂度简单复杂
适用场景小型集群、测试环境大规模生产环境
  • 选择建议
    • 如果是 小型集群测试环境,可以选择 堆叠式,以节省资源并简化部署。
    • 如果是 大规模生产环境,建议选择 非堆叠式,以提高可靠性和性能。
    • 不过,如果你的资源并不紧缺,还是更推荐 堆叠式

6.经典故障案例分析

在这里插入图片描述

6.1.大规模 List 操作雪崩

  • 场景复现:

    • 5000 节点集群
    • 每个节点上的 DaemonSet 每分钟执行:
      kubectl get pods --all-namespaces --watch
      
  • 后果:

    • ETCD 连接数暴增
    • 节点心跳更新阻塞
    • 集群误判节点离线
  • 解决方案:

    • 优化 List 操作使用缓存
    • 分离高频访问对象到独立 ETCD

6.2.证书过期故障

  • 典型现象:
    • API Server 日志报错 “x509: certificate has expired”
    • 集群突然不可写
  • 处理步骤:
    • 紧急更新 ETCD 证书
    • 滚动重启 API Server

6.3.ETCD分裂

  • 5个节点,4个local storage,1个remote storage
  • 导致这个节点数据一直跟不上

6.4.少数ETCD 出现 成员DOWN

在这里插入图片描述

6.5.Master节点出现网络分区

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/19694.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis后端数据库查询多对多查询解决方案

问题场景&#xff1a; 我开发的是一个论文选择系统。 后端用一个论文表paper来存储论文信息。 论文信息中&#xff0c;包含前置课程&#xff0c;也就是你需要修过这些课程才能选择这个论文。 而一个论文对应的课程有很多个。 这样就造成了一个数据库存储的问题。一个paper…

BGP配置华为——RR反射器配置

实验拓扑 与之前实验同理将loop0作为routerID使用&#xff0c;且R1和R2上用loop1接口用于模拟用户其他网段 实验要求 1&#xff0c;在AS100内运行OSPF协议 2.配置路由反射器&#xff0c;使得从R1进入的数据能够反射到全局网络 3.在R1和R2上分别宣告自己的loop1口网段用于观…

CentOS7 离线安装 Postgresql 指南

一、背景 服务器通常都是离线内网环境&#xff0c;想要通过联网方式一键下载安装 Postgresql 不太现实&#xff0c;本文将介绍如何在 CentOS7 离线安装 Postgresql&#xff0c;以及遇到困难如何解决。 二、安装包下载 先在本地下载好 rpm 包&#xff0c;再通过 ftp 上传到服…

vue3项目实践心得-寻找未被使用的最小编号

&#x1f9e1;&#x1f9e1;遇到的问题&#x1f9e1;&#x1f9e1; 在用vue3ts编写编译原理项目中”绘制状态转换图“时&#xff0c;有一个添加状态的功能按钮&#xff0c;用户点击按钮即可添加一个新的状态&#xff0c;至于新的状态的编号值&#xff0c;想着以”最小未被使用…

FPGA简介|结构、组成和应用

Field Programmable Gate Arrays&#xff08;FPGA&#xff0c;现场可编程逻辑门阵列&#xff09;&#xff0c;是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物&#xff0c; 是作为专用集成电路&#xff08;ASIC&#xff09;领域中的一种半定制电路而出现的&#xff0c…

C# 入门简介

关于C# ​ C# &#xff08;读作C Sharp&#xff09;是由微软公司开发的一种面向对象、类型安全、高效且简单的编程语言&#xff0c;最初于 2000 年发布&#xff0c;并随后成为 .NET 框架的一部分。所以学习C#语言的同时&#xff0c;也是需要同步学习.NET框架的&#xff0c;不过…

处理使用 mapstruct 导致分页总数丢失问题

问题 PageHelper 分页总数不对&#xff0c;返回的总数老是等于当前页数目 分析 问题出现在 domain 转 VO 这个步骤&#xff0c;当我把数据库实体类型的 list 转为 vo 类型的 list&#xff0c;然后放进 PageInfo 则会丢失分页信息&#xff1b; 解决方式 从数据库查询出来后…

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下&#xff0c;是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作&#xff0c;提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…

【ProtoBuf】文件编写及序列化

ProtoBuf文件编写及序列化 文章目录 ProtoBuf文件编写及序列化快速上手ProtoBuf创建.proto 文件指定Proto3语法Package声明符定义消息(message)定义消息字段编译命令 序列化与反序列化的使用小结 快速上手ProtoBuf 为了快速上手以及完整的使用ProtoBuf&#xff0c;我们将编写一…

Java高频面试之SE-22

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; Java中的Optional了解多少&#xff1f; 在 Java 中&#xff0c;Optional 是 Java 8 引入的一个容器类&#xff0c;用于显式处理可能为 null 的…

250217-数据结构

1. 定义 数据结构是数据的存储结构&#xff0c;即数据是按某些结构来存储的&#xff0c;比如线性结构&#xff0c;比如树状结构等。 2. 学习意义 数据结构是服务于算法的&#xff0c;为了实现算法的高效计算&#xff0c;所以将数据按特定结构存储。比如使用快速插入或删除的…

PyCharm2024使用Python3.12在Debug时,F8步进时如同死机状态

在使用时PyCharm2024&#xff0b;Python3.12&#xff0c;在程序进行调试时&#xff0c;按F8步进时如同死机状态。 1、相同的程序在PyCharm2023&#xff0b;Python3.9时是没有问题的&#xff0c;因此决定重装PyCharm2023&#xff0b;Python3.9&#xff0c;进行调试——调试OK。 …

C/C++ | 每日一练 (2)

&#x1f4a2;欢迎来到张胤尘的技术站 &#x1f4a5;技术如江河&#xff0c;汇聚众志成。代码似星辰&#xff0c;照亮行征程。开源精神长&#xff0c;传承永不忘。携手共前行&#xff0c;未来更辉煌&#x1f4a5; 文章目录 C/C | 每日一练 (2)题目参考答案封装继承多态虚函数底…

DeepSeek应用-一秒对书本要点分析并创建思维脑图

2025年开始啦&#xff0c;从DeepSeek的火爆程度来看&#xff0c;今年必须紧盯DS的发展&#xff0c;AI不会淘汰人&#xff0c;AI只会淘汰不会使用的人。从文心一言、豆包、Kimi到DS,基本上从功能上大致相同&#xff0c;但是DeepSeek的开源着实在眼界和格局上更胜一筹&#xff0c…

4、IP查找工具-Angry IP Scanner

在前序文章中&#xff0c;提到了多种IP查找方法&#xff0c;可能回存在不同场景需要使用不同的查找命令&#xff0c;有些不容易记忆&#xff0c;本文将介绍一个比较优秀的IP查找工具&#xff0c;可以应用在连接树莓派或查找IP的其他场景中。供大家参考。 Angry IP Scanner下载…

android 的抓包工具

charles 抓包工具 官网地址 nullCharles Web Debugging Proxy - Official Sitehttps://www.charlesproxy.com/使用手册一定记得看官网 SSL Certificates • Charles Web Debugging Proxy http请求&#xff1a; 1.启动代理&#xff1a; 2.设置设备端口 3.手机连接当前代理 …

Java常用工具类详解

目录 一、Java 中的数学利器&#xff1a;java.lang.Math 类详解 1.常用属性 2.常用方法 ⑴.static int abs(int a) ⑵.static double ceil(double a) ⑶.static double floor(double a) ⑷.static int max(int a, int b) 和 static int min(int a, int b) ⑸.static do…

STM32 低功耗模式

目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…

uniapp 使用v-html在微信小程序中渲染成rich-text如何显示文本溢出省略

一、问题描述 小伙伴有个需求&#xff0c;想在uniapp开发的微信小程序的一个列表中对内容进行显示溢出显示省略号的控制&#xff1a;当文本超出一行之后&#xff0c;显示…。 经过尝试&#xff0c;无法在v-html所在的节点进行ellipise的控制。 二、解决方案 1.增加函数&…

VMware 17 安装 VMTools(win 7旗舰 X64)

由于在VM 17中安装的 win 7虚拟机没有安装VM Tools 的原因&#xff0c;界面有大黑边&#xff0c;也无法直接拖拽复制粘贴文件&#xff08;但是如果只是要复制文件&#xff0c;最简单的方法还是使用U盘&#xff09;&#xff0c;所以下面开始安装VM Tools 。 若直接选择VM软件中的…