<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Etcd on 吾爱主机</title><link>https://blog.waihost.com/tags/etcd/</link><description>Recent content in Etcd on 吾爱主机</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 09 Jul 2026 09:06:19 +0800</lastBuildDate><atom:link href="https://blog.waihost.com/tags/etcd/index.xml" rel="self" type="application/rss+xml"/><item><title>etcd 3.7.0 正式发布：Kubernetes 控制面的升级、备份与兼容性检查清单</title><link>https://blog.waihost.com/posts/etcd-3-7-upgrade-guide/</link><pubDate>Thu, 09 Jul 2026 09:06:19 +0800</pubDate><guid>https://blog.waihost.com/posts/etcd-3-7-upgrade-guide/</guid><description>&lt;img src="https://blog.waihost.com/images/covers/etcd-3-7-upgrade-guide.svg" alt="Featured image of post etcd 3.7.0 正式发布：Kubernetes 控制面的升级、备份与兼容性检查清单" /&gt;&lt;p&gt;etcd 是 Kubernetes 控制面的关键依赖：API Server 的对象状态、Leader 选举、租约与 watch 通知，最终都要落到这个分布式键值存储上。2026 年 7 月 8 日，etcd 项目发布了 v3.7.0。它不是一个只改版本号的小更新：官方发布说明明确要求升级前阅读 v3.7 升级指南，CHANGELOG 中同时包含安全修复、依赖升级、v2 相关能力移除、clientv3 行为变化以及运维工具改动。&lt;/p&gt;
&lt;p&gt;这篇文章基于 etcd 官方 Release、CHANGELOG、v3.7 升级文档，以及 Kubernetes 官方 etcd 运维文档整理成一份实践清单。它不是复制某一篇公告，而是面向真实生产环境回答三个问题：是否应该升级、升级前要检查什么、如果你运行的是 Kubernetes 集群该如何降低风险。&lt;/p&gt;
&lt;h2 id="这次发布最值得关注的变化"&gt;&lt;a href="#%e8%bf%99%e6%ac%a1%e5%8f%91%e5%b8%83%e6%9c%80%e5%80%bc%e5%be%97%e5%85%b3%e6%b3%a8%e7%9a%84%e5%8f%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;这次发布最值得关注的变化
&lt;/h2&gt;&lt;h3 id="1-安全修复与依赖升级"&gt;&lt;a href="#1-%e5%ae%89%e5%85%a8%e4%bf%ae%e5%a4%8d%e4%b8%8e%e4%be%9d%e8%b5%96%e5%8d%87%e7%ba%a7" class="header-anchor"&gt;&lt;/a&gt;1. 安全修复与依赖升级
&lt;/h3&gt;&lt;p&gt;v3.7.0 的正式版 CHANGELOG 提到两个服务端修复：当配置 &lt;code&gt;--listen-client-http-urls&lt;/code&gt; 时，gRPC listener 上的 CRL enforcement bypass 问题得到修复；同时修复了带 &lt;code&gt;bearer&lt;/code&gt; 前缀 token 的 websocket 认证问题。依赖层面，官方二进制使用 Go 1.26.5 编译，并将 &lt;code&gt;golang.org/x/crypto&lt;/code&gt; 升级到 v0.52.0，以处理多项 CVE。&lt;/p&gt;
&lt;p&gt;对运维团队来说，这意味着 v3.7.0 不应只被看成“新功能版本”。如果你的 etcd 暴露在严格证书校验、客户端证书吊销列表、或经过网关/WebSocket 访问的场景中，安全修复本身就值得排期评估。&lt;/p&gt;
&lt;h3 id="2-v2-时代彻底退出"&gt;&lt;a href="#2-v2-%e6%97%b6%e4%bb%a3%e5%bd%bb%e5%ba%95%e9%80%80%e5%87%ba" class="header-anchor"&gt;&lt;/a&gt;2. v2 时代彻底退出
&lt;/h3&gt;&lt;p&gt;v3.7 升级文档说明，v2 store 已在 v3.7 中完全移除：&lt;code&gt;--enable-v2&lt;/code&gt;、&lt;code&gt;--experimental-enable-v2v3&lt;/code&gt;、v2 discovery service、&lt;code&gt;client/v2&lt;/code&gt; 包以及 v2 snapshot 文件加载都不再存在。CHANGELOG 也把移除 v2 discovery、client/v2、v2 request/apply 等列为 v3.7.0-rc.0 的 breaking changes。&lt;/p&gt;
&lt;p&gt;如果你的集群已经稳定运行在 3.6，并且历史上没有保留 v2 数据，这通常不是阻塞项；但如果某些遗留脚本仍依赖 v2 API，或者你还保留了旧版本快照恢复流程，就必须在升级前完成迁移与演练。&lt;/p&gt;
&lt;h3 id="3-clientv3-创建连接不再阻塞"&gt;&lt;a href="#3-clientv3-%e5%88%9b%e5%bb%ba%e8%bf%9e%e6%8e%a5%e4%b8%8d%e5%86%8d%e9%98%bb%e5%a1%9e" class="header-anchor"&gt;&lt;/a&gt;3. clientv3 创建连接不再阻塞
&lt;/h3&gt;&lt;p&gt;CHANGELOG 写明：&lt;code&gt;clientv3&lt;/code&gt; 创建 etcd client 变为 non-blocking，etcd 不再遵循已废弃的 &lt;code&gt;grpc.WithBlock&lt;/code&gt; dial option。过去一些程序会假设 &lt;code&gt;clientv3.New(...)&lt;/code&gt; 返回成功就代表连接已建立；升级依赖后，这类程序需要改为显式执行健康检查、超时控制或首次请求重试。&lt;/p&gt;
&lt;p&gt;一个更稳妥的模式是：创建 client 后立即用带超时的上下文调用 &lt;code&gt;Status&lt;/code&gt; 或 &lt;code&gt;EndpointHealth&lt;/code&gt;，把“创建对象成功”和“后端可达”拆开处理。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cancel&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;WithTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Background&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="nx"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;defer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;cancel&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nx"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;:=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://127.0.0.1:2379&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;nil&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fmt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;etcd endpoint not ready: %w&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-命令行工具与可观测性变化"&gt;&lt;a href="#4-%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%b7%a5%e5%85%b7%e4%b8%8e%e5%8f%af%e8%a7%82%e6%b5%8b%e6%80%a7%e5%8f%98%e5%8c%96" class="header-anchor"&gt;&lt;/a&gt;4. 命令行工具与可观测性变化
&lt;/h3&gt;&lt;p&gt;v3.7 系列整理了 &lt;code&gt;etcdctl&lt;/code&gt; 命令，使帮助输出更简洁；&lt;code&gt;etcdutl&lt;/code&gt; 为所有命令增加 timeout flag，用于等待数据库文件锁时避免无限等待。监控方面，CHANGELOG 提到新增 &lt;code&gt;etcd_server_request_duration_seconds&lt;/code&gt;，以及多项 watch send loop 相关指标。对于依赖 Prometheus 告警的集群，升级后应同步检查 dashboard 和 recording rules，避免因为指标新增、命名差异或告警阈值不适配导致误报或漏报。&lt;/p&gt;
&lt;h2 id="生产升级前的硬性检查"&gt;&lt;a href="#%e7%94%9f%e4%ba%a7%e5%8d%87%e7%ba%a7%e5%89%8d%e7%9a%84%e7%a1%ac%e6%80%a7%e6%a3%80%e6%9f%a5" class="header-anchor"&gt;&lt;/a&gt;生产升级前的硬性检查
&lt;/h2&gt;&lt;p&gt;官方 v3.7 升级文档给出了两个基础前提：运行中的集群必须已经是 v3.6.11 或更高版本；etcd 只支持一次升级一个 minor 版本。如果你还在 3.5 或更早版本，应先升级到 3.6，再从 3.6 升级到 3.7。&lt;/p&gt;
&lt;p&gt;升级前建议执行以下检查：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 1. 检查所有成员版本与健康状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; etcdctl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --endpoints&lt;span class="o"&gt;=&lt;/span&gt;https://127.0.0.1:2379 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cacert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/ca.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --key&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; endpoint status --cluster -w table
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; etcdctl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --endpoints&lt;span class="o"&gt;=&lt;/span&gt;https://127.0.0.1:2379 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cacert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/ca.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --key&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; endpoint health --cluster
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 2. 创建快照，保留到升级窗口结束后&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; etcdctl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --endpoints&lt;span class="o"&gt;=&lt;/span&gt;https://127.0.0.1:2379 &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cacert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/ca.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cert&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.crt &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --key&lt;span class="o"&gt;=&lt;/span&gt;/etc/kubernetes/pki/etcd/server.key &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; snapshot save /backup/etcd-&lt;span class="k"&gt;$(&lt;/span&gt;date +%F-%H%M&lt;span class="k"&gt;)&lt;/span&gt;.db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 3. 校验快照状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcdutl snapshot status /backup/etcd-YYYY-MM-DD-HHMM.db -w table
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Kubernetes 官方文档也强调了 &lt;code&gt;etcdctl&lt;/code&gt; 与 &lt;code&gt;etcdutl&lt;/code&gt; 的分工：&lt;code&gt;etcdctl&lt;/code&gt; 主要用于通过网络管理集群、键值和健康状态；&lt;code&gt;etcdutl&lt;/code&gt; 更偏向直接操作数据文件，例如快照恢复、碎片整理、迁移与一致性验证。不要把两者混用成一个“万能命令”。&lt;/p&gt;
&lt;h2 id="推荐的滚动升级节奏"&gt;&lt;a href="#%e6%8e%a8%e8%8d%90%e7%9a%84%e6%bb%9a%e5%8a%a8%e5%8d%87%e7%ba%a7%e8%8a%82%e5%a5%8f" class="header-anchor"&gt;&lt;/a&gt;推荐的滚动升级节奏
&lt;/h2&gt;&lt;p&gt;v3.7 升级文档说明，常规情况下从 v3.6 到 v3.7 可以通过零停机滚动升级完成：一次停止并替换一个成员，所有成员升级完成后，集群才被视为真正升级到 v3.7，并启用新版本能力。升级期间，混合版本集群会按最低共同版本协议运行。&lt;/p&gt;
&lt;p&gt;一个三节点集群可以按下面节奏执行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在预发环境复刻生产拓扑，确认 kube-apiserver、控制器、调度器和自研组件能正常读写。&lt;/li&gt;
&lt;li&gt;对生产集群做快照，并确认快照可读、可复制到独立存储。&lt;/li&gt;
&lt;li&gt;逐个成员停止服务、替换二进制或镜像、启动服务。&lt;/li&gt;
&lt;li&gt;每升级一个成员后检查 &lt;code&gt;endpoint health --cluster&lt;/code&gt;、leader 是否稳定、API Server 错误率是否异常。&lt;/li&gt;
&lt;li&gt;所有成员升级完成后再观察至少一个业务高峰周期。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果是 kubeadm 管理的控制面，不建议绕过发行版或 kubeadm 文档直接替换宿主机上的 etcd；应先确认当前 Kubernetes 版本支持的 etcd 版本范围，并在维护窗口执行。&lt;/p&gt;
&lt;h2 id="日常维护也要一起复盘"&gt;&lt;a href="#%e6%97%a5%e5%b8%b8%e7%bb%b4%e6%8a%a4%e4%b9%9f%e8%a6%81%e4%b8%80%e8%b5%b7%e5%a4%8d%e7%9b%98" class="header-anchor"&gt;&lt;/a&gt;日常维护也要一起复盘
&lt;/h2&gt;&lt;p&gt;升级窗口是复盘 etcd 维护策略的好时机。官方维护文档指出，etcd 需要周期性维护以保持可靠性；如果 keyspace 历史没有及时压缩，后端数据库没有碎片整理，空间配额触发后集群会进入只接受读取和删除的受限维护模式。&lt;/p&gt;
&lt;p&gt;建议把下面三件事纳入升级后的运维基线：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 自动压缩：保留最近 1 小时历史（示例，需按业务 watch/回放需求调整）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;etcd --auto-compaction-mode&lt;span class="o"&gt;=&lt;/span&gt;periodic --auto-compaction-retention&lt;span class="o"&gt;=&lt;/span&gt;1h
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 手动压缩到某个 revision 后，再对成员做 defrag&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; etcdctl compact &amp;lt;revision&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;ETCDCTL_API&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt; etcdctl defrag --cluster
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 关注 DB Size、leader 切换、请求延迟、watch 延迟等指标&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# 结合新增的 etcd_server_request_duration_seconds 更新 Prometheus 告警&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="升级风险清单"&gt;&lt;a href="#%e5%8d%87%e7%ba%a7%e9%a3%8e%e9%99%a9%e6%b8%85%e5%8d%95" class="header-anchor"&gt;&lt;/a&gt;升级风险清单
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;遗留 v2 依赖&lt;/strong&gt;：检查脚本、SDK、旧控制器和快照恢复流程，不要等升级后才发现 &lt;code&gt;client/v2&lt;/code&gt; 或 v2 snapshot 不可用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;客户端连接假设&lt;/strong&gt;：如果业务代码使用 &lt;code&gt;clientv3&lt;/code&gt;，确认是否依赖 &lt;code&gt;grpc.WithBlock&lt;/code&gt; 带来的阻塞语义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;快照不可恢复&lt;/strong&gt;：只保存快照不够，至少要在隔离环境验证一次恢复流程。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;混合版本时间过长&lt;/strong&gt;：滚动升级可以混合版本运行，但不应长期停留在混合状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kubernetes 兼容性&lt;/strong&gt;：控制面组件、发行版、kubeadm 与 etcd 版本必须一起评估。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;&lt;a href="#%e6%80%bb%e7%bb%93" class="header-anchor"&gt;&lt;/a&gt;总结
&lt;/h2&gt;&lt;p&gt;etcd 3.7.0 的关键词是“安全修复、v2 清理、客户端语义调整、运维工具增强”。对于新集群，它让技术债更少；对于老集群，它会暴露历史遗留依赖。真正稳妥的升级不是简单替换二进制，而是先确认版本链路、备份可恢复、客户端行为可接受、监控和维护策略同步更新。只要把这些检查前置，v3.6 到 v3.7 的滚动升级可以成为一次相对可控的控制面基础设施升级。&lt;/p&gt;
&lt;h2 id="参考资料"&gt;&lt;a href="#%e5%8f%82%e8%80%83%e8%b5%84%e6%96%99" class="header-anchor"&gt;&lt;/a&gt;参考资料
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;etcd 官方 Release：&lt;a class="link" href="https://github.com/etcd-io/etcd/releases/tag/v3.7.0" target="_blank" rel="noopener"
 &gt;https://github.com/etcd-io/etcd/releases/tag/v3.7.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;etcd 官方 CHANGELOG 3.7：&lt;a class="link" href="https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.7.md" target="_blank" rel="noopener"
 &gt;https://github.com/etcd-io/etcd/blob/main/CHANGELOG/CHANGELOG-3.7.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;etcd 官方 v3.7 升级指南：&lt;a class="link" href="https://etcd.io/docs/v3.7/upgrades/upgrade_3_7/" target="_blank" rel="noopener"
 &gt;https://etcd.io/docs/v3.7/upgrades/upgrade_3_7/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;etcd 官方维护文档：&lt;a class="link" href="https://etcd.io/docs/v3.7/op-guide/maintenance/" target="_blank" rel="noopener"
 &gt;https://etcd.io/docs/v3.7/op-guide/maintenance/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes 官方 etcd 管理文档：&lt;a class="link" href="https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/" target="_blank" rel="noopener"
 &gt;https://kubernetes.io/docs/tasks/administer-cluster/configure-upgrade-etcd/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>