웹사이트 검색

Ubuntu 14.04의 프로덕션 환경에서 Consul을 구성하는 방법


소개

Consul은 분산형, 고가용성, 데이터 센터 인식 서비스 검색 및 구성 시스템입니다. 클라이언트가 자신이 속한 인프라에 대한 최신 보기를 항상 가질 수 있도록 하는 유연하고 강력한 인터페이스에 서비스와 노드를 표시하는 데 사용할 수 있습니다.

Consul은 인프라에 대한 일관되고 사용 가능한 정보를 제공하는 데 사용되는 다양한 기능을 제공합니다. 여기에는 서비스 및 노드 검색 메커니즘, 태깅 시스템, 상태 확인, 합의 기반 선택 루틴, 시스템 전체 키/값 저장소 등이 포함됩니다. 조직 내에서 consul을 활용하면 애플리케이션과 서비스에 대한 정교한 인식 수준을 쉽게 구축할 수 있습니다.

마지막 가이드에서 일부 영사의 기능에 대한 간단한 데모를 제공했습니다. 이 가이드에서는 인프라에 대한 서비스 검색 구현을 시작하는 데 사용할 수 있는 프로덕션 준비 consul 구성 생성을 시작합니다.

전제 조건 및 목표

이 시리즈에서는 서로 통신하고 서비스 정보, 키/값 저장소 풀 및 클라이언트 시스템에 대한 기타 세부 정보를 유지할 수 있는 서버 시스템을 설정합니다. 시스템 생산 준비를 위한 첫 번째 단계는 소프트웨어를 설치하고 일부 구성을 자동화할 때 이 가이드에서 수행됩니다.

consul 문서에서는 서버 장애 시 데이터 손실을 방지하기 위해 각 데이터 센터에서 3개 또는 5개의 consul 서버를 실행할 것을 권장합니다. 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 다운로드 및 설치

영사 안내서의 초기 소개에서 아직 영사를 설치하지 않았다면 지금 설치해야 합니다. 구성 중인 4대의 시스템 각각에 시스템 수준 응용 프로그램으로 consul을 설치할 것입니다.

영사 응용 프로그램을 살펴보기 전에 unzip을 가져와 실행 파일을 추출해야 합니다. 로컬 시스템 패키지 캐시를 업데이트한 다음 apt를 사용하여 패키지를 설치합니다.

apt-get update
apt-get install unzip

이제 영사 프로그램을 받을 수 있습니다. 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을 쉽게 시험해 볼 수 있습니다. 이렇게 하면 몇 가지 기능을 테스트할 수 있습니다. 소프트웨어에 익숙해지기 위해 마지막 가이드에서 이 작업을 수행했습니다.

그러나 우리는 관리하기 쉽고 보다 안정적인 시스템을 설정하려고 시도할 것이므로 이 작업을 수행할 수 있는 구조를 만들 것입니다. 각 컴퓨터(서버 및 클라이언트)에서 다음 단계를 완료하십시오.

가장 먼저 처리해야 할 작업은 작업에 특정한 사용자를 생성하는 것입니다. 이것은 사용자 권한 분리의 표준 사례이므로 전용 사용자로 영사 프로세스를 실행합니다.

다음을 입력하여 지금 사용자를 만듭니다.

adduser consul

원하는 경우 모든 프롬프트를 건너뛸 수 있습니다(비밀번호를 설정하고 싶을 수도 있습니다. 그렇지 않으면 불평할 것입니다).

다음으로 서비스를 시작하려는 방법에 따라 사용할 다양한 구성을 수용할 구성 계층을 생성합니다. 이를 쉽게 하기 위해 /etc 구성 구조에 상위 consul.d 디렉토리를 만들고 bootstrap, 서버클라이언트는 각 시스템에서 다음과 같습니다.

mkdir -p /etc/consul.d/{bootstrap,server,client}

나중에 이들 각각에 구성을 넣을 수 있습니다. 각 서버는 아마도 이러한 디렉토리 중 최대 두 개를 사용하지만 각 호스트에서 일관성을 위한 구조를 만들 것입니다.

또한 consul이 재부팅 사이에 영구 데이터를 저장할 수 있는 위치를 만들어야 합니다. 이를 위해 /var/consul에 디렉토리를 만들고 데이터를 관리할 수 있도록 consul 사용자에게 제공합니다.

mkdir /var/consul
chown consul:consul /var/consul

이 구조를 사용하면 구성 파일 제작을 시작할 수 있습니다.

부트스트랩 구성 만들기

생성해야 하는 첫 번째 구성은 클러스터를 부트스트랩하기 위한 것입니다. 이는 처음에 클러스터를 생성하는 데만 필요하므로 매우 일반적인 이벤트는 아닙니다. 그러나 클러스터가 완전히 다운되는 경우 빠르게 다시 시작할 수 있도록 구성 파일을 만들 것입니다.

이 구성 파일을 영사 서버 중 하나만 배치하거나 모든 서버에 추가하여 부트스트래핑에 대한 추가 옵션을 제공할 수 있습니다. 이 데모에서는 server1에만 배치할 것입니다.

구성 파일은 간단한 JSON에 저장되므로 관리가 매우 쉽습니다. bootstrap 하위 디렉터리에 첫 번째 파일을 만듭니다.

nano /etc/consul.d/bootstrap/config.json

이 파일에서 이 구성을 사용할 때 consul이 부트스트랩 모드에서 서버로 시작하도록 지정하여 시작할 수 있습니다.

{
    "bootstrap": true,
    "server": true
}

클러스터가 상주할 데이터 센터도 지정해야 합니다. 클러스터의 물리적 위치를 식별하는 데 도움이 되는 모든 이름이 될 수 있습니다. Consul은 데이터 센터를 인식하며 이러한 지정은 데이터 센터별로 다양한 클러스터를 구성하는 데 도움이 됩니다.

/var/consul에 생성한 데이터 디렉토리를 전달할 수도 있습니다. Consul은 이것을 사용하여 클러스터 상태에 대한 정보를 저장합니다.

{
    "bootstrap": true,
    "server": true,
    "datacenter": "nyc2",
    "data_dir": "/var/consul"
}

다음으로 영사가 사용하는 속삭임 프로토콜에 일부 암호화를 구현하려고 합니다. 공유 비밀 시스템을 사용하여 이 기능이 내장되어 있습니다. 암호는 16비트 base-64로 인코딩된 문자열이어야 합니다. 이 값에 적합한 값을 얻기 위해 일시적으로 파일을 종료합니다.

터미널에서 consul 명령을 사용하여 필요한 길이와 인코딩의 키를 생성할 수 있습니다. 유형:

consul keygen
X4SYOinf2pTAcAHRhpj7dA==

생성된 값을 복사하고 구성 파일을 다시 엽니다.

nano /etc/consul.d/bootstrap/config.json

복사한 문자열을 encrypt 매개변수의 값으로 사용합니다.

{
    "bootstrap": true,
    "server": true,
    "datacenter": "nyc2",
    "data_dir": "/var/consul",
    "encrypt": "X4SYOinf2pTAcAHRhpj7dA=="
}

마지막으로 로그 수준을 지정하고 로깅에 syslog를 사용할 것임을 나타내기 위해 몇 가지 추가 정보를 추가합니다.

{
    "bootstrap": true,
    "server": true,
    "datacenter": "nyc2",
    "data_dir": "/var/consul",
    "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
    "log_level": "INFO",
    "enable_syslog": true
}

완료되면 파일을 저장하고 닫습니다.

일반 서버 구성 만들기

이제 부트스트랩 구성이 완료되었으므로 이를 일반 서버 구성의 기초로 사용할 수 있습니다. 클러스터가 부트스트랩되면 서버 구성이 사용됩니다.

편집을 위해 부트스트랩 파일을 server1에서 해당 컴퓨터의 서버 하위 디렉터리로 복사하여 시작합니다.

cp /etc/consul.d/bootstrap/config.json /etc/consul.d/server

파일을 열어 필요한 사항을 수정합니다.

nano /etc/consul.d/server/config.json

시작하려면 부트스트랩 플래그를 꺼야 합니다. 이 구성은 부트스트랩이 아닌 구성을 위한 것이기 때문입니다.

서버 구성에 대해 수정해야 하는 유일한 다른 사항은 이 노드가 시작할 때 연결을 시도해야 하는 다른 서버의 IP 주소를 지정하는 것입니다. 이렇게 하면 자동으로 조인되므로 서버가 시작된 후 수동으로 클러스터에 조인할 필요가 없습니다.

{
    "bootstrap": false,
    "server": true,
    "datacenter": "nyc2",
    "data_dir": "/var/consul",
    "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
    "log_level": "INFO",
    "enable_syslog": true,
    "start_join": ["192.0.2.2", "192.0.2.3"]
}

encrypt 매개변수는 시스템의 모든 참여자에 대해 반드시 동일해야 하므로 파일 복사는 이미 해당 요구 사항을 처리했습니다. 새 구성을 만들 때 이 점을 염두에 두십시오.

완료되면 파일을 저장하십시오.

이 구성 파일의 내용을 consul 서버로 작동할 다른 시스템에 복사해야 합니다. 첫 번째 호스트에서 했던 것처럼 /etc/consul.d/server/config.json의 파일에 배치합니다.

다른 호스트에서 수정해야 하는 유일한 값은 연결을 시도해야 하는 IP 주소입니다. 자신의 IP가 아닌 첫 번째 서버에 연결을 시도하는지 확인해야 합니다. 예를 들어, 이 예제의 두 번째 서버에는 다음과 같은 파일이 있습니다.

{
    "bootstrap": false,
    "server": true,
    "datacenter": "nyc2",
    "data_dir": "/var/consul",
    "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
    "log_level": "INFO",
    "enable_syslog": true,
    "start_join": ["192.0.2.1", "192.0.2.3"]
}

완료되면 생성한 파일을 저장하고 닫습니다.

클라이언트 구성 만들기

이제 서버 구성이 모두 완료되었습니다. 적절한 구성으로 클라이언트 시스템을 시작하고 실행하는 데 집중할 수 있습니다.

클라이언트 시스템의 클라이언트 하위 디렉토리에서 구성 파일을 엽니다.

nano /etc/consul.d/client/config.json

새 구성의 기초로 이전 구성을 다시 사용합니다. 서버 파일 중 하나의 내용을 이 파일에 복사합니다.

서버 구성에만 적용되고 server 매개변수를 false로 변경하기 때문에 bootstrap 매개변수에 대한 언급을 제거하는 것으로 시작하겠습니다.

다음으로 웹 UI 디렉토리의 위치를 지정하는 매개변수를 추가합니다. 우리는 이것에 필요한 파일을 곧 얻을 것입니다. 상주할 위치는 /home/consul/dist입니다.

마지막으로 모든 서버를 나열하도록 start_join 매개변수를 조정하려고 합니다.

{
    "server": false,
    "datacenter": "nyc2",
    "data_dir": "/var/consul",
    "ui_dir": "/home/consul/dist",
    "encrypt": "X4SYOinf2pTAcAHRhpj7dA==",
    "log_level": "INFO",
    "enable_syslog": true,
    "start_join": ["192.0.2.1", "192.0.2.2", "192.0.2.3"]
}

완료되면 파일을 저장하고 닫습니다.

웹 UI 파일 다운로드

이제 웹 UI를 제공하도록 클라이언트를 구성했으므로 이를 수행할 수 있는 실제 파일을 가져와야 합니다.

영사 웹사이트에서 영사 웹 UI에 대한 링크를 마우스 오른쪽 버튼으로 클릭하고 "링크 위치 복사\ 또는 유사한 옵션을 선택합니다.

클라이언트에서 su를 사용하여 consul 사용자가 됩니다. consul 사용자의 홈 디렉토리에 웹 디렉토리를 설정할 것입니다.

su consul
cd ~

이제 wget을 입력한 다음 공백을 입력하고 웹 UI 다운로드를 위해 복사한 링크를 붙여넣습니다. 이 글을 쓰는 시점에서는 다음과 같이 표시됩니다.

wget https://dl.bintray.com/mitchellh/consul/0.3.0_web_ui.zip

다운로드한 파일의 압축을 풀고 zip 파일을 제거합니다.

unzip *.zip
rm *.zip

이렇게 하면 홈 디렉토리 내에 dist라는 디렉토리가 생성됩니다. 구성 파일에서 웹 UI 매개변수를 가리키는 디렉토리입니다.

계속하기 전에 영사 사용자 세션을 종료하여 루트 세션으로 돌아가야 합니다.

exit

시작 스크립트 만들기

이제 구성 파일이 준비되었습니다. 다음으로 부팅 시 consul 인스턴스가 자동으로 시작되고 문제가 발생할 경우 다시 시작되도록 시작 스크립트를 만드는 데 집중할 수 있습니다.

클러스터 부트스트래핑은 자주 수행해야 하는 작업이 아니므로(대부분의 경우 클러스터 자체가 지속되고 단일 노드를 다시 시작하고 클러스터에 다시 가입해야 할 수 있음) 부트스트래핑을 시작 스크립트에 포함하지 않습니다. 곧 이 프로세스를 수동으로 완료하는 방법을 알려드리겠습니다.

우리의 시작 스크립트는 서버와 클라이언트에서 유사합니다. consul 서버 중 하나에서 /etc/init 디렉토리 내에 파일을 생성하여 consul 구성을 보관합니다.

nano /etc/init/consul.conf

이 파일의 내용을 다른 서버에 복사한 다음 클라이언트 구성의 기초로도 사용합니다. 이 파일 내에서 비즈니스의 첫 번째 순서는 프로세스에 대한 설명을 작성하는 것입니다. 서버에서 다음을 사용합니다.

description "Consul server process"

다음으로 프로세스가 시작되는 조건을 지정합니다. 이 서비스의 경우 로컬 파일 시스템이 마운트되고 공용 네트워크 인터페이스가 실행 중일 때 서비스가 시작되기를 원합니다.

또한 프로세스를 중지해야 하는 시기를 지정하려고 합니다. 표준 Linux 런레벨을 사용하여 정상 작동 모드 중 하나가 아닐 때마다 프로세스를 중지하도록 지시할 수 있습니다(서버를 중지하거나 재부팅할 때 프로세스 중지).

description "Consul server process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

프로세스가 예기치 않게 종료되면 init 시스템에 프로세스를 다시 시작하도록 지시할 수 있습니다. 또한 프로세스가 실행되어야 하는 사용자와 그룹을 지정하려고 합니다. 프로세스를 격리하기 위해 영사 사용자 및 그룹을 생성했음을 기억하십시오.

description "Consul server process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

respawn

setuid consul
setgid consul

마지막으로 실행하려는 실제 명령을 제공해야 합니다. 이것은 단순히 에이전트 모드에서 실행되는 consul 명령입니다. 서버 구성 사양이 포함된 디렉토리를 명령에 대한 인수로 전달합니다.

description "Consul server process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

respawn

setuid consul
setgid consul

exec consul agent -config-dir /etc/consul.d/server

완료되면 파일을 저장하십시오.

이 파일의 내용을 각 서버와 클라이언트의 /etc/init/consul.conf 파일에 복사합니다.

클라이언트에서 파일을 약간 수정해야 합니다. 이것이 클라이언트 시스템이라는 사실을 참조하도록 설명을 변경해야 합니다. 또한 실제 consul 명령으로 전달되는 구성 디렉토리를 변경해야 합니다.

최종 파일은 다음과 같아야 합니다.

description "Consul client process"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

respawn

setuid consul
setgid consul

exec consul agent -config-dir /etc/consul.d/client

완료되면 파일을 저장하고 닫습니다.

클러스터 시작하기

이제 우리는 영사 클러스터를 신속하게 시작하고 실행할 수 있는 모든 것을 갖추고 있습니다. 프로세스는 비교적 간단합니다.

부트스트랩 구성 파일이 포함된 서버(이 경우 server1)에서 su를 사용하여 consul 사용자로 잠시 변경합니다. 그런 다음 consul을 호출하고 부트스트랩 디렉터리를 인수로 전달할 수 있습니다.

su consul
consul agent -config-dir /etc/consul.d/bootstrap

서비스가 시작되고 터미널 창을 차지해야 합니다. 부트스트랩 모드에서 이 서버는 클러스터를 형성하기 위한 기반을 만드는 리더로 스스로 선출됩니다.

다른 consul 서버에서 루트로 다음을 입력하여 upstart 스크립트로 방금 생성한 consul 서비스를 시작합니다.

start consul

이러한 서버는 부트스트랩 서버에 연결되어 클러스터를 완성합니다. 이 시점에서 우리는 3개의 서버로 구성된 클러스터를 보유하고 있으며 그 중 2개는 정상적으로 작동하고 있고 그 중 1개는 부트스트랩 모드에 있습니다. 즉, 다른 서버와 상의하지 않고 실행 결정을 내릴 수 있습니다.

이것은 우리가 원하는 것이 아닙니다. 우리는 각 서버가 동등한 위치에 있기를 원합니다. 이제 클러스터가 생성되었으므로 부트스트랩된 consul 인스턴스를 종료한 다음 일반 서버로 클러스터에 다시 들어갈 수 있습니다.

이렇게 하려면 부트스트랩 서버의 터미널에서 CTRL-C를 누르십시오.

CTRL-C

이제 루트 세션으로 돌아가서 나머지 서버와 마찬가지로 consul 서비스를 시작합니다.

exit
start consul

이렇게 하면 이전에 부트스트랩된 서버가 승격되지 않은 권한으로 클러스터에 가입하여 클러스터가 최종 상태가 됩니다.

이제 클러스터가 완전히 작동하므로 클라이언트 시스템을 연결할 수 있습니다. 클라이언트 시스템에서 루트와 동일한 절차를 수행합니다.

start consul

클라이언트는 클라이언트로서 클러스터에 연결됩니다. 컴퓨터에서 구성원에 대해 consul에 요청하여 클러스터 구성원(서버 및 클라이언트)을 볼 수 있습니다.

consul members
Node     Address             Status  Type    Build  Protocol
server3  192.0.2.3:8301  alive   server  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
agent1   192.0.2.50:8301    alive   client  0.3.0  2

웹 UI에 연결

클러스터에 대한 웹 인터페이스를 호스팅하도록 클라이언트 시스템을 구성했습니다. 그러나 이것은 로컬 인터페이스에서 제공되고 있으므로 시스템의 공용 인터페이스를 사용하여 액세스할 수 없습니다.

웹 UI에 액세스하기 위해 UI 파일을 보유하는 클라이언트 시스템에 대한 SSH 터널을 생성합니다. Consul은 포트 8500에서 HTTP 인터페이스를 제공합니다. 로컬 포트 8500을 클라이언트 시스템의 포트 8500으로 터널링합니다. 로컬 컴퓨터에서 다음을 입력합니다.

ssh -N -f -L 8500:localhost:8500 root@192.0.2.50

그러면 원격 시스템에 연결되고 로컬 포트와 원격 포트 사이에 터널이 생성된 다음 연결이 백그라운드로 전환됩니다.

이제 로컬 웹 브라우저에서 다음을 입력하여 영사 웹 인터페이스에 액세스할 수 있습니다.

http://localhost:8500

이렇게 하면 기본 웹 UI 페이지가 제공됩니다.

이 인터페이스를 사용하여 서버의 상태를 확인하고 서비스 및 인프라에 대한 개요를 얻을 수 있습니다.

웹 UI 사용을 마치면 SSH 터널을 닫을 수 있습니다. ps 명령과 grep을 사용하여 우리가 전달한 포트 번호를 검색하여 프로세스의 pid 번호를 검색합니다.

ps aux | grep 8500
1001      5275  0.0  0.0  43900  1108 ?        Ss   12:03   0:00 ssh -N -f -L 8500:localhost:8500 root@192.241.170.60
1001      5309  0.0  0.0  13644   948 pts/7    S+   12:12   0:00 grep --colour=auto 8500

위의 출력에서 강조 표시된 숫자(우리가 사용한 터널링 명령이 포함된 줄)는 우리가 찾고 있는 pid 번호입니다. 그런 다음 이를 kill 명령에 전달하여 터널을 닫을 수 있습니다.

kill 5275

결론

이제 영사 구성원을 안정적으로 관리할 수 있습니다. 영사 클러스터는 빠르고 쉽게 부트스트랩 및 시작할 수 있습니다. 기존 서버의 구성 파일(consul config 및 upstart 스크립트)을 복사하여 추가 노드를 빠르게 구성할 수 있습니다.

이제 우리는 서비스를 쉽게 관리할 수 있는 방식으로 영사 환경을 설정했지만 아직 통신 보안을 완전히 확보하지 못했습니다. 다음 가이드에서는 구성원의 RPC 통신을 암호화하고 유효성을 검사하기 위해 SSL 인증서 유효성 검사를 설정하는 방법에 중점을 둘 것입니다.