TOPIC/Data

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

admin_cloud 2024. 2. 20. 10:59

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

 

지난 1부에 이어서 2부 "Grafana 대시보드화 구성과 AlertManager 를 통한 알림 서비스 연동" 으로 돌아왔습니다!

 

1부와 이어지는 내용이기에 아래 링크를 통해서 확인 후에, 이번 포스팅을 팔로우 하시면 이해하는 데 편하실거에요:)

 

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

안녕하세요. TAK 입니다:) 요번 Monitoring & Alert 를 위해 많이 사용되는 "Prometheus(+ Node Exporter) + Grafana" 주제를 준비했습니다! (별도의 Category 를 만들까 했지만, 제가 처음으로 포스팅한 내용처럼 조

with-cloud.tistory.com

 

그럼 시작하겠습니다!


Contents

    2-1. Grafana 구성

    2-1-1. Grafana 설치

    구성도에서 처럼 Promethues Server가 아닌, 별도의 Grafana Server(Ubuntu 22.04)에서 구성하겠습니다.

     

    자세한 사항은 Offical Docs 를 참고해 주세요!

    (가이드 등 세부 내역이 상세히 잘 되어 있는 느낌..!)

     

     

    Download Grafana | Grafana Labs

    Overview of how to download and install different versions of Grafana on different operating systems.

    grafana.com

     

    • Grafana Packages Repository 추가
    sudo apt-get install -y apt-transport-https software-properties-common wget
    # GPG key
    sudo mkdir -p /etc/apt/keyrings/
    wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
    # To add a repository for stable releases
    echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
    # Updates the list of available packages
    sudo apt-get update
    
    # Installs the latest OSS release:
    sudo apt-get install grafana

     

    • Systemd Service 시작
    sudo systemctl daemon-reload
    sudo systemctl enable grafana-server.service
    sudo systemctl start grafana-server.service
    sudo systemctl status grafana-server.service

     

    • NSG 확인
      • Azure Ubuntu의 경우, 방화벽의 Default 값은 Inactive 이므로, NSG(Netwokr Security Group)에서 제어합니다.
      • Grafana의 Default Port : 3000

    2-1-2. Grafana 설정

    • 액세스 확인 및 초기 Login 정보
      • 초기 Login 정보 > ID : admin / PW : admin
      • 최초 접속 이후에, PW 변경 지시에 따라 변경 권장

     

    • Data Source 설정하기
      • 실제 시각화할 데이터의 원본을 설정하는 단계입니다.

     

    • Prometheus Server 추가

     

     

    • Promethues Server의 URL 추가
      • 연결을 위한 아래 빨간 네모 박스 설정 이외에 인증, 보안 등 여러 설정이 있지만, 해당 과정에서는 Defualt 값으로 진행합니다.
      • 또한, UI 상에서 Prometheus, Grafana 사용을 위해 VM의 연결된 Public IP를 사용했지만, 모든 연결 설정은 Private IP 사용합니다.

     

    → 빨간 네모 박스 안, Prometheus Server URL의 경우
    1부에서 구성한 /etc/prometheus/prometheus.yml  파일의 "localhost:9090" 입니다.

     

    다만, 위 값에는 VM에 할당된 Private IP를 기입하여 "http://<Private IP>:9090" 입력합니다.

    (여기서, Priavte 환경에서는 VM의 Private IP를 적지만, 우선 Public IP도 함께 사용 중이므로 localhost 값을 유지하였습니다.)

    • 연결 확인

     

    2-2. Grafana 대시보드

    2-2-1. Self 테스트 구성

    • 초기 빈(Empty) 구성의 Custom Panel 생성

     

    • 대시보드를 위한 구성
      • 1,2번 항목 :  대시보드화할 Metics 종류와 Filter 선택
      • 3번 항목 : 1,2번 항목에서 선택 값이 구체화되는지 확인
      • 4번 항목 : 대시보드에 해당 값을 저장

    Visualizations(Chart종류) 및 Panel의 이름

    • 대시보드 확인
      • 위 단계를 반복하며 원하는 Metrics과 Filter 선택하여 목적에 맞게 대시보드 구성

     

    • 구성 대시보드 저장

    2-2-2. Template 사용 구성

    Grafana 에서 제공하는(타 사용자들이 공유) Template을 활용한 대시보드를 구성합니다.

    • Import 

     

     

    • Copy ID 적용 후, Import dashboard를 위한 Options 설정

     

    2-3. 멋진 최종 DashBoard 확인

    • Import 기능을 사용하여 제공되는 여러 Template을 기반으로 일반적인 Metrics 활용한 멋진 대시보드 완성!
    • 제공되는 여러 옵션을 선택하여 다양한 시각화를 제공합니다.

     

    2-4. Alertmanager 구성

    2-4-1. Alertmanager 설치

    Alermanager도 위 단계에서 사용한 Grafana VM에서 설치하여 사용합니다.

    sudo groupadd --system alertmanager
    sudo useradd -s /sbin/nologin --system -g alertmanager alertmanager
    
    sudo mkdir -p /etc/alertmanager/templates
    sudo mkdir /var/lib/alertmanager
    sudo chown alertmanager:alertmanager /etc/alertmanager
    sudo chown alertmanager:alertmanager /var/lib/alertmanager

     

    • 압축 풀고, 디렉터리 이동
    tar -xvf alertmanager-0.26.0.linux-amd64.tar.gz
    cd alertmanager-0.26.0.linux-amd64.tar.gz

     

     

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

     

     

    • 구성 파일 이동 및 소유자 변경
    sudo mv alertmanager.yml /etc/alertmanager/alertmanager.yml
    sudo chown alertmanager:alertmanager /etc/alertmanager/alertmanager.yml

     

     

    • Alertmanager Systemd Service 만들기
    sudo nano /etc/systemd/system/alertmanager.service
    
    
    [Unit]
    Description=AlertManager
    Wants=network-online.target
    After=network-online.target
    
    [Service]
    User=alertmanager
    Group=alertmanager
    Type=simple
    ExecStart=/usr/local/bin/alertmanager \
            --config.file /etc/alertmanager/alertmanager.yml \
            --storage.path /var/lib/alertmanager/ \
            --cluster.advertise-address="<Private IP>:9093"
            
    [Install]
    WantedBy=multi-user.target

     

     

     

    ** (Alertmanager의 HA mode) The cluster.advertise-address flag is required if the instance doesn't have an IP address that is part of RFC 6890 with a default route.

     

    GitHub - prometheus/alertmanager: Prometheus Alertmanager

    Prometheus Alertmanager. Contribute to prometheus/alertmanager development by creating an account on GitHub.

    github.com

     

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

     

    2-4-2. Alertmanager Service 시작

    sudo systemctl enable alertmanager
    sudo systemctl start alertmanager
    sudo systemctl status alertmanager

     

     

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

    • Prometheus 정상 액세스 확인
      • 내부 확인 : curl -X GET http://localhost:9093

    2-4-3. Prometheus Server연동

    다음과 같은 목적을 기반으로 작업 수행을 위해 Prometheus Server를 구성합니다.

    - Prometheus Server에서 Sraping 한 메트릭 데이터를 기반으로 Alertmanager에서 Alert을 보낼 수 있도록

    - Grafana에서 Alertmanager에 대한 영역을 모니터링할 수 있도록

     

    • Config 변경(추가)
      • Alertmanager를 Grafana VM에서 구성했기에, 해당 VM의 <Private IP>:9093 를 Target으로 입력합니다. 
      • 별도의 NSG 정책을 추가하지 않는다면, Azure에서는 기본 정책으로 VNET 내 Private IP 기반 통신의 경우, Source/Destination 및 Port의 제한이 없습니다.
    sudo nano /etc/prometheus/prometheus.yaml

     

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

     

    • Prometheus Target 정상 UP 확인
      • 위 Config 값에 구성한 값이 정상 반영된 것을 확인할 수 있습니다.

    2-5. Alertmanager 경고 규칙 만들기

    Prometheus Server 에서 정의한 경고 규칙에 따라, Alertmanager 가 정해진 구성값(ex. Slack, Email)을 기반으로 알림(Alert)를 보내기 위한 단계입니다.

     

    • Prometheus Server 에서 Rule 생성
      • 규칙의 경우,  Sample 제공하는 사이트의 자료를 참고하였습니다.
      • 총 5개의 규칙을 위한 조건을 정의하였습니다.
        - InstanceDown
        - HostHighCpuLoad
        - HostOutOfMemory
        - HostMemoryUnderMemoryPressure
        - HostOutOfDiskSpace
    sudo nano/etc/prometheus/alert_rules.yml
    
    
    groups:
    - name: alert_rules
      rules:
      # instance(Host VM) is down on {{ $labels.instance }}
      - alert: InstanceDown
        expr: up == 0
        for: 0m
        labels:
          severity: "critical"
        annotations:
          summary: "Endpoint {{ $labels.instance }} down"
          description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
     
      # CPU load is > 80%
      - alert: HostHighCpuLoad
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
        for: 0m
        labels:
          severity: warning
        annotations:
          summary: "Host high CPU load (instance {{ $labels.instance }})"
          description: "CPU load is > 80%\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"      
    
      # Node memory is filling up (< 10% left)	
      - alert: HostOutOfMemory
        expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100 < 10
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Host out of memory (instance {{ $labels.instance }})"
          description: "Node memory is filling up (< 10% left)\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
    
      #The node is under heavy memory pressure. High rate of major page faults
      - alert: HostMemoryUnderMemoryPressure
        expr: rate(node_vmstat_pgmajfault[1m]) > 1000
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Host memory under memory pressure (instance {{ $labels.instance }})"
          description: "The node is under heavy memory pressure. High rate of major page faults\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"
     
      # Disk is almost full (< 10% left) 
      - alert: HostOutOfDiskSpace
        expr: (node_filesystem_avail_bytes * 100) / node_filesystem_size_bytes < 10 and ON (instance, device, mountpoint) node_filesystem_readonly == 0
        for: 2m
        labels:
          severity: warning
        annotations:
          summary: "Host out of disk space (instance {{ $labels.instance }})"
          description: "Disk is almost full (< 10% left)\n  VALUE = {{ $value }}\n  LABELS: {{ $labels }}"

     

    • Rules 적용
      • 위 작성한 Rule에 대한 스크립트를 Promethues Config에 반영합니다.
    sudo /ect/prometheus/prometheus.yml

     

    • Prometheus Server 서비스 재기동
    sudo systemctl restart prometheus.services

     

    • Rules 반영 확인
      • Prometheus Server 접속 > Status > Rules


      • Prometheus Server > Alerts

    2-6. Alertmanager 통한 Slack 알림 보내기

    자, 이제 마지막 단계입니다.

    최종적으로 수집된 메트릭 데이터를 기반으로 규칙을 반영하여 Slack에 알림 보내겠습니다!

    (메일 알림의 경우, 타 자료가 많은 관계로 생략하였습니다_._)

     

    • 실제 알림을 위해 Node 중 1대의 VM을 OFF 
      • Alertmanager 확인(InstanceDown)
      • Premetheus 확인
      • Slack 알림 확인

     

    지금까지 2부 "Grafana 대시보드화 구성과 AlertManager 를 통한 알림 서비스 연동" 알아보았습니다.

    이것으로 1,2부 동안 진행한 "Prometheus(+ Node Exporter, AlertManager) + Grafana 구성" 포스팅을 마치겠습니다.

     

    궁금한 점이나 이번 포스팅에서 부족한 점 등 자유로운 의견을 남겨주세요!

     

    (!많관부!) 다음에도 함께 공유할 수 있는 주제를 가지고 찾아뵙겠습니다. (!많관부!)

    728x90
    320x100
    SMALL