1. 타노스란 무엇인가요?
Thanos는 CNCF 인큐베이팅 프로젝트입니다. Thanos는 Prometheus 2.0 스토리지 형식을 활용하여 빠른 쿼리 대기 시간을 유지하면서 모든 개체 스토리지에 기록 메트릭 데이터를 비용 효율적으로 저장합니다. 또한 모든 Prometheus 설치에 대한 전역 쿼리보기를 제공하고 Prometheus HA 쌍의 데이터를 즉시 병합 할 수 있습니다. 저는 사실 프로메테우스의 고가용성에 목표를 두고, 구성하기로했습니다.특징
- Prometheus HA 쌍에서 수집 된 메트릭의 중복 제거 및 병합
- 클러스터 간 연합
- 모든 측정 항목 데이터에 대한 통합 데이터 액세스를위한 간단한 gRPC ‘Store API’
2. 구성 아키텍처
k8s 클러스터에는 다음의 3가지가 설치가 되어있어야 합니다.
- kube-metric-state
- node-exporter
- cadvisor
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를 추가하여 작성합니다 .
6. 마치며..
프로메테우스를 HA로 구성하기 위해서는 프로메테우스 공식으로 제공하는 페더레이션을 사용하거나, 타노스를 사용하여 구성해야 합니다. 하지만, 타노스가 사이드카 방식으로 좀더 손쉽게 구성이 가능하기에 구성을 해보았습니다. 하지만, 여기서 다루지 않은 내용이 있는데 바로 타노스 스토어 입니다. 프로메테우스는 기본적으로 15일의 데이터만 보관/유지 합니다. 데이터를 아카이빙 하기 위해서는 스토리지 서비스를 이용하여 적재할 수 있는데요. 여기서 바로 사용하는 것이 타노스 스토어 입니다. 데이터를 적재하고 해당 데이터를 query하게 됩니다. 이부분은 추후에 진행을 해보겠습니다.함께 보면 좋은 글
- [Monitoring] Prometheus와 Grafana 연동
- [monitoring] Prometheus 설치 가이드(+exporter)
- [DevOps] k8s monitoring with Datadog
- [DevOps] Kubernetes HPA 실전 적용
새 글이 올라오면 Threads @wonizz.ai 에도 올립니다. 팔로우해 두면 피드에서 바로 볼 수 있습니다.