[monitoring] Prometheus-Thanos 연동 가이드

안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 프로메테우스의 가용성을 유지하기 위한 방법에 대해서 정리를 하도록 하겠습니다. 프로메테우스의 가장큰 단점은 가용성을 유지하기 위해서 복잡한 절차를 유지해야된다는 것입니다. 프로메테우스에서 공식적으로 제공하는 가이드는 페더레이션이라는 방식인데, 하이라키를 유지하면서 프로메테우스를 중첩되게 구성을 하여 가용성을 유지하는 것입니다.

이는 유지하기도 복잡하고, 프로메테우스의 프로메테우스를 구성하다보니, 구성차제도 간단하지가 않습니다.

그렇게 서칭을 하다보니, thanos라는 것을 알게 되었습니다. 프로메테우스에 추가적으로 설치를 통해서 구성이 가능하며, 본 포스팅에서 아키텍처와 구성의 방식에 대해서 간단히 소개하도록 하겠습니다.

Thanos 로고

1. 타노스란 무엇인가요?

Thanos는 CNCF 인큐베이팅 프로젝트입니다.

Thanos는 Prometheus 2.0 스토리지 형식을 활용하여 빠른 쿼리 대기 시간을 유지하면서 모든 개체 스토리지에 기록 메트릭 데이터를 비용 효율적으로 저장합니다. 또한 모든 Prometheus 설치에 대한 전역 쿼리보기를 제공하고 Prometheus HA 쌍의 데이터를 즉시 병합 할 수 있습니다. 저는 사실 프로메테우스의 고가용성에 목표를 두고, 구성하기로했습니다.

특징

  • Prometheus HA 쌍에서 수집 된 메트릭의 중복 제거 및 병합
  • 클러스터 간 연합
  • 모든 측정 항목 데이터에 대한 통합 데이터 액세스를위한 간단한 gRPC ‘Store API’

sidecar

위의 아키텍처에서 보면, Tahnos Sidecar라는 것이 보일것입니다. Prometheus와는 별개로, 타노스 사이드카를 배포하여 storeAPI를 통해서 grpc 포트를 개방해둡니다. 그렇게 되면, Thanos Query쪽에서 모든 프로메테우스 옆에 붙어있는 사이드카로부터 API를 호출하여 메트릭들을 저장하게 됩니다.

2. 구성 아키텍처

thanos_1

k8s 클러스터에는 다음의 3가지가 설치가 되어있어야 합니다.

  • kube-metric-state
  • node-exporter
  • cadvisor

각 exporter를 타겟으로 프로메테우스에서 pull 방식으로 수집을 진행합니다. 수집이 정상적으로 되고있는 것은, prometheus의 target에서 확인을 합니다.

thanos_2

prometheus의 /targets로 접속을 하게 되면, 위에 보이는 것과 같이 정상적으로 익스포터 타겟팅이 노출되게 됩니다.

3. 타노스 사이드카 구성방법

수집이 정상적으로 되었으면, 이제는 각 프로메테우스 서버내에 사이드카 구성으로, 타노스 사이드카를 설치할 차례 입니다. 설치는 간단하게 docker 명령어를 통해서 container로 설치를 진행하겠습니다.

docker run -d --net=host \
    -v /data/docker/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
    --name prometheus-sidecar \
    -u root \
    quay.io/thanos/thanos:v0.21.1 \
    sidecar \
    --http-address 0.0.0.0:19090 \
    --grpc-address 0.0.0.0:19190 \
    --reloader.config-file /etc/prometheus/prometheus.yml \
    --prometheus.url http://127.0.0.1:9090 && echo "Started sidecar for Prometheus"

위의 명령어에서 quay.io/thanos/thanos:v0.21.1 결국 타노스 이미지를 이용하는 것이고, 명령어로 sidecar 라고 주고 각 옵션들에 대해서 나열합니다. 보게 되면, http/grpc로 서비스를 하고 각 포트를 명시합니다. 그리고 prometheus.yml 파일을 볼륨으로 넣어주고, reloader옵션을 줘서, 사이드카가 리로드를 할때 해당 config 파일을 보도록 합니다.

정상적으로 명령어를 입력하게되면, prometheus에서도 역시 target을 추가 해줍니다.

  - job_name: 'sidecar'
    static_configs:
      - targets: ['{hostip_1}:19090', '{hostip_2}:19090']

필자는 상위 아키텍처에서 2대의 프로메테우스 서버를 구축하고 있으므로, 위와 같이 사이드카는 2개로 설정을 넣어줍니다. sidecar로부터 수집하는 데이터는 프로메테우스에서 표현할 수 있는데, 가령, 아래와 같이 쿼리를 수행하면, 현재 사이드카가 정상적으로 운용중이라는 것을 알 수 있습니다.

# 프로메테우스 쿼리에서 아래의 내용을 입력.
thanos_sidecar_prometheus_up

# 출력
thanos_sidecar_prometheus_up{instance="10.0.3.11:19090", job="sidecar"}
thanos_sidecar_prometheus_up{instance="10.0.3.12:19090", job="sidecar"}

4. 타노스 쿼리 구성방법

타노스 쿼리는 타노스 사이드카로부터 storeAPI를 통해서 데이터를 받아오는 역할을 수행합니다. 아무래도 2대의 프로메테우스에서 동일한 타겟팅 메트릭들이 수집이 되다보니, 중복 데이터가 들어올 것입니다. 쿼리는 바로 여기서 중복된 데이터를 merge해서 하나의 데이터로 보이게 합니다.

docker run -d --net=host --rm \
       --name querier \
       quay.io/thanos/thanos:v0.21.1 \
       query \
       --http-address 0.0.0.0:29090 \
       --query.replica-label replica \
       --store  10.0.3.11:19190 \
       --store  10.0.3.12:19190 && echo "Started Thanos Querier"

실제로 서비스가 올라올 포트는 29090 포트를 사용하고 있습니다. 그리고 한가지 중요한 것이 있는데, –query.replica-label replica 해당 옵셥입니다. 라벨링이 표기된 프로메테우스 타겟팅에 대해서 merge작업을 할때 같은 데이터로보고 하나로 표현을 해줍니다. 해당 내용은 프로메테우스 config 파일에 있습니다.

#1번 프로메테우스 서버
  external_labels:
    cluster: prometheus-1
    replica: 0

#2번 프로메테우스 서버
  external_labels:
    cluster: prometheus-1
    replica: 1

5. 그라파나 연동

그라파나 연동은 굉장히 심플합니다. 그라파나 인스턴스에 docker, docker-compose를 설치합니다. 그리고 아래의 docker-compose.yml 파일을 작성해서 넣습니다.

/data/grafana/docker-compose.yml
/grafana_data
/grafana_provisioning

  grafana:
    container_name: grafana
    image: grafana/grafana
    environment:
      - GF_SECURITY_ADMIN_USER=admin
      - GF_SECURITY_ADMIN_PASSWORD=admin
      - GF_USERS_ALLOW_SIGN_UP=false
    volumes:
      - /data/grafana/data:/var/lib/grafana
      - /data/grafana/provisioning:/etc/grafana/provisioning
    ports:
      - 3000:3000

결국 grafana도 데이터를 hostpath에 보관하기 위해서 volume을 통해서 마운트를 연결해주었습니다. 그리고 그라파나 옵션을 통해서 admin password까지 셋팅을 완료했습니다.

grafana의 설정에 접속하여, data source를 다음과 같이 thanos query를 추가하여 작성합니다 .

thanos_3

6. 마치며..

프로메테우스를 HA로 구성하기 위해서는 프로메테우스 공식으로 제공하는 페더레이션을 사용하거나, 타노스를 사용하여 구성해야 합니다. 하지만, 타노스가 사이드카 방식으로 좀더 손쉽게 구성이 가능하기에 구성을 해보았습니다. 하지만, 여기서 다루지 않은 내용이 있는데 바로 타노스 스토어 입니다. 프로메테우스는 기본적으로 15일의 데이터만 보관/유지 합니다. 데이터를 아카이빙 하기 위해서는 스토리지 서비스를 이용하여 적재할 수 있는데요. 여기서 바로 사용하는 것이 타노스 스토어 입니다. 데이터를 적재하고 해당 데이터를 query하게 됩니다. 이부분은 추후에 진행을 해보겠습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다