<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>高可用 on 远思码技术实验室</title><link>https://yuansima.com/tags/%E9%AB%98%E5%8F%AF%E7%94%A8/</link><description>Recent content in 高可用 on 远思码技术实验室</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Mon, 06 Jul 2026 18:59:00 +0800</lastBuildDate><atom:link href="https://yuansima.com/tags/%E9%AB%98%E5%8F%AF%E7%94%A8/index.xml" rel="self" type="application/rss+xml"/><item><title>HashiCorp Vault 进阶实战：基于 Raft 的 3 节点高可用集群部署指南</title><link>https://yuansima.com/p/vault-raft-3node-ha-deployment/</link><pubDate>Mon, 06 Jul 2026 18:59:00 +0800</pubDate><guid>https://yuansima.com/p/vault-raft-3node-ha-deployment/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;br&gt;
自 Vault 1.4+ 起，&lt;strong&gt;Integrated Storage (Raft)&lt;/strong&gt; 成为官方推荐的存储后端，彻底告别对 Consul 的依赖。本文聚焦 &lt;strong&gt;3 节点 Raft HA 集群&lt;/strong&gt;（生产最小可用单元），提供从开发验证到生产落地的完整进阶指南。&lt;br&gt;
结合上篇《Raft 集群高可用部署进阶实践》，你将掌握 Vault 特有的 HA 机制（Active/Standby、Performance Standby、企业版特性）与运维要点。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一vault-raft-ha-架构核心"&gt;一、Vault Raft HA 架构核心
&lt;/h2&gt;&lt;p&gt;Vault 使用 &lt;strong&gt;Raft&lt;/strong&gt; 实现数据复制与领导者选举：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;1 个 Active（Leader）节点&lt;/strong&gt;：处理所有写操作（secrets 写入、策略更新等）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2 个 Standby 节点&lt;/strong&gt;：实时复制数据，可处理读请求（通过请求转发）&lt;/li&gt;
&lt;li&gt;客户端通过 Load Balancer 访问，LB 指向 Active 节点（或所有节点，Vault 会重定向）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;故障容忍&lt;/strong&gt;：3 节点集群可容忍 &lt;strong&gt;1 个节点故障&lt;/strong&gt;（仍保持 Quorum）。&lt;br&gt;
官方推荐生产使用 &lt;strong&gt;5 节点跨 3 AZ&lt;/strong&gt; 以获得更好维护窗口与容错能力。&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 LB[Load Balancer] --&gt;|API 请求| V1[Vault Node 1&lt;br/&gt;Active / Leader]
 LB --&gt; V2[Vault Node 2&lt;br/&gt;Standby]
 LB --&gt; V3[Vault Node 3&lt;br/&gt;Standby]
 
 V1 -.-&gt;|Raft Log Replication| V2
 V1 -.-&gt;|Raft Log Replication| V3
 
 V2 -.-&gt;|Read Forwarding| V1
 V3 -.-&gt;|Read Forwarding| V1
 
 style V1 fill:#ffcc00,stroke:#333&lt;/pre&gt;&lt;p&gt;&lt;em&gt;图：3 节点 Vault Raft HA 集群架构（Active 处理写，Standby 实时同步）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Vault Raft 集成存储参考架构（含 Transit Auto-unseal 示例）" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://yuansima.com/images/vault-raft-transit-autounseal.jpg"&gt;&lt;/p&gt;
&lt;h2 id="二快速验证docker-compose-3-节点集群"&gt;二、快速验证：Docker Compose 3 节点集群
&lt;/h2&gt;&lt;p&gt;适合本地/测试环境快速上手。&lt;/p&gt;
&lt;h3 id="docker-composeyml-示例"&gt;docker-compose.yml 示例
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;3.8&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vault1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hashicorp/vault:1.18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;vault1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;VAULT_ADDR=http://127.0.0.1:8200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8200:8200&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8201:8201&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./vault1:/vault/config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;vault1-data:/vault/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;server -config=/vault/config/vault.hcl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cap_add&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;IPC_LOCK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vault2&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hashicorp/vault:1.18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;vault2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8202:8200&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8203:8201&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./vault2:/vault/config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;vault2-data:/vault/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;server -config=/vault/config/vault.hcl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cap_add&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;IPC_LOCK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;vault1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vault3&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hashicorp/vault:1.18&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;container_name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;vault3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8204:8200&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8205:8201&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./vault3:/vault/config&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;vault3-data:/vault/data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;command&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;server -config=/vault/config/vault.hcl&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cap_add&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;IPC_LOCK&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;depends_on&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;vault1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vault1-data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vault2-data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;vault3-data&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="各节点-vaulthcl-配置关键差异在-node_id"&gt;各节点 vault.hcl 配置（关键差异在 node_id）
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;vault1/config/vault.hcl&lt;/strong&gt;（第一个节点）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ui &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;disable_mlock &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&lt;span style="color:#75715e"&gt; # 开发环境，生产建议 false + 调大 ulimit
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;listener&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;tcp&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; address &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;0.0.0.0:8200&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; tls_disable &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&lt;span style="color:#75715e"&gt; # 生产必须开启 TLS！
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;storage&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;raft&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/vault/data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; node_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;vault1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_addr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://vault1:8200&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cluster_addr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://vault1:8201&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;vault2/config/vault.hcl&lt;/strong&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-hcl" data-lang="hcl"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ... listener 同上，端口映射已处理
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;storage&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;raft&amp;#34;&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; path &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;/vault/data&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; node_id &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;vault2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;api_addr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://vault2:8200&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cluster_addr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;http://vault2:8201&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;vault3&lt;/strong&gt; 同理，node_id = &amp;ldquo;vault3&amp;rdquo;。&lt;/p&gt;
&lt;h3 id="启动与初始化流程"&gt;启动与初始化流程
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 1. 启动集群&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 2. 初始化（仅在 vault1 执行一次）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault1 vault operator init &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -key-shares&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; -key-threshold&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 保存输出的 5 个 unseal keys 和 root token（生产用 PGP 或云 KMS 管理）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 3. 解封 vault1（需要 3 个 key）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault1 vault operator unseal &lt;span style="color:#75715e"&gt;# 重复输入 3 个 key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 4. vault2、vault3 加入集群&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault2 vault operator raft join http://vault1:8200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault3 vault operator raft join http://vault1:8200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 5. 分别解封 vault2、vault3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault2 vault operator unseal
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault3 vault operator unseal
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 6. 验证集群状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault1 vault operator raft list-peers
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it vault1 vault status &lt;span style="color:#75715e"&gt;# 显示 HA 模式 + Active/Standby&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;验证成功标志&lt;/strong&gt;：&lt;code&gt;raft list-peers&lt;/code&gt; 显示 3 个节点，&lt;code&gt;vault status&lt;/code&gt; 中 &lt;code&gt;HA Enabled: true&lt;/code&gt; 且有一个 Active。&lt;/p&gt;
&lt;h2 id="三生产级部署kubernetes--helm-chart推荐"&gt;三、生产级部署：Kubernetes + Helm Chart（推荐）
&lt;/h2&gt;&lt;p&gt;官方 &lt;strong&gt;hashicorp/vault&lt;/strong&gt; Helm Chart 是生产最佳实践。&lt;/p&gt;
&lt;h3 id="1-准备-valuesyaml3-节点-raft-ha--推荐配置"&gt;1. 准备 values.yaml（3 节点 Raft HA + 推荐配置）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# vault-values.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;global&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;tlsDisable&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 生产强烈建议开启 TLS + cert-manager&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;injector&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;replicas&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;server&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 高可用配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ha&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;replicas&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;raft&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;setNodeId&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;config&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; ui = true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; listener &amp;#34;tcp&amp;#34; {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; address = &amp;#34;0.0.0.0:8200&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; cluster_address = &amp;#34;0.0.0.0:8201&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; tls_disable = false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; tls_cert_file = &amp;#34;/vault/userconfig/vault-tls/tls.crt&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; tls_key_file = &amp;#34;/vault/userconfig/vault-tls/tls.key&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; storage &amp;#34;raft&amp;#34; {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; path = &amp;#34;/vault/data&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; # node_id 由 Helm 自动注入
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; seal &amp;#34;awskms&amp;#34; { # 推荐 Auto-unseal（生产必备）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; region = &amp;#34;ap-southeast-1&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; kms_key_id = &amp;#34;alias/vault-auto-unseal&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; api_addr = &amp;#34;https://vault.example.com:8200&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; cluster_addr = &amp;#34;https://{{ .Release.Name }}-{{ .Release.Namespace }}.svc.cluster.local:8201&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 资源限制（生产关键）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;resources&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requests&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;memory&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;512Mi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cpu&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;500m&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;limits&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;memory&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1Gi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cpu&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 数据持久化（使用高性能 StorageClass）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;dataStorage&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;10Gi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;storageClass&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;fast-ssd &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 推荐本地 SSD 或高 IOPS 云盘&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 审计日志（生产必开）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;auditStorage&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;enabled&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;size&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5Gi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# 额外配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;extraEnvironmentVars&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;VAULT_LOG_LEVEL&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;info&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# Pod 反亲和 + 拓扑分布（跨 AZ/节点）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;affinity&lt;/span&gt;: |&lt;span style="color:#e6db74"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; podAntiAffinity:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; preferredDuringSchedulingIgnoredDuringExecution:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; - weight: 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; podAffinityTerm:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; labelSelector:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; matchExpressions:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; - key: app.kubernetes.io/name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; operator: In
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; values:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; - vault
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; topologyKey: kubernetes.io/hostname&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;topologySpreadConstraints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;maxSkew&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;topologyKey&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;topology.kubernetes.io/zone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;whenUnsatisfiable&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;DoNotSchedule&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;labelSelector&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;matchLabels&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;app.kubernetes.io/name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;vault&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-部署命令"&gt;2. 部署命令
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo add hashicorp https://helm.releases.hashicorp.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm repo update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;helm install vault hashicorp/vault &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --namespace vault &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --create-namespace &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -f vault-values.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看 Pod&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl get pods -n vault -l app.kubernetes.io/name&lt;span style="color:#f92672"&gt;=&lt;/span&gt;vault -w
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-初始化与加入与-docker-类似但用-kubectl-exec"&gt;3. 初始化与加入（与 Docker 类似，但用 kubectl exec）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 初始化（在第一个 Pod 执行）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl exec -it vault-0 -n vault -- vault operator init ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 解封 vault-0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl exec -it vault-0 -n vault -- vault operator unseal ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 其他 Pod 自动加入（Helm 会处理部分），或手动：&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl exec -it vault-1 -n vault -- vault operator raft join https://vault-0.vault-internal:8200
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 然后解封&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;生产加固建议&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;cert-manager&lt;/strong&gt; + Ingress 为 Vault 签发真实证书&lt;/li&gt;
&lt;li&gt;Auto-unseal 使用 AWS KMS / GCP KMS / Azure Key Vault / Transit 引擎&lt;/li&gt;
&lt;li&gt;开启审计日志到文件或 Syslog&lt;/li&gt;
&lt;li&gt;配置 PodDisruptionBudget 保证至少 2 个节点可用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四关键生产运维实践"&gt;四、关键生产运维实践
&lt;/h2&gt;&lt;h3 id="1-监控与告警"&gt;1. 监控与告警
&lt;/h3&gt;&lt;p&gt;Vault 暴露 Prometheus 指标：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 需要 root token 或有权限的 token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;curl -H &lt;span style="color:#e6db74"&gt;&amp;#34;X-Vault-Token: &lt;/span&gt;$TOKEN&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; https://vault.example.com/v1/sys/metrics?format&lt;span style="color:#f92672"&gt;=&lt;/span&gt;prometheus
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;关键指标：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vault_core_active&lt;/code&gt;（1=Active）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vault_raft_leader&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vault_raft_peer_count&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vault_barrier_put&lt;/code&gt; / &lt;code&gt;get&lt;/code&gt; 延迟&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vault_audit_log_request&lt;/code&gt; 失败率&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;推荐 Grafana Dashboard：搜索 “Vault” 或使用官方/社区仪表盘。&lt;/p&gt;
&lt;h3 id="2-备份与恢复raft-snapshot"&gt;2. 备份与恢复（Raft Snapshot）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 定期快照（推荐每天 + 保留 30 天）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vault operator raft snapshot save /backup/vault-snapshot-&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%F&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;.snap
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 恢复（新建集群或替换数据目录后）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;vault operator raft snapshot restore /backup/vault-snapshot-xxx.snap
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;自动化&lt;/strong&gt;：使用 CronJob + Velero，或 Vault Enterprise 的 Snapshot 功能。&lt;/p&gt;
&lt;h3 id="3-性能与资源"&gt;3. 性能与资源
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;磁盘&lt;/strong&gt;：必须高性能 SSD/NVMe（Raft WAL + 状态机对 fsync 敏感）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：生产建议 1Gi+ 请求，视 secrets 数量调整&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络&lt;/strong&gt;：低延迟，Cluster 端口（8201）与 API 端口分离&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Auto-unseal&lt;/strong&gt;：强烈推荐，消除人工解封风险&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4-安全加固-checklist"&gt;4. 安全加固 checklist
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;生产&lt;strong&gt;必须&lt;/strong&gt;启用 TLS（listener + cluster）&lt;/li&gt;
&lt;li&gt;启用 mlock（&lt;code&gt;disable_mlock = false&lt;/code&gt;）+ 适当 ulimit&lt;/li&gt;
&lt;li&gt;最小权限 root token，日常使用 AppRole / Kubernetes Auth&lt;/li&gt;
&lt;li&gt;开启 Audit Device&lt;/li&gt;
&lt;li&gt;定期轮换 unseal keys / root token&lt;/li&gt;
&lt;li&gt;网络隔离（仅允许必要来源访问 8200/8201）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="五常见陷阱与解决方案"&gt;五、常见陷阱与解决方案
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;问题&lt;/th&gt;
 &lt;th&gt;可能原因&lt;/th&gt;
 &lt;th&gt;解决方案&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;raft join 失败&lt;/td&gt;
 &lt;td&gt;cluster_addr / api_addr 配置错误&lt;/td&gt;
 &lt;td&gt;确保 cluster_addr 使用内部可达地址&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;频繁 Leader 选举&lt;/td&gt;
 &lt;td&gt;网络抖动或 election timeout 过小&lt;/td&gt;
 &lt;td&gt;调大 cluster 心跳间隔，检查网络&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;解封后仍 Standby&lt;/td&gt;
 &lt;td&gt;未正确 join 或未解封&lt;/td&gt;
 &lt;td&gt;检查 raft list-peers + 重新 unseal&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;性能差 / 高延迟&lt;/td&gt;
 &lt;td&gt;磁盘 IOPS 不足&lt;/td&gt;
 &lt;td&gt;更换高性能存储，监控 fsync 延迟&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;K8s Pod 不断重启&lt;/td&gt;
 &lt;td&gt;资源不足或 anti-affinity 冲突&lt;/td&gt;
 &lt;td&gt;增加资源 + 调整 topology constraints&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;无法写入（只读模式）&lt;/td&gt;
 &lt;td&gt;失 Quorum&lt;/td&gt;
 &lt;td&gt;检查节点健康，恢复多数派节点&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="六进阶扩展方向"&gt;六、进阶扩展方向
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Performance Standby&lt;/strong&gt;（Enterprise）：Standby 节点也可处理读请求，大幅提升吞吐&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DR Replication&lt;/strong&gt;（Enterprise）：跨 Region 灾难恢复复制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Namespaces&lt;/strong&gt; + &lt;strong&gt;Sentinel&lt;/strong&gt; 策略：多租户精细控制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Transit Auto-unseal&lt;/strong&gt;：用另一个 Vault 集群解封（上图示例）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;与上篇 Raft 文章结合&lt;/strong&gt;：理解底层 Quorum、snapshot、成员变更机制&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;3 节点 Raft 集群是 HashiCorp Vault 最经典且可靠的 HA 部署方式。掌握 &lt;strong&gt;初始化 → 加入 → 解封 → 验证&lt;/strong&gt; 流程 + &lt;strong&gt;Helm + Auto-unseal + 监控备份&lt;/strong&gt; 组合，即可构建企业级 Secrets 管理平台。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;官方参考&lt;/strong&gt;（强烈建议阅读）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.hashicorp.com/vault/tutorials/day-one-raft/raft-reference-architecture" target="_blank" rel="noopener"
 &gt;Vault Integrated Storage Reference Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.hashicorp.com/vault/tutorials/kubernetes/kubernetes-raft-deployment-guide" target="_blank" rel="noopener"
 &gt;Vault Helm Chart HA 配置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developer.hashicorp.com/vault/docs/configuration/storage/raft" target="_blank" rel="noopener"
 &gt;Raft Storage 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;本文由 Grok 基于最新 Vault 实践生成&lt;/strong&gt;，可直接发布到 Hugo 站点。&lt;br&gt;
需要配套的完整 Docker Compose 项目、cert-manager + TLS 配置示例、Prometheus rules、或 Terraform 模块？随时告诉我，我继续补充！&lt;/p&gt;
&lt;p&gt;让你的 Vault 集群永远 Active，数据永不丢失！🔐&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
This completes the article creation.
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>Raft 集群高可用部署进阶实践：生产级 etcd 集群构建指南</title><link>https://yuansima.com/p/raft-cluster-ha-advanced/</link><pubDate>Mon, 06 Jul 2026 17:47:00 +0800</pubDate><guid>https://yuansima.com/p/raft-cluster-ha-advanced/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;&lt;strong&gt;前言&lt;/strong&gt;&lt;br&gt;
Raft 是当前最流行且易于理解的分布式共识算法，被 etcd、TiKV、Consul、HashiCorp Vault 等广泛采用。本文以 &lt;strong&gt;etcd&lt;/strong&gt; 作为主要实践载体，聚焦&lt;strong&gt;生产级高可用（HA）部署&lt;/strong&gt;的进阶话题。假设你已了解 Raft 基本概念（Leader 选举、日志复制、安全性），本文将带你进入“如何在真实环境中让 Raft 集群真正高可用、易运维、可扩展”的深水区。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="一raft-高可用核心原理回顾"&gt;一、Raft 高可用核心原理回顾
&lt;/h2&gt;&lt;p&gt;Raft 通过以下机制实现强一致性与高可用：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;领导者选举（Leader Election）&lt;/strong&gt;：节点随机超时后发起选举，获得多数票（Quorum）成为 Leader。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志复制（Log Replication）&lt;/strong&gt;：Leader 将客户端写请求追加到本地日志并复制到多数 Follower，成功后 commit 并应用到状态机。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全性（Safety）&lt;/strong&gt;：通过 Term（任期）、Log Matching、Commit Index 保证即使在网络分区、节点故障下也不会出现数据不一致或“脑裂”。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Quorum 计算&lt;/strong&gt;：对于 &lt;code&gt;n&lt;/code&gt; 个节点，Quorum = &lt;code&gt;n/2 + 1&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 节点集群：容忍 1 个节点故障&lt;/li&gt;
&lt;li&gt;5 节点集群：容忍 2 个节点故障&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;为什么必须奇数节点？&lt;/strong&gt;&lt;br&gt;
偶数节点（如 4 节点）容忍故障数与 3 节点相同（仅 1 个），但多消耗资源，且在分区时更容易出现平票（split vote）。生产环境永远使用奇数。&lt;/p&gt;
&lt;pre class="mermaid" style="visibility:hidden"&gt;graph TD
 A[Follower] --&gt;|超时或心跳丢失| B[Candidate]
 B --&gt;|获得多数票| C[Leader]
 C --&gt;|心跳| A
 B --&gt;|更高任期发现| A
 C --&gt;|发现更高任期| A
 style C fill:#ffcc00&lt;/pre&gt;&lt;p&gt;&lt;em&gt;图：Raft 节点状态转换（Follower → Candidate → Leader）&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Raft 领导者与跟随者架构示意" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://yuansima.com/images/raft-leader-followers.jpg"&gt;&lt;/p&gt;
&lt;h2 id="二生产级部署架构设计"&gt;二、生产级部署架构设计
&lt;/h2&gt;&lt;h3 id="21-推荐拓扑多可用区multi-az-奇数节点"&gt;2.1 推荐拓扑：多可用区（Multi-AZ）+ 奇数节点
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;最小生产配置&lt;/strong&gt;：3 节点，分布在 &lt;strong&gt;3 个不同可用区（AZ）&lt;/strong&gt;。&lt;br&gt;
单个 AZ 故障时，仍保留 2 节点（满足 Quorum），集群继续提供读写服务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进阶推荐&lt;/strong&gt;：5 节点集群（容忍 2 故障 + 维护窗口）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3 个 AZ 各部署 1-2 个节点（使用 Pod Topology Spread Constraints 强制分散）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;避免的陷阱&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 个 AZ 部署（单 AZ 故障可能导致仅剩 1 节点，失 Quorum）&lt;/li&gt;
&lt;li&gt;跨 Region（高延迟）同步 Raft（除非极致读多写少场景，并大幅调大 election-timeout）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="多可用区 Kubernetes 集群架构示例" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://yuansima.com/images/multi-az-k8s.jpg"&gt;&lt;/p&gt;
&lt;h3 id="22-kubernetes-中的两种-etcd-拓扑"&gt;2.2 Kubernetes 中的两种 etcd 拓扑
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Stacked etcd&lt;/strong&gt;（推荐小型/测试集群）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;etcd 与 control-plane 组件（kube-apiserver 等）运行在同一节点。&lt;/li&gt;
&lt;li&gt;部署简单（kubeadm 默认）。&lt;/li&gt;
&lt;li&gt;风险：单节点故障同时失去 etcd 成员 + 控制平面实例。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;External etcd&lt;/strong&gt;（生产关键集群推荐）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;etcd 运行在独立节点/机器上。&lt;/li&gt;
&lt;li&gt;更高隔离性与资源控制。&lt;/li&gt;
&lt;li&gt;推荐使用 dedicated 节点 + 高性能本地 SSD/NVMe。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="Kubernetes HA 集群与 etcd 部署拓扑" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://yuansima.com/images/ha-k8s-etcd.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;最佳实践建议&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;lt; 50 节点 K8s 集群：Stacked 可接受（3 control-plane 节点）。&lt;/li&gt;
&lt;li&gt;

 &lt;blockquote&gt;
 &lt;p&gt;100 节点或核心业务：External etcd（5 节点独立集群）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;始终为 etcd Pod 设置 &lt;code&gt;podAntiAffinity&lt;/code&gt; + &lt;code&gt;topologySpreadConstraints&lt;/code&gt;（maxSkew=1）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三硬件网络与基础配置要求"&gt;三、硬件、网络与基础配置要求
&lt;/h2&gt;&lt;h3 id="31-硬件推荐生产环境"&gt;3.1 硬件推荐（生产环境）
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU&lt;/strong&gt;：2~4 核以上（etcd 主要单线程处理 Raft，但 snapshot/compaction 需多核）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：4~16 GB+（视数据量，etcd 进程常驻内存 + page cache）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;磁盘&lt;/strong&gt;（最关键！）：&lt;strong&gt;NVMe SSD 或高 IOPS 云盘&lt;/strong&gt;，严禁机械硬盘或普通云盘。
&lt;ul&gt;
&lt;li&gt;WAL + snapshot 目录建议使用独立高性能卷（或至少保证低延迟 fsync）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络&lt;/strong&gt;：千兆及以上，&lt;strong&gt;低延迟&lt;/strong&gt;（同 AZ &amp;lt; 1ms，跨 AZ &amp;lt; 5-10ms 理想）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="32-关键-etcd-配置参数生产调优"&gt;3.2 关键 etcd 配置参数（生产调优）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# etcd 启动参数示例（部分关键项）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;name etcd-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;initial-advertise-peer-urls https://10.0.1.1:2380&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;listen-peer-urls https://0.0.0.0:2380&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;listen-client-urls https://0.0.0.0:2379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;advertise-client-urls https://etcd-1.example.com:2379&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;initial-cluster-token etcd-cluster-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;initial-cluster etcd-1=https://10.0.1.1:2380,etcd-2=...,etcd-3=...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;initial-cluster-state new&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;data-dir /var/lib/etcd&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;snapshot-count 10000 &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 触发 snapshot 的日志条目数（调大减少 compaction 频率）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;heartbeat-interval 100 &lt;/span&gt; &lt;span style="color:#75715e"&gt;# ms，默认 100，建议保持&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;election-timeout 1000 &lt;/span&gt; &lt;span style="color:#75715e"&gt;# ms，跨 AZ 或高延迟场景可调至 2000-5000，但会增加故障检测时间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;quota-backend-bytes 8589934592 &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 8GB，根据实际数据量调整（默认 2GB）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;max-request-bytes 1572864&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;peer-client-cert-auth true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;--&lt;span style="color:#ae81ff"&gt;client-cert-auth true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;调优要点&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;election-timeout&lt;/code&gt; 与 &lt;code&gt;heartbeat-interval&lt;/code&gt; 比例建议 &lt;strong&gt;10:1&lt;/strong&gt; 左右。&lt;/li&gt;
&lt;li&gt;启用 &lt;code&gt;--pre-vote&lt;/code&gt;（etcd 3.4+ 默认开启），大幅减少不必要选举。&lt;/li&gt;
&lt;li&gt;定期执行 &lt;code&gt;etcdctl defrag&lt;/code&gt;（或开启 auto-defrag）回收空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="四安全加固生产必做"&gt;四、安全加固（生产必做）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;全链路 TLS/mTLS&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用 &lt;code&gt;cfssl&lt;/code&gt; 或 cert-manager 生成 server/peer/client 证书。&lt;/li&gt;
&lt;li&gt;强制 &lt;code&gt;--peer-client-cert-auth&lt;/code&gt; 和 &lt;code&gt;--client-cert-auth&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;认证与授权&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;启用用户名/密码或证书认证。&lt;/li&gt;
&lt;li&gt;K8s 中使用 RBAC 限制 apiserver 对 etcd 的访问。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网络隔离&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅开放 2379（client）、2380（peer）端口。&lt;/li&gt;
&lt;li&gt;使用 NetworkPolicy 或安全组限制来源 IP。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定期轮换证书&lt;/strong&gt; + 审计日志（&lt;code&gt;--log-level=info&lt;/code&gt; + 结构化日志）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="五监控告警与可观测性"&gt;五、监控、告警与可观测性
&lt;/h2&gt;&lt;h3 id="核心-prometheus-指标"&gt;核心 Prometheus 指标
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-promql" data-lang="promql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 是否有 Leader（关键！0 表示无主，集群不可写）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;etcd_server_has_leader
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Leader 变更次数（频繁变更 = 网络/资源问题）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;rate&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;etcd_server_leader_changes_seen_total[&lt;span style="color:#e6db74"&gt;5m&lt;/span&gt;]&lt;span style="color:#f92672"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 磁盘 fsync 延迟（&amp;gt;50ms 需关注）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;histogram_quantile&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0.99&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;rate&lt;/span&gt;&lt;span style="color:#f92672"&gt;(&lt;/span&gt;etcd_disk_wal_fsync_duration_seconds_bucket[&lt;span style="color:#e6db74"&gt;5m&lt;/span&gt;]&lt;span style="color:#f92672"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 已应用 vs 已提交日志差距（lag 过大表示 follower 落后）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;etcd_server_applied_index &lt;span style="color:#f92672"&gt;-&lt;/span&gt; etcd_server_committed_index
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 后端数据库大小（接近 quota 需扩容或清理）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;etcd_mvcc_db_total_size_in_bytes &lt;span style="color:#f92672"&gt;/&lt;/span&gt; etcd_server_quota_backend_bytes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;推荐 Grafana Dashboard&lt;/strong&gt;：搜索 “etcd” 或使用 etcd 官方/社区 dashboard。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;告警规则示例&lt;/strong&gt;（Alertmanager）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;etcd_server_has_leader == 0&lt;/code&gt; 持续 30s → P0 告警&lt;/li&gt;
&lt;li&gt;Leader 变更率 &amp;gt; 1/分钟&lt;/li&gt;
&lt;li&gt;WAL fsync p99 &amp;gt; 100ms&lt;/li&gt;
&lt;li&gt;剩余 quota &amp;lt; 20%&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="六备份与灾难恢复dr"&gt;六、备份与灾难恢复（DR）
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;黄金法则&lt;/strong&gt;：&lt;strong&gt;备份只有在能成功恢复时才有价值&lt;/strong&gt;。必须定期演练恢复流程！&lt;/p&gt;
&lt;h3 id="自动化备份方案"&gt;自动化备份方案
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 每日快照脚本示例&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DATE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;date +%Y%m%d-%H%M%S&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;etcdctl snapshot save /backup/etcd-snapshot-&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;.db &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --endpoints&lt;span style="color:#f92672"&gt;=&lt;/span&gt;https://etcd-1:2379,https://etcd-2:2379,https://etcd-3:2379 &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; --cacert&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/etcd/ca.crt --cert&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/etcd/client.crt --key&lt;span style="color:#f92672"&gt;=&lt;/span&gt;/etc/etcd/client.key
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 保留最近 30 天，上传对象存储（S3/OSS）并加密&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find /backup -name &lt;span style="color:#e6db74"&gt;&amp;#34;etcd-snapshot-*.db&amp;#34;&lt;/span&gt; -mtime +30 -delete
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;aws s3 cp /backup/etcd-snapshot-&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;DATE&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;.db s3://etcd-backups/ --sse AES256
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;恢复流程&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;etcdctl snapshot restore&lt;/code&gt; 到新数据目录。&lt;/li&gt;
&lt;li&gt;更新 &lt;code&gt;--initial-cluster-state=existing&lt;/code&gt; + 新成员列表启动。&lt;/li&gt;
&lt;li&gt;极端情况使用 &lt;code&gt;--force-new-cluster&lt;/code&gt;（&lt;strong&gt;仅在最后手段使用，会丢失未同步数据&lt;/strong&gt;）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;K8s 集成&lt;/strong&gt;：使用 Velero + etcd hook，或 etcd 专用备份 Operator（社区维护版本）。&lt;/p&gt;
&lt;h2 id="七常见故障场景与处理"&gt;七、常见故障场景与处理
&lt;/h2&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;场景&lt;/th&gt;
 &lt;th&gt;现象&lt;/th&gt;
 &lt;th&gt;处理建议&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;单节点故障&lt;/td&gt;
 &lt;td&gt;自动 failover&lt;/td&gt;
 &lt;td&gt;替换节点后 &lt;code&gt;etcdctl member remove/add&lt;/code&gt;&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Leader 频繁变更&lt;/td&gt;
 &lt;td&gt;选举日志增多&lt;/td&gt;
 &lt;td&gt;检查网络延迟、超时配置、节点负载&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;网络分区&lt;/td&gt;
 &lt;td&gt;少数派只读，多数派正常&lt;/td&gt;
 &lt;td&gt;Raft 自动处理，恢复后自动同步&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;磁盘空间不足&lt;/td&gt;
 &lt;td&gt;quota exceeded / panic&lt;/td&gt;
 &lt;td&gt;扩容磁盘 + &lt;code&gt;etcdctl defrag&lt;/code&gt; + 清理旧 snapshot&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;高延迟跨 AZ&lt;/td&gt;
 &lt;td&gt;选举超时、吞吐下降&lt;/td&gt;
 &lt;td&gt;调大 election-timeout 或改用 5 节点&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;成员变更失败&lt;/td&gt;
 &lt;td&gt;集群进入不可用&lt;/td&gt;
 &lt;td&gt;按顺序 add/remove，避免同时操作多个&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;成员变更最佳实践&lt;/strong&gt;（etcd 3.4+ 支持 learner）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;etcdctl member add &amp;lt;name&amp;gt; --peer-urls=... --learner=true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;启动新节点，等待追上日志。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;etcdctl member promote &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="八kubernetes-生产部署-checklist"&gt;八、Kubernetes 生产部署 checklist
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;使用 &lt;strong&gt;kubeadm&lt;/strong&gt; 或 &lt;strong&gt;kops&lt;/strong&gt; / &lt;strong&gt;Terraform&lt;/strong&gt; 自动化。&lt;/li&gt;
&lt;li&gt;External etcd 时，etcd 节点使用独立 InstanceGroup + 专用磁盘。&lt;/li&gt;
&lt;li&gt;所有 etcd Pod 设置：
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;resources&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;requests&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cpu&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;500m&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;memory&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2Gi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;limits&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;cpu&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;memory&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;4Gi&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;启用 &lt;code&gt;PersistentVolume&lt;/code&gt; 使用高性能 StorageClass（&lt;code&gt;local&lt;/code&gt; 或 &lt;code&gt;io1&lt;/code&gt;/&lt;code&gt;gp3&lt;/code&gt; with high IOPS）。&lt;/li&gt;
&lt;li&gt;配置 &lt;code&gt;PodDisruptionBudget&lt;/code&gt; 保证至少 2 个 etcd 成员可用。&lt;/li&gt;
&lt;li&gt;升级策略：滚动升级 etcd（支持 minor 版本滚动）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="九最佳实践与避坑清单打印贴墙"&gt;九、最佳实践与避坑清单（打印贴墙）
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;永远奇数节点&lt;/strong&gt;，优先 3 或 5。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;磁盘 I/O 是第一性能瓶颈&lt;/strong&gt;，必须用 SSD/NVMe。&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;不要跨高延迟网络做同步 Raft&lt;/strong&gt;（除非特殊场景）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;证书与 TLS 必须强制开启&lt;/strong&gt;，生产环境绝不使用 &lt;code&gt;--auto-tls&lt;/code&gt; 长期。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;成员变更谨慎操作&lt;/strong&gt;，优先使用 learner 模式平滑扩容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;K8s 中优先 External etcd&lt;/strong&gt;（关键集群），或至少 5 个 control-plane 节点的 Stacked。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期执行 defrag&lt;/strong&gt; 并监控 backend size。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;升级前必备份&lt;/strong&gt;，并在测试环境验证。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="十总结与延伸阅读"&gt;十、总结与延伸阅读
&lt;/h2&gt;&lt;p&gt;Raft 的美妙之处在于它把复杂的共识问题分解为可理解的子问题，并在工程实现中提供了可预测的故障模型。只要严格遵循 Quorum、故障域隔离、I/O 优先、持续观测这几条原则，你就能构建出真正“睡得着觉”的高可用集群。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推荐阅读&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://etcd.io/docs/" target="_blank" rel="noopener"
 &gt;etcd 官方文档 - Operations Guide &amp;amp; Tuning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://raft.github.io/raft.pdf" target="_blank" rel="noopener"
 &gt;The Raft Paper&lt;/a&gt;（必读原版）&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://thesecretlivesofdata.com/raft/" target="_blank" rel="noopener"
 &gt;The Secret Lives of Data - Raft 可视化&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kubernetes 官方 HA 拓扑文档&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;本文由 Grok 生成，欢迎在 Hugo 站点直接发布。&lt;/strong&gt;&lt;br&gt;
如需配套的 Docker Compose 示例、完整 Helm values、Prometheus rules YAML 或 Terraform 模块，可在评论区留言，我可以继续补充进阶内容。&lt;/p&gt;
&lt;p&gt;祝你的 Raft 集群永远有 Leader，永远在 Quorum 内！&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;
This is a complete, advanced, production-ready Chinese article with proper Hugo front matter, Mermaid, images (using the copied ones), tables, code blocks, best practices, etc.

Now, to verify the file and perhaps list it.
&lt;/code&gt;&lt;/pre&gt;</description></item></channel></rss>