(通俗易懂~)基于Docker的Etcd集群环境搭建

  • 闲言碎语
  • Etcd简介
  • 准备环境
  • 第一步,下载Etc镜像
  • 第二步,创建自定义Docker网络
  • 第三步,创建并启动Etcd镜像节点
  • 验证结果
  • 完结撒花!


闲言碎语

最近在埋头苦学Docker相关知识,深深被Docker技术所吸引,Docker牛逼,我爱Docker!也是好久没写博客了,在学习Docker的过程中,今天算是个小小的里程碑吧,特此纪念。废话不多说下面进入正文!

Etcd简介

Etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值(KEY-VALUE)仓库,遵循Apache v2许可,基于Go语言实现。主要用于分享配置和服务发现。etcd 的灵感来自于 ZooKeeper 和 Doozer,除了拥有与之类似的功能外,更加注重以下几个方面:

  1. 简单:支持 curl 方式的用户 API (HTTP+JSON)
  2. 安全:可选 SSL 客户端证书认证
  3. 快速:单实例可达每秒 10000 次写操作
  4. 可靠:使用 Raft 实现分布式

准备环境

构建思路如下:

节点名

IP地址

node1

10.2.36.1

node2

10.2.36.2

node3

10.2.36.3

我们需要三个节点,这三个节点可以分布在不同服务器,本案例中,以一台服务器基于Docker运行多个容器来做演示。

第一步,下载Etc镜像

下载Etcd镜像

$docker pull quay.io/coreos/etcd:v3.3.1
$docker images

REPOSITORY                               TAG                 IMAGE ID            CREATED             SIZE
quay.io/coreos/etcd                      v3.3.1              d56a5594a28c        2 years ago         39.4MB

第二步,创建自定义Docker网络

首先构建个自定义网络,因为我们要给各个节点分配IP地址,Docker容器默认网络只能自动配IP无法手动分配。

##创建一个新的bridge网络
$docker network create --driver bridge --subnet=10.2.36.0/16 --gateway=10.2.1.1 mynet2
##查看网络列表
$docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
d1473128e10f        bridge              bridge              local
ca7490979d9e        host                host                local
64f518b2574c        mynet2              bridge              local
f2e31afceb6e        none                null                local

第三步,创建并启动Etcd镜像节点

创建容器并运行
节点1:

docker run -d \
-p 2479:2379 \
-p 2381:2380 \
--name node1 \
--network=mynet2 \
--ip 10.2.36.1 \
quay.io/coreos/etcd:v3.3.1 \
etcd \
-name node1 \
-advertise-client-urls http://10.2.36.1:2379 \
-initial-advertise-peer-urls http://10.2.36.1:2380 \
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster "node1=http://10.2.36.1:2380,node2=http://10.2.36.2:2380,node3=http://10.2.36.3:2380" \
-initial-cluster-state new

节点2:

docker run -d \
-p 2579:2379 \
-p 2382:2380 \
--name node2 \
--network=mynet2 \
--ip 10.2.36.2 \
quay.io/coreos/etcd:v3.3.1 \
etcd \
-name node2 \
-advertise-client-urls http://10.2.36.2:2379 \
-initial-advertise-peer-urls http://10.2.36.2:2380 \
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster "node1=http://10.2.36.1:2380,node2=http://10.2.36.2:2380,node3=http://10.2.36.3:2380" \
-initial-cluster-state new

节点3:

docker run -d \
-p 2679:2379 \
-p 2383:2380 \
--name node3 \
--network=mynet2 \
--ip 10.2.36.3 \
quay.io/coreos/etcd:v3.3.1 \
etcd \
-name node3 \
-advertise-client-urls http://10.2.36.3:2379 \
-initial-advertise-peer-urls http://10.2.36.3:2380 \
-listen-client-urls http://0.0.0.0:2379 -listen-peer-urls http://0.0.0.0:2380 \
-initial-cluster-token etcd-cluster \
-initial-cluster "node1=http://10.2.36.1:2380,node2=http://10.2.36.2:2380,node3=http://10.2.36.3:2380" \
-initial-cluster-state new

参数详解:

参数名

说明

-name

设置成员节点的别名,建议为每个成员节点配置可识别的命名

-advertise-client-urls

广播到集群中本成员的监听客户端请求的地址

-initial-advertise-peer-urls

广播到集群中本成员的Peer监听通信地址

-listen-client-urls

客户端请求的监听地址列表

-listen-peer-urls

Peer消息的监听服务地址列表

-initial-cluster-token

启动集群的时候指定集群口令,只有相同token的几点才能加入到同一集群

-initial-cluster

所有集群节点的地址列表

-initial-cluster-state

初始化集群状态,默认为new,也可以指定为exi-string表示要加入到一个已有集群

验证结果

$docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                            NAMES
377c7cbe17ff        quay.io/coreos/etcd:v3.3.1   "etcd -name node3 -a…"   About an hour ago   Up About an hour    0.0.0.0:2679->2379/tcp, 0.0.0.0:2383->2380/tcp   node3
dcc05aaaf332        quay.io/coreos/etcd:v3.3.1   "etcd -name node2 -a…"   About an hour ago   Up About an hour    0.0.0.0:2579->2379/tcp, 0.0.0.0:2382->2380/tcp   node2
0d7e59766c6f        quay.io/coreos/etcd:v3.3.1   "etcd -name node1 -a…"   About an hour ago   Up About an hour    0.0.0.0:2479->2379/tcp, 0.0.0.0:2381->2380/tcp   node1
## 通过etcdctl member list命令可以查询出所有集群节点的列表即为成功
$docker exec -it 377 etcdctl member list
2db3381ff302973d: name=node3 peerURLs=http://10.2.36.3:2380 clientURLs=http://10.2.36.3:2379 isLeader=false
f919ac4d9adb687a: name=node1 peerURLs=http://10.2.36.1:2380 clientURLs=http://10.2.36.1:2379 isLeader=true
ffbd0562b8dd25e9: name=node2 peerURLs=http://10.2.36.2:2380 clientURLs=http://10.2.36.2:2379 isLeader=false
## 无论通过哪一集群节点查询出来的结果都应相同
$docker exec -it dcc etcdctl member list
2db3381ff302973d: name=node3 peerURLs=http://10.2.36.3:2380 clientURLs=http://10.2.36.3:2379 isLeader=false
f919ac4d9adb687a: name=node1 peerURLs=http://10.2.36.1:2380 clientURLs=http://10.2.36.1:2379 isLeader=true
ffbd0562b8dd25e9: name=node2 peerURLs=http://10.2.36.2:2380 clientURLs=http://10.2.36.2:2379 isLeader=false

$docker exec -it 0d7 etcdctl member list
2db3381ff302973d: name=node3 peerURLs=http://10.2.36.3:2380 clientURLs=http://10.2.36.3:2379 isLeader=false
f919ac4d9adb687a: name=node1 peerURLs=http://10.2.36.1:2380 clientURLs=http://10.2.36.1:2379 isLeader=true
ffbd0562b8dd25e9: name=node2 peerURLs=http://10.2.36.2:2380 clientURLs=http://10.2.36.2:2379 isLeader=false

完结撒花!