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