2. etcd 集群部署策略:节点规划、网络拓扑、TLS 配置、集群初始化与成员管理
etcd 作为 Kubernetes 控制面的核心数据存储,其部署策略直接决定集群的可用性、一致性与安全性。本节从节点规划、网络拓扑、TLS 配置、集群初始化与成员管理四个维度,给出生产级部署的标准化方案与避坑指南。
2.1 节点规划:奇数节点与故障域隔离
| 集群规模 | 节点数 | 最大容忍故障 | 适用场景 |
|---|---|---|---|
| 最小生产 | 3 | 1 | 开发/测试、边缘集群 |
| 标准生产 | 5 | 2 | 中小规模生产集群 |
| 大规模生产 | 7 | 3 | 超大规模、跨可用区部署 |
核心原则:始终使用奇数节点,避免脑裂场景下出现平票(split-brain tie)。5 节点集群比 3 节点集群多容忍 1 个故障,但写入延迟增加约 10-15%,需根据业务 SLA 权衡。
故障域隔离策略:
- 物理机/VM 级别:每个 etcd 实例部署在不同宿主机,避免单机故障导致多数节点丢失。
- 机架/交换机级别:跨机架部署,防止 ToR 交换机故障导致集群失联。
- 可用区(AZ)级别:跨 AZ 部署时,确保每个 AZ 内节点数 ≤ 总节点数的一半(如 5 节点:2-2-1 分布),避免单个 AZ 故障导致仲裁丢失。
2.2 网络拓扑与延迟约束
etcd 对网络延迟高度敏感,Raft 心跳与日志复制依赖稳定低延迟的 TCP 连接。
| 网络指标 | 推荐值 | 警告阈值 | 影响 |
|---|---|---|---|
| 节点间 RTT | < 10ms | > 50ms | 心跳超时、Leader 频繁选举 |
| 带宽 | > 1 Gbps | < 100 Mbps | 快照传输阻塞、写入延迟飙升 |
| 丢包率 | < 0.01% | > 0.1% | Raft 日志重试、吞吐量下降 |
重要:etcd 集群节点之间应使用独立的高带宽低延迟网络(如 Kubernetes 的 Node Network,而非 Pod Network),避免与业务流量争抢带宽。跨 AZ 部署时,务必实测 AZ 间 RTT,若超过 20ms 建议使用 5 节点并调大
--heartbeat-interval(默认 100ms)至 200-300ms。
2.3 TLS 配置:双向认证与证书体系
生产环境必须启用 etcd 的 TLS 双向认证(mTLS),防止中间人攻击与未授权访问。
证书体系结构:
- CA 证书(ca.crt):自建内部 CA,用于签发所有组件证书,有效期建议 5-10 年。
- 服务端证书(server.crt / server.key):用于 etcd 节点间通信,CN 必须包含节点 IP 或 DNS 名称。
- 客户端证书(client.crt / client.key):用于 etcdctl、Kubernetes API Server 等客户端访问。
- 对等证书(peer.crt / peer.key):用于 etcd 节点之间的 Raft 通信,CN 需匹配每个节点的 hostname。
| 证书类型 | 用途 | CN 示例 | 有效期建议 |
|---|---|---|---|
| CA | 签发所有证书 | etcd-ca | 5-10 年 |
| Server | 客户端→etcd 加密 | etcd-server | 1-2 年 |
| Peer | etcd 节点间通信 | etcd-0.example.com | 1-2 年 |
| Client | API Server 访问 etcd | kube-apiserver | 1-2 年 |
最佳实践:使用
cfssl 或 openssl 生成证书时,务必在 server 证书的 SAN(Subject Alternative Name)中同时加入节点 IP、DNS 名称和 127.0.0.1,避免后续 IP 变更导致证书不可用。证书轮换前需确认所有客户端已加载新 CA 证书,否则会导致连接中断。
2.4 集群初始化:静态配置与发现机制
etcd 集群初始化支持两种方式:静态配置(适用于已知节点 IP 的固定集群)和 发现服务(适用于动态环境)。
静态配置示例(5 节点):
# 节点 etcd-0 启动参数
etcd \
--name etcd-0 \
--initial-advertise-peer-urls https://10.0.1.10:2380 \
--listen-peer-urls https://0.0.0.0:2380 \
--advertise-client-urls https://10.0.1.10:2379 \
--listen-client-urls https://0.0.0.0:2379 \
--initial-cluster- etcd-cluster-1 \
--initial-cluster etcd-0=https://10.0.1.10:2380,etcd-1=https://10.0.1.11:2380,etcd-2=https://10.0.1.12:2380,etcd-3=https://10.0.1.13:2380,etcd-4=https://10.0.1.14:2380 \
--initial-cluster-state new \
--peer-cert-file=/etc/etcd/pki/peer.crt \
--peer-key-file=/etc/etcd/pki/peer.key \
--peer-trusted-ca-file=/etc/etcd/pki/ca.crt \
--peer-client-cert-auth=true \
--cert-file=/etc/etcd/pki/server.crt \
--key-file=/etc/etcd/pki/server.key \
--trusted-ca-file=/etc/etcd/pki/ca.crt \
--client-cert-auth=true
关键参数说明:
--initial-cluster-state new:首次初始化必须为new,后续重启或扩容时改为existing。--initial-cluster-:同一集群所有节点必须一致,用于防止不同集群的节点误加入。--peer-client-cert-auth=true:启用对等通信的 mTLS,生产环境必须开启。
2.5 成员管理:添加、移除与迁移
etcd 成员管理通过 etcdctl member 命令操作,所有变更必须遵循 Raft 一致性协议。
成员管理操作清单:
| 操作 | 命令示例 | 注意事项 |
|---|---|---|
| 列出成员 | etcdctl member list --write-out=table |
确认所有节点状态为 started |
| 添加成员 | etcdctl member add etcd-5 --peer-urls=https://10.0.1.15:2380 |
添加后需在新节点上以 --initial-cluster-state existing 启动 |
| 移除成员 | etcdctl member remove <member-id> |
先停止目标节点 etcd 进程,再执行移除;移除后需清理数据目录 |
| 更新成员 | etcdctl member update <member-id> --peer-urls=https://10.0.2.10:2380 |
用于节点 IP 变更场景,需确保新 URL 可达 |
高危操作:切勿同时移除多个成员导致集群失去仲裁。例如 5 节点集群最多同时容忍 2 个节点故障,若一次性移除 3 个节点,集群将无法选举 Leader,数据不可读写。正确的做法是:先添加新节点,待数据同步完成后,再逐个移除旧节点。
2.6 部署策略检查清单
生产上线前逐项确认:
- 节点数为奇数(3/5/7),且跨故障域分布。
- 节点间 RTT < 10ms,带宽 > 1 Gbps,丢包率 < 0.01%。
- 所有 etcd 节点已启用 mTLS,证书 SAN 包含 IP 和 DNS。
--initial-cluster-state首次为new,后续扩容为existing。- 数据目录使用独立 SSD 或高性能云盘,IOPS > 1000。
- 已配置定期快照备份(默认每 30 分钟自动创建快照)。
- 成员变更操作已制定回滚方案,避免误操作导致集群不可用。