본문 바로가기
DevOps/Monitoring

Prometheus 소개 및 쿠버네티스에 설치

by 비어원 2025. 3. 20.
728x90

Prometheus는 모니터링과 얼럿 시스템을 구축하기 위해 사용하는 대표적인 오픈소스 도구이다. Prometheus는 여러가지 메트릭을 시계열 데이터로 수집하고 저장한다.

 

주요 기능

Prometheus가 제공하는 주요 기능은 다음과 같다.

  • 메트릭 이름과 key-value 쌍으로 식별되는 시계열 데이터가 포함된 다차원 데이터 모델을 저장한다.
  • PromQL이라는 쿼리 언어를 지원하여 유연하게 쿼리할 수 있다.
  • 단일 서버 노드로 운영된다. (분산 환경 제공 X)
  • 기본적으로 Pull-based model을 사용하여 시계열 데이터 수집이 이루어지며, 필요에 따라 push-gateway라는 중개 게이트웨이를 통해 시계열 데이터를 push-base로 수집하는 것도 가능하다.

 

Architecture

Prometheus는 여러가지 시계열 데이터를 저장하고, 이 데이터를 활용하여 모니터링과 얼럿 시스템을 구축할 수 있게 도와준다. 보통은 Prometheus를 활용한 모니터링 시스템은 다음과 같은 구조로 이루어져 있다.

  • Exporter는 특정 시계열 데이터를 수집하는 주체이며, 수집한 시계열 데이터를 제공하는 HTTP API가 있으면 모두 exporter가 될 수 있다. MySQL, MongoDB, Spring 등 대부분의 오픈소스나 프레임워크에는 메트릭을 수집할 수 있도록 exporter 기능을 자체적으로 제공해준다.
  • Prometheus 서버는 시계열 데이터를 scrape하고 저장한다. scrape는 exporter가 수집하는 시계열 데이터를 pull 방식으로 주기적으로 받아오는 것을 말한다.
  • Pull-based로 메트릭을 수집할 수 없는 경우에는 (준실시간으로 결과가 나오지 않는 경우 등), 메트릭 제공자는 메트릭이 만들어질 때마다 push-gateway로 메트릭을 전달하면 Prometheus는 pull 방식으로 push-gateway에 메트릭을 scrape한다. 즉, Prometheus는 pull 기반으로만 메트릭을 수집할 수 있지만 push-gateway를 두면 메트릭 제공자가 push 기반으로 메트릭을 전달하게끔 할 수 있다는 것이다.
  • Prometheus에서 수집이 된 시계열 데이터는 Grafana 대시보드 (시각화 툴)을 통해 데이터를 쿼리한 후 시계열 데이터를 그래프 등을 활용하여 시각화 할 수 있다.
  • Prometheus에서는 수집하는 특정 메트릭이 특정 수치를 넘기는 경우 Alert를 보낼 수 있는데, AlertManager를 사용하면 Alert이 발생하면 Slack 등의 웹훅이나 Email 등으로 Alert을 알릴 수 있다.

 

쿠버네티스에 설치

대략적인 아키텍처를 이해했으면 실제로 Prometheus를 설치하여 메트릭을 수집해보자. 일단 Helm chart를 사용하여 Prometheus를 쿠버네티스 위에 설치해보자.

 

설치하기에 앞서, Helm repo를 추가하자.

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

 

그 다음 Prometheus를 설치해야 하는데 prometheus-community 레포에는 아주 많은 Prometheus 관련 차트가 제공되어 있다.

$ helm search repo prometheus-community
NAME                                                    CHART VERSION   APP VERSION     DESCRIPTION                                       
prometheus-community/alertmanager                       1.15.2          v0.28.1         The Alertmanager handles alerts sent by client ...
prometheus-community/alertmanager-snmp-notifier         0.4.0           v1.6.0          The SNMP Notifier handles alerts coming from Pr...
prometheus-community/jiralert                           1.7.2           v1.3.0          A Helm chart for Kubernetes to install jiralert   
prometheus-community/kube-prometheus-stack              70.1.1          v0.81.0         kube-prometheus-stack collects Kubernetes manif...
prometheus-community/kube-state-metrics                 5.30.1          2.15.0          Install kube-state-metrics to generate and expo...
prometheus-community/prom-label-proxy                   0.10.2          v0.11.0         A proxy that enforces a given label in a given ...
prometheus-community/prometheus                         27.5.1          v3.2.1          Prometheus is a monitoring system and time seri...
prometheus-community/prometheus-adapter                 4.13.0          v0.12.0         A Helm chart for k8s prometheus adapter           
prometheus-community/prometheus-blackbox-exporter       9.3.0           v0.26.0         Prometheus Blackbox Exporter                      
prometheus-community/prometheus-cloudwatch-expo...      0.27.0          0.16.0          A Helm chart for prometheus cloudwatch-exporter   
prometheus-community/prometheus-conntrack-stats...      0.5.17          v0.4.26         A Helm chart for conntrack-stats-exporter         
prometheus-community/prometheus-consul-exporter         1.0.0           0.4.0           A Helm chart for the Prometheus Consul Exporter   
prometheus-community/prometheus-couchdb-exporter        1.0.0           1.0             A Helm chart to export the metrics from couchdb...
prometheus-community/prometheus-druid-exporter          1.1.1           v0.11.0         Druid exporter to monitor druid metrics with Pr...
prometheus-community/prometheus-elasticsearch-e...      6.7.0           v1.9.0          Elasticsearch stats exporter for Prometheus       
prometheus-community/prometheus-fastly-exporter         0.5.1           v9.0.1          A Helm chart for the Prometheus Fastly Exporter   
prometheus-community/prometheus-ipmi-exporter           0.6.0           v1.10.0         This is an IPMI exporter for Prometheus.          
prometheus-community/prometheus-json-exporter           0.16.0          v0.7.0          Install prometheus-json-exporter                  
prometheus-community/prometheus-kafka-exporter          2.12.1          v1.9.0          A Helm chart to export the metrics from Kafka i...
prometheus-community/prometheus-memcached-exporter      0.4.0           v0.15.0         Prometheus exporter for Memcached metrics         
prometheus-community/prometheus-modbus-exporter         0.1.3           0.4.1           A Helm chart for prometheus-modbus-exporter       
prometheus-community/prometheus-mongodb-exporter        3.11.1          0.43.1          A Prometheus exporter for MongoDB metrics         
prometheus-community/prometheus-mysql-exporter          2.9.1           v0.17.2         A Helm chart for prometheus mysql exporter with...
prometheus-community/prometheus-nats-exporter           2.18.0          0.16.0          A Helm chart for prometheus-nats-exporter         
prometheus-community/prometheus-nginx-exporter          1.0.1           1.4.1           A Helm chart for NGINX Prometheus Exporter        
prometheus-community/prometheus-node-exporter           4.44.1          1.9.0           A Helm chart for prometheus node-exporter         
prometheus-community/prometheus-opencost-exporter       0.1.2           1.108.0         Prometheus OpenCost Exporter                      
prometheus-community/prometheus-operator                9.3.2           0.38.1          DEPRECATED - This chart will be renamed. See ht...
prometheus-community/prometheus-operator-admiss...      0.20.0          0.80.1          Prometheus Operator Admission Webhook             
prometheus-community/prometheus-operator-crds           19.0.0          v0.81.0         A Helm chart that collects custom resource defi...
prometheus-community/prometheus-pgbouncer-exporter      0.5.0           v0.10.2         A Helm chart for prometheus pgbouncer-exporter    
prometheus-community/prometheus-pingdom-exporter        3.1.0           v0.3.0          A Helm chart for Prometheus Pingdom Exporter      
prometheus-community/prometheus-pingmesh-exporter       0.4.1           v1.2.2          Prometheus Pingmesh Exporter                      
prometheus-community/prometheus-postgres-exporter       6.10.0          v0.17.0         A Helm chart for prometheus postgres-exporter     
prometheus-community/prometheus-pushgateway             3.0.0           v1.11.0         A Helm chart for prometheus pushgateway           
prometheus-community/prometheus-rabbitmq-exporter       2.1.1           1.0.0           Rabbitmq metrics exporter for prometheus          
prometheus-community/prometheus-redis-exporter          6.9.0           v1.67.0         Prometheus exporter for Redis metrics             
prometheus-community/prometheus-smartctl-exporter       0.13.0          v0.13.0         A Helm chart for Kubernetes                       
prometheus-community/prometheus-snmp-exporter           9.0.0           v0.28.0         Prometheus SNMP Exporter                          
prometheus-community/prometheus-sql-exporter            0.2.2           v0.5.9          Prometheus SQL Exporter                           
prometheus-community/prometheus-stackdriver-exp...      4.8.2           v0.18.0         Stackdriver exporter for Prometheus               
prometheus-community/prometheus-statsd-exporter         0.15.0          v0.28.0         A Helm chart for prometheus stats-exporter        
prometheus-community/prometheus-systemd-exporter        0.3.0           0.6.0           A Helm chart for prometheus systemd-exporter      
prometheus-community/prometheus-to-sd                   0.4.2           0.5.2           Scrape metrics stored in prometheus format and ...
prometheus-community/prometheus-windows-exporter        0.9.1           0.30.5          A Helm chart for prometheus windows-exporter      
prometheus-community/prometheus-yet-another-clo...      0.39.5          v0.62.1         Yace - Yet Another CloudWatch Exporter            
prometheus-community/yet-another-cloudwatch-exp...      0.39.1          v0.62.1         Yace - Yet Another CloudWatch Exporter

 

그 중에 잘 알려져있는 것 몇 가지를 한번 알아보자.

  • prometheus: 가장 기본적인 형태의 Helm chart로, Prometheus를 설치할 수 있으며 자주 사용하는 Exporter인 kube-state-metrics, prometheus-node-exporter, prometheus-pushgateway 와 AlertManager 또한 해당 차트를 사용하여 한꺼번에 설치가 가능하다.
  • alertmanager: AlertManager를 설치해야 하는 경우 해당 차트로 설치하면 된다.
  • kube-prometheus-stack: Prometheus Operator를 사용하여 Prometheus를 운영 및 관리하기 위해 사용되는 설치 방법. 아직 쿠버네티스에 대해 잘 모르거나 Operator 패턴에 대해 잘 모르면 러닝커브가 있을 수 있다.
  • kube-state-metrics: 쿠버네티스 리소스와 관련된 메트릭을 수집하는 Exporter이다.
  • prometheus-node-exporter: 가장 대표적인 Exporter로, 노드(서버)의 상태를 메트릭으로 수집하는 Exporter이다. 노드의 CPU, Memory, Network 및 File system 등의 상태를 수집할 수 있다.

위에서 소개한 차트 외에도 Prometheus에서 자체적으로 제공하는 Exporter들이 많은데, 필요하다면 자유롭게 추가해도 무방하다. 그리고 Prometheus 서버 자체를 설치하기 위해서는 prometheus 또는 kube-prometheus-stack을 설치하면 되는데 가장 기본적인 형태인 prometheus 차트를 설치할 예정이다.

PersistentVolume 결정

Prometheus는 시계열 데이터를 저장하는 TSDB가 내장되어 있기 때문에 Prometheus를 배포할 때에는 볼륨에 신경을 써야 한다. 당연히 영구 저장이 가능한 PersistentVolume을 사용하는 것이 좋으며, 상황이 된다면 클라우드에서 제공하는 Dynamic provisioning으로 PersistentVolume을 사용하는 것이 좋다. 하지만 클라우드를 사용하지 못하는 경우나 로컬에서 간단히 공부나 테스트를 위하는 목적이라면 Local Storage가 적당할지도 모른다.

 

아래는 Local Storage를 사용하는 목적이라면 참고하고, 아니면 건너뛰면 된다.

 

Dynamic provisioning에 대해서는 아래 문서를 참고하자.

 

Dynamic Volume Provisioning

Dynamic volume provisioning allows storage volumes to be created on-demand. Without dynamic provisioning, cluster administrators have to manually make calls to their cloud or storage provider to create new storage volumes, and then create PersistentVolume

kubernetes.io

 

 

Local Storage 사용

Local PersistentVolume을 사용해야 하는 경우에는 다음과 같이 local storage용 StorageClass를 추가해야 한다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer

 

그리고 직접 PersistentVolume과 PersistentVolumeClaim을 지정해야 한다.

 

pvc.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: prometheus
  namespace: monitoring
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  resources:
    requests:
      storage: 8Gi

 

pv.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
  name: prometheus
spec:
  capacity:
    storage: 8Gi
  volumeMode: Filesystem
  accessModes:
  - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /mnt/prometheus
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - k8s-wn2

 

 

nodeSelector에 있는 k8s-wn2 값은 워커노드 이름인데, 해당 워커노드의 로컬 스토리지를 사용하겠다는 것이다. 추가로 해당 워커노드에 접속해서 local.path 에 지정한 경로 이름에 맞게 디렉터리를 생성하자.

beer1@k8s-wn2: ~$ mkdir -p /mnt/prometheus

 

 

pv와 pvc가 생성되면 다음과 같이 조회가 될 것이다. Pending이 정상이며, prometheus가 해당 PVC를 볼륨으로 사용하게 되면 Binding이 될 것이다.

$ kubectl get pv  
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS    REASON   AGE
prometheus   8Gi        RWO            Retain           Available           local-storage            5s

$ kubectl get pvc 
NAME         STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS    AGE
prometheus   Pending                                      local-storage   5s

 

Helm chart로 Prometheus 설치

 

PersistentVolume을 결정하였다면 Helm chart로 Prometheus를 설치해보자.

 

prometheus.yaml

server:
  retention: "15d"
  global:
    scrape_interval: 15s
    scrape_timeout: 10s
    evaluation_interval: 1m

  persistentVolume:
    enabled: true
    existingClaim: "prometheus"
    size: 8Gi

  resources: 
    limits:
      memory: 512Mi
    requests:
      memory: 512Mi

kube-state-metrics:
  enabled: true

prometheus-node-exporter:
  enabled: true

alertmanager:
  enabled: false

prometheus-pushgateway:
  enabled: false
  • server.retention: 시계열 데이터 보관기간으로 현재 시각 기준 15일이 지난 데이터는 삭제된다.
  • server.global.scrape_interval: Prometheus가 Exporter에게 데이터를 수집하는 주기로, 여기서는 15초마다 exporter에게 메트릭을 요청한다.
  • server.global.scrape_timeout: exporter에게 메트릭을 요청할 떄의 타임아웃
  • server.global.evaluation_interval: Alert과 관련된 설정으로, Alert rule 평가 주기이다.
  • server.persistentVolume.existingClaim은 Local Storage를 사용할 때 PVC 이름을 넣으면 되고, 만약 Cloud Provider를 사용하여 Dynamic provisioning으로 PV를 할당받으려면 server.persistentVolume.existingClaim을 지우고 server.persistentVolume.storageClass 을 사용하면 된다.

 

$ helm install prometheus prometheus-community/prometheus -n monitoring -f prometheus.yaml

 

차트 배포를 성공하면 다음과 같이 파드가 잘 뜨는 것을 확인할 수 있다.

kubectl get po -n monitoring
NAME                                             READY   STATUS    RESTARTS   AGE
prometheus-kube-state-metrics-648ddc549f-kzmk8   1/1     Running   0          9m28s
prometheus-prometheus-node-exporter-cjrmh        1/1     Running   0          9m28s
prometheus-prometheus-node-exporter-pkp7l        1/1     Running   0          9m28s
prometheus-prometheus-node-exporter-q457b        1/1     Running   0          9m28s
prometheus-server-7d56c5d696-cggjs               2/2     Running   0          9m28s

 

Prometheus UI 확인

port-forward 명령어를 사용하여 간단히 Prometheus UI에 접근할 수 있다. (http://localhost:8080)

$ kubectl port-forward svc/prometheus-server 8080:80

 

 

Prometheus UI 안에서 PromQL을 사용하여 쿼리를 날려볼 수 있으며, Alert에 대한 정보도 확인이 가능하다.

 

마무리

이번 시건에는 Prometheus에 대한 소개와 대략적인 아키텍처를 알아보고 쿠버네티스로 직접 설치까지 해봤다. 추후에는 Prometheus 메트릭 데이터 및 PromQL에 대해 정리하고, Scrape 설정 하는 방법과 Alert와 관련된 내용도 다뤄볼 예정이다.

 

 

728x90

'DevOps > Monitoring' 카테고리의 다른 글

Prometheus 데이터 구조 및 PromQL  (0) 2025.04.06

댓글