들어가며
최근 서버로 활용하기 좋은 PC를 한 대 얻게 되어 직접 홈 서버를 구축해 보려고 한다.
주된 목적은 친구들과 함께 즐길 마인크래프트 서버를 운영하는 것이다. 하지만 직업이 직업인 만큼 단순히 게임 서버만 실행하는 데 그치지 않고, Ubuntu 기반 운영체제에 모니터링 스택까지 구성해 제대로 운영해 볼 생각이다.
나아가 기회가 된다면 Ansible을 이용해 서버 설정을 코드로 관리하고, 필요할 때 언제든 동일한 환경을 재현할 수 있도록 구성 자동화까지 진행해 보는 것이 이번 시리즈의 목표다.
이번 포스트에서는 Ubuntu가 설치된 PC에 Node Exporter를 구성하고, 시스템 메트릭을 Prometheus로 수집한 뒤 Grafana 대시보드로 시각화하는 과정까지 다룬다.
Node Exporter를 비롯한 각 구성 요소는 컨테이너가 아닌 Linux systemd 서비스 방식으로 설치할 예정이다. 특별한 기술적 이유가 있는 것은 아니다. 회사에서 Docker Compose와 Kubernetes를 주로 사용하고 있어서, 이번에는 호스트에서 서비스를 직접 구성하고 관리해 보고 싶었다. 결국 가장 큰 이유는 그냥 내 마음이다.
사용 장비

모델: HP ProDesk 400 G7 SFF
CPU: Intel Core i5-10400 — 6코어 12스레드, 2.9GHz·최대 4.3GHz
메모리: DDR4 24GB — 16GB + 8GB
저장장치: 500GB
내장 그래픽: Intel UHD Graphics 630
운영체제: Ubuntu
Node Exporter 설치
먼저 홈 서버의 CPU, 메모리, 디스크, 네트워크 등의 상태를 수집하기 위해 Node Exporter를 설치한다.
Node Exporter는 Linux 시스템의 하드웨어 및 운영체제 정보를 Prometheus 형식의 메트릭으로 제공하는 Exporter다. 기본적으로 9100 포트를 사용하며, Prometheus는 이 엔드포인트에 주기적으로 접근해 메트릭을 수집한다.
전용 사용자 생성
Node Exporter를 별도의 사용자 권한으로 실행하기 위해 로그인할 수 없는 시스템 사용자를 생성한다. 이는 서비스를 불필요한 root 권한으로 실행하지 않기 위함이다.
sudo useradd \
--system \ # 일반 사용자가 아닌 시스템 계정
--user-group \ # 같은 이름의 전용 그룹 생성
--no-create-home \ # 홈 디렉터리를 만들지 않음
--shell /usr/sbin/nologin \ # 직접 로그인하지 못하도록 제한
node_exporter
생성된 사용자는 다음과 같이 확인할 수 있다.

Node Exporter 다운로드 및 설치
이 글에서는 1.12.1 버전을 설치할 예정이고, 서버의 CPU가 Intel x86-64 아키텍처이므로 linux-amd64 파일을 사용한다.
# 임시 디렉토리로 이동
cd /tmp
# Node Exporter 다운로드
wget "https://github.com/prometheus/node_exporter/releases/download/v1.12.1/node_exporter-1.12.1.linux-amd64.tar.gz"
# 압축 해제
tar -xzf "node_exporter-1.12.1.linux-amd64.tar.gz"
# 실행 파일 설치
sudo install \
-m 0755 \
"node_exporter-1.12.1.linux-amd64/node_exporter" \
/opt/node_exporter/node_exporter
설치 경로(/opt/node_exporter)로 가서 설치되었는지 다음과 같이 확인한다.

Systemd 서비스 등록
Node Exporter가 서버 부팅 시 자동으로 실행되도록 systemd 서비스로 등록한다.
sudo nano /etc/systemd/system/node_exporter.service
서비스 파일에 다음 내용을 작성한다.
[Unit]
Description=Prometheus Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/opt/node_exporter/node_exporter
Restart=on-failure
User=node_exporter
Group=node_exporter
[Install]
WantedBy=multi-user.target
파일을 저장한 뒤 systemd 설정을 다시 불러오고 Node Exporter를 실행한다.
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
서비스 상태 확인
다음 명령으로 서비스가 정상적으로 실행되고 있는지 확인한다.
sudo systemctl status node_exporter
출력에 active (running)이 표시되면 서비스가 정상적으로 실행된 것이다.
Node Exporter는 기본적으로 9100 포트의 /metrics 경로를 통해 메트릭을 제공한다. 다음 명령으로 실제 응답을 확인한다.
curl http://localhost:9100/metrics

Prometheus 설치 및 연동
Node Exporter가 정상적으로 시스템 메트릭을 제공하는 것까지 확인했다. 이제 해당 메트릭을 주기적으로 수집하고 저장할 Prometheus를 설치한다.
Prometheus 역시 Node Exporter와 마찬가지로 전용 사용자와 systemd 서비스를 이용해 실행한다. Prometheus 버전은 현재 LTS인 3.13.3을 사용하고, 관련 파일은 모두 /opt/prometheus 아래에 구성한다.
전용 사용자 생성
Prometheus가 root 권한으로 실행되지 않도록 전용 시스템 사용자를 생성한다.
sudo useradd \
--system \
--user-group \
--no-create-home \
--shell /usr/sbin/nologin \
prometheus
생성된 계정을 확인한다.

Prometheus 3.13.3 다운로드
# 임시 디렉터리로 이동
cd /tmp
# Prometheus 3.13.3 다운로드
wget "https://github.com/prometheus/prometheus/releases/download/v3.13.3/prometheus-3.13.3.linux-amd64.tar.gz"
# 압축 해제
tar -xzf "prometheus-3.13.3.linux-amd64.tar.gz"
실행 파일 설치
Prometheus를 설치할 디렉토리를 생성한다.
sudo mkdir -p /opt/prometheus
sudo mkdir -p /opt/prometheus/data
압축을 해제한 디렉터리에서 실행 파일을 설치한다.
sudo install \
-m 0755 \
"prometheus-3.13.3.linux-amd64/prometheus" \
/opt/prometheus/prometheus
sudo install \
-m 0755 \
"prometheus-3.13.3.linux-amd64/promtool" \
/opt/prometheus/promtool
기본 설정 파일도 /opt/prometheus로 복사한다.
sudo install \
-m 0755 \
"prometheus-3.13.3.linux-amd64/prometheus.yml" \
/opt/prometheus/prometheus.yml
다음과 같이 뜨면 정상적으로 설치된 것이다.

Node Exporter 수집 설정
이제 Prometheus가 Node Exporter의 메트릭을 수집하도록 스크랩 설정을 진행한다.
sudo nano /opt/prometheus/prometheus.yml
Prometheus 자체 메트릭과 Node Exporter 메트릭을 수집하도록 다음과 같이 작성한다.
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: prometheus
static_configs:
- targets:
- localhost:9090
- job_name: node_exporter
static_configs:
- targets:
- localhost:9100
Prometheus와 Node Exporter가 같은 서버에서 실행되고 있으므로 수집 대상에는 localhost를 사용했다.
그리고 promtool 을 통해 설정 파일의 문법 오류를 검증할 수 있다.
sudo /opt/prometheus/promtool \
check config /opt/prometheus/prometheus.yml
다음과 같이 SUCCESS가 표시되면 설정 파일에 문제가 없는 것이다.
SUCCESS: /opt/prometheus/prometheus.yml is valid prometheus config file syntax
systemd 서비스 등록
이제 Prometheus를 systemd 서비스에 등록해서 자동으로 관리되도록 하자.
sudo nano /etc/systemd/system/prometheus.service
다음 내용을 작성한다.
[Unit]
Description=Prometheus Monitoring
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
ExecStart=/opt/prometheus/prometheus \
--config.file=/opt/prometheus/prometheus.yml \
--storage.tsdb.path=/opt/prometheus/data
Restart=on-failure
User=prometheus
Group=prometheus
[Install]
WantedBy=multi-user.target
설정을 적용하고 서비스를 실행한다.
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
실행 상태 확인
실행 상태를 확인할 예정인데, systemctl status 로 확인하는 것도 좋지만 바로 Prometheus 웹 UI로 들어가서 확인하겠다.
브라우저에서 다음 주소로 접속한다.
http://localhost:9090/targets
prometheus와 node_exporter가 모두 UP으로 표시되면 정상적으로 메트릭을 수집하고 있는 것이다.

이제 쿼리화면에서 다음 PromQL을 실행해서 정상적으로 쿼리를 보내는지도 확인한다.
up{job="node_exporter"}
결과가 1이면 Prometheus와 Node Exporter의 연동이 완료된 것이다.
Grafana 설치 및 Prometheus 연동
마지막으로 Prometheus에 저장된 메트릭을 시각화하기 위해 Grafana를 설치한다.
Grafana는 이전 두 서비스와 다르게 공식 APT 저장소를 이용해서 설치해야 한다. Grafana 패키지는 앞선 두 서비스와 달리 전체 사용자와 systemd 서비스까지 함께 구성해준다.
Grafana 저장소 추가
먼저 저장소를 추가하는 데 필요한 패키지를 설치한다.
sudo apt-get install -y \
apt-transport-https \
wget \
gnupg
Grafana 저장소의 GPG 키를 내려받는다.
http://localhost:3000/login
sudo mkdir -p /etc/apt/keyrings
sudo wget \
-O /etc/apt/keyrings/grafana.asc \
https://apt.grafana.com/gpg-full.key
sudo chmod 644 /etc/apt/keyrings/grafana.asc
Grafana 공식 stable 저장소를 추가한다.
echo "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" \
| sudo tee /etc/apt/sources.list.d/grafana.list
Grafana 설치 및 실행 확인
패키지 목록을 갱신하고 Grafana OSS를 설치한다.
sudo apt-get update
sudo apt-get install -y grafana
sudo systemctl daemon-reload
sudo systemctl enbale --now grafana-server
이제 다음 주소로 들어가서 설치를 확인할 수 있다.
http://localhost:3000/login

초기 비밀번호는 아래와 같고 UI 에서 변경이 가능하다.
Id: admin
Password: admin
Prometheus 데이터 소스 추가
Node Exporter 대시보드를 추가 하기에 앞서, Grafana 가 Prometheus를 데이터 소스로 쓰기위한 설치부터 진행한다.
사이드바에서 Connections -> Data sources 를 클릭한다.

Add new data source 버튼을 누른다.

Prometheus 를 검색 후 선택하고, Connection 항목에 http://localhost:9100 을 기입한뒤 save&test 버튼을 누른다.

Data source 설정이 완료되면 Explore 에 들어가서 Prometheus 와 메트릭이 불러와지는 모습을 볼 수 있다.

Linux Node Exporter 대시보드 설정
이제 Linux Node Exporter 의 대시보드를 만든다. 이미 남이 잘 만들어 놓은 대시보드를 그대로 가져 와서 쓰겠다.
먼저 사이드바에서 Dashboard 를 선택한뒤, New -> Import dashboard 버튼을 누른다.

Import 에는 JSON을 사용하는 방식, 이미 Grafana 커뮤니티에 공개된 대시보드 id 이렇게 두 가지가 있다. 우리는 대시보드 ID 를 사용해서 Import 하겠다. 1860을 기입하고 Load를 눌러준다

이후 Import 버튼을 누른다.

그러면 Linux Node Exporter 가 설치되고 Prometheus가 수집하기 시작한 이후의 데이터들을 대시보드에서 확인 가능하다.

각 요소들의 정보는 다음에 기회가 있을 때 정리해보고자 한다. 그리고 추후에 이 3요소를 한번에 설치 가능한 Ansible 플레이북을 만들까 싶다. 분명히 도움이 될 것 같다.
