Grafana 모니터링 시스템 만들기

Grafana 모니터링 시스템 만들기

Category
Published
June 12, 2024
Last updated
Last updated August 23, 2024

개요

이전에 Prometheus와 Grafana를 간단히 사용하며 구조를 이해했고, 본격적으로 exporter를 구성하고 적절한 메트릭을 받아와 작동하는 서버들의 정보를 모아 보기로 했다

목표

  • 클라우드에 작동중인 서버들에 적절한 exporter 추가
  • 서버들의 메트릭 수집
  • 범용적으로 사용되는 메트릭 종류 확인(CPU 사용량, 메모리 사용량 등)
  • 그라파나 세팅하여 서버들 상태 시각화
  • 추가적으로 exporter의 보안을 어떻게 보통 유지하는지, 검색과 적용

어떤 메트릭을 수집할까

원래 계획은 자주 사용되는 메트릭을 찾아서 직접 대시보드를 구현하려 했다.
우선 어떤 메트릭이 자주 사용되는지 확인하기 위해 검색을 해보니, 굳이 메트릭을 일일히 설정해줄 필요 없게 대시보드의 형태로 배포되는 것이 있었다.
 
검색해서 node exporter에서 사용할 대시보드를 찾았다.
이를 적용시키니
notion image
생각보다 빠르게 대시보드 구성을 할 수 있었다

Exporter 보안

이후 가동중인 서버에 본격적으로 exporter를 설정해주기 전에, 보안에 대해 먼저 생각해보기로 했다.
우선 exporter은 단순히 열어둔다면 어느곳에서나 메트릭을 수집해 갈 수 있기 때문에, 시스템이 노출되는 결과를 낳는다. 이를 방지하려면 어떻게 해야 할까?

IP 화이트리스트

클라우드를 사용하기 때문에 해당 서비스에서 제공하는 ip 화이트리스트로 9100포트에 대해서 내가 사용하는 PC의 ip만을 지정해주면 될 것 같다.
  • 문제점
다만 이러면 집 외의 다른 장소에서는 확인이 어려워진다.
  • 전용 서버 개설
프로메테우스와 그라파나를 가동하는 전용 서버를 따로 가동하여 해당 문제를 해결할 수 있다.
메트릭을 계속 수집하기 위해서라도 이렇게 따로 서버개설이 필요할 것 같기는 하다. 또한 프로메테우스와 그라파나 가동이 그렇게 큰 리소스를 요구하진 않을테니 소규모 서버로도 가동이 가능할 것이고, 또는 다른 서비스와 같이 가동할 수도 있을 것 같다(젠킨스 등).
장기적으로 그라파나 서버를 제작하기로 하고, 우선은 IP 화이트리스트 방식으로 당장의 보안을 유지하기로 했다.
  • VPN 사용
또는 외부에서 접근시 VPN을 이용할 수도 있으나, VPN 서버를 만들어 두어야 하는 것은 동일하고, 크게 이점이 없는 방식이라 판단했다.

인증

또는 Nginx등을 이용하여 exporter 접근시 인증을 할 수도 있을 것 같다.

Exporter 설정

어떤 exporter를 설정할까?

Node exporter가 유명하지만, 스프링에서 actuator에서 제공하는 exporter나 Minecraft 게임 서버에서 사용할 수 있는 minecraft-prometheus-exporter 등도 존재한다.
모두 Node exporter로 통일한다면 대시보드 설정이 편하겠지만, 실제 작동하는 서비스(앱)의 정보를 가져오려면 특화된 exporter가 필요할 것이다.
 
그렇기에 우선 모든 서버에 대해서 Node exporter를 설정해주고, 추가적으로 서비스 특화 exporter를 사용할 수 있으면 이것도 같이 사용해주기로 결정했다.

Grafana 모니터링 시스템을 만들고

  • 다양한 exporter를 사용하고, 메트릭을 하나하나 찾아 대시보드를 만들어 줄 생각이었는데, 이미 대시보드 템플릿 형식으로 나온것이 있어서 빠르게 만들 수 있었다
  • 보안과 메트릭 수집을 지속적으로 하기 위해 그라파나 전용 서버는 필수인 것 같다
  • 수집까지는 좋은데 의미있게 써먹으려면 메트릭에 문제가 있으면 알림등을 해줘야 할듯?

추가적으로 할것

  • 그라파나 전용 서버 제작하기
  • 메트릭 이상에 따른 슬랙 알람봇 만들기

Docker Compose로 원클릭 그라파나 서버 만들기

💡
2024.07.03 추가

개요

이전에 Grafana 모니터링 시스템을 구상해본 후 최종적으로 전용 서버를 제작하는 것이 좋다는 결론이 나왔다.
이에 전용서버를 구축할겸, 아에 최대한 편하게 구축할 수 있게 Docker compose를 이용하여 원클릭 배포를 만들어보기로 했다.

목표

  • docker-compose up 으로 끝나는 서버 배포
  • 보안을 위한 그라파나 페이지 Authentication

서버 구성

아래의 구성들은 모두 위의 레포지토리에서 확인할 수 있다.

prometheus.yml

우선 docker-compose.yml을 구성하기 전에 프로메테우스 설정을 구성했다.
고민되는 부분은 타겟 서버들을 별도의 파일이나 환경변수로 분리할지 아니면 그대로 Github에 공개로 올릴지의 여부였다.
Github에 공개로 올리지 않더라도 어짜피 어딘가에서는 공격 시도가 들어올테니, 그냥 편하게 공개해버리고 각 서버에 방화벽을 제대로 설정하기로 결정했다.
global: scrape_interval: 30s scrape_configs: - job_name: "a-server" static_configs: - targets: ["a.net:9100"] - targets: ["a.net:9940"] - job_name: "b-server" static_configs: - targets: ["b.com:9100"] - job_name: "c-server" static_configs: - targets: ["c.net:9100"]
prometheus.yml

grafana

그 다음은 그라파나를 설정해주기로 했다. 기존에는 서버를 시행하고, 그라파나의 대시보드는 일일히 따로 설정해주는 방식이었다. 이를 한번에 진행하기 위해 다음과 같이 설정 파일을 제작해주었다.
apiVersion: 1 datasources: - name: Prometheus type: prometheus access: proxy url: http://prometheus:9090 isDefault: true editable: true jsonData: timeInterval: 30s version: 1
grafana/datasource.yml
apiVersion: 1 providers: - name: "default" orgId: 1 folder: "" type: file disableDeletion: false updateIntervalSeconds: 10 options: path: /var/lib/grafana/dashboards
grafana/dashboards.yml
 
그리고 대시보드도 json으로 다운받아 grafana/dashboards에 추가해주었다
{ "__inputs": [ { "name": "DS_PROMETHEUS", "label": "Prometheus", "description": "", "type": "datasource", "pluginId": "prometheus", "pluginName": "Prometheus" ~~~ 약 23000줄 ~~~ }, "timezone": "browser", "title": "Node Exporter Full", "uid": "rYdddlPWk", "version": 92, "weekStart": "" }
grafana/dashboards/1860_rev37.json
💡
해당 대시보드는 Apache-2.0 license로 자유롭게 사용 가능하다

docker-compose.yml

마지막으로 이 모든걸 잇고 배포할 Docker compose 파일을 추가했다.
version: '3.8' services: prometheus: image: prom/prometheus:latest container_name: prometheus volumes: - ./prometheus.yml:/etc/prometheus/prometheus.yml expose: - 9090 grafana: image: grafana/grafana:latest container_name: grafana depends_on: - prometheus ports: - "3000:3000" environment: - GF_SECURITY_ADMIN_USER=admin - GF_SECURITY_ADMIN_PASSWORD=admin - TZ=Asia/Seoul volumes: - grafana-data:/var/lib/grafana - ./grafana/datasource.yml:/etc/grafana/provisioning/datasources/datasource.yaml - ./grafana/dashboards.yml:/etc/grafana/provisioning/dashboards/dashboards.yaml - ./grafana/dashboards:/var/lib/grafana/dashboards volumes: grafana-data:
docker-compose.yml
위에서 작성한 설정 파일들을 볼륨에 적절히 연결시켜주었다.
Prometheus는 외부로 공개하지 않고 도커 네트워크 내부에서만 포트를 열어두었다. 즉 외부에서는 Grafana로만 접근이 가능하고, Grafana에 인증 절차를 추가하는 구성이다.

Exporter 설정

도커 설치가 되어 있는 서버에서는 다음과 같이 도커를 이용해 Node Exporter 를 실행했다.
sudo docker pull prom/node-exporter sudo docker run -d \ -p 9100:9100 \ prom/node-exporter
도커 설치가 되어 있지 않은 서버에서는 다음과 같이 수동으로 설치 해주었다.
# x64 sudo wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz sudo tar xvfz node_exporter-1.8.2.linux-amd64.tar.gz cd node_exporter-1.8.2.linux-amd64 ./node_exporter & # ARM wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.4.0.linux-arm64.tar.gz tar xvfz node_exporter-1.7.0.linux-arm64.tar.gz cd node_exporter-1.7.0.linux-arm64 ./node_exporter &
수동 설치한 경우에 자동 재시작을 추가하려면
sudo vi /etc/systemd/system/node_exporter.service
에서 다음을 추가하고
[Unit] Description=Node Exporter Wants=network-online.target After=network-online.target [Service] User=root Group=root Type=simple ExecStart=/home/ubuntu/node_exporter-1.8.2.linux-amd64/node_exporter [Install] WantedBy=multi-user.target
아래의 명령을 통해 서비스를 등록할 수 있다.
sudo systemctl daemon-reload sudo systemctl enable node_exporter.service sudo systemctl start node_exporter.service

방화벽 설정

각 클라우드의 방화벽 설정에서 9100/TCP 포트를 개방해주었다. 이에 추가적으로 OCI 에서는 추가 설정이 필요해 iptables 명령어로 화이트리스트를 추가해주었다.
sudo iptables -I INPUT -p tcp --dport 9100 -j ACCEPT
💡
방화벽 설정에서 문제가 생기면 iptables, ufw, firewall-cmd 등을 확인해보는 것을 권장

완료

notion image
이렇게 자체 그라파나 서버를 구성할 수 있었다.
추후 수정하고 싶은 점으로는
  • Nginx나 다른 수단으로 3000번 포트 → 80번 포트로 이전
  • https 적용
이 있다.