docker服务发现方案etcd

前言

服务发现简单来说是指service的客户端可以发送请求到动态变化的service实例上 。现在主流的docker 服务发现方案有三种:分别是etcd,consul,skyDNS。今天我们主要讲解etcd解决方案。

etcd

它是一个键值存储仓库,用于配置共享和服务发现。 对于etcd更加细致的介绍,可以自己科普下,我就不一一阐释了。

etcd一般搭建集群,数量为奇数为佳。

host1上创建etcd容器,需要开放2379,2380,4001端口。设置访问etcd所需要的URL,也就是监听地址经由主机IP连接,还有集群中存在的所以节点。

docker run -d -p 2379:2379 -p 2380:2380 -p 4001:4001 \
--name etcd quay.io/coreos/etcd:v2.2.5 \
-name etcd-1 \
-initial-advertise-peer-urls http://172.16.2.234:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \
-advertise-client-urls http://172.16.2.234:2379 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd-1=http://172.16.2.234:2380,etcd-2=http://172.16.2.235:2380
-initial-cluster-state new

host2上创建etcd容器,需要开放2379,2380,4001端口。设置访问etcd所需要的URL,也就是监听地址经由主机IP连接,还有集群中存在的所以节点。这里只需要修改对外开放端口为host地址即可。

docker run -d -p 2379:2379 -p 2380:2380 -p 4001:4001 \
--name etcd quay.io/coreos/etcd:v2.2.5 \
-name etcd-2 \
-initial-advertise-peer-urls http://172.16.2.235:2380 \
-listen-peer-urls http://0.0.0.0:2380 \
-listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \
-advertise-client-urls http://172.16.2.235:2379 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd-1=http://172.16.2.234:2380,etcd-2=http://172.16.2.235:2380 \
-initial-cluster-state new


curl查询所有成员的名单

curl -s http://172.16.2.234:2379/v2/members
>>> {"members":[{"id":"3b1e9b838fe5f460","name":"etcd-2","peerURLs":["http://172.16.2.235:2380"],"clientURLs":["http://172.16.2.235:2379"]},{"id":"b2b7116e0f05b4fe","name":"etcd-1","peerURLs":["http://172.16.2.234:2380"],"clientURLs":["http://172.16.2.234:2379"]}]}

通过http put请求host1将service_address的值存储在service_name目录下

curl -s http://172.16.2.234:2379/v2/keys/service_name -XPUT -d value="service_address"
>>> {"action":"set","node":{"key":"/service_name","value":"service_address","modifiedIndex":6,"createdIndex":6}}

通过http get请求host2将该目录下的值取出来

curl -s http://172.16.2.235:2379/v2/keys/service_name
>>> {"action":"get","node":{"key":"/service_name","value":"service_address","modifiedIndex":6,"createdIndex":6}}

总结

etcd已经搭建完了,现在有什么收获呢?我们在两台主机上,分别创建了etcd容器,设置了etcd容器可以被其他节点发现。最后我们在这个双节点集群中,测试了在节点一上保存数据,节点二上获取数据,可以发现数据是一致性的。服务发现,最核心的模块就是要保持数据的一致性,通过多节点的记录服务发现,在客户端请求访问数据时,我们的etcd集群才能准确无误的告知到动态的实例上。