Ubuntu 14.04에서 서비스 검색 시스템인 Consul 사용 소개
소개
Consul은 분산형, 고가용성, 데이터 센터 인식 서비스 검색 및 구성 시스템입니다. 클라이언트가 자신이 속한 인프라에 대한 최신 보기를 항상 가질 수 있도록 하는 유연하고 강력한 인터페이스에 서비스와 노드를 표시하는 데 사용할 수 있습니다.
Consul은 인프라에 대한 일관되고 사용 가능한 정보를 제공하는 데 사용되는 다양한 기능을 제공합니다. 여기에는 서비스 및 노드 검색 메커니즘, 태깅 시스템, 상태 확인, 합의 기반 선택 루틴, 시스템 전체 키/값 저장소 등이 포함됩니다. 조직 내에서 consul을 활용하면 애플리케이션과 서비스에 대한 정교한 인식 수준을 쉽게 구축할 수 있습니다.
이 가이드에서는 consul 사용의 몇 가지 기본 사항을 소개합니다. 테스트를 위해 서버에서 consul을 실행하는 데 필요한 일반적인 절차를 다룰 것입니다. 다음 가이드에서는 프로덕션 환경에서 영사 설정에 중점을 둘 것입니다.
전제 조건 및 목표
이 가이드에서는 consul을 사용하여 인프라에 대한 서비스 검색 및 구성 시스템을 구축하는 방법에 익숙해질 것입니다.
데모를 위해 3개의 서버와 1개의 클라이언트를 구성할 것입니다. 서버는 쿼리를 처리하고 시스템의 일관된 보기를 유지하는 데 사용됩니다. 클라이언트도 시스템의 구성원이며 인프라에 대한 정보를 위해 서버에 연결할 수 있습니다. 클라이언트에는 영사가 모니터링하는 서비스가 포함될 수도 있습니다.
이 안내서와 이 시리즈의 목적을 위해 전체적으로 4대의 컴퓨터를 구성할 것입니다. 처음 세 개는 위에서 설명한 대로 consul 서버가 됩니다. 마지막 하나는 클라이언트 역할을 하는 consul 에이전트가 될 것이며 시스템에 대한 정보를 쿼리하는 데 사용할 수 있습니다.
나중에 일부 보안 메커니즘을 구현하려면 단일 도메인 내의 모든 시스템에 이름을 지정해야 합니다. 이는 향후 와일드카드 SSL 인증서를 활용할 수 있도록 하기 위한 것입니다.
우리 기계의 세부 사항은 다음과 같습니다.
Hostname | IP Address | Role |
---|---|---|
server1.example.com | 192.0.2.1 | bootstrap consul server |
server2.example.com | 192.0.2.2 | consul server |
server3.example.com | 192.0.2.3 | consul server |
agent1.example.com | 192.0.2.50 | consul client |
이 데모에서는 64비트 Ubuntu 14.04 서버를 사용하지만 모든 최신 Linux 서버가 동일하게 잘 작동해야 합니다.
Consul 다운로드 및 설치
우리가 취해야 할 첫 번째 단계는 각 컴퓨터에 consul 소프트웨어를 다운로드하여 설치하는 것입니다. 위에 나열된 각 시스템에서 다음 단계를 수행해야 합니다. 루트로 로그인해야 합니다.
영사 응용 프로그램을 살펴보기 전에 unzip
을 가져와 실행 파일을 추출해야 합니다. 또한 screen
응용 프로그램을 사용하여 단일 터미널 창에서 여러 세션을 쉽게 가질 수 있습니다. 이는 서비스로 실행되지 않을 때 일반적으로 consul이 전체 화면을 차지하기 때문에 소개에 유용합니다.
로컬 시스템 패키지 캐시를 업데이트한 다음 apt
를 사용하여 패키지를 설치합니다.
apt-get update
apt-get install unzip screen
따라서 나중에 잊지 말고 지금 화면 세션을 시작하십시오.
screen
저작권 메시지가 표시되면 Enter 키를 누릅니다. 터미널 창으로 돌아가지만 이제 화면 세션 안에 있습니다.
이제 영사 프로그램을 받을 수 있습니다. consul 프로젝트의 페이지는 Windows, OS X 및 Linux용 바이너리 패키지에 대한 다운로드 링크를 제공합니다.
위 페이지로 이동하여 서버를 나타내는 운영 체제 및 아키텍처를 마우스 오른쪽 버튼으로 클릭합니다. 이 가이드에서는 64비트 서버를 사용하고 있으므로 "linux\ 아래의 "amd64\ 링크를 사용합니다. "링크 위치 복사\ 또는 브라우저에서 제공하는 유사한 옵션을 선택하십시오.
터미널에서 실행 파일을 보관할 /usr/local/bin
디렉토리로 이동합니다. wget
과 공백을 입력한 다음 사이트에서 복사한 URL을 붙여넣습니다.
cd /usr/local/bin
wget https://dl.bintray.com/mitchellh/consul/0.3.0_linux_amd64.zip
이제 앞에서 설치한 unzip
명령을 사용하여 바이너리 패키지를 추출할 수 있습니다. 그런 다음 압축 파일을 제거할 수 있습니다.
unzip *.zip
rm *.zip
이제 모든 서버에서 사용할 수 있는 consul
명령이 있어야 합니다.
부트스트랩 서버 시작
consul 작업을 시작하려면 consul 서버를 가동하고 실행해야 합니다. 권장하는 다중 서버 환경에서 이를 구성할 때 이 단계를 단계별로 수행해야 합니다.
가장 먼저 해야 할 일은 서버 중 하나에서 server
및 bootstrap
모드로 consul 프로그램을 시작하는 것입니다. 서버 모드는 consul이 클라이언트 대신 서버 인스턴스로 시작됨을 의미합니다. 부트스트랩 옵션은 첫 번째 서버에 사용됩니다. 이를 통해 선택 없이 클러스터의 "리더\로 자신을 지정할 수 있습니다(사용 가능한 유일한 서버가 되므로).
호스트를 지정하는 테이블에서 server1
을 부트스트랩 서버로 지정했습니다. server1에서 다음을 입력하여 부트스트랩 인스턴스를 시작합니다.
consul agent -server -bootstrap -data-dir /tmp/consul
현재 터미널에서 서버가 시작되고 이벤트가 발생하면 로그 데이터가 출력됩니다. 로그 데이터의 끝 부분에 다음 줄이 표시됩니다.
. . .
2014/07/07 14:32:15 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:32:17 [WARN] raft: Heartbeat timeout reached, starting election
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Candidate] entering Candidate state
2014/07/07 14:32:17 [INFO] raft: Election won. Tally: 1
2014/07/07 14:32:17 [INFO] raft: Node at 192.0.2.1:8300 [Leader] entering Leader state
2014/07/07 14:32:17 [INFO] consul: cluster leadership acquired
2014/07/07 14:32:17 [INFO] consul: New leader elected: server1.example.com
2014/07/07 14:32:17 [INFO] consul: member 'server1.example.com' joined, marking health alive
보시다시피 초기 노드이므로 클러스터 리더를 찾을 수 없습니다. 그러나 부트스트랩 옵션을 활성화했기 때문에 이 서버는 단일 호스트로 클러스터를 시작하기 위해 자체적으로 리더 상태에 들어갈 수 있었습니다.
다른 서버 시작
server2
및 server3
에서 이제 다음을 입력하여 부트스트랩 옵션 없이 consul 서비스를 시작할 수 있습니다.
consul agent -server -data-dir /tmp/consul
이러한 서버의 경우 로그 항목도 표시됩니다. 마지막에 다음과 같은 메시지가 표시됩니다.
. . .
2014/07/07 14:37:25 [ERR] agent: failed to sync remote state: No cluster leader
2014/07/07 14:37:27 [WARN] raft: EnableSingleNode disabled, and no known peers. Aborting election.
2014/07/07 14:37:53 [ERR] agent: failed to sync remote state: No cluster leader
이는 클러스터 리더를 찾을 수 없고 리더 자체가 될 수 없기 때문에 발생합니다. 이 상태는 두 번째 및 세 번째 서버가 활성화되었지만 아직 서로 연결된 서버가 없기 때문에 발생합니다.
서로 연결하려면 이러한 서버를 서로 연결해야 합니다. 이 작업은 어느 방향에서나 수행할 수 있지만 가장 쉬운 방법은 server1
시스템에서 수행하는 것입니다.
server1
의 현재 터미널 창에서 consul 서버를 실행하고 있으므로 추가 작업을 수행하려면 screen
이 있는 다른 터미널을 만들어야 합니다. 다음을 입력하여 server1
의 기존 화면 세션 내에 새 터미널 창을 만듭니다.
CTRL-A C
그러면 이전 세션이 계속 실행되는 동안 새로운 터미널 인스턴스가 열립니다. 다음을 입력하여 각 기존 터미널 세션을 단계별로 실행할 수 있습니다.
CTRL-A N
새 터미널로 돌아가서 다음과 같이 IP 주소를 참조하여 다른 두 인스턴스를 조인하십시오.
consul join 192.0.2.2 192.0.2.3
이렇게 하면 3개의 서버가 모두 동일한 클러스터에 즉시 결합됩니다. 다음을 입력하여 다시 확인할 수 있습니다.
consul members
Node Address Status Type Build Protocol
server1.example.com 192.0.2.1:8301 alive server 0.3.0 2
server2.example.com 192.0.2.2:8301 alive server 0.3.0 2
server3.example.com 192.0.2.3:8301 alive server 0.3.0 2
위에서 설명한 대로 화면에 새 터미널 세션을 만들고 동일한 명령을 실행하여 다른 서버에서도 이 정보를 얻을 수 있습니다.
부트스트랩 서버 제거 및 일반 서버로 재가입
우리는 세 개의 서버를 모두 클러스터에 결합했지만 아직 완료되지 않았습니다.
현재 server1
은 부트스트랩 모드에서 시작되었으므로 다른 서버와 상의하지 않고 결정을 내릴 수 있는 권한이 있습니다. 그들은 동등하게 작동하고 쿼럼에 따라 결정을 내려야 하므로 클러스터가 부트스트랩된 후 이 권한을 제거하려고 합니다.
이렇게 하려면 server1
에서 consul 서비스를 중지해야 합니다. 이렇게 하면 나머지 머신이 새 리더를 선택할 수 있습니다. 그런 다음 부트스트랩 옵션 없이 server1
에서 consul 서비스를 다시 시작하고 클러스터에 다시 가입할 수 있습니다.
server1에서 consul을 실행하는 터미널로 다시 전환합니다.
CTRL-A N
다음을 입력하여 서비스를 중지합니다.
CTRL-C
이제 부트스트랩 옵션 없이 서비스를 다시 시작합니다.
consul agent -server -data-dir /tmp/consul
열려 있는 터미널로 다시 전환하고 클러스터의 두 서버 중 하나에 연결하여 클러스터에 다시 가입하십시오.
CTRL-A N
consul join 192.0.2.2
이제 세 대의 서버를 동등하게 사용할 수 있어야 합니다. 서로 정보를 복제하고 단일 서버를 사용할 수 없게 되는 상황을 처리합니다. 이제 부트스트랩 없이 서버를 시작하고 클러스터에 가입하기만 하면 추가 서버도 클러스터에 가입할 수 있습니다.
클라이언트로 클러스터에 가입하고 웹 UI 제공
이제 서버 클러스터를 사용할 수 있으므로 계속해서 클라이언트 시스템을 사용하여 연결할 수 있습니다.
클러스터와 상호 작용하고 상태를 모니터링할 수 있도록 클라이언트 시스템에 consul 웹 UI를 배치할 것입니다. 이렇게 하려면 웹 UI의 다운로드 페이지를 방문하십시오. 다운로드 버튼을 마우스 오른쪽 버튼으로 클릭하고 "링크 위치 복사\ 또는 사용 가능한 유사한 옵션을 선택합니다.
클라이언트 시스템에서 홈 디렉토리로 변경하십시오. wget
과 공백을 입력한 다음 페이지에서 복사한 URL을 붙여넣습니다.
cd ~
wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip
다운로드가 완료되면 아카이브의 압축을 풀고 삭제합니다.
unzip *.zip
rm *.zip
영사 웹 UI를 렌더링하는 데 필요한 모든 파일을 포함하는 dist
라는 디렉토리가 있습니다. 클러스터에 연결할 때 이 디렉터리를 지정하기만 하면 됩니다.
클러스터에 연결하기 위해 서버에 사용한 것과 유사한 영사 에이전트 호출을 사용합니다. 그러나 우리는 다른 플래그를 사용할 것입니다.
우리는 클라이언트 모드에서 작동하기를 원하기 때문에 server
플래그를 사용하지 않을 것입니다. 기본적으로 각 노드의 클라이언트 인터페이스는 로컬 루프백 인터페이스를 사용하여 액세스할 수 있습니다. 웹 UI에 원격으로 액세스하고 싶기 때문에 대신 클라이언트의 공용 IP 주소를 지정해야 합니다.
해당 콘텐츠를 제공하려면 웹 UI가 있는 디렉토리를 consul에 지정해야 합니다. 또한 클러스터에 있는 서버 중 하나의 IP 주소를 전달하여 클러스터에 바로 가입할 것입니다. 이렇게 하면 나중에 가입하지 않아도 됩니다. 서버 예제에서도 이 작업을 더 일찍 수행할 수 있었습니다.
결국 연결 명령이 상당히 깁니다. 다음과 같이 표시됩니다.
consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dir -join 192.0.2.1
이렇게 하면 클라이언트 시스템이 서버가 아닌 일반 에이전트로 클러스터에 연결됩니다. 이 에이전트는 일반적인 127.0.0.1
인터페이스 대신 공용 IP 주소에 대한 요청에 응답합니다. 이 때문에 rpc-addr
를 지정하는 모든 consul 명령에 추가 플래그를 추가해야 합니다.
예를 들어 클라이언트에서 구성원 목록을 쿼리하려면 선택한 대체 인터페이스와 포트를 전달해야 합니다.
consul members -rpc-addr=192.0.2.50:8400
Node Address Status Type Build Protocol
agent1 192.0.2.50:8301 alive client 0.3.0 2
server2 192.0.2.2:8301 alive server 0.3.0 2
server1 192.0.2.1:8301 alive server 0.3.0 2
server3 192.0.2.3:8301 alive server 0.3.0 2
이것은 번거로워 보일 수 있지만 영사 웹 인터페이스에 액세스할 수 있는 기회를 제공합니다. 클라이언트의 IP 주소를 방문한 다음 웹 브라우저에서 :8500/ui
를 입력하여 웹 인터페이스에 액세스할 수 있습니다.
http://192.0.2.50:8500/ui
기본 인터페이스는 다음과 같습니다.

다양한 메뉴를 클릭하고 인터페이스를 탐색할 수 있습니다. 이는 클러스터와 시스템 및 서비스의 상태를 시각화하는 좋은 방법을 제공합니다.
서비스 및 수표 추가
이제 이를 설정하기 위한 기본 사용 사례인 consul에 서비스를 추가하려고 합니다. 다양한 방법으로 서비스를 추가할 수 있지만 가장 쉬운 방법은 서비스 정의를 저장할 구성 디렉토리를 만드는 것입니다.
서비스는 서비스 정의를 포함하는 노드와 연결됩니다. 그래서 웹 서버가 있다면 그 서버에 consul agent를 설치하고 거기에 서비스 정의 파일을 만들어야 합니다.
우리의 목적을 위해 클라이언트에 Nginx를 설치하여 이를 시연합니다. 다음을 입력하여 현재 클라이언트 세션을 종료합니다.
CTRL-C
다음을 입력하여 클라이언트에 Nginx를 설치합니다.
apt-get install nginx
이제 서비스 정의를 저장할 구성 디렉토리를 만들 수 있습니다.
mkdir ~/services
이 디렉토리 내에서 웹 서비스를 설명하는 JSON 파일을 생성합니다. 우리는 이것을 web.json
이라고 부를 것입니다:
nano ~/services/web.json
이 파일 안에 서비스 정의를 위한 구조를 포함해야 합니다. 이 구조 내에서 서비스의 실행 여부를 안정적으로 알 수 있도록 서비스의 상태 확인을 위한 하위 구조를 정의합니다.
기본 개요는 다음과 같습니다.
{
"service": {
. . .
"check": {
. . .
}
}
}
서비스의 경우 서비스 이름을 정의하고 확인해야 하는 포트를 consul에 알려야 합니다. 또한 자체 정렬 목적으로 서비스를 임의로 분류하는 데 사용할 수 있는 태그 목록을 제공할 수 있습니다.
이 예에서는 다음과 같습니다.
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
. . .
}
}
}
이것이 서비스 자체를 정의하는 데 필요한 전부입니다. 그러나 우리는 또한 consul이 서비스의 상태를 확인할 수 있는 방법을 정의하고자 합니다. 이것은 일반적으로 매우 간단하며 일반 시스템 관리자의 수동 검사를 복제합니다.
우리 서비스의 경우 자체 문서에 있는 consul 프로젝트 목록으로 curl
을 사용하여 간단한 웹 요청을 구현할 것입니다. 실제로 curl이 검색할 수 있는 것이 무엇인지 알 필요는 없으며 명령이 오류 없이 실행될 수 있는지 여부만 중요합니다. 이 때문에 출력을 버릴 수 있습니다.
또한 검사가 실행되는 간격을 설정해야 합니다. 이것은 항상 성능과 최신 정보 사이의 절충안입니다. 문제가 있는지 비교적 빨리 알고 싶기 때문에 10초를 사용합니다.
{
"service": {
"name": "web server",
"port": 80,
"tags": ["nginx", "demonstration"],
"check": {
"script": "curl localhost:80 > /dev/null 2>&1",
"interval": "10s"
}
}
}
완료되면 파일을 저장하고 닫습니다.
이제 클라이언트 consul 세션을 다시 시작하고 서비스 정의가 있는 이 디렉터리를 가리킬 수 있습니다.
consul agent -data-dir /tmp/consul -client 192.0.2.50 -ui-dir /home/your_user/dist -join 192.0.2.1 -config-dir /home/your_user/services
이렇게 하면 노드가 다시 시작되고 클러스터에 연결됩니다. 웹 인터페이스로 돌아가면 이제 서비스가 표시됩니다.

클라이언트로 돌아가서 새 터미널을 만들고 웹 서버를 일시적으로 중지할 수 있습니다.
CTRL-A C
service nginx stop
웹 UI를 새로 고치면 이제 예상대로 웹 서비스 검사가 실패하는 것을 볼 수 있습니다.

이는 상태 확인이 예상대로 작동하고 있음을 보여줍니다.
결론
이제 consul이 어떻게 작동하는지에 대한 기본적인 아이디어를 얻었을 것입니다. 이 가이드에서 제공한 데모는 프로덕션에서 consul을 처리하는 가장 좋은 방법은 아니지만 소프트웨어의 유용한 기능을 빠르게 볼 수 있도록 하는 데 사용되었습니다.
다음 가이드에서는 프로덕션 환경에서 consul을 사용하는 방법을 다룰 것입니다. 쉽게 참조할 수 있도록 모든 구성 세부 정보를 파일에 넣고 부팅 시 서비스를 시작하는 시작 스크립트를 만듭니다.