Consul DNS SRV 레코드로 NGINX Plus Service Discovery 수행

해당 포스트에서는 Consul DNS 인터페이스에서 얻은 DNS SRV 레코드를 사용하여 NGINX Plus 에서 상위 서버를 동적으로 구성하는 방법을 살펴보겠습니다.
이 방법을 사용하면 NGINX Plus는 주기적으로 Consul DNS 를 사용하여 서비스 이름을 재해석합니다. 서비스와 관련된 IP 주소 목록이 변경되면 NGINX Plus는 즉시 업데이트된 서버 그룹 간에 로드 밸런싱을 시작합니다.

목차

1. Consul DNS 데모 작동 방식
 1-1. Consul DNS 기반 로드 밸런싱 구성
2. 요약

1. Consul DNS 데모 작동 방식

NGINX Plus 상위 그룹의 동적 구성과 Consul DNS를 결합하기 쉽도록 consul-dns-srv-demo라는 샘플 데모를 만들었습니다.
이 블로그 포스트에서 설명한 구성을 생성하는 단계별 지침이 포함되어 있습니다. 이 포스트에서는 개념 증명을 진행하겠습니다. Docker, Docker Compose 및 Homebrew와 같은 도구를 사용하여 모든 구성 요소가 별도의 Docker 컨테이너에서 실행되는 Docker 기반 환경을 구축할 수 있습니다.
이 환경에서 NGINX Plus는 HTTP 트래픽을 NGINX 오픈소스 웹 서버 그룹 전체에 대해 로드 밸런싱합니다.

Diagram depicts the setup for the consul dns-srv-demo from NGINX, Inc. NGINX Plus load balances multiple instances of a containerized backend application, obtaining service discovery information that can be used in a microservices architecture from Consul in the form of DNS 'A' and 'SRV' records.

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

  • Consul – 서비스 검색(Service Discovery)을 수행하고 DNS 서비스를 제공합니다.
  • Registrator – 서비스를 Consul에 등록합니다. Registrator는 컨테이너가 시작되거나 중지될 때 모니터링하고 컨테이너의 상태가 변경되면 Consul을 업데이트합니다.
  • hello – 확장 가능한 백엔드 서버를 시뮬레이션합니다. 이것은 NGINX의 다른 프로젝트로, 클라이언트 IP 주소, 요청 URI 및 웹 서버의 호스트명, IP 주소, 포트 및 로컬 시간을 나열하는 HTML 페이지를 제공하는 NGINX 웹 서버입니다. (다이어그램에는 이 앱의 네 개의 인스턴스가 표시됩니다.)
  • NGINX Plus R9 이상 – 백엔드 서버 앱에 대한 로드 밸런싱을 수행합니다.

NGINX Plus 컨테이너는 공개 포트 80에서 listening 하며, 내장된 NGINX Plus 대시보드는 포트 8080에서 listening합니다. Consul 컨테이너는 포트 8300, 8400, 8500 및 53에서 listening 합니다 (마지막 포트는 Docker 호스트의 포트 8600에 매핑되어 TCP 및 UDP를 통해 DNS 쿼리를 수신합니다). Consul은 컨테이너 간 통신을 위해 Docker 호스트의 IP 주소를 전달합니다. (컨테이너를 시작하기 전에 환경 변수 HOST_IP로 구성됨).

노출된 포트를 가진 새로운 Docker 컨테이너가 실행될 때마다, Registrator는 해당 서비스를 Consul에 등록합니다.
컨테이너가 종료되거나 제거되면 Registrator는 자동으로 Consul 서비스 카탈로그에서 해당 서비스를 제거합니다.

컨테이너 내에서 환경 변수를 설정함으로써, 서비스를 Consul에 등록하는 방법에 대해 명시적으로 지정할 수 있습니다.
hello 컨테이너의 경우, 환경 변수 SERVICE_80_NAME을 http로 설정하여 Registrator 내에서 생성된 서비스 객체의 기본 서비스 이름을 재정의합니다. 이후 레지스트리 백엔드 (우리의 경우 Consul)로 프록시됩니다.
이는 NGINX Plus가 서비스=http 매개변수를 사용하여 DNS SRV 쿼리를 보낼 때 hello 컨테이너의 모든 정보 (IP 주소, 포트, 우선순위 및 가중치)를 반환하도록 Consul에 지시합니다.

1-1. Consul DNS 기반 로드 밸런싱 구성

데모 구성에 포함된 app.conf라는 NGINX Plus 구성 파일은 다음 지시문을 사용하여 DNS 기반 로드 밸런싱을 구성합니다.

  • resolver 지시문은 포트 53에서 수신 대기하는 Consul DNS 서비스인 consul이라는 컨테이너를 DNS 서버로 지정합니다. NGINX Plus는 NGINX Plus 컨테이너의 /etc/hosts 파일에서 consul 컨테이너의 IP 주소를 얻습니다.
    valid 매개변수는 NGINX Plus가 Consul DNS에서 제공하는 레코드의 TTL을 무시하고 10초마다 다시 해석하는 것을 의미합니다.
  • server 지시문의 service 매개변수는 NGINX Plus R9에서 도입된 것으로, NGINX Plus가 DNS SRV 레코드를 읽고 name server로부터 service.consul에 대한 IP 주소뿐만 아니라 포트 번호, 가중치 및 우선순위도 얻을 수 있게 합니다. 현재 Consul은 가중치와 우선순위를 지원하지 않으므로 데모에서 NGINX Plus는 Consul에 등록된 백엔드 서버의 포트 번호만 사용합니다.
resolver consul:53 valid=10s;

upstream backend {
    zone upstream_backend 64k;
    server service.consul service=http resolve;
}

server {
    # ...
    location / {
        proxy_pass http://backend;
    }
}

NGINX Plus R9에서 도입된 또 다른 기능은 SRV 레코드를 사용하는 것을 용이하게 하는 것인데, 이는 TCP를 통한 DNS 조회를 지원합니다. SRV 레코드는 다른 유형의 DNS 레코드보다 크기가 크기 때문에 완전한 DNS 응답이 단일 512바이트 UDP 데이터그램에 들어갈 수 없는 경우가 더 많습니다. DNS 서버는 완전하지 않은 응답을 “truncated”로 표시하고, NGINX Plus는 즉시 TCP를 통해 요청을 다시 시도합니다. (이 기능은 또한 마이크로서비스 애플리케이션에서 일반적인 매우 큰 서버 배치를 쉽게 처리할 수 있도록 합니다.) 참고로, 적절한 경우에 truncated 플래그를 설정하여 Consul도 구성해야 합니다. 데모에서는 consul_dns_config.json 파일에서 이 작업을 수행합니다.

2. 요약

Consul의 DNS 인터페이스를 사용하여 업스트림 서버를 동적으로 구성하는 것은 NGINX Plus의 동적 구성 API를 사용하는 대안이며, 자동 확장을 사용하는 업스트림 서버 그룹의 구성을 자주 변경해야하는 조직에 유용합니다.
주요 이점은 NGINX Plus 구성을 직접 수정하지 않고도 업스트림 그룹의 서버를 관리할 수 있다는 것입니다.

서비스 검색(Service Discovery)을 위해 Consul DNS 를 사용하여 NGINX Plus 업스트림 그룹의 자동 구성을 직접 사용해 보십시오.

아래 뉴스레터를 구독하고 NGINX와 NGINX STORE의 최신 정보들을 빠르게 전달 받아보세요.