Grafana 대시보드 관리 방식 전환 — PVC → Sidecar ConfigMap
증상
모니터링 대시보드를 Git에서 관리하고 싶었지만 PVC 방식에서 아래 문제가 반복됐다.
- 코드 푸시 후 반영 안 됨 — ArgoCD가 ConfigMap이나 values 변경을 감지해도 Grafana 컨테이너 안 PVC 내용이 바뀌지 않아 대시보드가 이전 상태로 유지됐다.
- 삭제 후 재배포해도 구 버전 복원 — PVC를 지우지 않으면 Grafana가 재기동 시 PVC의 오래된 JSON을 다시 읽어왔다.
- Git과 실제 대시보드 불일치 — 직접 UI에서 수정한 대시보드가 저장되어, Git이 진짜 소스가 아닌 상태가 됐다.
원인
PVC 기반 프로비저닝은 Grafana가 직접 디스크에 대시보드를 저장·관리하는 방식이다. ArgoCD가 Git의 변경을 클러스터에 적용해도 이미 PVC에 올라간 JSON 파일은 건드리지 않기 때문에, Git → 클러스터 단방향 동기화가 깨진다. GitOps 패턴에서 PVC는 "클러스터 내부 상태"로 남아 소스 오염원이 된다.
해결
Grafana sidecar 방식으로 전환했다. sidecar 컨테이너가 클러스터의 ConfigMap을 watch하고, grafana_dashboard: "1" 레이블이 붙은 ConfigMap을 발견하면 자동으로 Grafana에 로드한다. 모든 대시보드 JSON은 Git 안의 Helm 차트 파일로만 관리된다.
변경한 파일
1. k8s-helm/ca-staging/values/monitoring/visualization/values-grafana.yaml
# 변경 전: persistence 활성화
# persistence:
# enabled: true
# storageClassName: gp2
# size: 10Gi
# 변경 후: persistence 비활성화 + sidecar 활성화
sidecar:
dashboards:
enabled: true
folder: /tmp/dashboards
folderAnnotation: grafana_folder
searchNamespace: monitoring
provider:
foldersFromFilesStructure: true
allowUiUpdates: true
persistence:
enabled: false
# PVC 마운트 시 권한 에러 방지용 init 컨테이너도 불필요해져 비활성화
initChownData:
enabled: false
2. k8s-helm/common-charts/infra/monitoring/prometheus-stack/templates/grafana-dashboards/*/configmap.yaml
대시보드 팀별 폴더 구조에 맞게 ConfigMap 템플릿을 작성한다. grafana_dashboard: "1" 레이블이 sidecar의 탐지 조건이고, grafana_folder 어노테이션이 Grafana UI 폴더명을 결정한다.
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-dashboards-infra-team-infra
namespace: monitoring
labels:
app.kubernetes.io/name: grafana
grafana_dashboard: "1" # sidecar 탐지 조건
annotations:
grafana_folder: "DEV 플랫폼 관측(인프라)" # Grafana UI 폴더명
data:
infra-dashboard.json: |-
{ ... }
대시보드 JSON 파일은 Helm 차트의 files/ 디렉터리에 두고, 템플릿에서 .Files.Glob으로 읽어 ConfigMap data에 포함시킨다.
common-charts/infra/monitoring/prometheus-stack/
├── files/
│ └── grafana-dashboards/
│ ├── infra-team-observability/
│ │ └── infra/
│ │ └── *.json
│ ├── ai-team/
│ │ └── *.json
│ └── ...
└── templates/
└── grafana-dashboards/
├── infra-team/
│ └── infra-configmap.yaml
└── ...
결과
| 항목 | PVC 방식 | Sidecar 방식 |
|---|---|---|
| 코드 푸시 → 반영 | 재기동 필요, 반영 불안정 | ArgoCD sync 즉시 반영 |
| Git이 소스인가 | 아니오 (UI 수정이 실제 저장소) | 예 (JSON 파일이 유일한 소스) |
| EBS PVC 필요 | 예 | 아니오 |
| 대시보드 추가 절차 | Grafana UI 또는 PVC 직접 수정 | JSON 파일 추가 후 PR |
추가 고려 사항
allowUiUpdates: true를 설정하면 UI에서 임시로 편집할 수 있지만, ConfigMap을 덮어쓰지 않으므로 재기동 시 Git 상태로 롤백된다. 의도한 변경은 반드시 JSON 파일을 수정하고 푸시해야 한다.searchNamespace: monitoring으로 탐지 범위를 monitoring 네임스페이스로 제한했다. 다른 네임스페이스 ConfigMap이 실수로 로드되는 것을 방지한다.