docker搭建etcd集群和etcdkeeper

docker搭建etcd集群

etcd版本

v3.3.27

创建etcd目录

1
mkdir etcd-cluster

编写docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
version: "3.0"


networks:

etcd-net: # 网络

driver: bridge # 桥接模式


volumes:

etcd1_data: # 挂载到本地的数据卷名

driver: local

etcd2_data:

driver: local

etcd3_data:

driver: local

###

### etcd 其他环境配置见:https://doczhcn.gitbook.io/etcd/index/index-1/configuration

###

services:

etcd1:

image: bitnami/etcd:3.3.27 # 镜像

container_name: etcd1 # 容器名 --name

restart: always # 总是重启

networks:

- etcd-net # 使用的网络 --network

ports: # 端口映射 -p

- "20000:2379"

- "20001:2380"

environment: # 环境变量 --env

- ALLOW_NONE_AUTHENTICATION=yes # 允许不用密码登录

- ETCD_NAME=etcd1 # etcd 的名字

- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd1:2380 # 列出这个成员的伙伴 URL 以便通告给集群的其他成员

- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380 # 用于监听伙伴通讯的URL列表

- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379 # 用于监听客户端通讯的URL列表

- ETCD_ADVERTISE_CLIENT_URLS=http://etcd1:2379 # 列出这个成员的客户端URL,通告给集群中的其他成员

- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster # 在启动期间用于 etcd 集群的初始化集群记号

- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380 # 为启动初始化集群配置

- ETCD_INITIAL_CLUSTER_STATE=new # 初始化集群状态

volumes:

- etcd1_data:/bitnami/etcd # 挂载的数据卷


etcd2:

image: bitnami/etcd:3.3.27

container_name: etcd2

restart: always

networks:

- etcd-net

ports:

- "20002:2379"

- "20003:2380"

environment:

- ALLOW_NONE_AUTHENTICATION=yes

- ETCD_NAME=etcd2

- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd2:2380

- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380

- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379

- ETCD_ADVERTISE_CLIENT_URLS=http://etcd2:2379

- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster

- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380

- ETCD_INITIAL_CLUSTER_STATE=new

volumes:

- etcd2_data:/bitnami/etcd


etcd3:

image: bitnami/etcd:3.3.27

container_name: etcd3

restart: always

networks:

- etcd-net

ports:

- "20004:2379"

- "20005:2380"

environment:

- ALLOW_NONE_AUTHENTICATION=yes

- ETCD_NAME=etcd3

- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://etcd3:2380

- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380

- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379

- ETCD_ADVERTISE_CLIENT_URLS=http://etcd3:2379

- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster

- ETCD_INITIAL_CLUSTER=etcd1=http://etcd1:2380,etcd2=http://etcd2:2380,etcd3=http://etcd3:2380

- ETCD_INITIAL_CLUSTER_STATE=new

volumes:

- etcd3_data:/bitnami/etcd

运行docker-compose

1
2
3
4
5
6
7
8
9
10
[root@ray-aliyun etcd-cluster]# ls
docker-compose.yml
[root@ray-aliyun etcd-cluster]# docker-compose up -d
Creating network "etcd-cluster_etcd-net" with driver "bridge"
Creating volume "etcd-cluster_etcd1_data" with local driver
Creating volume "etcd-cluster_etcd2_data" with local driver
Creating volume "etcd-cluster_etcd3_data" with local driver
Creating etcd1 ... done
Creating etcd2 ... done
Creating etcd3 ... done

检查搭建状态

查看节点启动情况

1
2
3
4
5
[root@ray-aliyun etcd-cluster]# docker ps -f name=etcd
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1fb56aba5292 bitnami/etcd:3.3.27 "/opt/bitnami/script…" About an hour ago Up About an hour 0.0.0.0:20000->2379/tcp, :::20000->2379/tcp, 0.0.0.0:20001->2380/tcp, :::20001->2380/tcp etcd1
0c8086970946 bitnami/etcd:3.3.27 "/opt/bitnami/script…" About an hour ago Up About an hour 0.0.0.0:20002->2379/tcp, :::20002->2379/tcp, 0.0.0.0:20003->2380/tcp, :::20003->2380/tcp etcd2
cd942ecc6a9a bitnami/etcd:3.3.27 "/opt/bitnami/script…" About an hour ago Up About an hour 0.0.0.0:20004->2379/tcp, :::20004->2379/tcp, 0.0.0.0:20005->2380/tcp, :::20005->2380/tcp etcd3

查看挂载的数据卷

1
2
3
4
5
[root@ray-aliyun etcd-cluster]# docker volume ls
DRIVER VOLUME NAME
local etcd-cluster_etcd1_data
local etcd-cluster_etcd2_data
local etcd-cluster_etcd3_data
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@ray-aliyun etcd-cluster]# docker inspect etcd1
………………
"Mounts": [
{
"Type": "volume",
"Name": "etcd-cluster_etcd1_data",
"Source": "/var/lib/docker/volumes/etcd-cluster_etcd1_data/_data",
"Destination": "/bitnami/etcd",
"Driver": "local",
"Mode": "rw",
"RW": true,
"Propagation": ""
}
],
………………

测试节点

从etcd1写一个key
1
2
3
[root@ray-aliyun etcd-cluster]# docker exec -it etcd1 bash
I have no name!@1fb56aba5292:/opt/bitnami/etcd$ etcdctl put name "i am ray"
OK
从etcd2和etcd3读取该value
1
2
3
4
5
6
7
8
9
10
[root@ray-aliyun etcd-cluster]# docker exec -it etcd2 bash
I have no name!@0c8086970946:/opt/bitnami/etcd$ etcdctl get name
name
i am ray
I have no name!@0c8086970946:/opt/bitnami/etcd$ exit
exit
[root@ray-aliyun etcd-cluster]# docker exec -it etcd3 bash
I have no name!@cd942ecc6a9a:/opt/bitnami/etcd$ etcdctl get name
name
i am ray

搭建成功!

配置etcdkeeper连接etcd集群

拉取镜像

1
docker pull evildecay/etcdkeeper

默认情况下,etcdkeeper将连接到本地运行的etcd集群。如果需要连接到不同的etcd集群,请按照以下步骤进行操作:

在运行etcdkeeper容器时,可以通过设置环境变量来指定etcd集群的地址

1
docker run -d --name etcdkeeper -p 8080:8080 -e ETCD_ENDPOINTS=http://etcd1:2379,http://etcd2:2379,http://etcd3:2379 evildecay/etcdkeeper

由于我们之前为集群搭建了网络,所以需要将etcdkeeper容器连接到集群网络

1
docker network connect etcd-cluster_etcd-net 0d1c5ff93558

etcd-cluster_etcd-nett是网络名称,0d1c5ff93558是etcdkeeper容器id

etcdkeeper

最后在宿主机访问etcdkeeper服务,此处建立的kv与集群中互通。

配置成功!