이 글에서 다루는 것
Observability 스택 운영 중 실제로 마주친 이슈들(크로스 스크랩, Alertmanager 충돌, NFS 권한, TSDB 병목 등)의 원인 분석과 재발 방지 구조를 다룹니다.
선수지식
이 단계에서 해결하려는 문제
관측, 알림, 로그 시스템은 세팅보다 운영 이후가 진짜 시작이다. 실운영 환경에서 반드시 마주치는 문제들(dev/prod 크로스 스크랩, Alertmanager 충돌, NFS 권한, TSDB 병목 등)을 정리하고, 왜 문제가 생겼는지에서 어떻게 해결했는지, 다시는 반복되지 않도록 구조 자체를 잡아주는 단계다.
🎯 핵심 요약
- dev/prod 크로스 스크랩 문제 정리
- Alertmanager configSecret / generated-secret 충돌
- Instant Query 오류 원리
- worker2 종료 지연(30~40초)
- NFS Flush / Permission / fsGroup 문제
- SealedSecret namespace mismatch
- Prometheus TSDB -> local-path 전환 시 발생 가능한 이슈
- “문제 -> 원인 -> 해결 -> 재발 방지” 구조로 정리
1️⃣ dev/prod Cross-Scrape 문제
증상
monitoring-dev Prometheus에서 monitoring-prod 메트릭까지 보여서 그래프가 dev/prod가 섞여버리는 현상이 발생.
근본 원인
- kube-state-metrics의
additionalLabels.release값을 dev/prod 모두 같은 값으로 사용 - Prometheus
serviceMonitorSelector가 공통 라벨을 필터링하여 dev/prod를 구분할 기준 자체가 사라짐
해결
환경별 라벨 분리:
kube-state-metrics:
prometheus:
monitor:
additionalLabels:
release: "monitoring-dev"
Prometheus에도 동일한 기준:
serviceMonitorSelector:
matchLabels:
release: "monitoring-dev"
재발 방지
“dev/prod 라벨이 환경명을 포함하는가?”, “selector.matchLabels가 환경별로 나뉘어 있는가?” 를 GitOps 리뷰 체크리스트에 반드시 포함한다.
2️⃣ Alertmanager Secret 미적용 & missing name in receiver
증상
Ingress 접근은 정상이지만 Slack 메시지가 전혀 오지 않음. /#/status 확인 시 config가 기본 템플릿.
원인
- 잘못된 키 사용:
alertmanager.configFromSecret(오타) -> 정답은alertmanager.alertmanagerSpec.configSecret - Operator가 자동 생성하는 generated-secret이 configSecret보다 먼저 적용됨
- receivers 블록이 비어 있으면
missing name in receiver오류 발생
해결
spec.alertmanagerSpec.configSecret사용- receivers 이름을 실제 존재하는 값으로 정리
- generated-secret이 있는지, 내용이 덮어쓰지 않는지 확인
재발 방지
Alertmanager는 Operator가 지속적으로 Secret을 재생성한다는 사실을 기억하고, receivers 이름이 템플릿 내부와 일치하는지 항상 체크한다.
3️⃣ Instant Query 에러
증상
Grafana / Loki에서 log queries are not supported as an instant query type 오류 발생.
원인
Instant Query는 단일 시점 메트릭 조회용이다. 로그는 반드시 시간 구간이 필요하므로 Instant Query 개념 자체와 충돌한다.
해결
Range Query 사용:
curl -G http://loki-dev:3100/loki/api/v1/query_range \
--data-urlencode 'query={namespace="fastapi-dev"}' \
--data-urlencode start=1732440000000000000 \
--data-urlencode end=1732440600000000000
재발 방지
메트릭은 순간 데이터, 로그는 구간 데이터. 이 개념만 기억하면 된다.
4️⃣ worker2 종료 지연 (약 30~40초)
증상
worker2만 종료가 30~40초 지연됨.
원인
Promtail DaemonSet이 NFS 언마운트를 기다리면서 지연. NFS Flush 시간이 길면 graceful timeout이 증가한다.
해결
terminationGracePeriodSeconds: 10
재발 방지
Promtail이 NFS 기반 positions.yaml을 쓸 경우 terminationGracePeriodSeconds 최소화가 필수다.
5️⃣ tmp-curl CrashLoopBackOff
증상
tmp-curl-* Pod가 CrashLoopBackOff 반복.
원인
kube-prometheus-stack가 내부적으로 생성하는 테스트용 curl Pod. TLS/Ingress 완성 전에는 readiness 실패로 crash.
해결
Ingress/TLS 구축 중 잠시 발생하는 정상 현상이다. 구조가 완성되면 자동으로 사라진다.
6️⃣ FastAPI / NFS 권한 문제 (PermissionError)
증상
FastAPI 로그: PermissionError: [Errno 13] Permission denied: '/app/logs'
원인
NFS에서 root_squash 적용으로 runAsUser 변환. Pod의 securityContext와 일치하지 않아 Permission 오류 발생.
해결
FastAPI Deployment:
securityContext:
fsGroup: 1000
runAsUser: 1000
NFS 서버 디렉토리:
chmod 0777 -R /mnt/nfs_share/mlops/fastapi
재발 방지
NFS + 애플리케이션 로그 구조에서는 무조건 fsGroup 설정이 필요하다.
7️⃣ Prometheus TSDB -> local-path 전환
증상
Prometheus TSDB 쓰기 지연 / scrape 지연 / CPU 부하 증가. NFS 기반 TSDB와 병목이 맞지 않음.
근본 원인
Prometheus TSDB는 고 IOPS + 저지연이 필수이므로 NFS는 구조적으로 부적합하다.
해결
storageClassName: local-path
필수 조치:
kubectl scale sts prometheus --replicas=0
kubectl delete pvc <prometheus-pvc>
kubectl scale sts prometheus --replicas=1
재발 방지
Prometheus만 local-path, Grafana / Loki / Alertmanager는 NFS로 유지한다.
8️⃣ SealedSecret namespace mismatch
증상
ArgoCD에서 SealedSecret이 정상 적용됐다고 나오는데 Secret 자체가 생성되지 않음.
원인
SealedSecret.metadata.namespace와 Secret.metadata.namespace가 불일치하여 생성되지 않음.
해결
metadata:
namespace: monitoring-dev
재발 방지
SealedSecret은 최종 Secret이 존재할 namespace와 반드시 동일해야 한다.
9️⃣ 운영 중 자주 헷갈린 포인트 정리
- NFS 수백 개 디렉터리 자동 생성 방지:
archiveOnDelete=true - Promtail positions.yaml 오염 방지: dev/prod PVC 분리
- Alertmanager generated-secret 삭제 금지: Operator가 재생성
- Loki 쿼리 느릴 때: 시간 범위 / 라벨 조합이 과도한 경우가 대부분
설계 판단 (Why This Way?)
개별 이슈 해결이 아닌 라벨 규칙·namespace 규칙·스토리지 분리 원칙 같은 구조적 기준을 수립하여 신규 컴포넌트에서의 동일 실수를 예방합니다. NFS 권한 문제는 개발 환경에서 0777로 빠르게 해결하되, 프로덕션에서는 no_root_squash + fsGroup으로 최소 권한 원칙을 지킵니다.
다음에 읽을 글
→ Observability 6단계: FastAPI Dashboard & Alert Library — 서빙 전용 대시보드 구축