본문 바로가기
카테고리 없음

[AEWS 3기-4주차] prometheus와 grafana 설치하기

by james_janghun 2025. 3. 2.

Prometheus

모니터링의 필수 요소인 Grafana Prometheus에 대해서 다뤄봅니다.

 

일단 Prometheus가 무엇인지 부터 정리해보겠습니다.

SoundCloud사에서 만든 오픈소스 모니터링 툴입니다. 이제는 CNCF 재단에서 관리하고 있습니다.

 

특징

- TSDB(Time Series DataBase)라는 시계열 데이터베이스를 사용하고 있습니다. 기본적으로 데이터를 key:value 형식으로 저장합니다.

 

- PromQL이라는 자체 쿼리문을 사용합니다. 이를 통해 빠르고 쉽게 조회가 가능합니다.

 

- 분산 스토리지에 의존하지 않는 자율적 노드. 서버 자체가 데이터를 수집하고 저장합니다. 그렇기 때문에 단순하게 설정할 수 있고 쉽게 확장할 수 있습니다.

 

- HTTP 기반의 pull 모델 데이터 수집이 가능합니다. 기본적으로 agent 형의 push 모델을 많이 사용하는데 prometheus는 pull 방식을 사용합니다. 그렇기 때문에 부하를 컨트롤 하는데 용이합니다.

 

- 강력한 시각화 기능 제공. 과거보다 최근에는 UI가 많이 개선되어서 대시보드에서 확인도 가능하고, 그래프도 잘 그려줍니다. 물론 그라파나를 따라갈 수 없어서 그라파나를 연동해서 많이 활용합니다.

 

아키텍처 & 구성요소 소개

 

- Prometheus 서버가 TSDB를 스크랩하거나 데이터를 적재합니다.

- Client 라이브러리를 통해서 HTTP 엔드포인트(보통 /metrics)를 자동으로 노출시켜 Prometheus 서버가 데이터를 수집할 수 있게 합니다.

- push gateway는 일시적으로 실행되는 작업(배치 작업, 서버리스 함수 등)이 종료되기 전에 메트릭을 저장할 수 있는 중간 저장소입니다.

- exporters를 통해서 다양한 목적의 서비스를 제공합니다. 예를 들면 HAProxy, StatsD 등이 있습니다.

- alertmanager는 알림을 발생시킬 수 있도록 관리합니다.

 

 

자 바로 일단 prometheus 스택부터 설치해봅시다

설치

certificate까지 적용하고 도메인 적용을 위해서 환경변수를 입력한뒤 아래 yaml을 통해 배포해봅니다.

CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo "alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN"

cat <<EOT > monitor-values.yaml
prometheus:
  prometheusSpec:
    scrapeInterval: "15s"
    evaluationInterval: "15s"
    podMonitorSelectorNilUsesHelmValues: false
    serviceMonitorSelectorNilUsesHelmValues: false
    retention: 5d
    retentionSize: "10GiB"
    storageSpec:
      volumeClaimTemplate:
        spec:
          storageClassName: gp3
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 30Gi

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - prometheus.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

grafana:
  defaultDashboardsTimezone: Asia/Seoul
  adminPassword: prom-operator

  ingress:
    enabled: true
    ingressClassName: alb
    hosts: 
      - grafana.$MyDomain
    paths: 
      - /*
    annotations:
      alb.ingress.kubernetes.io/scheme: internet-facing
      alb.ingress.kubernetes.io/target-type: ip
      alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
      alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
      alb.ingress.kubernetes.io/success-codes: 200-399
      alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
      alb.ingress.kubernetes.io/group.name: study
      alb.ingress.kubernetes.io/ssl-redirect: '443'

  persistence:
    enabled: true
    type: sts
    storageClassName: "gp3"
    accessModes:
      - ReadWriteOnce
    size: 20Gi

alertmanager:
  enabled: false
defaultRules:
  create: false
kubeControllerManager:
  enabled: false
kubeEtcd:
  enabled: false
kubeScheduler:
  enabled: false
prometheus-windows-exporter:
  prometheus:
    monitor:
      enabled: false
EOT

 

지정한 config를 가지고 helm을 배포합니다.

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.0.0 -f monitor-values.yaml --namespace monitoring

 

배포 확인

kubectl get pod,pvc,svc,ingress -n monitoring

 

node-exporter는 물리 노드에 리소스 메트릭을 확인하는데 사용됩니다.

operator는 시스템 경고 메시지 정책으로 애플리케이션 모니터링을 추가하거나 작업을 할 수 있도록 도와주는 역할을 합니다.

kube-state-matrics는 쿠버네티스 클러스터의 상태를 메트릭으로 확인할 수 있습니다.

 

GUI확인

node-exporter이 9100으로 열려있는데 한번 확인해봅시다.

kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter

 

기본적으로 config에서 DNS 설정까지 완료되었으므로 제대로 배포되었다면 다음과 같이 모두 있어야한다.

 

LB에서도 다음과 같이 라우팅이 되는 것을 확인할 수 있습니다.

 

일단 먼저 prometheus 부터 들어가보자. Query에서 간단히 container_memory_usage_bytes를 조회해도 잘 나오는 것을 확인할 수 있습니다.

 

PromQL은 다양하게 활용할 수 있다. 다음과 같이 컨테이너 cpu 사용량을 확인할 수 있습니다.

container_cpu_usage_seconds_total

 

이렇게 특정 네임스페이스만 확인도 가능합니다.

container_cpu_usage_seconds_total{namespace="istio-system"}

Status에서 Target health를 확인하면 타겟으로 등록된 인스턴스가 모두 식별됩니다.

타겟정보를 바꾸고싶으면 config를 변경해야 합니다.

 

 

 

Grafana

그라파나는 데이터 시각화 툴로 같이 깔려있습니다.

 

다음 명령어를 통해서 admin 사용자의 초기 패스워드를 가져올 수 있습니다. 접속해봅시다.

  kubectl --namespace monitoring get secrets kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo

그라파나에서는 data sources를 등록해야만 볼 수 있는데 이미 prometheus가 등록된것을 확인할 수 있습니다.

 

이렇게 다양한 대시보드도 기본으로 제공해줍니다.

 

Coredns 쪽을 살펴봤다. 그림이 매우 잘 나오는 것을 확인할 수 있습니다.

 

대시보드 가져오기

그라파나에서는 타인이 만들어놓은 대시보드를 가져와서 사용할 수 있습니다. import하는 방법은 다음과 같습니다.

Dashboard → New → Import → 15757 입력 후 Load ⇒ 데이터소스(Prometheus 선택) 후 Import 클릭합니다.

 

너무 예쁘게 잘 되고, 다른사람들이 이미 만들어놓은 좋은 대시보드를 사용할 수 있습니다.

다른 여러 대시보드는 여기서 찾을 수 있습니다.

 

만약 쿼리를 수정해보고 싶다면 edit 설정에 들어가서 다음과 같이 Builder 혹은 Code를 놓고, 아래 입력한 다음 Run queries하면됩니다.

Builder는 선택형으로 필터링하고, Code는 직접 QL을 입력하는 것이다. 잘 활용하면 Code가 나중에는 더 편할 것입니다.

sum by (instance) (irate(node_cpu_seconds_total{mode!~"guest.*|idle|iowait", instance="$instance"}[5m]))

 

적용할때는 반드시 save를 눌러줘야합니다.

 

 

이런 필터링 설정은 Settings > Variables에서 설정할 수 있습니다.

 

 

이상으로 Prometheus, Grafana를 알아보았습니다.