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 集群的完整步骤。
- 准备证书:在任意一台节点生成 CA 与节点证书,分发至所有节点。
- 配置主机名与防火墙:确保各节点可通过主机名互访,开放 2379(Client)与 2380(Peer)端口。
- 启动第一个节点:使用
--initial-cluster-state new启动 etcd-1。 - 验证单节点状态:
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 - 启动第二、三节点:依次启动 etcd-2、etcd-3,观察日志确认加入集群。
- 最终验证:
etcdctl member list应显示 3 个节点,endpoint status显示所有节点为healthy。
常见排错:
- 节点无法加入:检查
--initial-cluster中的地址是否可路由,证书是否匹配。 - TLS 握手失败:确认
--trusted-ca-file与--peer-trusted-ca-file指向同一 CA 证书。 - 集群脑裂:检查节点间网络延迟与防火墙规则,确保 2380 端口双向可达。
3.6 部署架构总览
下图展示了静态部署模式下,三节点 etcd 集群的组件关系与通信路径。
3.7 集群健康检查与验证
部署完成后,执行以下命令确认集群状态:
# 查看成员列表
etcdctl member list --write-out=table
# 检查端点健康状态
etcdctl endpoint health --cluster
# 写入测试数据
etcdctl put /test/key "hello etcd"
# 读取测试数据
etcdctl get /test/key
预期输出:所有节点状态为
healthy,leader 节点唯一,数据读写正常。若任一节点状态异常,立即检查该节点日志与网络连通性。