作者
唐聪,腾讯云资深工程师,极客时间专栏《etcd实战课》作者,etcd活跃贡献者,主要负责腾讯云大规模k8s/etcd平台、有状态服务容器化、在离线混部等产品研发设计工作。
etcd 3.5发布
美东时间2021年6月15号18点,继 etcd 3.4 版本发布近两年之后,etcd 社区官宣发布了3.5 稳定版本,其主要贡献者来自 Google、AWS、Tencent、Red Hat、ByteDance、IBM 等公司的开发者。etcd 3.5 版本的发布,将极大提升开发者体验、更快、更稳的支撑 kubernetes。
腾讯云容器团队(tangcong/wswcfan/mlmhl等)一直致力于参与 etcd社区开源的贡献,参与以及贡献了大量提升 etcd 稳定性、性能优化的 PR 和 QoS Proposal 等,是目前国内最活跃的贡献团队,未来我们也将持续将内部大规模 kubernetes 和 etcd 集群的治理经验回馈给社区,为 kubernetes 和 etcd 社区添砖加瓦!
etcd 3.5 特性分析
那么在 etcd 3.5 版本中有哪些令人期待的特性呢?
下图我从模块化/开发者体验、性能、稳定性、运维和安全、文档及 RoadMap 方面为你总结了 etcd 3.5核心要点。
首先,在我看来,在etcd 3.5版本,最令开发者期待的当属对 Go Module 的版本号语义的支持,并将之前大的 etcd 模块按功能进行了拆分,实现了 etcd 的模块化等,解决了饱受社区吐槽的 “go get fail”、依赖复杂、循环依赖、强制依赖过低的 gRPC 版本等痛点,将大大提升 etcd 开发者幸福度。
其次,从性能及稳定性上看,etcd 3.5 版本包含了若干对etcd读写性能优化、启动耗时优化、重要 Bug 修复、内存占用优化等特性,将显著提升集群稳定性、吞吐量、延时,将更好的支撑大规模 kubernetes 集群。
最后,从运维、安全上,etcd 3.5 版本包含了 etcd 日志轮转/压缩、集群降级、etcdutl、expensive request 定位、本地 trace 及分布式 trace OpenTelemetry 等特性支持,以及一系列安全问题优化,将显著提升问题定位效率。
接下来我就从以上各方面为你解读 etcd 3.5 中核心特性。
etcd 3.5 核心特性解读
支持 Go Module 版本号语义及模块化
自从 Go 社区在 Go 1.11 版本开始推出官方的包依赖管理解决方案 Go Module,并在 Go 1.14 版本达到生产环境可用标准后,绝大部分的项目已经使用 Go Module 来解决项目中的包依赖管理的痛点,并且 Go 在1.16版本后 Go Module 已经默认开启了。
然而,如果你的 Go 项目依赖 etcd,原以为一个"go get go.etcd.io/etcd/"命令能下好所有依赖,结果却是要经历一波三折才能下好各种依赖,一开始你会遇到如下的 boltdb 错误。通过 Go Modules 的如下 replace 命令解决后,又会遇到因为 etcd 依赖过低的 gRPC 版本,导致的 gRPC 错误等。
% go get go.etcd.io/etcd/
go get: github.com/coreos/bbolt@none updating to
github.com/coreos/bbolt@v1.3.6: parsing go.mod:
module declares its path as: go.etcd.io/bbolt
but was required as: github.com/coreos/bbolt
go.etcd.io/etcd imports
github.com/coreos/etcd/etcdmain imports
github.com/coreos/etcd/proxy/grpcproxy imports
google.golang.org/grpc/naming: cannot find module providing package google.golang.org/grpc/naming
当你解决完各种依赖问题,满心欢喜的开始编译时,你又可能会遇到版本过低,导致编译错误,又陷入崩溃中。
为什么会版本过低呢? 查看 go.mod 文件你会发现,原来你最后 go get 下载得版本是 v3.3.25,如下所示。
% cat go.mod | grep etcd
module github.com/tangcong/etcd-lab
github.com/coreos/etcd v3.3.25+incompatible // indirect
go.etcd.io/etcd v3.3.25+incompatible
首先为什么v3.3.25后面含有个 incompatible 呢? 这主要是因为 etcd 3.3 分支还未支持 Go Module(未含有go mod文件),incompatible 表示它的主版本号大于2,与较低的版本号属于同一模块。go 命令可能会将其自动升级到更高的 incompatible 版本,即