Consul에 대해 알아보자! (Service Mesh)
최근 재미있는 프로젝트를 하고있는데, Health cheak, Service discovery 용도로 Consul을 써보게 되었고 글로 약간 정리해둡니다. hashicorp에서 만든 Consul, 거기서 지정한 DevOps 관련 내용 중 Monitor에 해당하는 부분입니다.
Service Mesh Made Easy
Consul is a distributed service mesh to connect, secure, and configure services across any runtime platform and public or private cloud
공식 홈페이지의 설명(?)으론 위와 같습니다. Service Mesh를 쉽게 해주는 툴이며 Service Mesh Architecture, 즉 클라우드 환경에서 MicroService Architecture 에서 서비스간 통신을 위한 메커니즘 구현을 쉽게 해준다는 이야기입니다. Service Mesh(MicroService Architecture)에서 추구하는 기능들은 여러가지가 있습니다.
- Service Discovery
- Load Balancing
- Dynamic Request Routing
- Circuit Breaking
- Etc..
이 중 Consul에서 눈에 띄는 부분들은 Health check + Service Discovery + Key/value 입니다. Consul을 이용하면 Health check, Service Discovery 등 서비스간 통신 채널을 복잡하지 않고 깔끔하게 구현할 수 있다고 보입니다. (보통 클라우드쪽에서 많이 이야기나오는듯하네요)
How to Install?
Consul은 단일 바이너리로 동작하며 옵션을 통해 크게 Agent와 Server로 기능을 나누어 처리할 수 있습니다. 설치 자체는 뭐 크게 불편한점 없습니다. 바이너리의 경우 OS 버전에 맞는 바이너리 받아서 실행하면되고, 직접 빌드 시 git clone 후 make 해주시면 됩니다. 빌드의 경우 Consul이 go로 만들어졌기 때문에 GOPATH 지정이 필요합니다.
[ Binary ]
- https://www.consul.io/downloads.html
[ Build ]
mkdir -p $GOPATH/src/github.com/hashicorp&& cd $!
git clone https://github.com/hashicorp/consul.git
cd consul
빌드,
make tools
or
make dev
직접 바이너리를 실행하여 구동할 수 있습니다. /usr/bin 에 넣고 명령행처럼 사용해도 되고, 아님 바이너리 직접 호출해서 쓰셔도 무방합니다.
#> consul -v
Usage: consul [--version] [--help] <command> [<args>]
Available commands are:
agent Runs a Consul agent
catalog Interact with the catalog
connect Interact with Consul Connect
event Fire a new event
exec Executes a command on Consul nodes
force-leave Forces a member of the cluster to enter the "left" state
info Provides debugging information for operators.
intention Interact with Connect service intentions
join Tell Consul agent to join cluster
keygen Generates a new encryption key
keyring Manages gossip layer encryption keys
kv Interact with the key-value store
leave Gracefully leaves the Consul cluster and shuts down
lock Execute a command holding a lock
maint Controls node or service maintenance mode
members Lists the members of a Consul cluster
monitor Stream logs from a Consul agent
operator Provides cluster-level tools for Consul operators
reload Triggers the agent to reload configuration files
rtt Estimates network round trip time between nodes
snapshot Saves, restores and inspects snapshots of Consul server state
validate Validate config files/directories
version Prints the Consul version
watch Watch for changes in Consul
따로 정리할까 하다가 너무 많아서 그냥 링크 하나 남겨놓습니다. Agent, Server 모드 이외에도 현재 Health나 Discovery 정보를 얻어올 수 있는 옵션들이 많습니다. Agent-Server로 구성하고 Cli 모드로 추가적인 정보를 가져와서 다른 Application에서 활용할 수 있겠네욤
[ Cli commands ] https://www.consul.io/docs/commands/index.html
서비스 구동 방식
실제로 사용할떈 Client-Server 느낌으로 보이지만, Agent 또한 서버로 동작하며 이를 총 관리해주는 리더서버가 존재합니다.
- 리더서버 : Consul Server
- 노드서버 : Consul Agent
Consul server
음 우선 리더서버인 Consul server는 Node(Consul Agent)들의 정보를 관리합니다. 데모 주소 보시면 어떤 느낌인지 감 오실겁니다.
우선 관리서버 Web UI를 위해 hashicorp 홈페이지에서 consul web ui를 다운받아 압축 해제합니다.
cd /consul-ui
wget https://releases.hashicorp.com/consul/0.7.2/consul_0.7.2_web_ui.zip
unzip consul_0.7.2_web_ui.zip
이제 Consul server를 동작할텐데요, 동작에 앞서 Key generate가 필요합니다. generate된 key를 각각 Agent의 설정 파일로 넘겨주어 통신을 성공시킬 수 있습니다.
consul key gen
zRaQ1ZhnLB777nw0Lpoo2w==
해당 값은 복사해두셨다가 Agent config에 넣어주시면 됩니다. 다시 본론으로 와서, server의 config 파일을 작성합니다. 여기서 아까 압축 해제한 web ui 디렉토리 경로 또한 추가해줍니다. (ui_dir)
/etc/consul.d/server/config.json
{
"bootstrap": true,
"server": true,
"datacenter": "test",
"ui_dir": "/consul-ui",
"data_dir": "/data/consul",
"encrypt": "[key 생성 내용]",
"addresses": {
"http": "[Consul 서버 IP]"
}
}
그러고 consul agent를 –server 옵션을 주어 실행하여 서버로 동작시킵니다.
consul agent --server -config-dir=/etc/consul.d/server -bind=[Consul 서버 IP]
Consul Agent
Agent는 아까 생성한 키 값을 포함하여 설정 파일을 만들어줍니다. 서버 IP도 기록해줍니다.
/etc/consul.d/agent/config.json
{
"server": false,
"datacenter": "test",
"data_dir": "/data/consul",
"encrypt": "[key 생성 내용]",
"start_join": ["[Consul 서버 IP]"]
}
그러고 agent 옵션에 –server 없이 명령행으로 전달하면 Consul Agent(node)가 생성되고 통신을 시도하게 됩니다.
consul agent -config-dir /etc/consul.d/agent -bind=[Consul agent IP]
Consul은 실행(Server/Agent) 시 8500 포트가 올라가며 이를 통해 서비스 등록/제거를 할 수 있습니다.
- http://127.0.0.1:8500/v1/agent/service/register
- http://127.0.0.1:8500/v1/agent/service/deregister/[id]
등록 시 JSON 포맷으로 개별 서비스의 설정 정보를 같이 전달해줍니다.
{
"service": {
"name": "HAHWUL-Redis",
"tags": ["New"],
"address": "",
"port": 8000,
"enableTagOverride": false,
"checks": [
{
# "script": "/data/redis.rb", # 일반 스크립트도 가능합니다.
"http" : "http://127.0.0.1:4000/health", # 10초마다 /health 페이지를 접근하여 체크합니다.
"interval": "10s"
}
]
}
}
이후 Consul에서 Cli든 API던 서비스 정보를 받아올 수 있어 이를 이용하여 서비스에 필요한 로직을 추가로 구현하면 됩니당 :)