클라우드로 다 옮기지 못하는 인프라가 있다면, 결국 온프레미스와 쿠버네티스가 공존하는 환경을 직접 관리해야 합니다. 이번 글에서는 Rocky Linux + Podman 기반으로 Grafana·Loki·Prometheus 통합 모니터링 스택을 구축하고, 여기에 쿠버네티스 클러스터까지 연결한 실전 경험을 정리합니다.
왜 통합 모니터링이 필요한가
서버가 늘어나고 쿠버네티스 클러스터까지 추가되면, 로그와 메트릭이 여기저기 흩어집니다. 장애가 나면 SSH로 서버마다 들어가 로그를 뒤지는 방식은 한계가 명확하죠. 하나의 대시보드에서 서버 상태, 컨테이너 리소스, 보안 로그, 쿠버네티스 클러스터 상태까지 한눈에 보는 것이 목표였습니다.
스택 구성
-
Prometheus: 메트릭 수집 및 중앙 저장소
-
Grafana: 대시보드 시각화
-
Loki + Promtail: 로그 수집 및 검색
-
Node Exporter / Podman Exporter: 서버·컨테이너 리소스 메트릭
Podman 환경(rootful, podman-compose)에서 구성했는데, Docker 문서 그대로 따라가면 막히는 지점이 꽤 있었습니다.
실제로 겪은 트러블슈팅
1) Loki 권한 문제 mkdir /logs permission denied 에러가 발생했는데, 컨테이너 user를 root로 지정해 해결했습니다.
2) Podman 특유의 로그 드라이버 문제 Docker의 local 로깅 드라이버가 Podman에서는 지원되지 않아 invalid log driver 에러가 났습니다. k8s-file로 교체하니 해결됐고, 덕분에 컨테이너 자체 로그가 journald를 거쳐 다시 /var/log/messages로 순환 유입되는 문제도 막을 수 있었습니다.
3) Loki 429 / 500 / 400 에러 연쇄 운영 초기에는 ingestion rate limit(429), empty ring(500, 재시작 시 일시적), entry too far behind(400) 에러를 순차적으로 만났습니다. 각각 rate limit 설정, 재시작 대기, reject_old_samples_max_age 조정으로 해결했습니다.
4) 컨테이너 리소스 모니터링 - cAdvisor의 한계 처음엔 cAdvisor로 컨테이너별 CPU/메모리를 모니터링하려 했지만, Podman rootful 환경에서 컨테이너를 전혀 인식하지 못하는 문제에 부딪혔습니다. cgroup 경로 문제(podman-compose의 Pod 래핑)는 --no-pod 옵션으로 해결했지만, 그 이후에도 subcontainers API에 네트워크 인터페이스만 잡히고 실제 컨테이너는 안 잡히는 근본적인 한계가 있었습니다. 결국 Podman 전용 exporter인 prometheus-podman-exporter로 전환했습니다.
5) 보안 로그 대시보드 messages, secure 로그에 pipeline_stages(regex/template/labels)를 적용해 로그인 실패 IP, 계정, 시간대별 추이를 구조화된 필드로 뽑아 "Security Overview" 대시보드를 구성했습니다. 여기에 OPNsense 방화벽 로그까지 syslog(UDP 1514)로 수신해 통합했습니다.
쿠버네티스 클러스터 연결하기
가장 까다로웠던 부분은 기존 스택에 쿠버네티스 클러스터를 붙이는 작업이었습니다. 선택한 방식은:
-
Promtail DaemonSet: 클러스터 내 로그를 중앙 Loki로 전송
-
Prometheus Agent Mode + remote_write: 클러스터 내 kube-prometheus-stack을 Agent 모드로 설치해 메트릭만 중앙 Prometheus로 전송
여기서 중앙 Prometheus 쪽에 --web.enable-remote-write-receiver 플래그가 빠져 있어 remote_write 수신 자체가 거부되는 문제가 있었는데, 플래그를 추가하고 나서야 정상적으로 수신됐습니다. 이후 up{cluster="k8s-a"} 쿼리로 kubelet, apiserver, coredns, kube-proxy, node-exporter 등 30여 개 시계열이 들어오는 것을 확인하면서 첫 번째 클러스터 연동을 마무리했습니다.
정리
온프레미스와 쿠버네티스가 섞인 환경의 통합 모니터링은 "표준 가이드대로" 되는 일이 거의 없습니다. Podman이라는 변수 하나만으로도 로깅 드라이버, cAdvisor 호환성 등 문서에 안 나오는 문제를 계속 만나게 됩니다. 결국 중요한 건 각 에러 메시지를 정확히 읽고, 컨테이너 런타임의 특성을 이해한 채로 하나씩 우회 경로를 찾는 과정이었습니다.
다음 편에서는 나머지 쿠버네티스 클러스터 2대를 마저 연결하고, Grafana에서 멀티 클러스터 뷰를 구성하는 과정을 다뤄보겠습니다.

댓글목록
등록된 댓글이 없습니다.