Observability/Prometheus

EP04 [Part 2: Prometheus Operator 설치와 구성 #1] Kubernetes에 Prometheus Operator 설치 준비

ygtoken 2025. 3. 19. 14:38
728x90

이 글에서는 Kubernetes 환경에서 Prometheus Operator를 설치하기 위한 준비 과정에 대해 알아봅니다. Prometheus Operator의 개념과 장점, 아키텍처를 이해하고, 설치 전 사전 요구사항과 환경 준비 과정을 상세히 다룹니다. 이를 통해 안정적이고 확장 가능한 모니터링 시스템 구축의 기반을 마련할 수 있습니다.


📌 Prometheus Operator 이해하기

Kubernetes에서 Prometheus를 운영하려면 여러 컴포넌트를 개별적으로 관리해야 하는 복잡성이 있습니다. Prometheus Operator는 이러한 복잡성을 추상화하여 쿠버네티스 네이티브 방식으로 모니터링 시스템을 선언적으로 관리할 수 있게 해줍니다.

 

Operator 패턴이란?

Operator는 쿠버네티스의 확장 메커니즘을 활용하여 복잡한 애플리케이션을 관리하는 패턴입니다.

# Operator가 없을 때 - 수동으로 모든 리소스 관리
# Prometheus 배포를 위한 일반적인 매니페스트 예시
apiVersion: apps/v1
kind: Deployment
metadata:
  name: prometheus-server
  namespace: monitoring
spec:
  replicas: 1
  selector:
    matchLabels:
      app: prometheus
  template:
    metadata:
      labels:
        app: prometheus
    spec:
      containers:
      - name: prometheus
        image: prom/prometheus:v2.41.0
        # 수십 줄의 설정이 필요...
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-config
  namespace: monitoring
data:
  prometheus.yml: |
    # 수백 줄의 복잡한 설정...
---
# 서비스, PVC, 인그레스 등 추가 리소스들...

 

Operator는 이러한 복잡성을 크게 단순화합니다:

# Operator 사용 시 - 단순한 CR(Custom Resource) 정의
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
  namespace: monitoring
spec:
  replicas: 2  # 고가용성을 위한 2개 복제본
  version: v2.41.0
  serviceAccountName: prometheus
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
    runAsUser: 1000
  serviceMonitorSelector:
    matchLabels:
      team: frontend  # frontend 팀 애플리케이션만 모니터링
  resources:
    requests:
      memory: 400Mi
      cpu: 500m
    limits:
      memory: 2Gi
      cpu: 1000m
  retention: 15d  # 15일간 데이터 보존
  storage:
    volumeClaimTemplate:
      spec:
        storageClassName: standard
        resources:
          requests:
            storage: 50Gi  # 50GB 스토리지 요청

 

Prometheus Operator의 주요 기능

  1. 선언적 관리
    • 모니터링 스택을 코드로 정의(GitOps 친화적)
    • 버전 관리 용이
  2. 자동화된 운영
    • 프로비저닝 자동화
    • 설정 업데이트 자동화
    • 버전 업그레이드 간소화
  3. 쿠버네티스 통합
    • 네이티브 쿠버네티스 리소스로 관리
    • 라벨/어노테이션 기반 서비스 디스커버리
  4. 확장성
    • 다중 Prometheus 인스턴스 관리
    • 샤딩(Sharding) 지원

▶️ 실무 사례: 한 대규모 전자상거래 회사에서는 모니터링을 위해 10개 이상의 Prometheus 인스턴스를 관리해야 했습니다. 수동 관리 시 각 인스턴스별 설정과 업그레이드에 엔지니어 시간이 과도하게 소요되었으나, Operator 도입 후 모든 인스턴스를 중앙에서 단일 YAML 파일 세트로 관리하게 되어 운영 효율성이 크게 향상되었습니다.


📌 Prometheus Operator 아키텍처

Prometheus Operator는 여러 커스텀 리소스 정의(CRD)를 통해 모니터링 스택을 관리합니다.

Prometheus Operator 아키텍처

주요 커스텀 리소스

  1. Prometheus
    • 실제 Prometheus 서버 인스턴스 정의
    • 복제본 수, 버전, 보존 정책, 리소스 요구사항 등 지정
# Prometheus CR 예시
apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus-main
  namespace: monitoring
spec:
  # Prometheus 서버 포드 복제본 수 (HA 구성)
  replicas: 2
  
  # 사용할 Prometheus 버전
  version: v2.41.0
  
  # 데이터 보존 기간
  retention: 10d
  
  # 스크레이핑할 ServiceMonitor 선택
  serviceMonitorSelector:
    matchLabels:
      monitor: "true"
  
  # 외부 레이블 설정 (다중 클러스터 구성 시 유용)
  externalLabels:
    cluster: "production-east"
    environment: "prod"
  
  # 노드 셀렉터를 통한 배치 제어
  nodeSelector:
    monitoring: "true"
  
  # 리소스 요청 및 제한
  resources:
    requests:
      memory: "1Gi"
      cpu: "500m"
    limits:
      memory: "2Gi"
      cpu: "1000m"
  
  # 영구 스토리지 설정
  storage:
    volumeClaimTemplate:
      spec:
        storageClassName: fast
        resources:
          requests:
            storage: 100Gi
  1. ServiceMonitor
    • 모니터링할 서비스를 정의
    • 라벨 셀렉터를 통해 타겟 서비스 선택
# ServiceMonitor CR 예시
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: api-service-monitor
  namespace: monitoring
  labels:
    monitor: "true"  # Prometheus에서 이 레이블로 선택
spec:
  # 모니터링할 서비스가 있는 네임스페이스 선택
  namespaceSelector:
    matchNames:
      - default
      - app
  
  # 실제 모니터링할 서비스 선택 (라벨 기반)
  selector:
    matchLabels:
      app: api-service
  
  # 엔드포인트 설정
  endpoints:
  - port: web  # 서비스의 포트 이름 (숫자 대신 이름 사용)
    interval: 15s  # 스크래핑 주기
    path: /metrics  # 메트릭 경로
    
    # 기본 인증 설정 (필요한 경우)
    basicAuth:
      username:
        name: basic-auth
        key: username
      password:
        name: basic-auth
        key: password
    
    # mTLS 설정 (필요한 경우)
    tlsConfig:
      insecureSkipVerify: false
      caFile: /etc/prometheus/certs/ca.crt
      certFile: /etc/prometheus/certs/client.crt
      keyFile: /etc/prometheus/certs/client.key
    
    # 시간 초과 설정
    scrapeTimeout: 10s
    
    # 메트릭 릴레이블링 (수집 전)
    relabelings:
    - sourceLabels: [__meta_kubernetes_pod_name]
      targetLabel: pod
    
    # 메트릭 수집 후 메트릭 릴레이블링
    metricRelabelings:
    - sourceLabels: [__name__]
      regex: 'go_.*'
      action: drop  # go_ 접두사가 있는 메트릭 제외
  1. PodMonitor
    • 서비스 없이 직접 파드 모니터링
    • 마이크로서비스가 서비스로 노출되지 않을 때 유용
# PodMonitor CR 예시
apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: backend-metrics
  namespace: monitoring
spec:
  # 모니터링할 파드가 있는 네임스페이스 선택
  namespaceSelector:
    matchNames:
      - backend
  
  # 실제 모니터링할 파드 선택 (라벨 기반)
  selector:
    matchLabels:
      app: backend-api
  
  # 파드의 메트릭 엔드포인트 정의
  podMetricsEndpoints:
  - port: metrics  # 컨테이너 포트 이름
    interval: 30s  # 스크래핑 주기
    path: /stats/prometheus  # 메트릭 경로 (기본값 /metrics와 다른 경우)
  1. AlertManager
    • Alertmanager 인스턴스 정의 및 설정
# AlertManager CR 예시
apiVersion: monitoring.coreos.com/v1
kind: Alertmanager
metadata:
  name: main
  namespace: monitoring
spec:
  # AlertManager 인스턴스 수 (HA 구성)
  replicas: 3
  
  # 설정은 보통 Secret으로 관리
  # 이 예시에서는 인라인으로 설정
  config:
    global:
      resolve_timeout: 5m
      smtp_smarthost: 'smtp.example.org:587'
      smtp_from: 'alerts@example.org'
      smtp_auth_username: 'alertmanager'
      smtp_auth_password: 'password'
    
    route:
      group_by: ['job', 'alertname', 'severity']
      group_wait: 30s
      group_interval: 5m
      repeat_interval: 4h
      receiver: 'team-emails'
      routes:
      - match:
          severity: critical
        receiver: 'team-pager'
    
    receivers:
    - name: 'team-emails'
      email_configs:
      - to: 'team@example.org'
    - name: 'team-pager'
      pagerduty_configs:
      - service_key: '<key>'
  
  # 리소스 요청 및 제한
  resources:
    requests:
      memory: "100Mi"
      cpu: "100m"
    limits:
      memory: "200Mi"
      cpu: "200m"
  1. PrometheusRule
    • 알림 및 기록 규칙 정의
# PrometheusRule CR 예시
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: kubernetes-important-rules
  namespace: monitoring
  labels:
    prometheus: main  # 특정 Prometheus 인스턴스에 규칙 적용
spec:
  groups:
  # 노드 관련 알림 규칙 그룹
  - name: node-alerts
    rules:
    # 디스크 공간 부족 알림
    - alert: NodeDiskRunningFull
      expr: predict_linear(node_filesystem_free_bytes[6h], 3600 * 24) < 0
      for: 30m
      labels:
        severity: warning
      annotations:
        summary: "디스크 공간 부족"
        description: "{{ $labels.instance }} 노드의 {{ $labels.mountpoint }} 파티션이 24시간 내에 가득 찰 예정입니다."
    
    # 노드 메모리 부족 알림
    - alert: NodeMemoryHigh
      expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes > 0.9
      for: 15m
      labels:
        severity: warning
      annotations:
        summary: "노드 메모리 사용량 높음"
        description: "{{ $labels.instance }} 노드의 메모리 사용량이 90%를 초과했습니다."
  
  # API 서비스 알림 규칙 그룹
  - name: api-service-alerts
    rules:
    # 높은 에러율 알림
    - alert: HighErrorRate
      expr: sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.1
      for: 10m
      labels:
        severity: critical
        team: api
      annotations:
        summary: "API 에러율 높음"
        description: "API 요청의 에러율이 10%를 초과했습니다 (현재 값: {{ $value | humanizePercentage }})"
    
    # 느린 응답 시간 알림
    - alert: SlowAPIResponse
      expr: histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (le, service)) > 2
      for: 10m
      labels:
        severity: warning
        team: api
      annotations:
        summary: "API 응답 시간 지연"
        description: "{{ $labels.service }} 서비스의 95번째 백분위 응답 시간이 2초를 초과했습니다."
  
  # 자주 사용하는 집계 메트릭을 기록 규칙으로 사전 계산하여 쿼리 성능 향상
  - name: recording-rules
    rules:
    # 노드별 CPU 사용 기록 규칙
    - record: node:cpu_utilization:avg5m
      expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
    
    # API 엔드포인트별 요청 비율 기록 규칙
    - record: api:request_rate:5m
      expr: sum by (service, endpoint) (rate(http_requests_total[5m]))

 

Operator 작동 원리

  1. 시작 시: Operator는 Kubernetes API 서버에 CRD들을 등록
  2. CR 감시: Operator의 컨트롤러가 CR 변경사항 감시
  3. 리소스 관리:
    • CR 생성 시: 필요한 Deployment, ConfigMap, Secret 등 생성
    • CR 변경 시: 관련 리소스 자동 업데이트
    • CR 삭제 시: 관련 리소스 정리

▶️ 아키텍처 특징: Prometheus Operator는 "조정자(reconciler)" 패턴을 따릅니다. 이는 현재 상태와 목표 상태 간의 차이를 지속적으로 확인하고 필요한 조치를 취하여 목표 상태에 도달하도록 합니다. 이 방식은 선언적 관리와 자가 치유 속성을 제공합니다.


📌 설치 전 사전 요구사항

Prometheus Operator를 설치하기 전에 다음 요구사항을 확인하고 준비하세요.

쿠버네티스 클러스터 요구사항

  1. 쿠버네티스 버전
    • Kubernetes 1.19 이상
    • RBAC(Role-Based Access Control) 활성화
# 쿠버네티스 버전 확인
kubectl version --short
# 출력 예시
# Client Version: v1.25.3
# Server Version: v1.24.8
  1. 클러스터 리소스
    • 최소 권장 사양:
      • CPU: 2코어 (Prometheus + Operator)
      • 메모리: 4GB
      • 스토리지: 50GB (기본 보존 기간 15일 기준)
  2. 네트워크 요구사항
    • Ingress Controller 또는 LoadBalancer (선택적)
    • NodePort로도 접근 가능

권한 및 RBAC

Prometheus Operator가 클러스터 리소스를 관찰하고 관리하려면 적절한 권한이 필요합니다.

# 기본 권한 확인 예시 (필요한 ServiceAccount, ClusterRole, ClusterRoleBinding)
apiVersion: v1
kind: Namespace
metadata:
  name: monitoring
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: prometheus-operator
  namespace: monitoring
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: prometheus-operator
rules:
# 이 ClusterRole은 다음 API 그룹의 리소스를 관리할 권한을 부여
- apiGroups: [""]  # 코어 API 그룹
  resources:
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]  # 읽기 전용 권한
- apiGroups: [""]
  resources:
  - nodes
  - nodes/metrics
  - namespaces
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  - secrets
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]  # 전체 권한
- apiGroups: ["apps"]
  resources:
  - statefulsets
  - deployments
  verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# Custom Resource에 대한 권한
- apiGroups: ["monitoring.coreos.com"]
  resources:
  - prometheuses
  - alertmanagers
  - servicemonitors
  - podmonitors
  - prometheusrules
  verbs: ["*"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: prometheus-operator
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus-operator
subjects:
- kind: ServiceAccount
  name: prometheus-operator
  namespace: monitoring

 

스토리지 준비

Prometheus는 시계열 데이터를 저장하므로 적절한 스토리지 계획이 중요합니다.

  1. 스토리지 클래스 확인
# 사용 가능한 스토리지 클래스 확인
kubectl get storageclass
  1. 스토리지 요구사항 계산

데이터 크기는 다음과 같은 요소에 따라 결정됩니다:

  • 메트릭 수 (시계열 개수)
  • 샘플링 간격
  • 라벨 카디널리티
  • 보존 기간

일반적인 계산 공식:

필요 스토리지 = 메트릭 수 × 샘플 크기 × 초당 샘플 수 × 초 단위 보존 기간

예시: 10,000개 메트릭, 15초 샘플링, 15일 보존 시

10,000 × 2바이트 × (1/15) × (15 × 24 × 60 × 60) ≈ 8.64GB

실제로는 라벨과 메타데이터 오버헤드를 고려하여 2-3배 더 큰 값으로 계획하는 것이 좋습니다.

 

네트워크 접근성

  1. 인그레스 설정 계획
# Prometheus와 Grafana에 대한 인그레스 예시
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: monitoring
  namespace: monitoring
  annotations:
    # 여기에 인그레스 컨트롤러별 어노테이션 추가
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/ssl-redirect: "true"
    cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
  tls:
  - hosts:
    - prometheus.example.com
    - grafana.example.com
    secretName: monitoring-tls
  rules:
  - host: prometheus.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: prometheus-operated
            port:
              number: 9090
  - host: grafana.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: grafana
            port:
              number: 3000
  1. 보안 고려사항

운영 환경에서는 다음 보안 설정을 고려하세요:

  • Prometheus UI에 대한 인증 (OAuth, basic auth 등)
  • TLS 암호화
  • 네트워크 정책을 통한 접근 제한
# 네트워크 정책 예시 - 모니터링 네임스페이스 보호
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: monitoring-network-policy
  namespace: monitoring
spec:
  podSelector: {}  # 네임스페이스의 모든 파드에 적용
  policyTypes:
  - Ingress
  ingress:
  - from:
    # 같은 네임스페이스의 파드에서 접근 허용
    - podSelector: {}
    # kube-system 네임스페이스에서 접근 허용
    - namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
    # 특정 IP 대역에서 접근 허용
    - ipBlock:
        cidr: 10.0.0.0/8  # 내부 네트워크
    ports:
    - protocol: TCP
      port: 9090  # Prometheus
    - protocol: TCP
      port: 3000  # Grafana

▶️ 설치 전 체크리스트:

  1. 쿠버네티스 버전 확인 (1.19+)
  2. 클러스터 리소스 충분한지 확인
  3. RBAC 활성화 확인
  4. 적절한 스토리지 클래스 및 용량 계획
  5. 네트워크 접근 전략 수립
  6. 보안 요구사항 검토

📌 모니터링 전략 설계

Prometheus Operator 설치 전에 모니터링 전략을 수립하는 것이 중요합니다.

 

대상 및 범위 정의

  1. 클러스터 인프라 모니터링
    • 노드, kubelet, API 서버 등 쿠버네티스 구성 요소
    • etcd, CoreDNS 등 핵심 서비스
  2. 애플리케이션 모니터링
    • 마이크로서비스
    • 데이터베이스
    • 캐시 시스템
    • 메시징 시스템
  3. 비즈니스 메트릭
    • 사용자 활동
    • 트랜잭션
    • 에러율

네임스페이스 계획

모니터링 컴포넌트 배치를 위한 네임스페이스 전략:

# 모니터링 전용 네임스페이스 생성
kubectl create namespace monitoring

# 필요한 경우 네임스페이스에 라벨 추가
kubectl label namespace monitoring monitoring=true

 

리소스 할당 계획

Prometheus 및 관련 컴포넌트에 대한 리소스 계획:

  1. 프로덕션 환경 기본 권장 값
컴포넌트  CPU 요청 메모리 요청 CPU 제한 메모리 제한
Prometheus 1000m 2048Mi 2000m 4096Mi
Alertmanager 100m 200Mi 200m 400Mi
Grafana 100m 128Mi 200m 256Mi
node-exporter 100m 30Mi 200m 50Mi
kube-state-metrics 100m 128Mi 200m 256Mi
  1. 스케일링 고려사항

리소스 요구사항은 다음 요소에 따라 달라집니다:

  • 모니터링 대상 수
  • 메트릭 수와 카디널리티
  • 수집 간격
  • 쿼리 복잡도와 빈도

▶️ 모니터링 전략 수립 팁: "모든 것을 모니터링하지 말고, 중요한 것만 모니터링하세요." 모든 메트릭을 수집하면 리소스 사용량과 관리 복잡성이 급증합니다. 비즈니스 및 시스템에 정말 중요한 메트릭에 집중하세요.


📌 설치 방법 선택

Prometheus Operator를 설치하는 여러 방법이 있으며, 각 방법에는 장단점이 있습니다.

주요 설치 방법 비교

  1. 직접 YAML 적용
    • 장점: 세밀한 제어, 모든 구성 요소 이해 가능
    • 단점: 복잡하고 시간 소모적, 업그레이드 관리 어려움
  2. Helm 차트 (kube-prometheus-stack)
    • 장점: 간편한 설치 및 업그레이드, 다양한 옵션 제공
    • 단점: 추상화로 인한 이해 어려움, 때로는 유연성 제한
  3. Jsonnet (예: kube-prometheus)
    • 장점: 고도의 커스터마이징, GitOps 워크플로우 적합
    • 단점: 학습 곡선, 추가 도구 필요
  4. Operator Lifecycle Manager (OLM)
    • 장점: 오퍼레이터 수명주기 관리, 업그레이드 간소화
    • 단점: 추가 오버헤드, 일부 환경에서 제한적

환경별 추천 방법

환경 추천 방법 이유
개발/테스트 Helm 빠른 시작, 간편한 설정
소규모 프로덕션 Helm 적절한 균형의 복잡성과 기능
대규모 프로덕션 Jsonnet 다중 클러스터 일관성, 세밀한 제어
규제 환경 직접 YAML 모든 구성 요소에 대한 감사 용이

 

kube-prometheus-stack 살펴보기

kube-prometheus-stack은 Prometheus Operator를 포함하여 완전한 모니터링 스택을 제공하는 Helm 차트입니다.

 

포함된 구성 요소:

  • Prometheus Operator
  • Prometheus 인스턴스
  • Alertmanager
  • Grafana
  • kube-state-metrics
  • node-exporter
  • 주요 서비스 모니터 및 대시보드
# helm values.yaml 구성 예시
prometheus:
  prometheusSpec:
    # Prometheus 서버 복제본 수
    replicas: 2
    
    # 보존 설정
    retention: 15d
    
    # 스토리지 설정
    storageSpec:
      volumeClaimTemplate:
        spec:
          storageClassName: standard
          resources:
            requests:
              storage: 50Gi
    
    # 리소스 요구사항
    resources:
      requests:
        memory: 2Gi
        cpu: 500m
      limits:
        memory: 4Gi
        cpu: 1000m

alertmanager:
  alertmanagerSpec:
    # Alertmanager 복제본 수
    replicas: 2
    
    # 스토리지 설정
    storage:
      volumeClaimTemplate:
        spec:
          storageClassName: standard
          resources:
            requests:
              storage: 10Gi
    
    # 리소스 요구사항
    resources:
      requests:
        memory: 200Mi
        cpu: 100m
      limits:
        memory: 400Mi
        cpu: 200m

grafana:
  # 관리자 비밀번호 (또는 기존 시크릿 사용)
  adminPassword: "prom-operator"
  
  # 영구 스토리지 활성화
  persistence:
    enabled: true
    size: 10Gi
    storageClassName: standard
  
  # 기본 대시보드 및 데이터 소스
  defaultDashboardsEnabled: true
  defaultDashboardsTimezone: Asia/Seoul
  
  # 추가 데이터 소스
  additionalDataSources:
  - name: Loki
    type: loki
    url: http://loki-gateway.monitoring.svc.cluster.local
    access: proxy

# 커스텀 ServiceMonitor 예시 (MySQL)
additionalServiceMonitors:
- name: mysql
  selector:
    matchLabels:
      app: mysql
  namespaceSelector:
    matchNames:
      - default
      - database
  endpoints:
  - port: metrics
    interval: 30s
    scrapeTimeout: 10s

▶️ 선택 기준: 소규모에서 중간 규모의 클러스터에는 Helm을 통한 kube-prometheus-stack 설치가 일반적으로 가장 적합합니다. 간편한 설치와 관리 용이성을 제공하면서도 대부분의 사용 사례를 충족합니다. 이후 글에서는 이 방법을 중심으로 설명하겠습니다.


📌 설치 환경 준비하기

실제 설치 전에 환경을 준비하고 필요한 도구를 설정해봅시다.

 

필요 도구 설치

  1. kubectl - 쿠버네티스 클러스터 관리 CLI
# Linux에 kubectl 설치
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

# 버전 확인
kubectl version --client
  1. Helm - 쿠버네티스 패키지 관리자
# Linux에 Helm 설치
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh

# 버전 확인
helm version

 

Helm 레포지토리 추가

# Prometheus 커뮤니티 Helm 레포지토리 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 레포지토리 업데이트
helm repo update

# 사용 가능한 차트 확인
helm search repo prometheus-community

 

네임스페이스 및 리소스 준비

# 모니터링용 네임스페이스 생성
kubectl create namespace monitoring

# 필요한 경우 리소스 할당량 설정
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ResourceQuota
metadata:
  name: monitoring-quota
  namespace: monitoring
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    persistentvolumeclaims: "10"
EOF

 

보안 설정

  1. RBAC 준비
# 기본 RBAC이 활성화되어 있는지 확인
kubectl cluster-info dump | grep authorization-mode
# 출력에 'RBAC'이 포함되어 있어야 함
  1. PodSecurityPolicy (필요한 경우)
# 모니터링용 PodSecurityPolicy 예시
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: monitoring-psp
  annotations:
    seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'runtime/default'
    seccomp.security.alpha.kubernetes.io/defaultProfileName: 'runtime/default'
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
    - 'persistentVolumeClaim'
  hostNetwork: false
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  readOnlyRootFilesystem: false

 

스토리지 준비

# 사용 가능한 스토리지 클래스 확인
kubectl get storageclass

# 기본 스토리지 클래스가 없다면 생성 (예: minikube에서)
# 예: minikube에서 기본 스토리지 클래스 생성
cat <<EOF | kubectl apply -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: standard
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: k8s.io/minikube-hostpath
EOF

 

설치 전 검증

  1. 쿠버네티스 버전 확인
kubectl version
# Server Version: v1.24.x 이상이면 OK
  1. 클러스터 상태 확인
kubectl get nodes
# 모든 노드가 Ready 상태여야 함

kubectl get pods --all-namespaces
# kube-system 포드들이 정상 실행 중이어야 함
  1. 네트워크 플러그인 동작 확인
# 파드 간 통신 테스트
kubectl run busybox --image=busybox -- sleep 3600
kubectl exec -it busybox -- ping -c 3 kubernetes.default
# 3개의 패킷이 모두 도달해야 함
  1. Helm 기본 기능 테스트
# 테스트용 간단한 차트 배포
helm repo add bitnami https://charts.bitnami.com/bitnami
helm install test-redis bitnami/redis --set auth.enabled=false --set architecture=standalone

# 테스트 파드가 실행 중인지 확인
kubectl get pods | grep test-redis

# 테스트 완료 후 제거
helm uninstall test-redis

 

▶️ 환경 준비 체크리스트:

  1. 필요한 CLI 도구 설치 완료 (kubectl, helm)
  2. Prometheus 커뮤니티 Helm 레포지토리 추가
  3. 모니터링 네임스페이스 생성
  4. RBAC 및 보안 정책 확인
  5. 스토리지 클래스 및 용량 확인
  6. 클러스터 전반적인 상태 검증

📌 설치 전 설정 파일 준비

Helm을 사용하여 kube-prometheus-stack을 설치하기 전에 사용자 정의 values.yaml 파일을 준비하는 것이 좋습니다.

 

기본 values.yaml 확인

# 기본 values.yaml 파일 확인하기
helm show values prometheus-community/kube-prometheus-stack > original-values.yaml

 

사용자 정의 values.yaml 작성

다음은 일반적인 환경에 맞춘 사용자 정의 values.yaml 예시입니다:

# custom-values.yaml

# Prometheus Operator 설정
prometheusOperator:
  # Operator 리소스 요구사항
  resources:
    limits:
      cpu: 200m
      memory: 200Mi
    requests:
      cpu: 100m
      memory: 100Mi
  
  # Admission Webhook 설정 (선택적)
  admissionWebhooks:
    enabled: true
    # 인증서 관리 방법 (cert-manager 또는 자체 서명)
    certManager:
      enabled: false

# Prometheus 서버 설정
prometheus:
  prometheusSpec:
    # 복제본 수 (HA 구성)
    replicas: 1
    
    # 보존 정책
    retention: "10d"
    retentionSize: "30GB"
    
    # 리소스 요구사항
    resources:
      limits:
        cpu: 1000m
        memory: 2Gi
      requests:
        cpu: 500m
        memory: 1Gi
    
    # 영구 스토리지 설정
    storageSpec:
      volumeClaimTemplate:
        spec:
          storageClassName: standard
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 50Gi
    
    # 원격 쓰기/읽기 설정 (선택적)
    remoteWrite: []
    remoteRead: []
    
    # 외부 레이블 (여러 클러스터에서 메트릭 구분)
    externalLabels:
      cluster: "production"
      environment: "prod"
    
    # SecurityContext 설정
    securityContext:
      fsGroup: 2000
      runAsNonRoot: true
      runAsUser: 1000
    
    # 추가 Prometheus 규칙 (원하는 경우)
    additionalRuleLabels: {}
    
    # Thanos 사이드카 (장기 저장소 연동 시)
    thanos: {}

# Alertmanager 설정
alertmanager:
  alertmanagerSpec:
    # 복제본 수
    replicas: 1
    
    # 리소스 요구사항
    resources:
      limits:
        cpu: 200m
        memory: 200Mi
      requests:
        cpu: 100m
        memory: 100Mi
    
    # 영구 스토리지 설정
    storage:
      volumeClaimTemplate:
        spec:
          storageClassName: standard
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 10Gi
    
    # 알림 설정
    config:
      global:
        resolve_timeout: 5m
      route:
        group_by: ['job', 'severity']
        group_wait: 30s
        group_interval: 5m
        repeat_interval: 12h
        receiver: 'null'
        routes:
        - match:
            alertname: Watchdog
          receiver: 'null'
      receivers:
      - name: 'null'
    
    # 내부 알림 템플릿 (선택적)
    templates: []

# Grafana 설정
grafana:
  # 관리자 계정 설정
  adminPassword: "admin-password"  # 또는 기존 시크릿 사용
  
  # 영구 스토리지 활성화
  persistence:
    enabled: true
    size: 10Gi
    storageClassName: standard
  
  # 리소스 요구사항
  resources:
    limits:
      cpu: 200m
      memory: 200Mi
    requests:
      cpu: 100m
      memory: 100Mi
  
  # 대시보드 프로비저닝
  dashboardProviders:
    dashboardproviders.yaml:
      apiVersion: 1
      providers:
      - name: 'default'
        orgId: 1
        folder: ''
        type: file
        disableDeletion: false
        editable: true
        options:
          path: /var/lib/grafana/dashboards/default
  
  # 추가 데이터 소스 (선택적)
  additionalDataSources: []
  
  # 기본 대시보드 활성화
  defaultDashboardsEnabled: true
  
  # SMTP 설정 (알림용)
  smtp:
    enabled: false
    host: "smtp.example.com:587"
    user: "grafana"
    password: "password"
    fromAddress: "grafana@example.com"

# Node Exporter 설정
nodeExporter:
  enabled: true
  resources:
    limits:
      cpu: 200m
      memory: 50Mi
    requests:
      cpu: 100m
      memory: 30Mi

# kube-state-metrics 설정
kubeStateMetrics:
  enabled: true
  resources:
    limits:
      cpu: 100m
      memory: 200Mi
    requests:
      cpu: 10m
      memory: 50Mi

# Prometheus 규칙 설정
defaultRules:
  # 기본 알림 규칙 활성화
  create: true
  # 특정 규칙 비활성화
  disabled: {}
  # 규칙 수정
  rules:
    etcd: false  # etcd 규칙 비활성화 (외부 etcd 사용 시)

# 네임스페이스 스크래핑 설정
kubeTargetVersionOverride: "1.24.0"  # 현재 쿠버네티스 버전에 맞게 설정

# kube-controller-manager와 kube-scheduler 모니터링 설정
kubeControllerManager:
  enabled: true
  endpoints: []  # 외부 컨트롤러 관리자 IP 지정 (필요한 경우)

kubeScheduler:
  enabled: true
  endpoints: []  # 외부 스케줄러 IP 지정 (필요한 경우)

kubelet:
  enabled: true
  serviceMonitor:
    https: true

 

설정 파일 검증

사용자 정의 values.yaml 파일을 작성한 후, 실제 적용 전에 템플릿 렌더링을 통해 검증할 수 있습니다:

# 템플릿 렌더링 검증 (실제 설치하지 않음)
helm template prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  -f custom-values.yaml > rendered-templates.yaml

# 렌더링된 템플릿 검증
kubectl create --dry-run=client -f rendered-templates.yaml

▶️ 설정 파일 관리 팁: values.yaml 파일은 Git과 같은 버전 관리 시스템에 저장하고, 변경 사항을 추적하세요. 이렇게 하면 설정 변경 이력이 유지되며, GitOps 기반 접근 방식을 적용할 수 있습니다.


📌 Summary

  • Prometheus Operator는 쿠버네티스 환경에서 모니터링 스택을 선언적으로 관리하는 강력한 도구입니다.
  • 커스텀 리소스를 통해 Prometheus, Alertmanager, ServiceMonitor 등을 관리하여 운영 복잡성을 크게 줄여줍니다.
  • 설치 준비는 클러스터 요구사항 확인, 네임스페이스 생성, 권한 설정, 스토리지 구성 등을 포함합니다.
  • kube-prometheus-stack Helm 차트는 모니터링 스택의 모든 컴포넌트를 포함하는 포괄적인 솔루션입니다.
  • 설치 환경은 kubectl, Helm과 같은 필수 도구 준비와 리포지토리 설정으로 시작합니다.
  • 사용자 정의 values.yaml을 통해 환경에 맞는 리소스 할당, 보존 기간, 고가용성 구성 등을 설정할 수 있습니다.
  • 다음 에피소드에서는 Helm을 사용한 kube-prometheus-stack 배포 과정을 자세히 다루겠습니다.
728x90