3. etcd 集群部署:集群搭建、TLS 配置、成员管理、健康检查与故障恢复

etcd 作为 Kubernetes 的控制面存储,其集群的稳定性直接决定整个集群的可用性。本节将围绕 etcd 集群的完整生命周期展开,涵盖从二进制部署、TLS 双向认证、成员动态管理到健康巡检与故障恢复的全流程操作。

3.1 集群架构与节点规划

生产环境推荐使用奇数节点(3 或 5 台)以保证 Raft 多数派可用。以下为 3 节点集群的典型规划:

节点角色主机名IP 地址数据目录初始集群状态
etcd-0etcd-0.k8s.local10.0.1.10/var/lib/etcdnew
etcd-1etcd-1.k8s.local10.0.1.11/var/lib/etcdnew
etcd-2etcd-2.k8s.local10.0.1.12/var/lib/etcdnew
选型建议: 3 节点集群容忍 1 节点故障;5 节点集群容忍 2 节点故障。超过 7 节点会显著增加 Raft 日志复制开销,非必要不推荐。

3.2 二进制部署与 TLS 配置

etcd 支持多种部署方式,生产环境推荐使用官方二进制或容器镜像。以下为基于二进制的手动部署步骤,TLS 使用自签名 CA 实现双向认证。

3.2.1 生成 TLS 证书

使用 cfssl 工具生成 CA 证书、服务端证书及客户端证书。关键步骤:

# 1. 生成 CA 配置文件与证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

# 2. 生成 etcd 服务端证书(需包含所有节点 IP 与域名)
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=server \
  server-csr.json | cfssljson -bare server

# 3. 生成客户端证书(用于 etcdctl 与 Kubernetes API Server 连接)
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=client \
  client-csr.json | cfssljson -bare client
证书注意事项: 服务端证书的 SAN(Subject Alternative Name)必须包含所有 etcd 节点的 IP 地址、主机名以及集群内部 DNS 名称(如 *.etcd.kube-system.svc.cluster.local),否则 TLS 握手会失败。

3.2.2 启动 etcd 节点

以下为 etcd-0 节点的启动命令示例,其他节点仅需修改 --name、--initial-advertise-peer-urls、--listen-peer-urls 等参数:

etcd \
  --name etcd-0 \
  --data-dir /var/lib/etcd \
  --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 \
  --initial-cluster-state new \
  --client-cert-auth \
  --trusted-ca-file=/etc/etcd/ssl/ca.pem \
  --cert-file=/etc/etcd/ssl/server.pem \
  --key-file=/etc/etcd/ssl/server-key.pem \
  --peer-client-cert-auth \
  --peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \
  --peer-cert-file=/etc/etcd/ssl/server.pem \
  --peer-key-file=/etc/etcd/ssl/server-key.pem

3.3 成员管理

etcd 支持运行时动态添加、移除成员,无需重启整个集群。以下为常用操作:

操作命令示例说明
列出成员etcdctl member list --write-out=table查看当前集群所有成员 ID、名称、地址
添加成员etcdctl member add etcd-3 --peer-urls=https://10.0.1.13:2380返回新节点所需的 --initial-cluster-state=existing 参数
移除成员etcdctl member remove <member-id>从集群中永久移除故障或退役节点
更新成员etcdctl member update <member-id> --peer-urls=https://10.0.1.14:2380修改已有成员的 peer URL
关键原则: 添加成员时,新节点必须使用 --initial-cluster-state=existing 启动,且 --initial-cluster 参数需包含所有现有成员地址。移除成员前,请确保该节点已停止服务,且集群剩余节点仍满足多数派条件。

3.4 健康检查

etcd 提供多种健康检查方式,用于监控告警与自动化运维:

  • 端点健康检查: etcdctl endpoint health --cluster 返回每个节点的健康状态与延迟。
  • 端点状态检查: etcdctl endpoint status --cluster --write-out=table 显示 Raft 角色、DB 大小、版本等。
  • Prometheus 指标: 通过 /metrics 端点暴露,关键指标包括 etcd_server_leader_changes_seen_total、etcd_network_client_grpc_sent_bytes_total、etcd_mvcc_db_total_size_in_bytes。
  • Kubernetes 就绪探针: 使用 etcdctl endpoint health 作为 livenessProbe 与 readinessProbe 的命令。
# 健康检查示例
etcdctl --endpoints=https://10.0.1.10:2379,https://10.0.1.11:2379,https://10.0.1.12:2379 \
  --cacert=/etc/etcd/ssl/ca.pem \
  --cert=/etc/etcd/ssl/client.pem \
  --key=/etc/etcd/ssl/client-key.pem \
  endpoint health --cluster

3.5 故障恢复

etcd 故障场景主要分为单节点故障与多数派故障。以下为两种典型恢复流程:

3.5.1 单节点故障恢复

  1. 停止故障节点进程。
  2. 清理数据目录(rm -rf /var/lib/etcd/member)。
  3. 使用 etcdctl member remove 移除故障成员。
  4. 使用 etcdctl member add 重新添加成员,获取新节点启动参数。
  5. 以 --initial-cluster-state=existing 启动新节点。

3.5.2 多数派故障恢复(数据抢救)

当超过半数节点永久故障时,需从剩余健康节点中恢复数据:

# 1. 在健康节点上导出快照
etcdctl snapshot save /backup/snapshot.db

# 2. 停止所有 etcd 进程,清理所有节点数据目录

# 3. 在单节点上恢复快照
etcdctl snapshot restore /backup/snapshot.db \
  --name etcd-0 \
  --initial-cluster etcd-0=https://10.0.1.10:2380 \
  --initial-cluster- etcd-cluster-restore \
  --initial-advertise-peer-urls https://10.0.1.10:2380 \
  --data-dir /var/lib/etcd

# 4. 启动该节点,验证数据完整性

# 5. 使用 member add 逐步添加其他节点
恢复风险提示: 多数派故障恢复会丢失故障节点之后的所有写入数据。务必在恢复前备份快照,并确认业务可以接受该时间点的数据状态。恢复后的集群 --initial-cluster- 必须使用新值,避免与旧集群混淆。

3.6 etcd 集群部署与故障恢复流程总览

下图展示了从集群初始化、TLS 配置、成员管理到故障恢复的完整流程:

etcd 集群部署与故障恢复流程 etcd 集群部署与故障恢复流程 1. 二进制部署 + TLS 配置 2. 集群初始化(new 状态) 3. 成员管理(增删改查) 4. 健康检查(endpoint health) 5. 监控告警(Prometheus 指标) 6. 单节点故障恢复 7. 多数派故障恢复(快照) 8. 恢复后验证(健康检查) 说明: 单节点故障可通过 member remove/add 在线恢复;多数派故障需从快照恢复,会丢失部分数据,务必提前配置定期快照策略。

3.7 关键告警指标参考

基于 Prometheus 的 etcd 告警规则应覆盖以下核心维度:

告警名称指标表达式阈值严重级别
etcd 领导者变更increase(etcd_server_leader_changes_seen_total[5m])> 3Critical
etcd 数据库空间etcd_mvcc_db_total_size_in_bytes / etcd_server_quota_backend_bytes> 0.8Warning
etcd 节点宕机up{job="etcd"} == 0持续 30sCritical
etcd 请求延迟histogram_quantile(0.99, rate(etcd_request_duration_seconds_bucket[5m]))> 1sWarning
etcd 磁盘 fsync 延迟histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m]))> 0.5sCritical
生产建议: 定期执行 etcdctl defrag 压缩碎片空间;配置 WAL 与数据目录分离至不同磁盘;使用 SSD 并确保磁盘 IOPS 满足 etcd 写入需求。etcd 的稳定性是 Kubernetes 集群稳定的基石,务必在部署阶段就做好 TLS、监控与备份策略。