Consul, Discovery Server
Consul은 무엇이며 어떻게 작동하는가?
wget https://releases.hashicorp.com/consul/1.4.4/consul_1.4.4_linux_amd64.zip
unzip consul_1.4.4_linux_amd64.zip
sudo mv consul /usr/local/bin/
consul -v
consul agent -dev
yenos@yenosui-MacBook-Pro-2:~$ consul agent -dev
==> Starting Consul agent...
Version: 'v1.5.2'
Node ID: 'd2b31054-5645-69a3-4cf2-cda6be8f8338'
Node name: 'yenosui-MacBook-Pro-2.local'
Datacenter: 'dc1' (Segment: '<all>')
Server: true (Bootstrap: false)
Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false
consul members
yenos@yenosui-MacBook-Pro-2:~$ consul members
Node Address Status Type Build Protocol DC Segment
yenosui-MacBook-Pro-2.local 127.0.0.1:8301 alive server 1.5.2 2 dc1 <all>
현재 실행중인 client들을 확인 할 수 있습니다.
-detailed
members command는 GossipProtocol을 기반으로 최종적인
consistant data 입니다. (흔히 이야기하는 eventually 하게 consistant를 유지한다는 이야기)
curl localhost:8500/v1/catalog/nodes
[{"Node":"Armons-MacBook-Air","Address":"127.0.0.1","TaggedAddresses":{"lan":"127.0.0.1","wan":"127.0.0.1"},"CreateIndex":4,"ModifyIndex":110}]
물론 DNS Interface역시 지원하기 때문에 local node name을 가지고 dns lookup query를 날릴 수 도 있습니다.
dig(domain information Groper)를 사용하여서 쿼리를 날려봅시다.
dig @127.0.0.1 -p 8600 {node_name}
configuration을 저장할 폴더를 만듭니다.
mkdir ./consul.d
echo '{"service": {"name": "web", "tags": ["rails"], "port": 80}}' \
> ./consul.d/web.json
consul agent -dev -config-dir=./consul.d
synced라는 메시지를 볼수 있게된다. 이는 등록한 service가 성공적으로 등록되어 기록되고 있다는 것을 의미합니다.
실제 사용되는 유용하고 재미있는 service option들이 많이 이씃ㅂ니다.
dig @127.0.0.1 -p 8600 web.service.consul
web.servicec.consul로 a레코딩에 정의된 ip주소를 리턴 받을 수 있습니다.
또한 서비스 되고 있는 실제 node이름을 받아 올수도 있습니다.
또한 앞서 설정한 tag값을 이용하여서도 검색이 가능합니다.
dig @127.0.0.1 -p 8600 rails.web.service.consul
$ curl http://localhost:8500/v1/catalog/service/web
$ curl 'http://localhost:8500/v1/health/service/web?passing'
connect를 서비스가 인지하지 못하도록 띄어봅니다.
echo 해주는 socket프로그램을 띄어봅니다.
socat -v tcp-l:8181,fork exec:"/bin/cat"
nc 127.0.0.1 8181
hello
hello
cat <<EOF | sudo tee ./consul.d/socat.json
{
"service": {
"name": "socat",
"port": 8181,
"connect": { "sidecar_service": {} }
}
}
EOF
consul reload를 통해 SIGUP시그널을 컨설로 보내면 새로운 configuration 이 적용된 consul agent가 실행됩니다.
connect를 통해 실제 특정 포트에서 연결된 inout bound를 넘겨주게됩니다.
consul connect proxy -sidecar-for socat
실제 코드를 실행해보면 8181포트에 한해서 proxy 프로세스가 실행됨을 확인할 수 있습니다.
consul connect proxy -service web2 -upstream socat:9191
socat -v tcp-l:8181,fork exec:"/bin/cat"
sudo consul agent -dev -config-dir=consul.d
consul connect proxy -sidecar-for socat -log-level debug
consul connect proxy -service web2 -upstream socat:9191
nc 127.0.0.1 9191
hello!
hello!
작동되는 과정은 아래와 같습니다.
$ cat <<EOF | sudo tee ./consul.d/web.json
{
"service": {
"name": "web",
"port": 8080,
"connect": {
"sidecar_service": {
"proxy": {
"upstreams": [{
"destination_name": "socat",
"local_bind_port": 9191
}]
}
}
}
}
}
EOF
consul connect proxy -service web2 -upstream socat:9191
consul connect proxy -sidecar-for web
discovery server라는 것을 처음 알았는데 생각해보니 어디서든 언젠가 꼭 필요한 기능이란 생각이 들었다.
consul이 없었으면 실제 구현해야겠지.. 덜덜..