将 etcd 从 v3.5 升级到 v3.6
在一般情况下,从 etcd v3.5 升级到 v3.6 可以实现零停机时间的滚动升级:
- 逐一停止 etcd v3.5 进程,并替换为 etcd v3.6 进程
- 所有 v3.6 进程运行后,集群即可使用 v3.6 中的新特性
在 开始升级 之前,请通读本指南其余部分以做好准备。
升级检查列表
更新 3.5
升级至 3.6 之前,请确保 所有 3.5 版本的成员均已更新至 3.5.32 或更高版本
。补丁版本 3.5.24 至 3.5.26 修复了多个潜在的升级障碍;3.5.32
增加了 --v2-deprecation=write-only-skip-check 功能,并将 etcdutl check v2store 扩展至可检查 WAL 记录以及 v2 快照。
V2 存储系统
如果未配置 --enable-v2 标志或将其设置为 false,则无需采取进一步操作。
如果配置了 --enable-v2,请运行命令 etcdutl check v2store,以验证 v2store 中是否存在非成员关系(自定义)数据。若不存在自定义数据,可安全移除该标志。否则,请参阅 v2 迁移指南
获取更多详情。
新增标志
已移除标志
标志已弃用
etcd --experimental-bootstrap-defrag-threshold-megabytes 标志已被弃用.
etcd --experimental-compaction-batch-limit 标志已被弃用.
etcd --experimental-compact-hash-check-time 标志已被弃用.
etcd --experimental-compaction-sleep-interval 标志已被弃用.
etcd --experimental-corrupt-check-time 标志已被弃用.
etcd --experimental-enable-distributed-tracing 标志已弃用.
etcd --experimental-distributed-tracing-address 标志已被弃用.
etcd --experimental-distributed-tracing-instance-id 标志已弃用.
etcd --experimental-distributed-tracing-sampling-rate 标志已被弃用.
etcd --experimental-distributed-tracing-service-name 标志已弃用.
etcd --experimental-downgrade-check-time 标志已被弃用.
etcd --experimental-max-learners 标志已被弃用.
etcd --experimental-memory-mlock 标志已被弃用.
etcd --experimental-peer-skip-client-san-verification 标志已被弃用.
etcd --experimental-snapshot-catchup-entries 标志已被弃用.
etcd --experimental-warning-apply-duration 标志已弃用.
etcd --experimental-warning-unary-request-duration 标志已被弃用.
etcd --experimental-watch-progress-notify-interval 标志已被弃用.
v3.5 功能门控的等效标志
对应的功能门控标志 etcd --experimental-compact-hash-check-enabled=true
对应的功能门控标志 etcd --experimental-initial-corrupt-check=true
对应的功能门控标志 etcd --experimental-enable-lease-checkpoint=true
对应的功能门控标志 etcd --experimental-enable-lease-checkpoint-persist=true
对应的功能门控标志 etcd --experimental-stop-grpc-service-on-defrag=true
对应的功能门控标志 etcd --experimental-txn-mode-write-with-shared-buffer=false
带有新默认值的标志
原始默认标志 etcd --snapshot-count=100000
原始默认标志 etcd --v2-deprecation='not-yet'
原始默认标志 etcd --discovery-fallback='proxy'
Prometheus 指标差异
服务器升级检查清单
升级要求
要将现有的 etcd 部署升级至 v3.6,运行中的集群版本必须为 v3.5 或更高。若版本低于 v3.5,请先 升级至 v3.5 ,再升级至 v3.6。
此外,为确保滚动升级顺利进行,运行中的集群必须处于健康状态。在继续操作前,请使用 etcdctl endpoint health 命令检查集群健康状况。
准备
在升级 etcd 之前,请务必在预发环境中测试依赖 etcd 的服务,再将升级部署到生产环境。
开始前,请先 下载快照备份
。如果升级出现问题,可以使用此备份 回滚
到现有 etcd 版本。请注意,snapshot 命令只备份 v3 数据。
混合版本
升级期间,etcd 集群支持不同版本的 etcd 成员共存,并以最低公共版本的协议运行。只有当集群中所有成员均升级至 v3.6 版本后,才认为集群已完成升级。内部机制上,etcd 成员之间会相互协商以确定集群的整体版本,该版本控制报告的版本及支持的功能。
回滚
升级 etcd 集群前,请创建并 下载快照备份 。该快照可用于在需要时将集群恢复至升级前的状态。若用户在升级过程中遇到问题,应首先识别并解决根本原因。若集群仍处于混合版本状态——即至少有一个成员仍运行在 v3.5 版本——则可选择将二进制文件或镜像替换为旧版 v3.5,或直接使用快照恢复集群。在此混合状态下,集群仍以 v3.5 集群模式运行,支持回滚而无需执行正式的降级流程。
然而,一旦所有成员均升级至 v3.6 版本,集群即被视为已完全升级,此时使用二进制文件回滚将不再可行。在此情况下,唯一的恢复方式是恢复升级前创建的快照。若用户希望在完成完整升级后返回原始版本,应遵循官方降级指南,以确保一致性并避免数据损坏。
升级流程
本示例演示如何升级在本地计算机上运行的 3 个成员的 v3.5 etcd 集群。
步骤 1: 检查升级要求
集群是否健康且运行 v3.5.x 版本?
Step 2: 从领导者下载快照备份
下载快照备份 ,以便在出现任何问题时提供回退路径。
etcd 领导者保证拥有最新的应用数据,因此应从领导者获取快照:
第 3 步:停止一个现有的 etcd 服务器
当每个 etcd 进程停止时,集群中的其他成员会记录预期的错误。这是正常的,因为集群成员之间的连接已(暂时)中断:
第 4 步:使用相同配置重启 etcd 服务器
使用相同配置但采用新 etcd 二进制文件重启 etcd 服务器。
新的 v3.6 etcd 将向集群发布其信息。此时,集群仍以 v3.5 协议运行,该版本为最低公共版本。
{"level":"info","ts":"2025-03-01T04:40:36.828+0530","caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.5"}
{"level":"info","ts":"2025-03-01T04:40:36.889+0530","caller":"membership/cluster.go:539","msg":"updated cluster version","cluster-id":"59a05384c9b79ee","local-member-id":"bf9071f4639c75cc","from":"3.0","to":"3.5"}
{"level":"info","ts":"2025-03-01T04:40:36.828+0530","caller":"api/capability.go:76","msg":"enabled capabilities for version","cluster-version":"3.5"}
{"level":"info","ts":"2025-03-01T04:40:36.894+0530","caller":"etcdserver/server.go:1686","msg":"published local member to cluster through raft","local-member-id":"bf9071f4639c75cc","local-member-attributes":"{Name:node1 ClientURLs:[http://127.0.0.1:2379]}","cluster-id":"59a05384c9b79ee","publish-timeout":"7s"}
验证每个成员以及整个集群在使用新的 v3.6 etcd 二进制文件后是否恢复正常健康状态:
未升级的成员将持续记录如下警告,直至整个集群完成升级。
这是预期行为,当所有 etcd 集群成员都升级到 v3.6 后,该现象将停止。
第 5 步:重复第 3 步和第 4 步,对剩余的成员进行操作
所有成员升级完成后,集群将成功报告升级至 v3.6:
成员 1:
{"level":"info","ts":"2025-03-01T04:58:32.375+0530","caller":"etcdserver/server.go:2149","msg":"updating cluster version using v3 API","from":"3.5","to":"3.6"}{"level":"info","ts":"2025-03-01T04:58:32.377+0530","caller":"etcdserver/server.go:2164","msg":"cluster version is updated","cluster-version":"3.6"}
成员 2:
{"level":"info","ts":"2025-03-01T04:58:32.377+0530","caller":"membership/cluster.go:539","msg":"updated cluster version","cluster-id":"59a05384c9b79ee","local-member-id":"91bc3c398fb3c146","from":"3.5","to":"3.6"}
成员 3:
{"level":"info","ts":"2025-03-01T04:58:32.377+0530","caller":"membership/cluster.go:539","msg":"updated cluster version","cluster-id":"59a05384c9b79ee","local-member-id":"fd422379fda50e48","from":"3.5","to":"3.6"}