3. etcd 集群部署:静态部署、动态发现、TLS 安全配置、多节点集群搭建实战

etcd 集群的部署方式直接影响生产环境的可用性与运维效率。本章围绕三种核心部署模式——静态部署、动态发现、TLS 安全配置——展开,并通过多节点集群搭建实战,帮助学员掌握从单机测试到生产级高可用集群的完整链路。

3.1 部署模式对比与选型

部署模式 适用场景 优点 缺点
静态部署 已知固定 IP 的私有云、物理机环境 配置简单,无外部依赖,启动最快 节点变更需手动修改配置并重启
动态发现(DNS SRV) DNS 管理完善的云原生环境 节点自动注册,扩缩容灵活 依赖 DNS 记录准确性与 TTL 控制
动态发现(etcd Discovery) 临时集群、CI/CD 测试环境 无需预先知道所有节点地址 依赖公共或自建 discovery 服务
选型建议:生产环境优先选择静态部署 + TLS,控制面最清晰;若集群规模频繁变动,可考虑 DNS SRV 模式,但务必配合严格的 DNS 记录审计。

3.2 静态部署:三节点集群搭建

静态部署要求每个节点在启动时通过 --initial-cluster 参数指定所有同伴的地址。以下为三节点集群的配置示例。

3.2.1 节点规划

节点名称 IP 地址 Client 端口 Peer 端口
etcd-1 192.168.1.11 2379 2380
etcd-2 192.168.1.12 2379 2380
etcd-3 192.168.1.13 2379 2380

3.2.2 节点 etcd-1 启动命令

etcd \
  --name etcd-1 \
  --initial-advertise-peer-urls http://192.168.1.11:2380 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --advertise-client-urls http://192.168.1.11:2379 \
  --listen-client-urls http://0.0.0.0:2379 \
  --initial-cluster- etcd-cluster-1 \
  --initial-cluster etcd-1=http://192.168.1.11:2380,etcd-2=http://192.168.1.12:2380,etcd-3=http://192.168.1.13:2380 \
  --initial-cluster-state new

3.2.3 节点 etcd-2 与 etcd-3 启动命令

仅需修改 --name、--initial-advertise-peer-urls、--advertise-client-urls 为对应节点 IP,其余参数保持一致。

关键参数说明:
  • --initial-cluster-state new:首次启动必须设为 new;若集群已存在,需改为 existing。
  • --initial-cluster-:同一集群所有节点必须使用相同 ,防止跨集群误加入。

3.3 动态发现:DNS SRV 模式

DNS SRV 模式通过 DNS 记录自动发现同伴节点,适合节点 IP 不固定的场景。

3.3.1 DNS 记录配置

在 DNS 管理域中添加以下 SRV 记录:

_etcd-server._tcp.example.com.  IN  SRV  0 10 2380 etcd-1.example.com.
_etcd-server._tcp.example.com.  IN  SRV  0 10 2380 etcd-2.example.com.
_etcd-server._tcp.example.com.  IN  SRV  0 10 2380 etcd-3.example.com.

3.3.2 节点启动命令

etcd \
  --name etcd-1 \
  --discovery-srv example.com \
  --initial-advertise-peer-urls http://etcd-1.example.com:2380 \
  --initial-cluster-state new
注意:DNS SRV 模式要求所有节点的 --initial-advertise-peer-urls 中的主机名必须与 SRV 记录中的目标主机名一致,否则发现失败。

3.4 TLS 安全配置

生产环境必须启用 TLS 加密通信,防止中间人攻击与数据泄露。TLS 配置分为客户端加密(Client-to-etcd)和节点间加密(Peer-to-Peer)。

3.4.1 证书生成(使用 cfssl)

# 生成 CA 证书
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

# 生成 etcd 节点证书(需包含所有节点 IP 与主机名)
cfssl gencert \
  -ca=ca.pem \
  -ca-key=ca-key.pem \
  -config=ca-config.json \
  -profile=etcd \
  -hostname="192.168.1.11,192.168.1.12,192.168.1.13,127.0.0.1,localhost" \
  etcd-csr.json | cfssljson -bare etcd

3.4.2 启用 TLS 的启动命令

etcd \
  --name etcd-1 \
  --initial-advertise-peer-urls https://192.168.1.11:2380 \
  --listen-peer-urls https://0.0.0.0:2380 \
  --advertise-client-urls https://192.168.1.11:2379 \
  --listen-client-urls https://0.0.0.0:2379 \
  --cert-file=/etc/etcd/ssl/etcd.pem \
  --key-file=/etc/etcd/ssl/etcd-key.pem \
  --peer-cert-file=/etc/etcd/ssl/etcd.pem \
  --peer-key-file=/etc/etcd/ssl/etcd-key.pem \
  --trusted-ca-file=/etc/etcd/ssl/ca.pem \
  --peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \
  --client-cert-auth \
  --peer-client-cert-auth \
  --initial-cluster etcd-1=https://192.168.1.11:2380,etcd-2=https://192.168.1.12:2380,etcd-3=https://192.168.1.13:2380 \
  --initial-cluster-state new
安全最佳实践:
  • 始终启用 --client-cert-auth 与 --peer-client-cert-auth,拒绝未认证连接。
  • 证书有效期建议不超过 1 年,并建立自动续期机制(如 cert-manager)。
  • 节点证书的 hostname 字段必须包含所有可能的访问 IP 与 DNS 名称。

3.5 多节点集群搭建实战流程

以下为从零搭建一个 3 节点 TLS 加密 etcd 集群的完整步骤。

  1. 准备证书:在任意一台节点生成 CA 与节点证书,分发至所有节点。
  2. 配置主机名与防火墙:确保各节点可通过主机名互访,开放 2379(Client)与 2380(Peer)端口。
  3. 启动第一个节点:使用 --initial-cluster-state new 启动 etcd-1。
  4. 验证单节点状态:etcdctl --endpoints=https://192.168.1.11:2379 --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem endpoint health
  5. 启动第二、三节点:依次启动 etcd-2、etcd-3,观察日志确认加入集群。
  6. 最终验证:etcdctl member list 应显示 3 个节点,endpoint status 显示所有节点为 healthy。
常见排错:
  • 节点无法加入:检查 --initial-cluster 中的地址是否可路由,证书是否匹配。
  • TLS 握手失败:确认 --trusted-ca-file 与 --peer-trusted-ca-file 指向同一 CA 证书。
  • 集群脑裂:检查节点间网络延迟与防火墙规则,确保 2380 端口双向可达。

3.6 部署架构总览

下图展示了静态部署模式下,三节点 etcd 集群的组件关系与通信路径。

etcd 三节点静态部署架构图 etcd 三节点静态部署架构图 etcd-1 192.168.1.11 Client:2379 / Peer:2380 etcd-2 192.168.1.12 Client:2379 / Peer:2380 etcd-3 192.168.1.13 Client:2379 / Peer:2380 Client 应用 读写请求 说明: • 实线箭头表示 Peer 间 Raft 通信(2380 端口),使用 TLS 加密。 • 虚线箭头表示 Client 请求(2379 端口),可负载均衡至任意节点。

3.7 集群健康检查与验证

部署完成后,执行以下命令确认集群状态:

# 查看成员列表
etcdctl member list --write-out=table

# 检查端点健康状态
etcdctl endpoint health --cluster

# 写入测试数据
etcdctl put /test/key "hello etcd"

# 读取测试数据
etcdctl get /test/key
预期输出:所有节点状态为 healthy,leader 节点唯一,数据读写正常。若任一节点状态异常,立即检查该节点日志与网络连通性。