1964 words
10 minutes
[Kubernetes]07. Prometheus
Overview
01. Monitoring
쿠버네티스 모니터링의 특징은 크게 두 가지로 볼 수 있다.
- 서비스 디스커버리 : 기본적으로 신규 파드가 자동으로 모니터링 대상으로 등록되야 하는 것. 모니터링 대상을 등록하는데 따르는 추가 리소스 및 시간지연 을 최소화 해야 하는것.
- 어플리케이션 모니터링 : 어플리케이션의 성능 및 상태를 모니터링 하는 것. 파드 자체가 어플리케이션 프로세스이기 때문에 관점이 어플리케이션 중심으로 간다.
k8s에서 모니터링 대상
- 컨테이너 자원 사용량 모니터링: CPU, 메모리, 스토리지, 네트워크 등 컨테이너 자원 사용량을 모니터링
- 클러스터 모니터링 : 사용중인 쿠버네티스 리소스 수량, 종류, 이벤트메시지 등 전반적인 클러스터 상태를 모니터링
- 어플리케이션 모니터링 : control plane, kubelet, kube-proxy, etcd, coredns, ingress controller 뿐만 아니라 개발자가 추가로 설치한 어플리케이션도 모니터링 대상
02. Prometheus
Concept
- Pull 방식 모니터링 : Prometheus 서버가 주기적으로 모니터링 대상을 스크랩하여 수집
- Push 방식 모니터링 : Agent를 설치하고 Agent가 중앙 서버로 모니터링 정보를 Push하는 방식
Prometheus 특징
- 서비스 디스커버리
- Pull 방식
- 시계열 데이터베이스(TSDB)
- Application Exporters : 다양한 어플리케이션이 Prometheus와 연동할 수 있도록 Exporter를 제공
03. Prometheus Architecture
Concept
- alertmanager : Alert를 수신하고, Alert를 처리(중복제거, 메시지그룹화, 일시 중지등의 사후처리) 후 이메일이나 슬랙으로 전송 하는 컴포넌트
- prometheus-pod : prometheus-pod은 쿠버네티스 클러스터 내에서 메트릭 수집, 저장, 쿼리 기능을 제공하는 프로메테우스의 핵심 구성요소
- 사이드카 컨테이너 : 주 컨테이너와 함께 배포되는 보조 컨테이너로, 주 컨테이너의 기능을 보완하거나 추가적인 기능을 제공하는 역할을 함. 모니터링 context에서 사이드카 컨테이너는 main 애플리케이션 컨테이너와 같은 pod 안에서 실행되며, 메인 애플리케이션의 메트릭을 수집하고 프로메테우스 형식으로 변환하여 HTTP 엔드포인트로 노출하는 역할을 함
- prometheus-operator : 경고메시지 정책(prometheus rule) , 어플리케이션 모니터링 대상 등의 추가 등의 작업을 편리하개 하기 위한 CRD 지원
- kube-state-metrics : 쿠버네티스 의 상태를 metrics 형식으로 변환하여 prometheus-pod에 노출하는 exporter
Prometheus Workflow
- prometheus-pod는 statefulset으로 배포됨
- 모니터링 대상이 되는 pod는 exporter라는 별도의 사이드카 형식의 컨테이너로 모니터링 대상이 되는 메트릭을 노출함
- 해당 메트릭을 prometheus-pod는 pull 방식으로 수집함
- prometheus-pod는 수집한 메트릭을 내부의 TSDB에 저장함
- 저장된 메트릭은 prometheus 웹서버 또는 grafana를 통해 시각화 할 수 있음
- alert는 alertmanager가 수신하여 처리함
프로메테우스의 전체 동작 흐름을 이해하려면 데이터의 생성부터 최종 활용까지의 여정을 따라가보는 것이 좋습니다.
1. 메트릭 생성 및 노출
- 애플리케이션 또는 시스템이 자체 메트릭을 생성하거나, 별도의 exporter 컨테이너가 메트릭을 수집하여 HTTP 엔드포인트로 노출됨
2. 서비스 디스커버리
- 프로메테우스는 쿠버네티스 API를 통해 모니터링 대상 pod들을 자동으로 발견-> 정적 설정 파일에 의존하지 않고 동적으로 변화하는 클러스터 환경에 대응할 수 있게 해줌
- scrape_configs에서 정의된 규칙에 따라 어떤 pod를 모니터링할지 결정됨
3. 메트릭 수집
- 프로메테우스가 설정된 주기(보통 15초~1분)마다 각 타겟의 메트릭 엔드포인트에 HTTP GET 요청을 보내 메트릭을 pull 방식으로 수집함
- 이는 push 방식과 달리 프로메테우스가 수집 주기와 실패 처리를 완전히 제어할 수 있게 해줌
4. 데이터 저장 및 관리
- 수집된 메트릭이 내장된 TSDB(Time Series Database)에 효율적으로 압축되어 저장됨
- retention 정책에 따라 오래된 데이터는 자동으로 삭제되며, 데이터 무결성을 위한 WAL(Write-Ahead Log) 메커니즘도 동작함
5. 쿼리 및 시각화
- 저장된 데이터를 PromQL이라는 전용 쿼리 언어로 조회할 수 있으며, 이를 통해 프로메테우스 웹 UI나 그라파나에서 다양한 형태로 시각화됨
6. 알림 처리
- 프로메테우스가 정의된 알림 규칙을 평가하여 조건에 맞는 알림을 AlertManager로 전송함
StatefulSet 배포의 의미
- 기본적으로 StatefulSet으로 배포한다는 것은 데이터에 지속성을 부여하는 것을 의미
- 프로메테우스는 시계열 데이터를 지속적으로 저장해야 하므로 영구 볼륨이 필요
- StatefulSet은 각 pod에 전용 PersistentVolume을 자동으로 할당하고, pod가 재시작되어도 동일한 볼륨을 유지함
- 이는 메트릭 데이터의 연속성을 보장하는 핵심 요소
- 고가용성 환경에서는 여러 프로메테우스 인스턴스가 서로 다른 데이터를 수집하거나, 동일한 데이터를 중복 수집할 수 있음
- StatefulSet의 안정적인 네트워크 정체성은 이런 복잡한 구성을 관리하는 데 필수적임
아키텍처 시각화
graph TD %% 메트릭 생성 단계 A[Application Container<br/>메인 애플리케이션] --> B[Sidecar Exporter<br/>메트릭 수집 & 변환] A1[Database Container] --> B1[MySQL Exporter] A2[Web Server Container] --> B2[Nginx Exporter]
%% 메트릭 노출 B --> C[":9090/metrics<br/>HTTP 엔드포인트<br/>프로메테우스 형식"] B1 --> C1[":9104/metrics"] B2 --> C2[":9113/metrics"]
%% 쿠버네티스 서비스 디스커버리 K8S[Kubernetes API<br/>Pod 정보 제공] --> SD[Service Discovery<br/>모니터링 대상 자동 발견]
%% 프로메테우스 스크랩 설정 SD --> SC[Scrape Config<br/>수집 규칙 & 주기 설정]
%% 메트릭 수집 (Pull) SC --> P[Prometheus Pod<br/>StatefulSet] P -->|HTTP GET 요청<br/>15초~1분 주기| C P -->|Pull 방식 수집| C1 P -->|메트릭 수집| C2
%% 데이터 저장 P --> TSDB[(TSDB<br/>Time Series Database<br/>압축 저장 & WAL)]
%% 데이터 보존 정책 TSDB --> RP[Retention Policy<br/>오래된 데이터 자동 삭제]
%% 쿼리 & 시각화 TSDB --> QL[PromQL<br/>쿼리 언어] QL --> PWI[Prometheus Web UI<br/>기본 대시보드] QL --> GF[Grafana<br/>고급 시각화]
%% 알림 처리 P --> AR[Alert Rules<br/>알림 규칙 평가] AR -->|조건 만족시| AM[AlertManager<br/>알림 관리] AM --> NG[Notification<br/>이메일/슬랙/SMS]
%% 고가용성 구성 (선택사항) P --> P2[Prometheus Pod 2<br/>중복 수집/샤딩] P2 --> TSDB2[(TSDB 2)]
%% PV 연결 (StatefulSet 특성) PV[Persistent Volume<br/>데이터 영속성] --> TSDB PV2[Persistent Volume 2] --> TSDB2
%% 스타일링 classDef appContainer fill:#e1f5fe classDef exporter fill:#f3e5f5 classDef prometheus fill:#ffebee classDef storage fill:#e8f5e8 classDef visualization fill:#fff3e0 classDef alert fill:#fce4ec
class A,A1,A2 appContainer class B,B1,B2 exporter class P,P2 prometheus class TSDB,TSDB2,PV,PV2 storage class PWI,GF,QL visualization class AR,AM,NG alert03. 설치
Helm Chart 설치
#!/bin/bash
echo "add helm repo prometheus"
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
echo "update helm repo"
# set helm path
HELM_REPO=~/helm-repo
helm pull prometheus-community/kube-prometheus-stack --destination $HELM_REPO
echo "Prometheus Helm Chart downloaded to $HELM_REPO"
tar xvfz $HELM_REPO/kube-prometheus-stack*.tgz -C $HELM_REPO
echo "Prometheus Helm chart extracted to $HELM_REPO/kube-prometheus-stack"my values.yaml 수정
- prometheus operator를 찾을 때 Configuration for Prometheus operator service로 검색하면 보다 쉽게 찾을 수 있다.
Reference
[Kubernetes]07. Prometheus
https://yjinheon.netlify.app/posts/05system/k8s/k8s_07_prometheus/