Kubernetes - Prometheus를 통한 모니터링 데이터 수집

2025. 11. 8. 21:23·Container & DevOps

Prometheus 개념

출처: https://prometheus.io/

프로메테우스는 쿠버네티스 모니터링 표준으로 사용되는 오픈소스 애플리케이션이다.  시스템이나 애플리케이션의 상태를 숫자 지표(metric)로 수집하고 저장하는 역할을 한다.
예를 들어 CPU 사용률, 웹 서버 요청 수, 에러율 같은 지표를 수집해 시간별로 저장하고, 이를 그래프나 알람으로 활용할 수 있다.

 

Prometheus 기본 구조

 

1. 쿠버네티스 노드(Kubernetes Node)

  • 쿠버네티스 클러스터는 여러 개의 노드(Worker Node) 로 구성된다.
  • 각 노드에는 Kubelet과 cAdvisor 같은 컴포넌트가 실행되어, 노드 및 파드의 리소스 사용량(CPU, 메모리, 네트워크, 디스크 등)을 실시간으로 수집한다.
  • 이 정보들은 Prometheus Exporter 형태로 노출된다.
    • kubelet이 /metrics 엔드포인트에서 메트릭 제공
    • node-exporter가 OS 수준의 CPU, 메모리 사용량 제공

2. 프로메테우스(Prometheus)

  • 프로메테우스는 각 노드나 파드의 Exporter로부터 데이터를 주기적으로 수집(scrape)한다.
  • 수집된 데이터는 내부 시계열(time-series) 데이터베이스에 저장된다.
  • 이 데이터베이스는 Persistent Volume(퍼시스턴트 볼륨) 에 연결되어 있다.

3. 퍼시스턴트 볼륨(Persistent Volume)

  • 퍼시스턴트 볼륨은 프로메테우스 서버가 사용하는 스토리지 공간이다.
  • 이곳에는 수집된 모든 메트릭 데이터(시계열 데이터)가 저장된다.
  • 프로메테우스 Pod 하나가 이 퍼시스턴트 볼륨을 마운트하여 독점적으로 사용하게 된다.

4. 알럿 매니저(Alertmanager)

  • Prometheus는 수집된 메트릭을 기반으로 알람 규칙(alert rule)을 평가한다.
  • 특정 조건(CPU 90% 초과 등)이 만족되면 Alertmanager로 경고 메시지를 전달한다.
  • Alertmanager는 그 알림을 Slack, Email, PagerDuty 등으로 전송한다.

5. 그래파나(Grafana)

  • Grafana는 Prometheus의 API를 통해 데이터를 시각화한다.
  • 사용자는 웹 대시보드에서 CPU 사용량, Pod 상태 등을 한눈에 볼 수 있다.
  • Grafana는 Prometheus의 데이터를 읽기만 할 뿐, 자체적으로 데이터를 저장하지 않는다.

 

Prometheus & Grapana 설치

헬름 레포지토리에 prometheus-community 추가하고, 헬름 차트를 최신 상태로 동기화 한다.

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

 

다음과 같이 헬름 패키지를 다운로드 한다.

helm pull prometheus-community/kube-prometheus-stack

 

압축해제를 한다.

tar xvfz kube-prometheus-stack-54.0.1.tgz

 

디렉토리 이름에 버전을 포함시켜준다.

mv kube-prometheus-stack kube-prometheus-stack-54.0.1

 

디렉토리 안에 들어가서 values.yaml 파일을 확인한다.

cd kube-prometheus-stack-54.0.1
ls

 

 

Prometheus & Grapana 설정 변경

프로메테우스 기본 설정에서 변경할 값들은 다음과 같다.

설정을 수정하기 위해 복사본을 만든다.

cp values.yaml my-values.yaml

 

service.type: ClusterIP → NodePort

  • Prometheus 웹 콘솔(기본 포트 9090)은 원래 쿠버네티스 클러스터 내부에서만 접근 가능하다.
  • 하지만 실습 환경처럼 외부(브라우저나 로컬 PC)에서 접속하려면
  • NodePort 타입으로 바꿔야 외부 IP를 통해 접근할 수 있다.

→ http://<노드IP>:<노드포트> 형태로 접속 가능
→ 외부 사용자가 직접 메트릭, 타임시리즈, Alert 상태를 볼 수 있다.

 

serviceMonitorSelectorNilUsesHelmValues: true → false

  • 해당 옵션은 Prometheus가 어떤 ServiceMonitor를 감시할지를 결정한다.
  • true: Helm 차트 내부에 정의된 기본 ServiceMonitor만 수집한다.
  • false: 클러스터 전체에 존재하는 모든 ServiceMonitor를 자동 인식한다.
  • 즉, 여러 네임스페이스에 존재하는 exporter (예: Node Exporter, kube-state-metrics 등)도 Prometheus가 자동으로 감시하려면 반드시 false로 바꿔야 한다.

→ Prometheus가 쿠버네티스 전역 리소스를 모니터링 가능.
→ Helm 설치 시 자동 배포된 exporter들이 정상적으로 수집됨.

 

retention: 10d

  • Prometheus의 시계열 데이터는 기본적으로 짧은 기간(약 15일 미만)만 보존된다.
  • retention을 통해 데이터를 얼마나 오래 저장할지를 지정한다.
  • 여기서 10d는 “10일간 데이터 보존”이라는 뜻이다.

→ 오래된 메트릭 자동 삭제
→ PV 공간 관리 가능
→ 운영 환경에서는 보통 15~30일로 설정한다.

 

retentionSize: "1GiB"

  • Prometheus는 시계열 데이터를 블록 형태로 저장하기 때문에
  • 데이터가 무한히 쌓이면 PV 용량을 초과한다.
  • 이를 방지하기 위해 보존 용량을 제한한다.

→ Prometheus 데이터가 1GiB를 넘기면 오래된 블록부터 자동 삭제된다.
→ 불필요한 로그 폭증 방지.

 

storageSpec

  • 기본값: 비어 있음 ({})
  • 기본값으로 두면 Pod가 재시작될 때마다 데이터가 모두 사라진다.
  • Prometheus의 TSDB(시계열 데이터베이스)는 /prometheus 경로에 저장되는데, 이걸 퍼시스턴트 볼륨(PV) 에 연결해야 데이터가 유지된다.
  • 예시 설정
    • storageSpec: volumeClaimTemplate: spec: accessModes: ["ReadWriteOnce"] resources: requests: storage: 10Gi

→ Prometheus Pod가 재시작되어도 메트릭 데이터 유지
→ PV에 실제 파일(wal, chunks, data 등) 저장
→ 운영 환경에서 필수 설정이다.

 

resources.requests.storage: 50Gi (혹은 다른 크기)

  • PV 크기를 정의하는 부분이다.
  • Prometheus는 시계열 데이터를 대량으로 저장하므로 여유 공간을 확보해야 한다.

→ 10Gi~50Gi 정도 설정 시 중장기 보존 가능
→ 작은 용량(예: 1Gi)은 실습용, 운영에는 비추천.

 

 

이어서 그라파나도 설정도 수정해줘한다.

cd kube-prometheus-stack-54.0.1/charts/grafana
vi values.yaml

 

다음과 같은 항목들을 수정해준다.

 

service.type: ClusterIP → NodePort

  • Grafana 웹 UI(기본 포트 3000)는 내부 전용이므로 외부 접속이 불가능하다.
  • Prometheus와 마찬가지로 NodePort로 변경해야
  • 브라우저에서 바로 대시보드를 볼 수 있다.

→ http://<노드IP>:<NodePort> 형태로 접근 가능
→ Grafana 로그인 창 접속 가능
→ 내부용 ClusterIP가 외부 접속용으로 변경됨.

 

persistence.enabled: false → true

  • Grafana의 대시보드, 설정, 사용자 계정 정보는 Pod 내부의 /var/lib/grafana 에 저장된다.
  • Pod가 재시작되면 이 디렉토리 내용이 모두 초기화된다.
  • 따라서 PVC를 연결해 데이터를 영구 보존해야 한다.

→ 재시작 후에도 기존 대시보드 유지
→ 커스텀 설정, 로그인 계정 등 영구 저장 가능.

 

storageClassName: default

persistence.enabled를 켜면, 어느 스토리지 클래스로 PVC를 생성할지 지정해야 한다.
보통 쿠버네티스 클러스터 기본 스토리지 클래스(default)를 사용한다.
AWS면 EBS, GCP면 PD, 로컬이면 hostPath 등 환경에 맞게 자동 연결된다.

→ Grafana의 PV가 정상적으로 생성됨
→ 퍼시스턴트 스토리지에 설정 및 데이터 저장.

 

size: 10Gi

  • Grafana가 사용하는 PV의 용량이다.
  • 보통 대시보드 정보나 사용자 계정 데이터는 크지 않으므로 5~10Gi로 충분하다.

→ 10Gi PV 생성
→ 재시작 시에도 모든 대시보드 및 설정 유지.

 

Prometheus  생성

먼저, 프로메테우스를 설치를 위한 네임스페이스를 생성한다.

kubectl create namespace mymonitoring

 

네임스페이스가 생성되었는지 확인한다.

kubectl get namespace

위와 같이 정상적으로 생성된 것을 확인할 수 있다.

 

헬름으로 해당 네임스페이스에 프로메테우스를 설치해준다.

helm install --namespace mymonitoring --generate-name prometheus-community/kube-prometheus-stack -f my-values.yaml

 

설치가 완료되면 STATUS가 deploy인 것을 확인할 수 있다.

 

프로메테우스가 성공적으로 설치되었는지 확인한다.

kubectl get all --namespace mymonitoring

또한 여러 파드들이 올라와 있는 것을 확인할 수 있는데, 각 파드들의 역할은 다음과 같다. 

컴포넌트 파드 위치   역할 설명
Prometheus server03 모든 노드(node-exporter, kube-state-metrics 등)에서 메트릭을 수집하고 자체 시계열 DB에 저장함. NodePort(30090)로 외부에서 접근 가능.
Grafana server03 Prometheus에서 수집한 데이터를 시각화. 웹 대시보드 형태로 표현.
Alertmanager server02 Prometheus의 경고 룰(Alert Rule)에 따라 Slack 등으로 알림 발송.
kube-state-metrics server03 쿠버네티스 오브젝트 상태(Deployment, Pod, Node 등)를 Prometheus 형식으로 변환해 제공.
node-exporter server01, server02, server03 각 노드의 하드웨어/OS 메트릭을 수집하는 agent. CPU, 메모리, 파일시스템, 네트워크 등 노드 단위 메트릭을 제공. DaemonSet 형태로 모든 노드에 배포됨.

 

프로메테우스를 통한 데이터 확인

프로메테우스에서 매트릭 정보를 가져오는 서비스는 node-exporter다. 

node-exporter를 웹 브라우저에서 확인할 수 있도록 포트포워딩을 설정해준다.

 

로컬 호스트의 8080포트를 9100포트로 포트포워딩 해준다.

 

웹 브라우저에서 127.0.0.1:8080으로 접속하면 다음과 같이 프로메테우스 node-exporter를 확인할 수 있다.

 

이번에는 프로메테우스에 직접 접속해본다. service/kube-prometheus-stack-1762-prometheus 서비스를 통해 프로메테우스에 직접 접속할 수 있다. 해당 프로메테우스 파드는 server03에 떠있는 것을 확인할 수 있다.

 

로컬 호스트의 30090포트를 server03의 30090포트로 포트포워딩 해준다.

 

웹 브라우저에서 127.0.0.1:30090으로 접속하면 다음과 같이 프로메테우스 화면을 볼 수 있다.

 

위와 같이 프로메테우스 UI에서 다양한 정보를 검색할 수 있다.

 

Reference

  • https://kubernetes.io/ko/docs/home/
  • 정철원, ⌜한권으로 배우는 도커&쿠버네티스⌟, 한빛미디어(주), 2024, 556쪽

 

'Container & DevOps' 카테고리의 다른 글
  • Kubernetes - Loki를 활용한 쿠버네티스 로그 확인
  • Kubernetes - Grafana를 활용한 모니터링 데이터 시각화
  • Kubernetes - Metrics Server 구축 및 리소스 사용량 확인
  • Kubernetes - ArgoCD를 통한 CD 구현
SummerToday
SummerToday
summertoday 님의 블로그 입니다.
  • SummerToday
    SummerToday
    SummerToday
  • 전체
    오늘
    어제
  • 인기 글

  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리자
    • 분류 전체보기 (62)
      • OS & Network (4)
      • Cloud (11)
      • Container & DevOps (41)
      • Database (4)
      • Develop (0)
      • IaC (2)
  • 태그

    점프 계정
    cloud
    Grafana
    openebs
    gitops
    AmazonSNS
    Eni
    MariaDB
    s2s vpn
    K8S
    Galera Cluster
    CI/CD
    CloudWatch
    계정 관리
    aws
    EIP
    argocd
    Kubernetes
    container
    tailscale
  • hELLO· Designed By정상우.v4.10.3
SummerToday
Kubernetes - Prometheus를 통한 모니터링 데이터 수집
상단으로

티스토리툴바