4. etcd集群基础部署:二进制安装etcd、静态配置与动态发现、TLS证书生成与配置
etcd集群的部署质量直接决定压测沙盘Federation环境的稳定性与性能基线。本章围绕二进制安装、静态配置与动态发现、TLS证书生成与配置三个核心环节展开,确保学员能够从零搭建一个生产级etcd集群,并为后续压测与瓶颈分析奠定基础。
4.1 二进制安装etcd
推荐使用官方预编译二进制包进行安装,避免包管理器版本滞后或依赖冲突。以下步骤适用于Linux amd64/arm64环境。
4.1.1 下载与解压
# 获取最新稳定版本(以v3.5.15为例)
wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
# 解压并进入目录
tar -xzf etcd-v3.5.15-linux-amd64.tar.gz
cd etcd-v3.5.15-linux-amd64
# 将二进制文件复制到系统路径
sudo cp etcd etcdctl etcdutl /usr/local/bin/
4.1.2 验证安装
etcd --version
etcdctl version
etcdutl version
版本一致性提示:集群内所有节点的etcd版本必须一致,否则可能导致Raft协议兼容性问题。建议在压测沙盘Federation环境中统一使用同一版本。
4.2 静态配置与动态发现
etcd集群成员发现机制分为静态配置和动态发现两种模式。静态配置适用于节点IP固定的场景,动态发现适用于IP不固定的云原生环境。
4.2.1 静态配置(Static Bootstrap)
静态配置需要在启动时通过--initial-cluster参数明确列出所有节点的名称与地址。以下是一个3节点集群的配置示例:
| 节点名称 | 节点IP | Client端口 | Peer端口 |
|---|---|---|---|
| etcd-1 | 192.168.1.101 | 2379 | 2380 |
| etcd-2 | 192.168.1.102 | 2379 | 2380 |
| etcd-3 | 192.168.1.103 | 2379 | 2380 |
# 节点 etcd-1 启动命令示例
etcd \
--name etcd-1 \
--initial-advertise-peer-urls http://192.168.1.101:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--advertise-client-urls http://192.168.1.101:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--initial-cluster- etcd-cluster-1 \
--initial-cluster etcd-1=http://192.168.1.101:2380,etcd-2=http://192.168.1.102:2380,etcd-3=http://192.168.1.103:2380 \
--initial-cluster-state new
关键参数说明:
--initial-cluster-state new:首次启动必须设为new,后续重启需改为existing。--initial-cluster-:同一集群的所有节点必须使用相同的,用于防止跨集群混淆。--listen-peer-urls:建议绑定0.0.0.0,但--initial-advertise-peer-urls必须使用实际可达IP。
4.2.2 动态发现(Discovery Service)
动态发现依赖etcd自带的discovery服务或自定义discovery URL。适用于节点IP动态分配的场景(如Kubernetes Pod)。
# 生成discovery (在任意一台机器执行)
DISCOVERY_URL=$(curl -s https://discovery.etcd.io/new?size=3)
echo $DISCOVERY_URL
# 所有节点使用相同的discovery URL启动
etcd \
--name etcd-1 \
--initial-advertise-peer-urls http://192.168.1.101:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--advertise-client-urls http://192.168.1.101:2379 \
--listen-client-urls http://0.0.0.0:2379 \
--discovery https://discovery.etcd.io/<>
静态 vs 动态发现对比:
- 静态配置:配置明确,启动速度快,适合压测沙盘Federation环境中的固定节点集群。
- 动态发现:灵活性高,但依赖外部discovery服务,存在单点故障风险。生产环境建议自建discovery服务。
4.3 TLS证书生成与配置
etcd集群在生产环境中必须启用TLS加密,防止中间人攻击和数据泄露。证书体系包含CA根证书、服务端证书、客户端证书以及Peer证书。
4.3.1 使用cfssl生成证书
推荐使用cfssl工具链,支持JSON配置化生成,便于批量管理。
# 安装cfssl
wget -q --show-progress https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl_1.6.5_linux_amd64
wget -q --show-progress https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssljson_1.6.5_linux_amd64
chmod +x cfssl_* cfssljson_*
sudo mv cfssl_* /usr/local/bin/cfssl
sudo mv cfssljson_* /usr/local/bin/cfssljson
# 创建CA配置文件
cat > ca-config.json <<EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"server": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "server auth"]
},
"client": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "client auth"]
},
"peer": {
"expiry": "87600h",
"usages": ["signing", "key encipherment", "server auth", "client auth"]
}
}
}
}
EOF
# 生成CA证书和私钥
cat > ca-csr.json <<EOF
{
"CN": "etcd CA",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"O": "etcd",
"OU": "SRE"
}
]
}
EOF
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
4.3.2 生成节点证书(以etcd-1为例)
# 创建节点证书请求
cat > etcd-1.json <<EOF
{
"CN": "etcd-1",
"key": {
"algo": "rsa",
"size": 2048
},
"hosts": [
"192.168.1.101",
"127.0.0.1",
"localhost",
"etcd-1.example.com"
],
"names": [
{
"C": "CN",
"L": "Beijing",
"O": "etcd",
"OU": "SRE"
}
]
}
EOF
# 生成服务端+Peer双用途证书
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=peer \
etcd-1.json | cfssljson -bare etcd-1
hosts字段填写规则:
- 必须包含节点的所有可达IP和DNS名称。
- 建议包含
127.0.0.1和localhost,便于本地调试。 - 如果使用Kubernetes Service名称,也需要加入hosts列表。
4.3.3 配置etcd启用TLS
etcd \
--name etcd-1 \
--initial-advertise-peer-urls https://192.168.1.101:2380 \
--listen-peer-urls https://0.0.0.0:2380 \
--advertise-client-urls https://192.168.1.101:2379 \
--listen-client-urls https://0.0.0.0:2379 \
--cert-file=/etc/etcd/ssl/etcd-1.pem \
--key-file=/etc/etcd/ssl/etcd-1-key.pem \
--peer-cert-file=/etc/etcd/ssl/etcd-1.pem \
--peer-key-file=/etc/etcd/ssl/etcd-1-key.pem \
--peer-client-cert-auth \
--peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \
--client-cert-auth \
--trusted-ca-file=/etc/etcd/ssl/ca.pem \
--initial-cluster etcd-1=https://192.168.1.101:2380,etcd-2=https://192.168.1.102:2380,etcd-3=https://192.168.1.103:2380 \
--initial-cluster- etcd-cluster-tls \
--initial-cluster-state new
证书路径权限:etcd进程以
etcd用户运行时,证书文件权限必须设置为600,目录权限为700,否则启动会报权限错误。
4.4 集群启动验证
启动所有节点后,使用etcdctl验证集群健康状态:
# 使用TLS访问
etcdctl \
--endpoints=https://192.168.1.101:2379,https://192.168.1.102:2379,https://192.168.1.103:2379 \
--cacert=/etc/etcd/ssl/ca.pem \
--cert=/etc/etcd/ssl/etcd-1.pem \
--key=/etc/etcd/ssl/etcd-1-key.pem \
endpoint health --cluster
# 查看成员列表
etcdctl member list --write-out=table
预期输出显示所有节点均为healthy状态,成员列表包含3个节点且Leader已选举成功。
4.5 本章知识结构
以下SVG图展示了etcd集群部署的完整流程与TLS证书体系关系:
4.6 常见部署问题与排查
| 问题现象 | 可能原因 | 排查命令/方法 |
|---|---|---|
| 节点启动后无法加入集群 | --initial-cluster-state设置错误或不匹配 |
检查所有节点的--initial-cluster-是否一致 |
| TLS握手失败 | 证书hosts字段缺少节点IP或DNS | openssl x509 -in <cert.pem> -text -noout 查看Subject Alternative Names |
| etcdctl连接超时 | 防火墙未放行2379/2380端口 | telnet <node-ip> 2379 测试端口连通性 |
| Leader选举失败 | 节点间网络延迟过高或丢包 | etcdctl endpoint status --write-out=table 查看Raft term和leader |
压测沙盘Federation环境建议:
- 统一使用静态配置,避免discovery服务成为压测瓶颈。
- 所有节点使用同一份CA签发的证书,便于证书轮换管理。
- 在压测前执行
etcdctl endpoint health --cluster确认所有节点健康,避免压测数据倾斜。