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와 관련된 내용도 다뤄볼 예정이다.
'DevOps > Monitoring' 카테고리의 다른 글
Prometheus 데이터 구조 및 PromQL (0) | 2025.04.06 |
---|
댓글