笔者测试环境为Centos7.5 64bit
#yum install etcd -y //centos7的镜像直接用yum安装即可
#etcd -version //进入容器查看etcd版本,是否安装成功
2.1、开放etcd通信使用的接口
#firewall-cmd --zone=public --add-port=2379/tcp --permanent
#firewall-cmd --zone=public --add-port=2380/tcp --permanent
#firewall-cmd --reload
#firewall-cmd --list-ports //查看已经打开的所有端口
#mkdir -p /var/data/etcd
Etcd启动参数说明及注意事项:
--name etcd0 //节点名称,默认为 default
--data-dir //服务运行数据保存的路径,默认为${name}.etcd
--snapshot-count //指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
--heartbeat-interval //leader 多久发送一次心跳到 followers。默认值是 100ms
--eletion-timeout //重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms。
--listen-peer-urls //和同伴通信的地址,比如http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost
--listen-client-urls //对外提供服务的地址:比如http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和 etcd 交互
--advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
--initial-advertise-peer-urls http://192.168.2.55:2380 //其他member使用,其他member通过该地址与本member交互信息。一定要保证从其他member能可访问该地址。静态配置方式下,该参数的value一定要同时在--initial-cluster参数中存在。
memberID的生成受--initial-cluster-token和--initial-advertise-peer-urls影响。该节点同伴监听地址,这个值会告诉集群中其他节点
--initial-cluster //集群中所有节点的信息,格式为node1=http://ip1:2380,node2=http://ip2:2380,…,注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值。
--initial-cluster-state //新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing。
--initial-cluster-token//创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误。
--initial-cluster-token etcd-cluster-2 //用于区分不同集群。本地如有多个集群要设为不同。
--initial-cluster-state new //用于指示本次是否为新建集群。有两个取值new和existing。如果填为existing,则该member启动时会尝试与其他member交互。集群初次建立时,要填为new,经尝试最后一个节点填existing也正常,其他节点不能填为existing。集群运行过程中,一个member故障后恢复时填为existing,经尝试填为new也正常。
上述配置也可以设置配置文件,默认为/etc/etcd/etcd.conf
#docker run -ti --net mynetwork --ip 192.168.0.10 --name etcd1 -p 2379:2379 -p 2380:2380 d5d21b79319a /bin/bash
#docker run -ti --net mynetwork --ip 192.168.0.10 --name etcd1 -v /root/jiezisoft:/root/jiezisoft --privileged=true -p 2379:2379 -p 2380:2380 -p 9901:9901 -p 9902:9902 -p 9903:9903 -p 9904:9904 d5d21b79319a /bin/bash
#docker create -it --net mynetwork --ip 192.168.0.10 --name etcd1 -v /root/jiezisoft:/root/jiezisoft/ --privileged=true -p 2379:2379 -p 2380:2380 -p 9901:9901 -p 9902:9902 -p 9903:9903 -p 9904:9904 d5d21b79319a bash
#etcd --name node1 --initial-advertise-peer-urls http://192.168.0.10:2380 --listen-peer-urls http://192.168.0.10:2380 --listen-client-urls http://192.168.0.10:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.0.10:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster node1=http://192.168.0.10:2380,node2=http://192.168.0.20:2480,node3=http://192.168.2.10:2380 --initial-cluster-state new
#etcd --name node1 --initial-advertise-peer-urls http://192.168.0.10:2380 --listen-peer-urls http://192.168.0.10:2380 --listen-client-urls http://192.168.0.10:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.0.10:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster node1=http://192.168.0.10:2380,node2=http://192.168.0.20:2480,node3=http://192.168.2.10:2380,node4=http://192.168.2.20:2480 --initial-cluster-state new
#etcd --name node2 --initial-advertise-peer-urls http://192.168.0.20:2480 --listen-peer-urls http://192.168.0.20:2480 --listen-client-urls http://192.168.0.20:2479,http://127.0.0.1:2479 --advertise-client-urls http://192.168.0.20:2479 --initial-cluster-token etcd-cluster-1 --initial-cluster node1=http://192.168.0.10:2380,node2=http://192.168.0.20:2480,node3=http://192.168.2.10:2380,node4=http://192.168.2.20:2480 --initial-cluster-state new
#etcd --name node3 --initial-advertise-peer-urls http://192.168.2.10:2380 --listen-peer-urls http://192.168.2.10:2380 --listen-client-urls http://192.168.2.10:2379,http://127.0.0.1:2379 --advertise-client-urls http://192.168.2.10:2379 --initial-cluster-token etcd-cluster-1 --initial-cluster node1=http://192.168.0.10:2380,node2=http://192.168.0.20:2480,node3=http://192.168.2.10:2380,node4=http://192.168.2.20:2480 --initial-cluster-state new
#etcd --name node4 --initial-advertise-peer-urls http://192.168.2.20:2480 --listen-peer-urls http://192.168.2.20:2480 --listen-client-urls http://192.168.2.20:2479,http://127.0.0.1:2479 --advertise-client-urls http://192.168.2.20:2479 --initial-cluster-token etcd-cluster-1 --initial-cluster node1=http://192.168.0.10:2380,node2=http://192.168.0.20:2480,node3=http://192.168.2.10:2380,node4=http://192.168.2.20:2480 --initial-cluster-state new
#etcd --name etcd0 --initial-advertise-peer-urls http://192.168.0.10:2380 --listen-peer-urls http://0.0.0.0:2380 --listen-client-urls http://0.0.0.0:2379 --advertise-client-urls http://192.168.0.10:2379 --initial-cluster-token etcd-cluster-2 --initial-cluster etcd0=http://192.168.0.10:2380,etcd1=http://192.168.0.20:2480,etcd2=http://192.168.2.10:2380 --initial-cluster-state new
#etcdctl member list //查看集群成员
#vi /etc/etcd/etcd.conf //修改etcd的配置文件
#etcdctl member add node4 http://192.168.2.20:2480 //添加节点,然后再启动节点
静态ip:
A主机虚拟机172.16.1.117:
#docker network create --subnet=192.168.0.0/24 mynetwork //A主机,一定不能和宿主机同网段
#docker network ls
#docker run -it --name CONTAINERNAME --net mynetwork --ip 192.168.0.10 IMAGEID /bin/bash
#route add -net 192.168.2.0/24 gw 172.16.1.118 //添加路由
B主机虚拟机172.16.1.118
#docker network create --subnet=192.168.2.0/24 mynetwork //B主机,一定不能和宿主机同网段
#docker network ls
#docker run -it --name CONTAINERNAME --net mynetwork --ip 192.168.2.10 IMAGEID /bin/bash
#route add -net 192.168.0.0/24 gw 172.16.1.117 //添加路由
打开端口
#systemctl start firewalld
#firewall-cmd --query-port=2379/tcp //查询2379端口是否开启
#firewall-cmd --zone=public --add-port=2379/tcp --permanent //永久开启2379端口
#firewall-cmd --reload //重启防火墙生效
自动启动etcd脚本:
注意:用host网络就是使用宿主机网络+端口,在主备机模式测试时,需要改一下IP="10.0.0.10",和initial-cluster-token etcd-cluster-1,保证主备机IP不一样和集群ID不一样。
#!/bin/bash
IP="10.0.0.10"
CLUSTER="s11=http://${IP}:2380,s12=http://${IP}:2480,s13=http://${IP}:2580"
nohup /usr/bin/etcd --name s11 --initial-advertise-peer-urls http://${IP}:2380 \
--listen-peer-urls http://${IP}:2380 \
--listen-client-urls http://${IP}:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://${IP}:2379,http://127.0.0.1:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state new > /dev/null 2>&1 &
nohup /usr/bin/etcd --name s12 --initial-advertise-peer-urls http://${IP}:2480 \
--listen-peer-urls http://${IP}:2480 \
--listen-client-urls http://${IP}:2479,http://127.0.0.1:2479 \
--advertise-client-urls http://${IP}:2479,http://127.0.0.1:2479 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state new > /dev/null 2>&1 &
nohup /usr/bin/etcd --name s13 --initial-advertise-peer-urls http://${IP}:2580 \
--listen-peer-urls http://${IP}:2580 \
--listen-client-urls http://${IP}:2579,http://127.0.0.1:2579 \
--advertise-client-urls http://${IP}:2579,http://127.0.0.1:2579 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state new > /dev/null 2>&1 &
#yum -y update nss -y
# curl -L https://github.com/coreos/etcd/releases/download/v3.2.22/etcd-v3.2.22-linux-amd64.tar.gz -o etcd-v3.2.22-linux-amd64.tar.gz
#tar xzvf etcd-v3.2.22-linux-amd64.tar.gz
#cd etcd-v3.2.22-linux-amd64
#cp etcd /bin
#cp etcdctl /bin