3. etcd 集群部署最佳实践

生产级 etcd 集群的部署质量直接决定 Kubernetes 控制面的稳定性。本章从节点规划、TLS 证书配置、启动参数调优到健康检查与监控指标,给出经过大规模验证的最佳实践。

3.1 节点规划与拓扑设计

etcd 使用 Raft 协议,集群规模通常为奇数节点。下表列出常见规模的选择依据:

节点数最大容忍故障适用场景推荐硬件
31开发/测试、小型生产2C / 4G / SSD 50GB
52标准生产集群4C / 8G / SSD 100GB
73超大规模/跨地域部署8C / 16G / SSD 200GB
节点规划要点:
  • etcd 节点应部署在独立主机或专用实例上,避免与高负载应用混部。
  • 所有节点位于同一数据中心内,网络延迟 ≤ 10ms;跨 AZ 部署时确保延迟 ≤ 20ms。
  • 磁盘必须使用 NVMe SSD 或同等性能块存储,禁用 NFS/CIFS 等网络文件系统。
etcd 集群拓扑与 Raft 角色 etcd 集群拓扑与 Raft 角色 etcd-0 Leader etcd-1 Follower etcd-2 Follower 客户端 (kube-apiserver) Leader 负责处理所有写请求,Follower 同步日志并转发读请求

3.2 TLS 证书配置

etcd 集群必须启用双向 TLS(mTLS)以保障通信安全。证书体系包含三类密钥对:

  • CA 证书:自建内部 CA,用于签发所有组件证书。
  • 服务端证书:每个 etcd 节点一份,包含节点 IP 和 DNS SAN。
  • 客户端证书:etcdctl、kube-apiserver 等客户端使用。

证书生成步骤(cfssl 示例)

# 1. 初始化 CA
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

# 2. 生成 etcd 服务端证书(含多个 SAN)
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -hostname="etcd-0,etcd-1,etcd-2,10.0.1.10,10.0.1.11,10.0.1.12,127.0.0.1" \
  -profile=server \
  etcd-csr.json | cfssljson -bare etcd-server

# 3. 生成客户端证书
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=client \
  etcd-client-csr.json | cfssljson -bare etcd-client
证书配置避坑:
  • 所有节点必须使用相同的 CA 签发证书,否则集群无法建立成员间信任。
  • 服务端证书的 SAN 必须包含节点的所有访问地址(IP + 主机名),遗漏会导致 TLS 握手失败。
  • 证书有效期建议 ≤ 3 年,并纳入证书轮换自动化流程。

3.3 集群启动参数调优

etcd 启动参数直接影响集群的性能与可靠性。以下为生产级配置模板:

# /etc/etcd/etcd.conf
ETCD_NAME=etcd-0
ETCD_DATA_DIR=/var/lib/etcd
ETCD_LISTEN_PEER_URLS=https://0.0.0.0:2380
ETCD_LISTEN_CLIENT_URLS=https://0.0.0.0:2379
ETCD_ADVERTISE_CLIENT_URLS=https://10.0.1.10:2379
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://10.0.1.10:2380
ETCD_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_INITIAL_CLUSTER_STATE=new
ETCD_INITIAL_CLUSTER_=etcd-cluster-prod

# TLS 配置
ETCD_CERT_FILE=/etc/etcd/pki/etcd-server.pem
ETCD_KEY_FILE=/etc/etcd/pki/etcd-server-key.pem
ETCD_CLIENT_CERT_AUTH=true
ETCD_TRUSTED_CA_FILE=/etc/etcd/pki/ca.pem
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd-server.pem
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd-server-key.pem
ETCD_PEER_CLIENT_CERT_AUTH=true
ETCD_PEER_TRUSTED_CA_FILE=/etc/etcd/pki/ca.pem

# 性能调优
ETCD_QUOTA_BACKEND_BYTES=8589934592
ETCD_MAX_REQUEST_BYTES=1572864
ETCD_AUTO_COMPACTION_RETENTION=8
ETCD_SNAPSHOT_COUNT=100000
ETCD_HEARTBEAT_INTERVAL=100
ETCD_ELECTION_TIMEOUT=1000

关键参数说明

参数推荐值说明
quota-backend-bytes8GB数据库空间配额,超过后集群进入只读模式
auto-compaction-retention8历史版本保留小时数,避免存储膨胀
snapshot-count100000触发快照的写操作数,平衡恢复速度与 I/O 开销
heartbeat-interval100msLeader 心跳间隔,低延迟网络可设为 50ms
election-timeout1000ms选举超时,建议为 heartbeat-interval 的 10 倍
etcd 启动参数调优决策树 etcd 启动参数调优决策树 集群规模与负载评估 磁盘 I/O 与网络延迟 调整心跳与选举超时 设置配额与压缩策略

3.4 健康检查与监控指标

etcd 提供多种健康检查方式,结合 Prometheus 指标可实现全方位监控。

健康检查命令

# 端点健康检查(需客户端证书)
etcdctl --endpoints=https://10.0.1.10:2379 \
  --cacert=/etc/etcd/pki/ca.pem \
  --cert=/etc/etcd/pki/etcd-client.pem \
  --key=/etc/etcd/pki/etcd-client-key.pem \
  endpoint health --cluster

# 成员列表
etcdctl member list -w table

# 端点状态(含 Leader 信息)
etcdctl endpoint status -w table --cluster

核心监控指标

指标名称类型告警阈值说明
etcd_server_has_leaderGauge0 → Critical集群是否拥有 Leader
etcd_server_leader_changes_seen_totalCounter>3次/10min → WarningLeader 频繁切换,通常由网络抖动或磁盘延迟引起
etcd_disk_wal_fsync_duration_secondsHistogramp99 > 100ms → WarningWAL 刷盘延迟,直接影响写入性能
etcd_network_client_grpc_sent_bytes_totalCounter突降 → Warning客户端流量异常下降,可能为网络分区
etcd_server_proposals_failed_totalCounter>0 → CriticalRaft 提案失败,集群可能不可用
etcd_mvcc_db_total_size_in_bytesGauge> quota 80% → Warning数据库大小接近配额上限
监控集成建议:
  • 使用 Prometheus + Grafana 采集上述指标,导入官方 etcd 仪表盘模板。
  • 设置 etcd_server_has_leader == 0 为 P0 告警,立即响应。
  • 每 30 秒执行一次 endpoint health 检查,结合告警通知(钉钉/邮件/PagerDuty)。

3.5 部署验证清单

集群启动后,按以下清单逐项验证:

  1. 成员状态:etcdctl member list -w table 输出所有节点且均为 started 状态。
  2. Leader 选举:etcdctl endpoint status -w table 确认存在唯一 Leader。
  3. TLS 连通性:使用 curl 测试带证书访问 https://节点IP:2379/version。
  4. 读写测试:etcdctl put testkey testvalue 与 etcdctl get testkey 正常返回。
  5. 故障模拟:停止一个 etcd 进程,确认集群仍可正常读写;恢复后自动加入。
  6. 性能基线:使用 etcdctl check perf 记录首次性能数据,作为后续压测对比基准。