etcd 를 사용해 NGINX Plus 용 Service Discovery 구현

해당 포스트는 Service Discovery 를 위한 인기 있는 오픈 소스 도구인 etcd 를 사용하여 NGINX Plus 업스트림 그룹에 서버를 동적으로 추가하거나 제거하는 방법을 설명합니다.
이 솔루션은 NGINX Plus의 동적 구성 API를 사용하여 로드 밸런싱된 서버 집합을 변경할 때 NGINX Plus 구성을 reload할 필요가 없습니다. NGINX Plus 릴리스 8 (R8) 이후로는 API를 사용하여 수행한 변경 사항을 재시작 및 구성 reload 시에도 유지할 수 있습니다.

목차

1. etcd Service Discovery 개요
2. Demo 작동 방식
3. 요약

1. etcd Service Discovery 개요

Service Discovery 는 마이크로서비스 아키텍처를 가진 애플리케이션 및 기타 분산 또는 서비스 지향 시스템에 대한 큰 도전 중 하나입니다.
서비스 인스턴스의 네트워크 위치는 자동 확장, 장애 또는 업그레이드로 인해 자주 변경되므로 일반적으로 동적으로 할당됩니다.
이는 애플리케이션이 서비스 인스턴스의 존재와 현재 위치를 추적하기 위해 정교한 Service Discovery 메커니즘을 필요로 함을 의미합니다.

CoreOS는 공유 구성 및 Service Discovery 를 위한 분산, 일관된 Key-Value 저장소(Store)로 etcd를 개발했습니다.
etcd의 Service Discovery 프로토콜은 공유된 디스커버리 URL을 사용하여 클러스터 Bootstrap 단계에서 새로운 etcd 멤버가 모든 다른 멤버를 발견하는 데 도움을 줍니다.

NGINX Plus의 동적 구성 API를 etcd와 쉽게 결합하기 위해 etcd-demo라는 GitHub 프로젝트를 만들었습니다.
이 프로젝트에는 여기에서 설명한 데모 배포를 설정하는 단계별 지침이 포함되어 있습니다.
Docker, Docker Compose, Homebrew 및 jq와 같은 도구를 사용하여 모든 구성 요소가 별도의 Docker 컨테이너에서 실행되는 Docker 기반 환경을 구축할 수 있으며, NGINX Plus는 HTTP 트래픽을 몇 개의 hello-world 애플리케이션으로 로드 밸런싱합니다.

2. Demo 작동 방식

먼저 다음 앱들 각각을 별도의 Docker 컨테이너로 실행합니다.

  • etcd – 서비스 디스커버리(Service Discovery)를 수행합니다.
  • Registrator – etcd에 서비스를 등록합니다. Registrator는 컨테이너가 시작되거나 중지될 때 모니터링하고, 컨테이너의 상태가 변경될 때마다 etcd를 업데이트합니다.
  • hello – 백엔드 서버를 시뮬레이션합니다.
    이것은 NGINX의 다른 프로젝트로, NGINX 웹 서버로 호스트명, IP 주소 및 포트를 포함한 HTML 페이지를 제공합니다.
  • hello 앱의 두 번째 인스턴스 – 다른 백엔드 서버를 시뮬레이션합니다.
  • NGINX Plus – 다른 나열된 서비스들에 대한 로드 밸런싱을 수행합니다.

NGINX Plus 컨테이너는 공개 포트 80에서 수신 대기하며, 내장된 NGINX Plus 대시보드는 포트 8080에서 수신 대기합니다. etcd 컨테이너는 포트 2379, 2380 및 4001에서 수신 대기하며, Docker 호스트의 IP 주소 (HOST_IP)를 다른 컨테이너가 통신할 때 사용할 주소로 공개합니다.

Registrator는 노출된 포트로 시작된 새로운 컨테이너를 Docker에서 모니터링하고, 해당 서비스를 etcd에 등록합니다. 컨테이너 내에서 환경 변수를 설정함으로써, 서비스를 etcd에 등록하는 방법에 대해 명시적으로 지정할 수 있습니다. 각 hello (웹 서버) 컨테이너에 대해, SERVICE_TAGS 환경 변수를 production으로 설정하여 NGINX Plus에 의해 로드 밸런싱의 대상 서버로 식별합니다. 컨테이너가 종료되거나 제거되면, Registrator는 자동으로 해당 키를 etcd에서 제거합니다.

마지막으로, 데모에 포함된 etcd_exec_watch.sh 스크립트를 사용하여 등록된 서비스 목록에 업데이트가 있을 때마다 외부 핸들러인 script.sh를 호출합니다 (즉, etcd 키에 변경이 있는 경우). 외부 핸들러는 etcd에 의해 설정된 환경 변수를 사용하여 NGINX Plus 업스트림 그룹에 추가하거나 제거할 서버를 결정합니다. ETCD_WATCH_ACTION=set인 경우, 핸들러는 ETCD_WATCH_VALUE로 지정된 서버를 추가하고, ETCD_WATCH_ACTION=delete인 경우, etcd에도 존재하지 않은 서버를 제거합니다.

3. 요약

etcd-demo와 같은 스크립트와 핸들러를 사용하여 etcd에 등록된 서비스를 기반으로 업스트림 그룹을 동적으로 구성하면, NGINX Plus에서의 업스트림 구성 과정을 자동화할 수 있습니다. 이 자동화는 API 호출을 올바르게 수행하는 방법을 찾는 번거로움을 줄여주며, etcd에서 서비스의 상태 변경과 NGINX Plus 업스트림 그룹에의 추가 또는 제거 사이의 시간 간격을 줄여줍니다.

업스트림 그룹을 동적으로 구성하기 위해 필요한 기술들을 NGINX STORE에 문의하여 답변 받아보세요.
아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.