TOPIC/Data

1부 : Prometheus(+ Node Exporter, AlertManager) + Grafana 구성하기

admin_cloud 2024. 2. 15. 17:16

안녕하세요. TAK 입니다:)

 

요번 Monitoring & Alert 를 위해 많이 사용되는 "Prometheus(+ Node Exporter) + Grafana" 주제를 준비했습니다!

(별도의 Category 를 만들까 했지만, 제가 처음으로 포스팅한 내용처럼 조금 더 포괄적인 영역인 DATA 분야에 포스팅하게 되었습니다.)

 

조금 더 자세한 전달을 위해 1부 & 2부로 나눠서 포스팅할 예정입니다.

1부에서는 개념과 테스트 환경의 설명, Prometheus 및 Node Exporter 설치와 구성
2부에서는 Grafana 대시보드화 구성과 AlertManager 를 통한 알림 서비스 연동

 

자, 그럼 본격으로 1부 시작하겠습니다!


Contents

    1-1. Prometheus 란?

    : Promethus 란, 시스템 모니터링 및 경고를 위해 SoundCloud 에서 구축된 오픈소스 ToolKit 입니다.

    현재는 독립된 오픈소스 프로젝트로 Kubernetes와 같이 거버넌스에 종속되지 않는 Cloud Native Computing Foundations에 합류했다고 합니다.

     

    주된 목적은 모니터링으로 서비스 운영 중 발생할 수 있는 이슈 및 장애 대비를 위해 사용되며, 시계열 데이터를 수집하고 기록하며, 이를 구체화(수치화, 시각화)하는 것이라고 표현할 수 있습니다.

     

    Timestamp와 함께 측정항목의 이름과 Key-Vaule 쌍으로 기록되며, 시계열이라 함은 시간에 따른 변화를 기록하는 것을 의미합니다. 이러한 다차원 데이터 모델을 활용하기 위한 별도의 PromQL이라는 쿼리언어가 존재합니다.

     

    모니터링에는 2가지 매커니즘이 존재합니다.

    1. pull-based monitoring system
    2. push-based monitoring system

     

    Prometheus 에서는 아래 보이는 것과 같이 대상(Targets)으로부터 메트릭 값을 Pull

    가져오는(받아오는) 방식을 사용하고 있습니다. 예를 들어, Node Exporter 라는 Agent가 설치된 대상(Tagets) 서버의 메트릭을 수집하면, 중앙 시스템(Prometheus Server)가 데이터를 Scraping 하는 방식입니다.

     

    이러한 Pull - Push 방식은 사용자의 관점이나 환경에 따라 장단점이 존재합니다.

     

    Pull의 경우만 살펴보자면,

    중앙 시스템(Prometheus Server)는 직접(수동) 접근하여 데이터를 수집하기에 신뢰성이 높으며, Health Check에서도 연결 구성이 비교적 단순하기에 Trobleshooting이 수월한 점 등이 있습니다.

     

    출처 : https://prometheus.io/assets/architecture.png

     

     

    위 그림처럼 Prometheus 생태계는 여러 구성 요소들로 이뤄질 수 있습니다.

    (대부분의 Prometheus 구성 요소는 Go 언어로 개발되었으며, 정적 바이너리로 쉽게 구축하고 배포할 수 있습니다.)

     

    생태계 구성 요소와 각 기능을 설명하자면 다음과 같습니다.

    • 데이터 수집
      : 중앙 시스템 역할을 하는 Prometheus Server 의 요소 중 하나인 Retrieval에서는 Service discovery에 정의되어 있는 Target을 식별합니다. Target이 정의되면 Retrieval에서 Target에 존재하는 Exporter를 통해 메트릭을 스크래핑 합니다.

      Service discovery는 Kubernetes Cluster 과 같은 Auto-Scale Target 에 대해 메트릭을 수집 대상을 동적으로 설정 가능하도록 yaml 형태로 정의한 파일로 저장되어 있습니다.

      또한, Pushgateway 는 말 그대로 데이터를 push 받아주는 서버(From Exporter) 입니다.
      이는 역할은 단일(임시) 또는 배치 작업과 같은 수명이 짧은 서비스에 대한 메트릭을 가져오기위해 사용 합니다.

    • 데이터 저장
      : Prometheus Server 구성 요소를 살펴보면, Pull Metrics 방식으로 데이터를 수집하는 역할을 하는 Retrieval,
      이러한 데이터가 저장되는 Local Storage인 TSDB(Time Series Database), 그리고 이러한 데이터를 API와 PromQL등 사용하여 대시보드화 등 활용가능케 하는 HTTP Server로 구성되어 있습니다.

            *데이터 저장소는 Remote Storage(Disk, Volume) 사용 가능.

    • 데이터 시각화, 알림
      : Prometheus Server 의 HTTP Server 는 수집한 메트릭 데이터를 HTTP 엔드포인트를 통해 활용될 수 있습니다. Grafana와 같은 대시보드를 위한 애플리케이션을 사용하여 PromQL 쿼리하여 데이터를 시각화할 수 있습니다.

      또한, API 방식으로 Alertmanager를 통해 수집한 메트릭 데이터 정보를 바탕으로 임계값을 조건에 맞춰 생성하고, 이데 따른 알림 및 경고를 E-mail, Slack 등 다양한 채널로 최종 사용자에게 전송하는 역할을 합니다.

     

    1-2. 테스트 환경

    출처 : https://training.promlabs.com/static/node-exporter-architecture-570e9857c08bbb0008022f76606fa749.svg

     

    위 예시처럼 Linux 서버에 Node Exporter를 사용하여 중앙 시스템(Prometheus Server)에서 메트릭 데이터를 Scraping 하는 구성도는 다음과 같습니다.

     

    이러한 구조는 Azure 환경에서 주로 사용되는 Hub-Spoke 구조에 적합?하여, Hub 영역에 Promethues Server를 배치하고, 메트릭 데이터를 수집하는 위 구성도를 반영하였습니다.

     

    우선, 서로 다른 네트워크(대역)을 VNET(Virtual Network) Peering을 통해 통신 가능한 상태로 구현하였습니다.

    (VPN은 비용상 문제가 있어서... 양해를..)

     

    Target VM을 서로 다른 Linux 계열을 사용하였으며, Subnet으로 구분한 이유는 NSG(Network Security Group)에 따른 In/Out Bound 정책을 제어하고자 하는 목적이 있습니다.

     

    현재 구성에 대한 세부 사항은 아래 접은글을 참고해주세요!

    더보기

    사용된 리눅스 계열(정보) 참조

    - Ubuntu 22.04

    - Rocky 8

    - RHEL 8.7 

    더보기

     Peering 연결 설정 그리고 간단한 통신 테스트 내용 참조

    • VNET Peering
      • Peering 대상  : tak-PG-vnet (172.168.10.0/24) - tak-prometheus-vnet(10.0.30.0/24)
      • 각 대상 VNET 선택 > 설정 > [피어링] 추가

     

    • 연결 및 통신 확인
      • Target VM 중 Ubuntu VM 정상 연결 확인(Ping, Telnet)

     

    1-3. Prometheus Server 설치

    이번 포스팅에서는 Binary 설치 방식을 사용하였습니다.

    (Docker 를 통한 설치는 추후 Kubernetes 환경에서 모니터링 포스팅에서 다룰 예정이랍니다!)

     

    1-3-1. 설치를 위한 기본 설정

    • Package Update
    sudo apt update

     

    • Prometheus 시스템 그룹 및 사용자 할당
    sudo groupadd --system prometheus
    sudo useradd -s /sbin/nologin --system -g prometheus prometheus

     

    • Prometheus 용 디렉터리 생성 및 권한 설정
    sudo mkdir /etc/prometheus
    sudo mkdir /var/lib/prometheus
    
    sudo chown -R prometheus:prometheus /var/lib/prometheus

     

    1-3-2. 설치를 위한 Binary 파일 구성

    • 아래 링크에서 원하는 버전 선택하여 진행
      • 현재 글은 최신 버전으로 구성
     

    Download | Prometheus

    An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

    prometheus.io

    wget https://github.com/prometheus/prometheus/releases/download/v2.43.0/prometheus-2.43.0.linux-amd64.tar.gz

     

    • 압축 풀고, 디렉터리 이동
    tar vxf prometheus*.tar.gz
    
    cd prometheus*/
    

     

     

     

    • Binary 파일 (로컬)이동 및 소유자 설정
    sudo mv prometheus /usr/local/bin
    sudo mv promtool /usr/local/bin
    sudo chown prometheus:prometheus /usr/local/bin/prometheus
    sudo chown prometheus:prometheus /usr/local/bin/promtool
    

     

     

    • 구성 파일 이동 및 소유자 변경
    sudo mv consoles /etc/prometheus
    sudo mv console_libraries /etc/prometheus
    sudo mv prometheus.yml /etc/prometheus
    
    sudo chown prometheus:prometheus /etc/prometheus
    sudo chown -R prometheus:prometheus /etc/prometheus/consoles
    sudo chown -R prometheus:prometheus /etc/prometheus/console_libraries
    sudo chown -R prometheus:prometheus /var/lib/prometheus
    

     

     

     

    • Prometheus Config 파일 수정
      • 지금 단계에서는 변경 사항없이 Default 값에 대한 정보만 확인합니다.
    sudo nano /etc/prometheus/prometheus.yml
    

     

    • Prometheus Systemd Service 만들기
    sudo nano /etc/systemd/system/prometheus.service
    
    [Unit]
    Description=Prometheus
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    User=prometheus
    Group=prometheus
    Type=simple
    ExecStart=/usr/local/bin/prometheus \\
        --config.file /etc/prometheus/prometheus.yml \\
        --storage.tsdb.path /var/lib/prometheus/ \\
        --web.console.templates=/etc/prometheus/consoles \\
        --web.console.libraries=/etc/prometheus/console_libraries
    
    [Install]
    WantedBy=multi-user.target
    

     

    • 구성 사항 반영을 위해 Reload Systemd
    sudo systemctl daemon-reload

     

     

    1-4. Prometheus Serivce 시작

    sudo systemctl enable prometheus
    sudo systemctl start prometheus
    
    sudo systemctl status prometheus
    

     

    • 방화벽 허용(Azure NSG 허용 정책)
      • Azure의 VM의 경우, 방화벽 설정이 Default 값으로 Inactive(비활성화) 입니다. 
      • 따라서, 해당 과정에서는 NSG 정책으로 In/Out Bound 제어 합니다.
        - InBound 정책 추가 : Default Port 9090

     

    • Prometheus 정상 액세스 확인

     

    1-5. Target VM < Node Exporter 설치

    이제는 Prometheus Server에서 Pull 방식으로 Scraping 할 수집 대상(Target) VM에 Node Exporter 설치 과정을 진행하겠습니다!

     

    Node Exporter을 통해서 각기 다른 Linux 계열 서버들을 대상으로 메트릭을 수집합니다.

     

    이는 시스템 서비스로 실행되며, 구성을 위한 전체적인 단계는 동일합니다.

    따라서, 이러한 공통 사항 반영하여 모든 VM에서 실행할 수 있도록 Shell Scripts 방식으로 배포하였습니다.

    (일부 명령어 사용에 있어 Linux 계열에 따라 구성에 달라질 수 있습니다.)

     

    1-5-1. (공통) Shell Scripts

    vi node-exporter-install.sh
    
    # System User생성
    sudo useradd -rs /sbin/nologin node_exporter
    
    # Node Exporter Binary Install
    wget <https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz>
    tar -xvf node_exporter-1.7.0.linux-amd64.tar.gz
    
    sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
    
    # Systmed Service 생성
    sudo tee </dev/null /etc/systemd/system/node_exporter.service
    [Unit]
    Description=Node Exporter
    Wants=network-online.target
    After=network-online.target
    StartLimitIntervalSec=500
    StartLimitBurst=5
    [Service]
    User=node_exporter
    Group=node_exporter
    Type=simple
    Restart=on-failure
    RestartSec=5s
    ExecStart=/bin/sh -c '/usr/local/bin/node_exporter' \
        --collector.logind
    [Install]
    WantedBy=multi-user.target
    EOF

     

    # 디렉터리 권한 변경
    chmod 775 /root/node-exporter-install.sh
    
    # 스크립트 실행
    /root/node-exporter-install.sh

     

     

    *Rocky의 경우, 파일 다운로드를 위해 wget 설치 필요

    (얘가 손이 많이 가서... ExecStart 값에서 다른 Linux는 실행 파일의 Path만 입력하면 됐는데.. 굳이 실행 명령어까지 필요한 너...)

    sudo yum install wget

     

    *RHEL경우, 7버전 이후부터는 firewalld 가 기본 방화벽 관리 도구로 사용되므로, Node Exporter의 Port(9100)를 추가

    # 9100 리스닝 확인
    netstat -nlp | greo 9100

    # 방화벽 상태 확인
    sudo firewall-cmd --state
    
    # 방화벽 현재 구성 확인
    sudo firewall-cmd --list-all
    # 방화벽 정책 추가
    sudo firewall-cmd --add-port=9100/tcp --permanent
    
    firewall-cmd --reload

    1-5-2. Systemd Serivce 확인

    • 위 단계의 스크립트 실행 후, 진행
    sudo systemctl daemon-reload
    
    sudo systemctl enable node_exporter
    sudo systemctl start node_exporter
    
    # activce 상태 확인
    sudo systemctl status node_exporter

     

    • 아래와 같이 Active 상태인 것을 확인

     

    • 프로세스(Daemon) 확인

     

     

    1-6. Prometheus Server에서 Target 정보(Node Exporter) 추가

    이번 단계에서는 위 Prometheus Server 설치 단계에서 확인한 Config 파일에 아래와 같이 해당 내용을 반영합니다.

    • Prometheus Config 파일 수정
      • scrape_configs > job_name > static_configs > targets
    sudo nano /etc/prometheus/prometheus.yml
    

     

    • 서비스 재시작하여 변경값 적용
    sudo systemctl restart prometheus

     

    • 서비스 상태 확인

     

    1-7. Prometheus Server Target 구성 확인

    이제 마지막으로 Prometheus Server에 들어가서 지금까지의 구성이 정상적으로 적용되었는지를 확인해 보겠습니다.

    • Target 확인

     

    • 쿼리(PromQL) 테스트
      • (예시) 운영체제 확인
        node_os_info​
      • (예시) CPU 확인
        100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)​

     


    이상으로 Prometheus(+ Node Exporter, AlertManager) + Grafana 구성하기 "1부 : 개념과 테스트 환경의 설명, Prometheus 및 Node Exporter 설치와 구성" 마치겠습니다.

     

    조만간 "2부 : AlertManager 를 통한 알림 서비스 연동 그리고 Grafana 대시보드화 구성" 로 돌아오겠습니다.(!많관부!)

    728x90
    320x100
    SMALL