grafana, prometheus 로 OpenWrt 모니터링 하기

별도의 원격서버에 prometheus server와 grafana를 설치해 OpenWrt 모니터링 하는 방법을 소개합니다.(아래 스크린샷 참조)

준비물

구성도

remote monitoring

1. prometheus node exporter 설치

OpenWrt 패키지 설치

OpenWrt에 prometheus node exporter를 설치합니다.

opkg update
opkg install prometheus-node-exporter-lua \
prometheus-node-exporter-lua-nat_traffic \
prometheus-node-exporter-lua-netstat \
prometheus-node-exporter-lua-openwrt \
prometheus-node-exporter-lua-wifi \
prometheus-node-exporter-lua-wifi_stations

prometheus node exporter 설정

vi /etc/config/prometheus-node-exporter-lua

외부에서 접근가능하도록 listen_interface ‘loopback’ 을 listen_interface ‘*’ 로 수정합니다.

config prometheus-node-exporter-lua 'main'
        option listen_interface '*'
        option listen_ipv6 '0'
        option listen_port '9100'

firewall 포트개방

vi /etc/config/firewall

방화벽은 prometheus-server가 data를 수집할 수 있도록 tcp 9100포트를 개방합니다. <super.duckdns.org’s ip>는 prometheus-server가 설치될 서버의 ip로 수정하십시요.

config rule
        option name 'Allow-prometheus'
        option src 'wan'
        option proto 'tcp'
        option src_ip '<super.duckdns.org's ip>'
        option dest_port '9100'
        option target 'ACCEPT'
        option enabled '1'

prometheus node exporter, firewall 재시작 및 동작 확인

/etc/init.d/prometheus-node-exporter-lua restart
/etc/init.d/firewall restart
netstat -an | grep -i 9100
curl 192.168.1.1:9100/metrics

netstat listen ip 가 127.0.0.1이 아닌 0.0.0.0 임을 확인하십시요. 또한 curl이나 웹브라우저 9100포트로 접속했을 경우 prometheus node exporter의 웹서버가 제대로 자료를 뿌려주는지 확인합니다.

[email protected]:~# netstat -an | grep  9100
tcp        0      0 0.0.0.0:9100            0.0.0.0:*               LISTEN
[email protected]:~# curl 192.168.1.1:9100/metrics
# TYPE node_scrape_collector_duration_seconds gauge
# TYPE node_scrape_collector_success gauge
# TYPE node_nf_conntrack_entries gauge
node_nf_conntrack_entries 148
# TYPE node_nf_conntrack_entries_limit gauge
node_nf_conntrack_entries_limit 16384
node_scrape_collector_duration_seconds{collector="conntrack"} 0.0009601116180419
.
.
.
wifi_stations{ifname="mesh0"} 1
node_scrape_collector_duration_seconds{collector="wifi_stations"} 0.0045309066772461
node_scrape_collector_success{collector="wifi_stations"} 1

2. 서버 설치(prometheus-server, grafana, autossh)

저는 구글 클라우드에 OS는 ubuntu 20.4 LTS minimal로 하였으며, 방화벽은 미리 tcp 3000, 9090포트를 개방했습니다.

시스템 업그레이드 및 기본 패키지 설치

minimal 설치시 기본적으로 필요한 패키지를 설치합니다. minimal이 아닌경우 root 사용로 변경(su)만 하세요.

sudo passwd root
su
apt update && apt upgrade
apt install vim landscape-common net-tools iputils-ping bridge-utils dnsutils

docker 엔진 설치

참고 : https://docs.docker.com/engine/install/ubuntu/

apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add –
apt-key fingerprint 0EBFCD88
add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”
apt update
apt install docker-ce docker-ce-cli containerd.io

docker-compose 설치

참고 : https://docs.docker.com/compose/install/

curl -L “https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)” -o /usr/local/bin/docker-compose
chmod 755 /usr/local/bin/docker-compose

docker-compose 구성

root 유저에서 일반유저로 변경하고 docker 컨테이너의 설정화일이 들어갈 디렉토리 dockerrr를 홈 디렉토리에 생성합니다.

exit
mkdir ~/dockerrrr
cd ~/dockerrrr
mkdir prometheus grafana grafana/dashboards autossh

docker-compose.yml에 autossh / prometheus / grafana 인스턴스를 구성합니다

vi docker-compose.yml

version: "3.0"

services:
  autossh:
    image: jnovack/autossh
    container_name: autossh
    environment:
      - SSH_REMOTE_USER=root
      - SSH_REMOTE_HOST=openwrt.duckdns.org
      - SSH_REMOTE_PORT=2222
      - SSH_BIND_IP=0.0.0.0
      - SSH_TUNNEL_PORT=19100
      - SSH_TARGET_HOST=openwrt.duckdns.org
      - SSH_TARGET_PORT=9100
      - SSH_MODE=-L
      - SSH_SERVER_ALIVE_COUNT_MAX=60
    restart: always
    volumes:
      - ./autossh/autossh_id_rsa:/id_rsa
    ports:
      - 19100:19100
    dns:
      - 1.1.1.1
      - 1.0.0.1

  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
    ports:
      - 9090:9090
    depends_on:
      - autossh

  grafana:
    image: grafana/grafana
    container_name: grafana
    volumes:
      - ./grafana/grafana.ini:/etc/grafana/grafana.ini
      - ./grafana/datasources.yml:/etc/grafana/provisioning/datasources/datasources.yml
      - ./grafana/dashboards.yml:/etc/grafana/provisioning/dashboards/dashboards.yml
      - ./grafana/dashboards:/etc/grafana/provisioning/dashboards/dashboards
    ports:
      - 3000:3000

vi ./prometheus/prometheus.yml

아래 targets은 docker-compose.yml 의 autossh 인스턴스와 포트를 매핑합니다.

global:
  scrape_interval: 5s

scrape_configs:
  - job_name: Prometheus
    static_configs:
      - targets: ["autossh:19100"]

vi ./grafana/grafana.ini

grafana 접속을 위한 id와 패스워드를 설정합니다. 아이디/패스워드는 원한는것으로 바꾸세요.

instance_name = My Instance

[security]
admin_user = admin
admin_password = [email protected]

ip addr show docker0 | grep global | awk ‘{print $2}’ | cut -d/ -f1

docker0 인터페이스 ip를 확인해 아래처럼 ./grafana/datasources.yml 의 url을 기입합니다.

[email protected]:~/dockerrr$ ip addr show docker0 | grep global | awk '{print $2}' | cut -d/ -f1
172.17.0.1

vi ./grafana/datasources.yml

apiVersion: 1

datasources:
  - name: Prometheus
    type: prometheus
    access: proxy
    url: http://172.17.0.1:9090

vi ./grafana/dashboards.yml

apiVersion: 1

providers:
  - name: "Dashboards"
    folder: ""
    type: file
    editable: true
    options:
      path: /etc/grafana/provisioning/dashboards/dashboards

ssh 터널링을 위한 키 생성 및 전송

서버에 접속한 사용자([email protected]) ssh 공개키를 OpenWrt에 등록을 한 후 아래와 같이 autossh가 사용할 ssh키를 생성해 OpenWrt에 전송합니다.

ssh-keygen -t rsa -b 4096 -C “autossh” -f autossh_id_rsa
mv autossh_id_rsa* ./autossh
ssh -p 2222 [email protected] “tee -a /etc/dropbear/authorized_keys” < ./autossh/autossh_id_rsa.pub

화일구조 종합

위에서 생성한 docker-compose 화일 구조는 아래와 같습니다.

${HOME}
|- dockerrrr
    |- docker-compose.yml
    |- grafana
    |   |- dashboards.yml
    |   |- datasources.yml
    |   |- grafana.ini
    |   |- dashboards
    |       |- <place dashboards here>
    |- prometheus
    |   |- prometheus.yml
    |- autossh
        |- autossh_id_rsa
        |- autossh_id_rsa.pub

일반사용자(현재 접속자)에게 docker 실행 권한 부여

sudo usermod -aG docker $USER
sudo service docker restart
sudo chmod 666 /var/run/docker.sock

docker 실행 및 확인

docker-compose up -d
docker-compose ps

[email protected]:~/dockerrrr$ docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[email protected]:~/dockerrrr$ docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[email protected]:~/dockerrrr$ docker-compose up -d
Creating network "dockerrrr_default" with the default driver
Creating autossh ... done
Creating grafana    ... done
Creating prometheus ... done
[email protected]:~/dockerrrr$ docker-compose ps -a
   Name                 Command               State            Ports
------------------------------------------------------------------------------
autossh      /entrypoint.sh                   Up      0.0.0.0:19100->19100/tcp
grafana      /run.sh                          Up      0.0.0.0:3000->3000/tcp
prometheus   /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp
[email protected]:~/dockerrrr$

prometheus server 접속 및 target 확인

웹브라우저로 http://super.duckdns.org:9090 로 접속해 prometheus server가 OpenWrt에서 메트릭을 제대로 긁어 오는지 확인합니다.

prometheus target

grafana 접속 및 dashboard import

웹브라우저로 http://super.duckdns.org:3030 로 접속해 위에서 설정한 id / password로 로그인하여 openwrt.json을 import 합니다.

grafana login
grafana data source
grafana dashboard

참고사이트

Comments

No comments yet. Why don’t you start the discussion?

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다