문제 상황#

Dev(kubeadm)와 Staging(EKS) 환경의 인프라 구성이 달라서 모니터링 대시보드가 작동하지 않는 문제 발생.

환경별 인프라 차이#

구성요소Dev (kubeadm)Staging (EKS)
PostgreSQL로컬 Pod (postgres:16-alpine)AWS RDS
Redis로컬 Pod (redis:7-alpine)AWS ElastiCache
메트릭 수집Prometheus exporterCloudWatch
데이터소스PrometheusCloudWatch

증상#

  • Dev 환경에서 “RDS PostgreSQL 모니터링” 대시보드 → No data
  • Dev 환경에서 “ElastiCache Redis 모니터링” 대시보드 → No data
  • 원인: CloudWatch 데이터소스가 없음 (AWS 환경이 아님)

해결#

1. 환경별 대시보드 분리#

동일한 기능의 대시보드를 두 가지 버전으로 생성:

대시보드데이터소스환경
database-rds-postgresql.jsonCloudWatchStaging
database-postgresql-local.jsonPrometheusDev
cache-elasticache-redis.jsonCloudWatchStaging
cache-redis-local.jsonPrometheusDev

2. 환경별 exclude 설정#

Helm values에서 환경에 맞지 않는 대시보드를 제외:

Dev 환경 (dev/values/monitoring/values-prometheus-stack.yaml):

dashboards:
  devTeam:
    exclude:
      # CloudWatch 기반 대시보드 제외 (Dev는 로컬 exporter 사용)
      - "database-rds-postgresql.json"
      - "cache-elasticache-redis.json"

Staging 환경 (staging/values/values-prometheus-stack.yaml):

dashboards:
  devTeam:
    exclude:
      # 로컬 exporter 대시보드 제외 (EKS는 CloudWatch 사용)
      - "database-postgresql-local.json"
      - "cache-redis-local.json"

3. ConfigMap 템플릿 수정#

대시보드 ConfigMap 생성 시 exclude 목록을 체크하도록 수정:

{{- $dashboardFiles := .Files.Glob "files/grafana-dashboards/dev-team-observability/*.json" -}}
{{- $excludeList := .Values.dashboards.devTeam.exclude | default list -}}
{{- if gt (len $dashboardFiles) 0 }}
...
{{- range $path, $_ := $dashboardFiles }}
{{- $filename := base $path -}}
{{- if not (has $filename $excludeList) }}
  {{ $filename }}: |-
{{ $.Files.Get $path | nindent 4 }}
{{- end }}
{{- end }}
{{- end }}

메트릭 비교#

PostgreSQL#

메트릭Dev (postgres_exporter)Staging (CloudWatch)
CPUprocess_cpu_seconds_totalCPUUtilization
연결 수pg_stat_activity_countDatabaseConnections
캐시 히트pg_stat_database_blks_hitN/A (RDS 자체 관리)
DB 크기pg_database_size_bytesFreeStorageSpace (역산)

Redis#

메트릭Dev (redis_exporter)Staging (CloudWatch)
CPUredis_cpu_sys_seconds_totalCPUUtilization, EngineCPUUtilization
메모리redis_memory_used_bytesBytesUsedForCache
연결 수redis_connected_clientsCurrConnections
캐시 히트redis_keyspace_hits_totalCacheHits

파일 변경 내역#

추가된 파일#

  • common-charts/.../dev-team-observability/database-postgresql-local.json
  • common-charts/.../dev-team-observability/cache-redis-local.json

수정된 파일#

  • common-charts/.../templates/grafana-dashboards-dev-team-observability-configmap.yaml
    • exclude 로직 추가
  • common-charts/.../values.yaml
    • dashboards.devTeam.exclude 기본값 추가
  • dev/values/monitoring/values-prometheus-stack.yaml
    • CloudWatch 대시보드 exclude
  • staging/values/values-prometheus-stack.yaml
    • 로컬 exporter 대시보드 exclude

관련 이슈: Prometheus PodMonitor 라벨 문제#

증상#

Staging에서 istio_requests_total 메트릭이 Prometheus에 수집되지 않음.

원인#

Prometheus가 release: kube-prometheus-stack 라벨이 있는 PodMonitor/ServiceMonitor만 선택하도록 설정되어 있었으나, Istio PodMonitor는 release: prometheus로 설정됨.

해결#

모든 모니터의 라벨을 release: kube-prometheus-stack으로 통일:

# 수정 전
labels:
  release: prometheus

# 수정 후
labels:
  release: kube-prometheus-stack

수정된 파일:

  • common-charts/infra/istio/istiod/templates/podmonitor-envoy.yaml
  • common-charts/infra/istio/istiod/templates/servicemonitor.yaml
  • common-charts/infra/argocd/templates/servicemonitor.yaml

Dev vs Staging Prometheus 설정 차이#

설정DevStaging
serviceMonitorSelectorNilUsesHelmValuesfalse (모든 모니터 수집)기본값 (라벨 필터링)
podMonitorSelectorNilUsesHelmValuesfalse (모든 모니터 수집)기본값 (라벨 필터링)

Dev는 모든 모니터를 수집하므로 라벨이 달라도 문제없음. Staging은 특정 라벨만 선택하므로 라벨 일치 필요.


검증 방법#

# 1. Prometheus targets 확인
kubectl exec -n monitoring sts/prometheus-prom -c prometheus -- \
  wget -qO- 'http://localhost:9090/api/v1/targets' | grep envoy

# 2. Istio 메트릭 쿼리
kubectl exec -n monitoring sts/prometheus-prom -c prometheus -- \
  wget -qO- 'http://localhost:9090/api/v1/query?query=istio_requests_total'

# 3. 대시보드 ConfigMap 확인
kubectl get configmap grafana-dashboards-dev-team-observability -n monitoring -o yaml | grep -E "^\s+\w+\.json"

참고#

  • Prometheus postgres_exporter: prometheuscommunity/postgres-exporter:v0.15.0
  • Prometheus redis_exporter: oliver006/redis_exporter:v1.66.0
  • CloudWatch 메트릭 네임스페이스:
    • RDS: AWS/RDS
    • ElastiCache: AWS/ElastiCache