Overview
사내 및 데이터센터에서 다수의 서버를 관리하고 있었지만, 각 서버의 자원 상태를 한 화면에서 파악할 수단이 없어 비정상적인 자원 점유나 이상 징후를 제때 발견하기 어려웠다. 그러던 중 모니터링 서버를 구축해 볼 수 있겠냐는 제의를 받았고, 한번 해보겠다고 했다. 약 70대의 서버에 node-exporter를 Ansible로 일괄 배포해, Grafana에서 CPU·메모리·네트워크를 한눈에 확인하는 통합 모니터링 환경을 구축했다. 여기서 욕심을 내 "GPU는 관리 안 해도 되나요?"라고 물었고, "하면 좋지"라는 답에 실패하더라도 해보겠다고 했다. 처음엔 dcgm-exporter를 설치하려 했지만, 서버마다 비어 있는 포트를 찾는 것부터 일이었다. 그래서 "우회할 방법이 없을까?" 고민하다가, cronjob으로 일정 시간마다 GPU 상태 스냅샷을 찍어 DB에 적재하고 이를 Grafana에서 띄우는 구조를 직접 설계했다.
아키텍처
Agentless가 필요했다: 대상 서버에 모니터링과 무관한 에이전트를 얹는 게 부담이라 SSH만으로 동작하는 Ansible을 택했다. 멱등성 덕에 몇 번을 다시 돌려도 동일 상태로 수렴해, 78대 반복 적용과 서버 추가에도 안전하게 재사용할 수 있었다.
OS 계열에 따라 방화벽 처리를 분기했다: node-exporter는 특정 포트로 지표를 노출하는데, 서버 방화벽이 켜져 있으면 그 포트가 막혀 Prometheus가 수집하지 못할 수 있었다. 그래서 사수에게 포트를 열어도 되는지 요청했더니, 내부 방화벽은 꺼도 된다는 답을 받았다. 다만 OS 계열마다 방화벽 도구가 달라(Debian 계열은 ufw, RedHat 계열은 firewalld) 하나의 명령으로 끌 수 없었기 때문에, Ansible로 OS를 판별해 계열별로 분기 처리했다.
GPU 우회 수집 구조 설계: GPU의 metric을 수집하는 dcgm-exporter의 포트 조사 등 제약이 컸다. '프로메테우스도 결국 스냅샷의 집합'이라는 발상으로 ansible을 통해 서버에 접속한 뒤, 명령어를 통해 메트릭을 수집하여 DB에 적재하고, 이를 cron job으로 등록해 주기적으로 실행했다.




