Etcd Registrator Docker Setup

PreRequirements

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

version: '3.3'

services:
etcd:
container_name: etcd-170
image: "quay.io/coreos/etcd:v3.3"
environment:
ETCD_NAME: etcd-170
ETCD_ADVERTISE_CLIENT_URLS: "http://$ETCD_IP:2379,http://0.0.0.0:2379"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://$ETCD_IP:2380"
ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
ETCD_INITIAL_CLUSTER_TOKEN: txin2018
ETCD_INITIAL_CLUSTER: etcd-33=http://$ETCD_NODE2_IP:2380,etcd-21=http://$ETCD_NODE1_IP:2380,etcd-170=http://$ETCD_IP:2380
ETCD_INITIAL_CLUSTER_TOKEN_STATE: new
ETCDCTL_API: "3"
SERVICE_2379_NAME: "etcd-170"
volumes:
- ./default.etcd:/default.etcd
ports:
- 2379:2379
- 2380:2380
- 4001:4001

etcd_node1:
container_name: etcd-21
image: "quay.io/coreos/etcd:v3.3"
environment:
ETCD_NAME: etcd-21
ETCD_ADVERTISE_CLIENT_URLS: "http://$ETCD_NODE1_IP:2379,http://0.0.0.0:2379"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://$ETCD_NODE1_IP:2380"
ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
ETCD_INITIAL_CLUSTER_TOKEN: txin2018
ETCD_INITIAL_CLUSTER: etcd-33=http://$ETCD_NODE2_IP:2380,etcd-21=http://$ETCD_NODE1_IP:2380,etcd-170=http://$ETCD_IP:2380
ETCD_INITIAL_CLUSTER_TOKEN_STATE: new
ETCDCTL_API: "3"
SERVICE_2379_NAME: "etcd-21"
volumes:
- ./default.etcd:/default.etcd
ports:
- 2379:2379
- 2380:2380
- 4001:4001

etcd_node2:
container_name: etcd-33
image: "quay.io/coreos/etcd:v3.3"
environment:
ETCD_NAME: etcd-33
ETCD_ADVERTISE_CLIENT_URLS: "http://$ETCD_NODE2_IP:2379,http://0.0.0.0:2379"
ETCD_LISTEN_CLIENT_URLS: "http://0.0.0.0:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS: "http://$ETCD_NODE2_IP:2380"
ETCD_LISTEN_PEER_URLS: "http://0.0.0.0:2380"
ETCD_INITIAL_CLUSTER_TOKEN: txin2018
ETCD_INITIAL_CLUSTER: etcd-33=http://$ETCD_NODE2_IP:2380,etcd-21=http://$ETCD_NODE1_IP:2380,etcd-170=http://$ETCD_IP:2380
ETCD_INITIAL_CLUSTER_TOKEN_STATE: new
ETCDCTL_API: "3"
SERVICE_2379_NAME: "etcd-21"
volumes:
- ./default.etcd:/default.etcd
ports:
- 2379:2379
- 2380:2380
- 4001:4001

registrator:
container_name: registrator-170
image: gliderlabs/registrator:latest
# Tell registrator where the etcd HTTP API is and to use
# the docker VM's IP
command: [ -ttl=60, -ttl-refresh=30, -ip, "$ETCD_IP", "etcd://$ETCD_IP:2379/trunk/services"]
volumes:
# So registrator can use the docker API to inspect containers
- "/var/run/docker.sock:/tmp/docker.sock"

registrator_node1:
container_name: registrator-21
image: gliderlabs/registrator:latest
# Tell registrator where the etcd HTTP API is and to use
# the docker VM's IP
command: [ -ttl=60, -ttl-refresh=30, -ip, "$ETCD_NODE1_IP", "etcd://$ETCD_NODE1_IP:2379/trunk/services"]
volumes:
# So registrator can use the docker API to inspect containers
- "/var/run/docker.sock:/tmp/docker.sock"

registrator_node2:
container_name: registrator-33
image: gliderlabs/registrator:latest
# Tell registrator where the etcd HTTP API is and to use
# the docker VM's IP
command: [ -ttl=60, -ttl-refresh=30, -ip, "$ETCD_NODE2_IP", "etcd://$ETCD_NODE2_IP:2379/trunk/services"]
volumes:
# So registrator can use the docker API to inspect containers
- "/var/run/docker.sock:/tmp/docker.sock"

deploy_manager.sh

1
2
3
4
export ETCD_IP=192.168.3.170
export ETCD_NODE1_IP=192.168.3.21
export ETCD_NODE2_IP=192.168.3.33
docker-compose up -d etcd registrator

deploy_node1.sh

1
2
3
4
export ETCD_IP=192.168.3.170
export ETCD_NODE1_IP=192.168.3.21
export ETCD_NODE2_IP=192.168.3.33
docker-compose up -d etcd_node1 registrator_node1

deploy_node1.sh

1
2
3
4
export ETCD_IP=192.168.3.170
export ETCD_NODE1_IP=192.168.3.21
export ETCD_NODE2_IP=192.168.3.33
docker-compose up -d etcd_node2 registrator_node2

etcd_client_demo.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import etcd

client = etcd.Client(host='192.168.3.170', port=2379)

SERVICE_PATH = '/trunk/services/'

SERVICE_NAME = 'test_service'

try:
client.read(SERVICE_PATH)

req_path = SERVICE_PATH + SERVICE_NAME

directory = client.get(req_path)
if directory and directory.children:
for obj in directory.children:
print(str(obj.key) + ': ' + str(obj.value))

except etcd.EtcdKeyNotFound:
print('SERVICE_PATH: ' + req_path + ' read error!')