3. etcd 集群部署:集群搭建、TLS 配置、成员管理、健康检查与故障恢复
etcd 作为 Kubernetes 的控制面存储,其集群的稳定性直接决定整个集群的可用性。本节将围绕 etcd 集群的完整生命周期展开,涵盖从二进制部署、TLS 双向认证、成员动态管理到健康巡检与故障恢复的全流程操作。
3.1 集群架构与节点规划
生产环境推荐使用奇数节点(3 或 5 台)以保证 Raft 多数派可用。以下为 3 节点集群的典型规划:
| 节点角色 | 主机名 | IP 地址 | 数据目录 | 初始集群状态 |
|---|---|---|---|---|
| etcd-0 | etcd-0.k8s.local | 10.0.1.10 | /var/lib/etcd | new |
| etcd-1 | etcd-1.k8s.local | 10.0.1.11 | /var/lib/etcd | new |
| etcd-2 | etcd-2.k8s.local | 10.0.1.12 | /var/lib/etcd | new |
选型建议: 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 单节点故障恢复
- 停止故障节点进程。
- 清理数据目录(
rm -rf /var/lib/etcd/member)。 - 使用
etcdctl member remove移除故障成员。 - 使用
etcdctl member add重新添加成员,获取新节点启动参数。 - 以
--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 配置、成员管理到故障恢复的完整流程:
3.7 关键告警指标参考
基于 Prometheus 的 etcd 告警规则应覆盖以下核心维度:
| 告警名称 | 指标表达式 | 阈值 | 严重级别 |
|---|---|---|---|
| etcd 领导者变更 | increase(etcd_server_leader_changes_seen_total[5m]) | > 3 | Critical |
| etcd 数据库空间 | etcd_mvcc_db_total_size_in_bytes / etcd_server_quota_backend_bytes | > 0.8 | Warning |
| etcd 节点宕机 | up{job="etcd"} == 0 | 持续 30s | Critical |
| etcd 请求延迟 | histogram_quantile(0.99, rate(etcd_request_duration_seconds_bucket[5m])) | > 1s | Warning |
| etcd 磁盘 fsync 延迟 | histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket[5m])) | > 0.5s | Critical |
生产建议: 定期执行
etcdctl defrag 压缩碎片空间;配置 WAL 与数据目录分离至不同磁盘;使用 SSD 并确保磁盘 IOPS 满足 etcd 写入需求。etcd 的稳定性是 Kubernetes 集群稳定的基石,务必在部署阶段就做好 TLS、监控与备份策略。