ETCD集群部署,启用SSL模式,自建证书
ETCD是基于Raft算法实现的强一致性分布式键值存储系统
启动命令
docker启动注意限制日志大小,时间同步,数据挂载。内存大小和自动压缩建议设置合适的范围并且开启否则可能会宕机第一次创建集群时,cluste-state=new,其他时间加入的节点均为existing设置好初始化集群注册信息(name、urls)等,可以依次启动。
/usr/local/bin/etcd # 节点名称 --name # 数据存放地址 --data-dir=/etcd-data # 心跳间隔 --heartbeat-interval # 选举超时时间 --election-timeout # 存储空间配额(内存),官方建议不超过8G,到达阈值会拒绝写 --quota-backend-bytes # 自动压缩模式 revision 基于版本号压缩|periodic 基于时间周期压缩 --auto-compaction-mode # 压缩间隔 (保留近N个版本 / 保留近N小时数据) --auto-compaction-retention # 向集群广播的该节点接收客户端监听url,支持多协议多端口:http://ip:port,https://ip:port --advertiese-client-urls # 该节点监听请求地址:http://0.0.0.0:port,https://0.0.0.0:port --listen-client-urls # 单个事务允许最大操作条数 --max-txn-ops # 默认false,是否开启peer对等连接请求ssl认证 --peer-client-cert-auth=true # peer-ca证书地址 --peer-trusted-ca-file=cafilepath # peer认证证书 --peer-cert-file=filepath # peer证书私钥 --peer-key-file=filepath # 节点间监听peer对等连接,可以不设置证书使用http协议:https://ip:port --listen-peer-urls # 通知到集群上的该节点peer监听地址,和listen一样就好:https://ip:port --initial-advertise-peer-urls # 加入集群时初始化的节点node-name=peerurl信息:ename1=url1,ename2=url2,ename3=url3 --initial-cluster # 当前节点加入时集群状态:existing|new --initial-cluster-state # 初始化该节点的token,各个节点相同即可 --initial-cluster-token
证书准备
cfssl安装&授权
curl -s -L -o ~/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64curl -s -L -o ~/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64chmod +x ~/bin/{cfssl,cfssljson}
证书生成
客户端证书流程一样(hosts=[]),这里只保证节点间安全验证,只举例server端证书。
CA
cfssl gencert -initca ca-csr.json | cfssljson -bare ca -生成:ca.pem \ ca-key.pem这些文件注意保存,当拓展节点时有可能需要
ca-csr.json
{
"CN": "Etcd",
"key":{
"algo":"rsa",
"size":4096
},
"names":[
{
"C":"CN",
"L":"Beijing",
"O":"ETCD",
"OU":"Base",
"ST":"Beijing"
}
]
}
Peer证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer peer-csr.json | cfssljson -bare peer生成文件:peer.pem \ peer-key.pem
ca-config.json
{
"signing":{
"default":{
"expiry":"100000h"
},
"profiles":{
"peer":{
"usages":["signing", "key encipherment", "server auth", "client auth"],
"expiry": "100000h"
},
"client":{
"usages":["signing", "key encipherment", "server auth", "client auth"],
"expiry": "100000h"
}
}
}
}
peer-csr.json
{
"CN":"etcd-peer",
"hosts":[
"ip1","ip2","ip3"
],
"key":{
"algo":"rsa",
"size":4096
},
"names":[
{
"C":"CN",
"L":"Beijing",
"O":"ETCD",
"OU":"Base",
"ST":"Beijing"
}
]
}
Doker启动Demo
version: '3'
services:
etcd-1:
container_name: "etcd-1"
image: "quay.io/coreos/etcd:v3.4.18"
restart: always
ulimits:
nofile:
soft: "65535"
hard: "65535"
network_mode: "host"
volumes:
- /etc/localtime:/etc/localtime:ro
- ./data/etcd-1:/data
- ./pki:/etc/cert
logging:
driver:"json-file"
options:
max-size:"5g"
command: >
/usr/local/bin/etcd
--name="etcd-1"
--logger=zap
--data-dir=/data
--election-timeout=3000
--quota-backend-bytes=2g
--auto-compation-mode=revision
--auto-compation-retention=50
--peer-cert-file=/etc/cert/peer.pem
--peer-key-file=/etc/cert/peer-key.pem
--peer-trusted-ca-file=/etc/cert/ca.pem
--peer-client-cert-auth=true
--advertise-client-urls=http://ip:2379
--listen-client-urls=http://0.0.0.0:2379
--listen-peer-urls=https://0.0.0.0:2380
--initial-advertise-peer-urls=https://ip:2380
--initial-cluster etcd1=peerurl1,etcd2=peerurl2,etcd3=peerurl3
--initial-cluster-token=自定义
--initial-cluster-state=new|existing
--max-txn-ops=4096