최근 재미있는 프로젝트를 하고있는데, 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 ]
[ Build ]
|
|
빌드,
|
|
or
|
|
직접 바이너리를 실행하여 구동할 수 있습니다. /usr/bin 에 넣고 명령행처럼 사용해도 되고, 아님 바이너리 직접 호출해서 쓰셔도 무방합니다.
|
|
따로 정리할까 하다가 너무 많아서 그냥 링크 하나 남겨놓습니다. 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를 다운받아 압축 해제합니다.
|
|
이제 Consul server를 동작할텐데요, 동작에 앞서 Key generate가 필요합니다. generate된 key를 각각 Agent의 설정 파일로 넘겨주어 통신을 성공시킬 수 있습니다.
|
|
해당 값은 복사해두셨다가 Agent config에 넣어주시면 됩니다. 다시 본론으로 와서, server의 config 파일을 작성합니다. 여기서 아까 압축 해제한 web ui 디렉토리 경로 또한 추가해줍니다. (ui_dir)
/etc/consul.d/server/config.json
|
|
그러고 consul agent를 –server 옵션을 주어 실행하여 서버로 동작시킵니다.
|
|
Consul Agent
Agent는 아까 생성한 키 값을 포함하여 설정 파일을 만들어줍니다. 서버 IP도 기록해줍니다.
/etc/consul.d/agent/config.json
|
|
그러고 agent 옵션에 –server 없이 명령행으로 전달하면 Consul Agent(node)가 생성되고 통신을 시도하게 됩니다.
|
|
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 포맷으로 개별 서비스의 설정 정보를 같이 전달해줍니다.
|
|
이후 Consul에서 Cli든 API던 서비스 정보를 받아올 수 있어 이를 이용하여 서비스에 필요한 로직을 추가로 구현하면 됩니당 :)