4. etcd 集群部署与配置:生产级高可用集群实战

本章演示如何从零部署一个生产级高可用 etcd 集群,涵盖 TLS 双向认证、成员动态管理、定期快照与灾难恢复策略。所有操作均面向 3 节点或 5 节点控制面,确保在任意单节点故障时集群仍可正常读写。

4.1 集群拓扑与节点规划

生产环境推荐使用 3 节点奇数成员,避免脑裂。以下为本次部署的节点信息:

节点名称 IP 地址 初始角色 数据目录
etcd-1 10.0.1.11 member /var/lib/etcd
etcd-2 10.0.1.12 member /var/lib/etcd
etcd-3 10.0.1.13 member /var/lib/etcd
关键原则:集群成员数必须为奇数(3/5/7)。偶数节点在网络分区时无法形成多数派,导致写入不可用。

4.2 TLS 证书体系配置

etcd 生产部署必须启用 TLS 双向认证(mTLS),防止中间人攻击和未授权访问。证书体系包含三类密钥:

  • CA 根证书(ca.pem / ca-key.pem):签发所有组件证书,离线保存。
  • 服务端证书(server.pem / server-key.pem):用于 etcd 节点间 peer 通信和客户端 server 端口。
  • 客户端证书(client.pem / client-key.pem):用于 etcdctl、kube-apiserver 等客户端认证。

使用 cfssl 工具生成证书的简化流程:

# 1. 生成 CA 配置文件
cat > ca-config.json <<EOF
{
  "signing": {
    "default": { "expiry": "87600h" },
    "profiles": {
      "server": { "usages": ["signing","key encipherment","server auth"] },
      "client": { "usages": ["signing","key encipherment","client auth"] },
      "peer":   { "usages": ["signing","key encipherment","server auth","client auth"] }
    }
  }
}
EOF

# 2. 生成 CA 证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

# 3. 为每个节点生成 peer 证书(含 SAN)
cfssl gencert \
  -ca=ca.pem -ca-key=ca-key.pem \
  -config=ca-config.json -profile=peer \
  -hostname="etcd-1,10.0.1.11,127.0.0.1" \
  etcd-peer-csr.json | cfssljson -bare etcd-1-peer

# 4. 生成客户端证书
cfssl gencert \
  -ca=ca.pem -ca-key=ca-key.pem \
  -config=ca-config.json -profile=client \
  etcd-client-csr.json | cfssljson -bare client
安全警告:CA 私钥(ca-key.pem)必须离线存储,禁止随集群分发。证书 SAN 必须包含节点所有可用 IP 和主机名,否则 TLS 握手会失败。

4.3 集群部署与启动配置

以下为 etcd-1 节点的 systemd unit 配置示例,其他节点仅修改 --name、--initial-advertise-peer-urls 和 --listen-peer-urls 中的 IP 地址。

[Unit]
Description=etcd key-value store
Documentation=https://github.com/etcd-io/etcd
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
  --name etcd-1 \
  --data-dir /var/lib/etcd \
  --initial-advertise-peer-urls https://10.0.1.11:2380 \
  --listen-peer-urls https://10.0.1.11:2380 \
  --advertise-client-urls https://10.0.1.11:2379 \
  --listen-client-urls https://10.0.1.11:2379,https://127.0.0.1:2379 \
  --initial-cluster- etcd-cluster-1 \
  --initial-cluster etcd-1=https://10.0.1.11:2380,etcd-2=https://10.0.1.12:2380,etcd-3=https://10.0.1.13:2380 \
  --initial-cluster-state new \
  --client-cert-auth \
  --trusted-ca-file /etc/etcd/ssl/ca.pem \
  --cert-file /etc/etcd/ssl/etcd-1-peer.pem \
  --key-file /etc/etcd/ssl/etcd-1-peer-key.pem \
  --peer-client-cert-auth \
  --peer-trusted-ca-file /etc/etcd/ssl/ca.pem \
  --peer-cert-file /etc/etcd/ssl/etcd-1-peer.pem \
  --peer-key-file /etc/etcd/ssl/etcd-1-peer-key.pem

Restart=always
RestartSec=10s
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
启动顺序:三个节点必须同时启动或在短时间内依次启动。第一个节点启动后会等待其他节点加入,直到形成多数派(quorum)后集群才可用。

4.4 成员管理与健康检查

集群启动后,使用 etcdctl 进行成员管理和健康检查:

# 设置客户端证书环境变量
export ETCDCTL_ENDPOINTS=https://10.0.1.11:2379,https://10.0.1.12:2379,https://10.0.1.13:2379
export ETCDCTL_CACERT=/etc/etcd/ssl/ca.pem
export ETCDCTL_CERT=/etc/etcd/ssl/client.pem
export ETCDCTL_KEY=/etc/etcd/ssl/client-key.pem

# 查看成员列表
etcdctl member list -w table

# 查看集群健康状态
etcdctl endpoint health -w table

# 动态添加新成员(先注册再启动)
etcdctl member add etcd-4 --peer-urls=https://10.0.1.14:2380

# 移除故障成员
etcdctl member remove <member-id>

健康检查输出示例:

端点 健康状态 延迟 错误
https://10.0.1.11:2379 true 2.3ms -
https://10.0.1.12:2379 true 1.8ms -
https://10.0.1.13:2379 true 3.1ms -

4.5 快照与恢复策略

etcd 快照是灾难恢复的核心手段。生产环境应启用定时快照并异地存储。

4.5.1 创建快照

# 手动创建快照
etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d%H%M%S).db

# 验证快照文件完整性
etcdctl snapshot status /backup/etcd-snapshot-20250321143000.db -w table

4.5.2 从快照恢复单节点

# 停止 etcd 服务
systemctl stop etcd

# 清空数据目录(谨慎操作)
rm -rf /var/lib/etcd/*

# 使用快照恢复数据
etcdctl snapshot restore /backup/etcd-snapshot-20250321143000.db \
  --name etcd-1 \
  --initial-cluster etcd-1=https://10.0.1.11:2380 \
  --initial-cluster- etcd-cluster-restore \
  --initial-advertise-peer-urls https://10.0.1.11:2380 \
  --data-dir /var/lib/etcd

# 启动 etcd 服务
systemctl start etcd
恢复注意事项:
  • 恢复时必须使用新的 --initial-cluster-,避免与旧集群冲突。
  • 恢复后的集群是一个全新的集群,原有成员信息丢失,需要重新添加其他节点。
  • 快照文件必须与 etcd 版本匹配,跨版本恢复可能导致数据损坏。

4.6 集群部署架构总览

下图展示了 3 节点 etcd 集群的完整部署架构,包括 TLS 证书分发、成员间 peer 通信以及客户端访问路径:

生产级 etcd 3 节点集群部署架构 etcd-1 10.0.1.11 peer:2380 client:2379 /var/lib/etcd etcd-2 10.0.1.12 peer:2380 client:2379 /var/lib/etcd etcd-3 10.0.1.13 peer:2380 client:2379 /var/lib/etcd TLS 双向认证证书体系 CA 根证书 (ca.pem) 服务端/Peer 证书 (server.pem) 客户端证书 (client.pem) 所有节点间通信使用 mTLS,端口 2380/2379 强制证书验证 kube-apiserver etcdctl 定时快照 → 异地存储 /backup/

4.7 生产部署检查清单

以下清单总结了生产级 etcd 集群部署的关键检查项:

类别 检查项 推荐配置
网络 节点间延迟 < 10ms,建议同机房部署
存储 磁盘 IOPS SSD,顺序写入 > 100MB/s
安全 TLS 双向认证 必须启用,证书有效期 < 2 年
备份 快照频率 每 30 分钟自动快照,保留 48 小时
监控 健康检查 Prometheus + etcd 指标采集
资源 内存/CPU 4GB RAM / 2 核以上
最佳实践:在压测沙盘环境中,建议先使用单节点部署验证 TLS 证书和快照恢复流程,再扩展到 3 节点集群。每次成员变更后,立即执行一次完整快照。