도커 교과서-9장

김지수·2023년 5월 29일
0

도커

목록 보기
9/10

이번 장의 주제는 도커를 이용한 체계적인 모니터링이다. 프로메티우스를 사용해 애플리케이션 컨테이너에서 측정된 수치를 수집하고 그라파나를 사용해 수치를 시각화해 이해하기 쉬운 대시보드 형태로 구성한다.

컨테이너화된 애플리케이션에서 사용되는 모니터링 기술 스택

일반적인 모니터링이라하면 잔여 디스크 공간, 메모리 및 CPU 사용량 등을 나타낸다. 하지만 컨테이너화된 애플리케이션의 환경은 훨씬 역동적이다.
프로메테우스는 CNCF(쿠바네티스와 컨테이너 런타임인 containerd를 관리하는 바로 그곳)에서 개발을 담당하며 다양한 곳에서 널리 사용하고 있다. 프로메테우스를 사용하면 모니터링의 일관성이 확보된다.(모든 애플리케이션에서 똑같이 구성된 측정값) 또한 도커 엔진의 측정값도 같은 형식으로 추출할 수 있다.

"metrics-addr" : "0.0.0.0:9323",
"experimental" : true

를 입력함으로써 포트 9323번을 통해 측정값을 공개하도록 하였다.

http://localhost:9323/metrics

지금 본 상태 정보 출력 포맷이 프로케테우스 포맷이다.

$hostIP = $(Get-NetIPConfiguration | Where-Object {$_.IPv4DefaultGateway -ne $null}).IPv4Address.IPAddress

해당 명령어는 다음의 역할을 한다. 컨테이너가 자신을 실행 중인 서버의 IP 주소를 알 수 없기 때문에 이 정보를 컨테이너 환경 변수 형태로 직접 전달해야한다.

docker container run -e DOCKER_HOST=$hostIP -d -p 9090:9090 diamol/prometheus:2.13.1

해당 명령어는 환경변수를 이용해 호스트 컴퓨터와 통신하고 도커 엔진의 상태 측정값을 수집하는 것이다.

Targets 항목에서 원하는 대상의 측정값을 볼 수 있다. DOCER_HOST의 상태가 녹색이라면 프로메테우스가 호스트 컴퓨터를 발견했다는 의미이다.

이후 Grapgh로 가면 모든 측정값의 목록이 담긴 드롭다운 리스트가 나온다.

이 정보들을 통해 우리가 할 일은 컨테이너마다 측정값을 수집할 엔드포인트를 만들고 프로메테우스가 이들 엔드포인트에서 주기적으로 정보를 수집하게 하는 것이다.

애플리케이션의 측정값 출력하기

이번 예제 코드는 이전에 다뤘던 NASA 오늘의 천체 사진 애플리케이션에 프로메테우스 측정값 생성 코드를 추가한 것이다.

각 컴포넌트에 측정값을 출력하는 HTTP 엔드포인트가 추가된다. 예를 들어 웹 애플리케이션은 Go언어로 구현됐으며 프로메테우스를 지원하는 promhttp 모듈을 추가했다. 자바로 구현된 REST API에는 micrometer 패키지가 추가 됐으며 Node.js의 prom-client 패키지가 추가 됐다.

docker container rm -f $(docker container ls -aq)

docker-compose up -d

http://localhost:8010/metrics

이번 장의 예제를 통해 두 애플리케이션에서 프로메테우스 클라이언트 라이브러리가 서로 다른 방식으로 동작한다는 것을 알 수 있다.

측정값 수집을 맡을 프로메테우스 컨테이너 실행하기

프로메테우스는 직접 측정값을 대상 시스템에서 받아다 수집하는 풀링 방식으로 동작한다. 이 측정값을 수집하는 과정을 스크래핑이라 한다. 이렇게 되면 스크래핑 대상 엔드포인트를 설정해야 한다.
설정 중 job 설정이 있는데 이는 해당 스크래핑 작업의 이름과 측정값을 수집할 엔드포인트, 대상 컨테이너를 지정하는 정보로 구성된다. 이 설정에는 두 가지 유형이 있으며 첫 번째는 정적 설정인 static_config인데 호스트명으로 단일 컨테이너를 지정하며, 두번째는 dns_sd_config로 DNS 서비스 디스커버리 기능을 통해 여러 컨테이너를 지정할 수 있고 스케일링에 따라 대상 컨테이너를 자동으로 확대할 수 있다.

docker-compose -f docker-compose-scale.yml up -d --scale accesslog=3

for ($i=1; $i -le 10; $i++) { iwr -useb http://localhost:8010 | Out-Null }

해당 명령어는 access-log 서비스의 공개 포트를 무작위로 설정하는 것을 방지하고 부하를 가해보는 것이다.

웹 애플리케이션은 요청을 받을 때마다 access-log 서비스를 호출할 것이고, 해당 서비스는 세 개의 컨테이너가 동작 중이므로 서비스에 대한 요청은 이들 컨테이너에 고르게 분배될 것이다.

4개가 실패했으니 16개가 나뉜것을 볼 수 있다.

레이블을 붙여 측정값에 정보를 추가하는 기능을 활용하여 다양하게 표현할 수 있다.

sum() 쿼리는 PromQL로 구현돼 있다.

측정값 시각화를 위한 그라파나 컨테이너 실행하기

프로메테우스를 사용해 데이터를 수집했다면, 측정값을 열람하거나 데이터 시각화를 위한 쿼리를 확인하고 손보는 데는 프로메테우스 웹 UI를 사용하고, 이 쿼리를 연결해 대시보드를 구성하는 데는 그라파나를 사용한다. 이를 통해 각 데이터 점은 이해하기 쉽게 시각화되며, 대시보드로 애플리케이션의 상황을 일목요연하게 파악할 수 있다.

그라파나 대시보드는 얼핏 복잡해 보이지만 시각화된 그래프 하나하나는 PromQL로 작성된 단일 쿼리로 그려지며, 이들 쿼리는 측정값의 취합이나 필터링 이상의 복잡한 작업을 필요로 하지 않는다.

$env:HOST_IP = $(Get-NetIPConfiguration | Where-Object {$_.IPv4DefaultGateway -ne $null }).IPv4Address.IPAddress

docker-compose -f ./docker-compose-with-grafana.yml up -d --scale accesslog=3

for ($i=1; $i -le 20; $i++) { iwr -useb http://localhost:8010 | Out-Null }

그라파나의 웹 UI는 포트 3000을 사용하며, 초기 사용자명은 admin이고, 패스워드도 admin이다.

Add panel을 누르고 Add Query 누르고

sum(image_gallery_requests_total{code="500"}) without(instance)

이후 툴바에서 Share Dashboard 아이콘을 클릭해 JSON 파일을 내보낸다.(Export를 누르면 됨)

profile
노는게 제일 좋아

0개의 댓글