3. etcd 集群部署最佳实践
生产级 etcd 集群的部署质量直接决定 Kubernetes 控制面的稳定性。本章从节点规划、TLS 证书配置、启动参数调优到健康检查与监控指标,给出经过大规模验证的最佳实践。
3.1 节点规划与拓扑设计
etcd 使用 Raft 协议,集群规模通常为奇数节点。下表列出常见规模的选择依据:
| 节点数 | 最大容忍故障 | 适用场景 | 推荐硬件 |
|---|---|---|---|
| 3 | 1 | 开发/测试、小型生产 | 2C / 4G / SSD 50GB |
| 5 | 2 | 标准生产集群 | 4C / 8G / SSD 100GB |
| 7 | 3 | 超大规模/跨地域部署 | 8C / 16G / SSD 200GB |
节点规划要点:
- etcd 节点应部署在独立主机或专用实例上,避免与高负载应用混部。
- 所有节点位于同一数据中心内,网络延迟 ≤ 10ms;跨 AZ 部署时确保延迟 ≤ 20ms。
- 磁盘必须使用 NVMe SSD 或同等性能块存储,禁用 NFS/CIFS 等网络文件系统。
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-bytes | 8GB | 数据库空间配额,超过后集群进入只读模式 |
| auto-compaction-retention | 8 | 历史版本保留小时数,避免存储膨胀 |
| snapshot-count | 100000 | 触发快照的写操作数,平衡恢复速度与 I/O 开销 |
| heartbeat-interval | 100ms | Leader 心跳间隔,低延迟网络可设为 50ms |
| election-timeout | 1000ms | 选举超时,建议为 heartbeat-interval 的 10 倍 |
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_leader | Gauge | 0 → Critical | 集群是否拥有 Leader |
| etcd_server_leader_changes_seen_total | Counter | >3次/10min → Warning | Leader 频繁切换,通常由网络抖动或磁盘延迟引起 |
| etcd_disk_wal_fsync_duration_seconds | Histogram | p99 > 100ms → Warning | WAL 刷盘延迟,直接影响写入性能 |
| etcd_network_client_grpc_sent_bytes_total | Counter | 突降 → Warning | 客户端流量异常下降,可能为网络分区 |
| etcd_server_proposals_failed_total | Counter | >0 → Critical | Raft 提案失败,集群可能不可用 |
| etcd_mvcc_db_total_size_in_bytes | Gauge | > quota 80% → Warning | 数据库大小接近配额上限 |
监控集成建议:
- 使用 Prometheus + Grafana 采集上述指标,导入官方 etcd 仪表盘模板。
- 设置
etcd_server_has_leader == 0为 P0 告警,立即响应。 - 每 30 秒执行一次
endpoint health检查,结合告警通知(钉钉/邮件/PagerDuty)。
3.5 部署验证清单
集群启动后,按以下清单逐项验证:
- 成员状态:
etcdctl member list -w table输出所有节点且均为 started 状态。 - Leader 选举:
etcdctl endpoint status -w table确认存在唯一 Leader。 - TLS 连通性:使用 curl 测试带证书访问
https://节点IP:2379/version。 - 读写测试:
etcdctl put testkey testvalue与etcdctl get testkey正常返回。 - 故障模拟:停止一个 etcd 进程,确认集群仍可正常读写;恢复后自动加入。
- 性能基线:使用
etcdctl check perf记录首次性能数据,作为后续压测对比基准。