宣布 etcd v3.7.0 发布
本文是原始公告的镜像版本的中文翻译
今天,SIG etcd 发布了 etcd v3.7.0, 这是广受欢迎的分布式键值存储和核心 Kubernetes 组件的最新次要版本。 v3.7 包含了期待已久的 RangeStream 功能,提供了多项其他性能改进, 移除了遗留 v2store 的最后残余,并完成了一次重大的 protobuf 重构。
你可以在这里下载 etcd v3.7.0:
此版本还包括两个核心 etcd 依赖项的新版本: bbolt v1.5.0 和 raft v3.7.0。
有关安装 etcd 的说明,请参阅安装文档。 有关完整的更改列表,请参阅 etcd v3.7 变更日志。
衷心感谢所有促成此次发布的贡献者!
主要功能
v3.7.0 中的最重要变化包括:
- RangeStream — 分块流式传输大型结果集,而不是缓冲整个响应。
- 仅限键(Keys-only)的范围请求,更快、更可靠的租约机制,以及其他多项性能改进。
- etcd 现在完全从 v3store 启动,消除了对遗留 v2 store 的长期依赖
- 已完成的 protobuf 重构,用完全支持的库替换过时的 protobuf 库。
- etcd v3.7 包含 bbolt v1.5.1 和 raft v3.7.0。
功能特性
RangeStream
在 etcd v3.6 及更早版本中,处理返回大型结果集的请求具有挑战性。数据库会在发送前缓冲完整的结果集, 导致服务器和客户端的延迟和内存使用都不可预测。 RangeStream RPC 允许调用应用程序分块接受结果集,减少延迟并使缓冲内存使用更加可预测。
在 etcd 文档中可以找到如何在 gRPC 调用和 etcdctl中使用 RangeStream 的说明。 用户应该为自己的应用程序试用它。
在协调发布中,运行即将推出的 Kubernetes v1.37 的用户可以通过启用
EtcdRangeStream 特性门控来使用 RangeStream 功能。由于 2023 年 etcd 和
Kubernetes 开发的合并,这种早期且有计划的采用成为可能。
性能改进
v3.7 为 Kubernetes 控制平面和其他用例提供了多项具体的性能改进。 与 v3.6 相比,Kubernetes 用户应该会看到 etcd 成员的整体 CPU 使用率显著降低。
仅键范围优化
etcd v3.7.0 包含仅键范围优化(#21791: keys-only Range optimization)。
当处理 keys_only Range 请求或 etcdctl get --keys-only 时,etcd 仅从其内存索引中读取。
它返回匹配的键,而不像以前那样从 bbolt 加载所有序列化的值。
唯一仍需要从 bbolt 加载的例外情况是当 keys_only Range 请求必须按值排序时
(即 SortTarget 设置为 VALUE 时)。
这减少了仅需要键名的工作负载的不必要后端读取和内存使用,使大型仅键范围请求更加高效。
更快、更可靠的 etcd 租约
v3.7 改进了租约过期和续期:
- LeaseRevoke 请求现在被优先处理,以确保在过载期间租约及时过期 (#20492: stability enhancement during overload conditions)。
- 新的 FastLeaseKeepAlive 功能通过跳过等待应用索引来实现更快的租约续期 (#20589: etcdserver: improve linearizable renew lease)。
更快的 find() 操作
etcd 3.7 通过加快 find() 操作来提高键的并发监视性能 (#19768: adt: split interval tree by right endpoint on matched left endpoints)。
其他功能
Protobuf 重构
v3.7 将多个过时的 protobuf 库迁移并替换为完全支持的依赖项。
这包括用完全支持的 google.golang.org/protobuf 替换
github.com/golang/protobuf 和 github.com/gogo/protobuf
(#14533: Protobuf: cleanup both golang/protobuf and gogo/protobuf),
以及将 grpc-logging 迁移到 grpc-middleware v2
(#20420: Migrate grpc-logging to grpc-middleware v2)。
除了提高安全性和可维护性外,此重构已被证明可以减少 etcd 组件的 CPU 使用率。
虽然这些更改预计不会直接影响通过官方二进制文件或容器镜像运行 etcd 的用户,
但它们可能会影响依赖 etcd Go 模块的用户,例如客户端 SDK 或 api/ 或 pkg/ 下的包。
由于此版本引入的 protobuf 和相关 API 更改,这些使用者可能需要更新其代码或依赖项。
更详细的信息可从 API 变更跟踪问题获取。
Unix socket 支持
etcd 现在支持 Unix socket 端点 (#19760: Add Support for Unix Socket endpoints), 无需 TCP 端口即可进行本地通信。由于这仅限于单成员集群,因此主要面向开发、测试和边缘设备用例。
从 v3store 启动
etcd v3.7 的重大变化之一是服务器现在完全从 v3 store 启动 (#20187 Bootstrap etcdserver from v3store), 消除了启动期间对遗留 v2 store 的依赖。
这一里程碑是跨越多个版本(从 v3.4 到 v3.7)的长期努力的结果。 它解决了长期存在的技术债务,显著简化了启动工作流程,并为 etcd 的未来改进奠定了基础。
为了保持向后兼容性,etcd v3.7 继续生成 v2 快照。因此,--snapshot-count 标志在 v3.7 中也被保留。
这是对遗留 v2 store 的最后依赖,v2 快照生成和 --snapshot-count 标志都将在 v3.8 中移除。
etcdutl 超时
所有 etcdutl 命令现在都有一个超时命令行参数 (#20708: etcdutl: enable timeout functionality for all commands), 因此离线实用程序命令在持有锁时不再无限期阻塞。
直接设置认证令牌
Client v3 现在允许用户直接设置 JWT,在认证选项方面提供了更大的灵活性 (#16803: clientv3: allow setting JWT directly, #20747: clientv3: disable auth retry when token is set)。
无需认证即可检索 AuthStatus
客户端可以在不先尝试认证的情况下检查其 AuthStatus,消除了一些应用程序开销 (#20802: etcdserver: remove permission check on AuthStatus api)。
新的监视指标
v3.7 添加了可选的监视发送循环指标 (#21030: Instrument watchstream send loop), 以更好地观察监视路径:
etcd_debugging_server_watch_send_loop_watch_stream_duration_secondsetcd_debugging_server_watch_send_loop_watch_stream_duration_per_event_secondsetcd_debugging_server_watch_send_loop_control_stream_duration_secondsetcd_debugging_server_watch_send_loop_progress_duration_seconds
还有一个新的 etcd_server_request_duration_seconds 指标
(#21038: Add metric etcd_server_request_duration_seconds)。
etcdctl 命令清理
etcdctl 命令为了清晰起见进行了重组 (#20162: etcdctl: organize etcdctl subcommand), 全局命令行参数现在被隐藏以简化帮助输出 (#20493: etcdctl: hide global flags)。
升级
此版本包含破坏性更改,特别是关于移除遗留 v2 组件的更改。 用户在升级其节点之前应查看升级指南。 与所有次要版本一样,一次升级一个成员,并在步骤之间确认集群健康状况。
移除实验性标志
所有已弃用的实验性标志已被移除
(#19959: Cleanup the deprecated experimental flags)。
etcd 中的功能现在遵循 v3.6 中引入的 Kubernetes 风格的特性门控生命周期
(Alpha → Beta → GA),而不是旧的 --experimental 前缀。
如果你的配置仍然依赖 --experimental-* 命令行参数,请在升级到 etcd 3.7 之前迁移到使用相应的特性门控或稳定的命令行参数。
遗留 V2 API 包和代码清理
为了移除对 v2store 的依赖,以下组件已被移除:
- v2 discovery(#20109: Remove v2discovery)包已移除,
- v2 request 支持(#21263: Remove v2 Request and apply_v2.go)
- v2 client 支持(#20117: Remove client/internal/v2)。
这些更改可能会给用户带来一些问题,特别是那些尚未更新到 v3.6.11 或更高版本的用户。 用户应报告遇到的任何阻碍,或需要更好的升级文档的情况。
非阻塞客户端创建
etcd 不再支持已弃用的 grpc.WithBlock 拨号选项
(#21942: Make the etcd client creation non-blocking)。
如需保留之前的阻塞行为,请遵循 grpc-go 的反模式文档中的指导。
仅提供多架构容器镜像
对于依赖官方 etcd 容器镜像的用户,v3.7 仅以多架构容器形式分发。 将不再提供架构标签的镜像,请相应调整部署。
API 更改
与每个 etcd 版本一样,有多项 API 更改。这些更改旨在尽可能向后兼容, 但可能需要一些用户进行调整。有关完整信息,请参阅我们的 API 文档页面。
bbolt v1.5.1
etcd v3.7 依赖并包含 bbolt 存储引擎的 v1.5.1 版本。 v1.5 包括多项功能和性能改进,包括:
- 数据库文件大小限制:用户可以设置文件大小限制,bbolt 将强制执行。 当 bolt 数据库超过这些限制时,它将拒绝接受写入,直到数据库被压缩或限制被更改。
- 为性能禁用统计信息:用户可以设置
NoStatistics来限制数据库统计信息查看器获取锁的开销。
- 更高效的哈希映射处理:更快地合并跨度,且开销更低。
raft v3.7.0
etcd 3.7 依赖并包含 raft 共识引擎的 v3.7.0 版本。v3.7 包括多项改进,包括:
- 更新启动过程:v3.7 现在允许从部分初始化的快照启动,支持 etcd 直接从 v3store 初始化。
- 改进 ReadIndex 流程以防止陈旧读取, 通过在只读操作的心跳上下文中注入唯一标识符。
Raft v3.7.0 还包含与 etcd 相同的 protobuf 库更新和重构。
依赖更新
其他依赖更新包括将 golang.org/x/crypto 升级到 v0.52.0 以解决 CVE
(#21903: [release-3.7] Bump golang.org/x/crypto to v0.52.0),
将 OpenTelemetry contrib 更新到 v0.61.0
(#20017: Update otelgrpc to v0.61.0),
以及使用 Go 1.26.4 编译
(#21891: [release-3.7] Update Go to 1.26.4)。
贡献者
etcd v3.7.0 是社区中一百多位贡献者的成果。感谢所有编写代码、审查 PR、 提交和分类问题以及帮助测试 Alpha、Beta 和候选版本的人。
负责人
v3.7 版本的 SIG etcd 负责人是 ivanvc、serathius、 ahrtr、fuweid、 siyuanfoundation 和 jberkus。Ivan 领导我们的发布团队。
其他贡献者
ah8ad3, ajaysundark, aladesawe, amosehiguese, ArkaSaha30, ashikjm, AwesomePatrol, dims, Elbehery, gangli113, henrybear327, Jille, jmhbnz, joshuazh-x, kishen-v, lavishpal, liggitt, marcelfranca, miancheng7, mmorel-35, MrDXY, mrueg, purpleidea, qsyqian, redwrasse, ronaldngounou, skitt, spzala, tcchawla, tjungblu, vivekpatani, wenjiaswe
新贡献者
特别欢迎在此周期中首次为 etcd 做出贡献的贡献者 — 包括 Jeffrey Ying,他的工作推动了 RangeStream 功能的实现。 新贡献者可以对 etcd 产生重大影响;如果你想参与,请参阅 贡献者指南。
1911860538, 4rivappa, aaronjzhang, abdurrehman107, ABin-Huang, adeptvin1, aditya7880900936, AHBICJ, akstron, alliasgher, aman4433, aojea, apullo777, AR21SM, arturmelanchyk, AshrafAhmed9, asttool, asutorufa, BBQing, beforetech, boqishan, caltechustc, carsontham, christophsj, chuanye-gao, cnuss, cuiweixie, dmvolod, Dogacel, dongjiang1989, EduardoVega, evertrain, eyupcanakman, gaganhr94, goingforstudying-ctrl, greenblade29, Himanshu-370, HossamSaberX, huajianxiaowanzi, hwdef, ishan-gupta2005, ishan16696, ivangsm, JasonLove-Coding, Jefftree, jianfengye, jiminhu, jinmingming2016, jinseopim, johscheuer, jonathan-taylor, juan-lee, JustinKuli, kevinklinger, krasin, KravtsovV, la55u, lanshiqin, lindycoder, linuxbean, liufuyang, lunarwhite, M00nLight, majiayi, marcosqf, MartinForReal, matthias-lohr, mattlqx, mcarrano, michmike, mike-chen01, mikefarah, MikulasZelinka, miztiik, mlauner, mlh758, moelholm, morsapaes, MrTomSawyer, nate-double-u, nishanttotla, nomorethink, Oberon00, octaviof, OmarZayed, pavolloffay, pencor, petermattis, phanvanhai, philip5096, pixdrift, PivotalJosh, pmorie, q3k, raghavendra-talur, rajatchopra, RanjiK, ravisw2013, redskal, remyleone, robert-scheck, rohan-kanade, rqlite, sethp-nr, shadow1305, sheldux, shizhiguo, sidje2001, simbafs, skgsergio, slawomir-smyk, smunaut, sohlich, sparkoo, spinkube, stefanprodan, stilldavid, str4d, szentistvan0, talayhan, tommy-sho, topolovec, travlerz, tupyy, uablrek, ueokande, vaporz01, Verf, vincent-pli, wenyiqing, wlgw, wuyue92tree, xiaobailong24, xiangpengzhao, xiliangMa, xinchenh, xuwen, y0ssar1an, yanniszark, yihuafan, yinheyi, yorkie, yuancheng-liu, zhizhenxu, zlsun, Zombie110year, zx2c4
反馈可以通过以下方式分享: