사내 서버 모니터링을 자체 구축하려는 분들을 위해, Rocky Linux 9.8 + Podman 환경에서 Grafana·Loki·Promtail·Prometheus 스택을 올리는 과정과 실제로 부딪힌 문제들을 정리했습니다. Docker 기준 튜토리얼은 많지만 Podman 기준으로는 정보가 부족해서, 직접 겪은 함정 위주로 씁니다.
왜 Podman인가
rootless/rootful 선택이 자유롭고, systemd와의 통합이 자연스럽다는 장점이 있지만, Docker 생태계의 관행이 그대로 통하지 않는 지점이 많습니다. 이 스택을 구축하면서 만난 Podman 특유의 문제만 따로 모아봤습니다.
구성 요소
|
컴포넌트 |
역할 |
|
Prometheus |
메트릭 수집·저장 |
|
Grafana |
대시보드 |
|
Loki |
로그 저장·검색 |
|
Promtail |
로그 수집 에이전트 |
|
Node Exporter |
서버 리소스 메트릭 |
podman-compose로 전체 스택을 관리하며 root 권한으로 운영했습니다.
겪은 문제와 해결 순서
1. Loki 컨테이너 권한 에러 mkdir /logs permission denied가 첫 관문이었습니다. 컨테이너의 user를 root로 지정하니 해결됐습니다.
2. Grafana 데이터소스 연결 실패 (Nginx 405) Grafana에서 Prometheus/Loki를 데이터소스로 등록할 때 Nginx 405 Not Allowed가 발생했습니다. 리버스 프록시를 거치지 않고 컨테이너 내부 다이렉트 주소로 연결하고, HTTP Method를 GET으로 맞추면서 해결했습니다.
3. Promtail이 로그를 안 가져오는 문제 권한 문제와 라벨 불일치(job 라벨)가 겹쳐서 발생했습니다. root 권한 부여와 라벨 정리로 해결했고, 이후 /var/log/*.log 글롭 패턴이 확장자 없는 messages, secure 파일은 못 잡는다는 것도 확인해서 job을 system-messages, system-secure로 나눠 각각 처리했습니다.
4. Podman 전용 로깅 드라이버 이슈 Docker의 local 로깅 드라이버를 그대로 쓰면 invalid log driver 에러가 납니다. k8s-file로 바꿔야 하는데, 이건 단순 호환성 문제가 아니라 컨테이너 로그가 journald를 거쳐 /var/log/messages로 다시 유입되는 걸 막는 것과도 연결돼 있어서 놓치기 쉬운 부분입니다.
5. Loki 429/500/400 에러 연쇄 대응 운영 중 ingestion rate limit(429), 재시작 직후 empty ring(500), 오래된 로그 진입 시도(400, entry too far behind) 에러를 순서대로 만났습니다. 각각 rate limit 값 조정, 재시작 대기, reject_old_samples_max_age 설정으로 대응했습니다. Loki 이미지에는 셸 유틸리티가 없어서 설정 확인은 호스트 파일을 직접 보거나 curl localhost:3100/config로 했습니다.
6. Positions 파일 미영속화로 인한 로그 중복 수집 Promtail 컨테이너를 재생성할 때마다 positions.yaml이 초기화되면서 로그 전체가 다시 수집되는 문제가 있었습니다. /logs/promtail-positions 볼륨을 마운트해 위치 정보를 영속화하면서 해결했습니다.
7. 컨테이너 리소스 모니터링 - cAdvisor 대신 Podman 전용 exporter cAdvisor로 컨테이너별 CPU/메모리를 보려 했는데, Podman rootful 환경에서 cgroup 경로 문제(Pod 래핑)는 --no-pod 옵션으로 우회했지만, 그 다음엔 컨테이너 자체를 아예 인식하지 못하는 근본적인 한계에 부딪혔습니다. 결국 prometheus-podman-exporter(Podman API 직접 사용)로 전환하는 게 훨씬 안정적이었습니다.
정리
Podman 환경에서 이 스택을 구축한다면, 아래 순서로 확인해보시길 권합니다.
-
컨테이너 user/권한 (root 여부)
-
로깅 드라이버가 k8s-file인지
-
Promtail 라벨과 글롭 패턴이 실제 로그 파일명과 맞는지
-
positions 파일 볼륨 마운트 여부
-
컨테이너 메트릭은 cAdvisor 대신 Podman 전용 exporter 우선 고려
Docker 기준 가이드를 그대로 따라가다 막히는 지점 대부분이 이 다섯 가지 중 하나였습니다.
