Docker 및 NGINX Plus를 통한 Health Check
NGINX Plus Health Check 는 백엔드 서버의 상태를 실시간으로 확인하고, 가용성과 성능을 유지하는데 큰 도움을 줍니다.
따라서 NGINX Plus를 사용하는 기업에서는 Health Check를 설정하여 서비스를 안정적으로 운영할 필요가 있습니다.
목차
1. 개요
2. Health Check 접근 방식
2-1. 요청 횟수 기반 Health Check
2-2. CPU 기반 Health Check
2-3. 메모리 사용량 기반 Health Check
3. NGINX Health Check 구성
4. 결론
1. 개요
마이크로서비스 환경에서 컨테이너를 실행할 때 서비스 인스턴스는 메모리나 CPU와 같은 리소스 제한으로 인해 과부화 되기 쉽습니다. 이 문제를 해결하기 위한 여러가지 전략이 있습니다.
해당 포스트에서는 NGINX Plus Active Health Check 를 통해 해결하는 방법을 설명합니다.
Active Health Check 는 주기적으로 백엔드 서버에 요청을 보내 응답 상태를 확인하는 방식입니다.
이 방식은 백엔드 서버에 문제가 발생하더라도 NGINX Plus가 즉시 감지하여 문제가 있는 서버를 제거할 수 있습니다. Active Health Check 는 HTTP, TCP, UDP, SMTP 등 다양한 프로토콜을 지원합니다.
세 가지 사용 사례에 대해 중점을 두겠습니다.
- 요청 횟수 기반. 서비스에 대한 요청이 너무 커서 서비스 인스턴스가 한 번에 하나의 요청만 처리할 수 있는 경우 이 방법을 사용합니다.
- CPU 기반. CPU 사용률이 주요 제한 요소이고 서비스가 새 요청을 수락하지 않는 CPU 사용량 임계값을 설정하려는 경우 이 방법을 사용합니다.
- 메모리 사용량 기반. 메모리 사용률이 주요 제한 요소이고 서비스가 새 요청을 수락하지 않는 메모리 사용 임계값을 설정하려는 경우 이 방법을 사용합니다.
이 세 가지 방법은 모두 동일한 기본 방식으로 작동합니다. NGINX Plus는 위의 방법 중 하나를 기반으로 활성 상태 점검을 구현하는 프로그램을 호출하여 비정상 상태 또는 정상 상태의 서버 상태를 반환합니다. NGINX Plus는 로드 밸런싱 순환에서 비정상적인 서버를 제거하고 정상적인 서버를 순환 상태로 유지합니다(또는 이전에 비정상적이었던 경우 다시 추가).
2. Health Check 접근 방식
각 방법에 대해 자세히 알아보겠습니다. 예제 코드는 GitHub의 NGINX 저장소 에서 사용할 수 있습니다.
모든 예제에서 로드 밸런서로 NGINX Plus를 사용하고 애플리케이션 서버로 NGINX Unit을 사용하고 있습니다. 두 가지 예제는 PHP로 작성되었고 하나는 Python으로 작성되었습니다. 모든 것은 Docker 컨테이너 에서 실행됩니다.
2-1. 요청 횟수 기반 Health Check
이 방법의 경우 애플리케이션은 요청을 수신할 때 세마포어 파일 /tmp/busy를 생성한 다음 요청 처리가 완료되면 파일을 제거합니다. 상태 검사는 파일이 지정된 서비스 인스턴스에 있는지 여부를 확인합니다.
이 경우 인스턴스가 비정상으로 간주되고 NGINX Plus에서 해당 인스턴스에 대한 요청 전송을 중지합니다.
파일이 존재하지 않으면 인스턴스가 정상인 것으로 간주되고 NGINX Plus에서 요청을 보냅니다.
이 예제에서는 단일 Python 프로그램인 testcnt.py 을 사용하여 애플리케이션과 상태 검사를 모두 구현합니다. 실행할 함수는 요청 URI에 의해 결정됩니다.
상태 점검 간의 가장 짧은 간격은 1초이므로 NGINX Plus가 서비스 인스턴스가 비정상(사용 중)인지 확인하는 데 시간이 걸릴 수 있습니다. 이 시간 동안 NGINX Plus가 서비스 인스턴스에 다른 요청을 보낼 수 있습니다.
이 경우를 처리하기 위해 다른 요청이 도착했을 때 이미 요청을 처리 중인 경우 애플리케이션은 상태 코드 503을 반환합니다. 이 경우 NGINX Plus는 다른 인스턴스를 시도합니다.
2-2. CPU 기반 Health Check
컨테이너의 CPU 사용량 매트릭을 가져오기 위해 Docker API를 사용할 수 있지만, 이는 Docker 호스트를 기준으로 상대적으로 나타납니다.
다른 말로 하면, Docker API가 컨테이너의 CPU 사용률을 25%로 보고하면, 그것은 Docker 호스트의 CPU 중 25%를 사용한다는 것을 의미합니다.
이 예제에서는 애플리케이션에 70%의 임계값을 설정하고, 애플리케이션의 각 컨테이너에 동일한 비율의 임계값 백분율을 할당합니다.
예를 들어, 컨테이너가 하나이면 Docker 호스트의 CPU의 70%를 사용할 수 있습니다. 컨테이너가 두 개인 경우, 각각은 Docker 호스트의 CPU의 35%를 사용할 수 있습니다. 우리는 NGINX Plus API를 사용하여 애플리케이션의 컨테이너 수를 가져옵니다.
두 개의 PHP 프로그램이 있습니다. testcpu.php
는 CPU 부하를 생성하고 hcheck.php
는 Health Check를 수행합니다.
컨테이너의 통계를 얻기 위해 Health Check 프로그램은 Docker 호스트에서 다음과 같이 Docker API를 호출합니다:
http://Docker_Host_IP_Address:Docker_API_Port/containers/Container ID/stats?stream=0
CPU 사용률을 계산하려면 예제에서 API를 두 번 호출해야 합니다. 호출은 1초 간격으로 이루어집니다. CPU 사용률은 두 호출에서 cpu_stats.cpu_usage.total_usage
필드를 비교하여 계산됩니다.
2-3. 메모리 사용량 기반 Health Check
CPU 기반 예제와 마찬가지로, 이 예제는 Docker API를 사용하여 메모리 사용량 메트릭을 검색합니다. 각 컨테이너는 128 MB의 메모리로 제한되며, 메모리 사용량 메트릭은 이 제한을 기준으로 상대적으로 나타납니다.
두 개의 PHP 프로그램이 있습니다. testmem.php
는 메모리를 사용하고 hcheck.php
는 Health Check를 수행합니다. 메모리 사용량이 70%를 초과하면, Health Check는 비정상 상태를 반환합니다.
Health Check는 CPU 사용률 방법과 동일한 Docker API 호출을 수행하지만 다른 필드를 사용합니다. 메모리 사용률의 백분율은 memory_stats.usage
을 memory_stats.stats.hierarchical_memory_limit
으로 나눈 값입니다.
3. NGINX Health Check 구성
NGINX의 주요 설정 파일 (/etc/nginx/nginx.conf
)을 변경 할 필요는 없습니다. 그러나 Error 로그에서 상세한 health check 메시지를 볼 수 있도록 하려면, 아래 예제처럼 심각도(severity level)를 info로 설정하면 됩니다.
error_log /var/log/nginx/error.log info;
샘플 애플리케이션의 NGINX Plus 구성은 다음과 같습니다. 이를 읽으며 특히 사용하거나 수정할 때 다음 사항을 염두에 두세요:
- Consul은 DNS Service Discovery에 사용됩니다. Consul과 NGINX Plus 모두 DNS SRV 레코드를 지원하므로 NGINX Plus는 컨테이너의 IP 주소뿐만 아니라 포트 번호도 가져올 수 있습니다. 이는 Docker 포트 매핑을 사용하기 때문에 필요합니다.
- 포트 80에서 수신 대기하는 첫 번째 server 블록은 직접 Health Check을 수행하는 프로그램으로 요청을 보낼 수 있도록합니다. NGINX Plus가 불건전한 서버로 요청을 전달하지 않는 Health Check가 구성된 가상 서버에 요청을 보내면 이러한 유형의 응답을 볼 수 없기 때문입니다.
- 이해를 돕기 위해 구성은 최소한의 지시문만 포함되어 있으며 Best Practices 구성에 포함되어 있는 모든 지시문을 포함하지 않습니다.
- Health Check 간격은 모두 짧으므로 데모 중 시스템이 빠르게 응답합니다. 제품 환경에서는 계수 기반(count-based) Health Check의 1초 간격은 아마도 여전히 적당합니다. 서비스가 바쁘게 되면 가능한 빨리 NGINX Plus가 요청을 보내는 것이 좋기 때문입니다. CPU 및 메모리 건강 상태 확인의 경우 제품에서 더 긴 간격을 설정할 수 있습니다.
- 이 구성과 CPU Health Check 프로그램은 NGINX Plus R14에서 도입된 NGINX Plus API Version 2를 사용하는 내장 라이브 활동 모니터링 대시 보드를 사용합니다.
- 이 구성과 프로그램은 Docker 컨테이너의 애플리케이션에서 Active Health Check을 사용하는 가능한 방법의 예시입니다. 제품 또는 대규모 운영환경에서 테스트되지 않았습니다.
애플리케이션 구성 예제 (/etc/nginx/conf.d/backend.conf):
# Configure DNS. Point to Consul.
resolver consul:53 valid=2s;
resolver_timeout 2s;
# The upstream groups are populated via DNS
upstream unitcnt {
zone unitcnt 64k;
server service.consul service=unitcnt resolve;
}
upstream unitcpu {
zone unitcpu 64k;
server service.consul service=unitcpu resolve;
}
upstream unitmem {
zone unitmem 64k;
4. 결론
NGINX Plus의 Active Health Check 는 Docker에서 실행되는 서비스의 용량 제한을 다루는 쉬운 방법으로, 서비스 인스턴스가 과부하되지 않도록 도와줍니다.
NGINX Plus 무료 평가판을 받고 사용해보세요! 모든 예제 코드는 GitHub의 NGINX 저장소에서 사용할 수 있습니다.