• blackbox monitoring은 증상이 발생한 부분을 확인하며, 예측되지 않은 활성 문제를 모니터링
  • blackbox monitoring을 통해 시스템이 제대로 작동하지 않음을 확인 한 이후에 whiteblox monitoring의 계측을 통해 로그 또는 HTTP 엔드 포인트와 같은 시스템 내부를 검사하는 기능
  • blackbox monitoring은 외부에서 시스템 상태를 확인(예 : 서버가 200 개의 HTTP 코드로 응답)
  • whiteblox monitoring은 내부 메트릭과 로그를 사용하여 시스템 문제를 표면화

blackbox monitoring과 whiteblox monitoring의 차이

  • 모니터링은 어떤 방법을 체택하는지에 따라 크게 writebox monitoring과 blackbox monitoring으로 구분

1. whitebox monitoring

  • 에이전트 혹은 소프트웨어를 설치해서 모니터링
  • Zabbix, PRTG, Prometheus 등이 whitebox monitoring에 속함 → 일반적인 모니터링 기술들
  • whitebox monitoring은 접근성은 좋으나 실제 모니터링 시스템을 구축할 때 모니터링 "소스(source)"가 되는 기술에 대한 이해도가 높아야함

2. blackbox monitoring

  • 시스템 내부가 어떻게 동작하는지보다 관측 가능한 행위에 초점을 두는 모니터링
  • CPU가 어떻게 동작하는지, Memory가 어떻게 동작하는지 몰라도 됨 → CPU 사용량이 얼마인지, Memory 사용량이 얼마인지가 중요
  • TCP가 어떻게 동작하는지 알 필요 X → 실행되는 프로세스에 TCP 연결이 가능한지 여부가 중요
  • 모니터링하려고 하는 내용의 동작 원리를 알지 못하여도 문제되지 않음
  • blackbox monitoring 쪽에서 유명한 기술은 Nagios

3. Prometheus는 whitebox monitoring과 blackbox monitoring 둘다 가능

  • Prometheus는 기본적으로 whitebox monitoring에 속하지만, 프로메테우스 재단은 Prometheus로 blackbox monitoring을 지원하기 위해서, 공식적으로 blackbox-exporter를 지원
  • blackbox-exporter는 HTTP, HTTPS는 물론 TCP, ICMP, DNS 등의 프로토콜 위에서 동작하는 엔드포인트들에 대한 blackbox monitoring을 가능하게 해줌
  • Prometheus쪽에서 해당 IP:PORT 정보를 제공해야만 모니터링 가능


blackbox-exporter와 설치

1. 서버 환경에서는 blackbox-exporter 스크립트 명령어 설치 및 구동

# 현재 디렉토리 위치
$ pwd
/root

# blackbox-exporter를 설치할 디렉토리 생성
$ mkdir black

# 디렉토리 이동
$ cd black

# 최신 버전 blackbox-exporter 설치
$ wget https://github.com/prometheus/blackbox_exporter/releases/download/v0.18.0/blackbox_exporter-0.18.0.linux-amd64.tar.gz

# 압축 파일 해제
$ tar zxvf blackbox_exporter-0.18.0.linux-amd64.tar.gz
blackbox_exporter-0.18.0.linux-amd64/
blackbox_exporter-0.18.0.linux-amd64/blackbox_exporter
blackbox_exporter-0.18.0.linux-amd64/LICENSE
blackbox_exporter-0.18.0.linux-amd64/blackbox.yml
blackbox_exporter-0.18.0.linux-amd64/NOTICE

# 압축해제된 디렉토리에 접근
$ cd blackbox_exporter-0.18.0.linux-amd64/

# blackbox-exporter 실행
$ ./blackbox_exporter

2. blackbox.yml 설정 파일을 토대로 blackbox-exporter 스크립트 실행

# <blackbox_exporter 경로> --config.file=<blackbox_exporter 설정 파일 경로>
$ ./blackbox_exporter --config.file=./blackbox.yml

3. blackbox-exporter 서비스로 실행 → blackbox-exporter 명령어를 systemd로 관리

$ pwd
/root/black/blackbox_exporter-0.18.0.linux-amd64/

# user 추가
$ useradd --no-create-home --shell /bin/false blackbox_exporter

# 생성한 blackbox_exporter 계정 확인
$ cat /etc/passwd | grep blackbox_exporter
blackbox_exporter:x:1004:1004::/home/blackbox_exporter:/bin/false

# 실행 파일 및 설정 파일 /usr/local/bin/으로 경로 이동
$ cp ./blackbox_exporter /usr/local/bin
$ cp ./blackbox.yml /usr/local/bin

# /usr/local/bin/blackbox_exporter blackbox_exporter 유저, 그룹 권한 주기
$ chown blackbox_exporter:blackbox_exporter /usr/local/bin/blackbox_exporter

# 명령어 복사 및 사용 권환 변경 확인
$ ls -al /usr/local/bin/blackbox_exporter
-rwxr-xr-x 1 blackbox_exporter blackbox_exporter 18264924 Nov 22 17:34 /usr/local/bin/blackbox_exporter

# 서비스 파일 등록
$ cat << EOF | tee /etc/systemd/system/blackbox_exporter.service
[Unit]
Description=Blackbox Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=blackbox_exporter
Group=blackbox_exporter
Type=simple
ExecStart=/usr/local/bin/blackbox_exporter --config.file=/usr/local/bin/blackbox.yml

[Install]
WantedBy=multi-user.target
EOF

# 데몬 리로드
$ systemctl daemon-reload

# 서비스 구동
$ systemctl restart blackbox_exporter

# 서비스 상태 확인
$ systemctl status blackbox_exporter
● blackbox_exporter.service - Blackbox Exporter
   Loaded: loaded (/etc/systemd/system/blackbox_exporter.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-11-22 17:35:28 KST; 4s ago
 Main PID: 6615 (blackbox_export)
    Tasks: 7
   Memory: 2.2M
   CGroup: /system.slice/blackbox_exporter.service
           └─6615 /usr/local/bin/blackbox_exporter --config.file=/usr/local/bin/blackbox.yml

4. blackbox-exporter 설정

  • blackbox-exporter가 Prometheus가 설정한 IP:PORT에서 TCP 통신이 가능한지 여부에 대한 메트릭을 수집하게 하려면 설정 파일에서 모듈 생성 필요
  • 지정한 IP:PORT에서 5초 주기로 TCP 통신을 시도
  • 다른 프로토콜도 확인 가능 : https://github.com/prometheus/blackbox_exporter/blob/master/CONFIGURATION.md
    # tcp 프토토콜 5초 간격으로 connect 확인
    $ vi /usr/local/bin/blackbox.yml
    modules:
      tcp_connect:
        prober: tcp
        timeout: 5s
  • 최초 blackbox.yaml의 기본 내용
    $ vi /usr/local/bin/blackbox.yml
    modules:
      http_2xx:
        prober: http
      http_post_2xx:
        prober: http
        http:
          method: POST
      tcp_connect:
        prober: tcp
      pop3s_banner:
        prober: tcp
        tcp:
          query_response:
          - expect: "^+OK"
          tls: true
          tls_config:
            insecure_skip_verify: false
      ssh_banner:
        prober: tcp
        tcp:
          query_response:
          - expect: "^SSH-2.0-"
      irc_banner:
        prober: tcp
        tcp:
          query_response:
          - send: "NICK prober"
          - send: "USER prober prober prober :prober"
          - expect: "PING :([^ ]+)"
            send: "PONG ${1}"
          - expect: "^:[^ ]+ 001"
      icmp:
        prober: icmp

5. blackbox-exporter 서비스로 재실행

$ systemctl restart blackbox_exporter

# 서비스 상태 확인
$ systemctl status blackbox_exporter
● blackbox_exporter.service - Blackbox Exporter
   Loaded: loaded (/etc/systemd/system/blackbox_exporter.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2021-11-22 17:37:32 KST; 5s ago
 Main PID: 8674 (blackbox_export)
    Tasks: 8
   Memory: 2.1M
   CGroup: /system.slice/blackbox_exporter.service
           └─8674 /usr/local/bin/blackbox_exporter --config.file=/usr/local/bin/blackbox.yml



Prometheus에서 blackbox-exporter 연동

  • Prometheus에서 blackbox-exporter가 수집하고 있는 메트릭을 스크래이핑
  • Prometheus 설정 파일을 보면 scrape_config 밑에 job이 등록
  • blackbox-exporter 추출 : http://:9115/probe?target=<static_configs.targets의IP:PORT>&module=<params.module의 모듈>
    1. static_configs.targets에 있는 "IP:PORT" 별로 데이터를 수집
    2. params.module은 blackbox-exporter 설정 파일에서 작성한 모듈 목록
    3. 현재는 TCP 연결만 확인하는 tcp_connect
  • Prometheus가 scrape_interval에 설정된 주기마다 각 인스턴스들에서 수집되는 메트릭을 스크래이핑하여 저장
    1. blackbox-exporter와 prometheus의 timeout 시간이 각각 있기에 주기는 2개 합산
    2. blackbox-exporter의 timeout인 5s + prometheus의 scrape_interval인 5s = 10s
  • metric_path가 "/probe"로 지정

  • relabel_configs는 설정 파일 형식 토대로 생성 → replacement는 "<blackbox 설치된 인스턴스 IP:9115>"

    $ vi /etc/prometheus/prometheus.yml
    # my global config
    global:
      scrape_interval:     15s # By default, scrape targets every 15 seconds.
      evaluation_interval: 15s # By default, scrape targets every 15 seconds.
    
      external_labels:
        monitor: 'kubernetes-monitoring'
    
       # prometheus에 blackbox-exporter를 추가
      - job_name: 'blackbox-exporter'
        scrape_interval: 5s
        metrics_path: /probe
        params:
          module: [tcp_connect] 
        static_configs:
          - targets:
            - [모니터링 서버 IP]:80
        relabel_configs:
          - source_labels: [__address__]
            target_label: __param_target
          - source_labels: [__param_target]
            target_label: instance
          - target_label: __address__
            replacement: [blackbox 설치된 인스턴스 IP]:9115
  • Prometheus 재구동

    # Prometheus 서비스 재시작
    $ systemctl restart prometheus
    
    # prometheus 서비스 상태 확인
    $ systemctl status prometheus

  • Prometheus UI에서 쿼리를 입력 → blackbox-exporter 설치한 서버의 값 읽음 (probe_success)
  • probe_success가 blackbox-exporter가 지정한 프로토콜 방식으로 IP:PORT와 연결이 성공했음을 알리는 지표

blackbox 서버 모니터링을 위한 Grafana 대시보드 구축

  • Grafana로 대시보드를 구축할 때 정말 좋은 점은 black-exporter같이 많이 사용하는 Exporter에 대한 대시보드가 이미 공유됨
    손쉽게 사용 가능

1. blackb-exporter 그라파다 대시보드 복사 가능한 대시보드 ID 획득

  • node-exporter 그라파나 대시보드 복사 가능하게 하는 URL : https://grafana.com/grafana/dashboards/13659
  • 위 경로에 접속하면 아래 화면이 보이는데 "Copy ID to Clipboard"를 클릭하여 복사함

2. 그라파나 대시보드로 이동한 후, 왼쪽 탭의 두 번째 "+"의 "Import" 메뉴를 클릭



3. 위에서 복사한 대시보드 ID를 입력하고 "Load" 버튼을 클릭



4. "Datasource"에서 "Prometheus"를 선택한 뒤 "Import"를 클릭


5. 생성한 대시보드 화면 확인

  • 해당 포트에 매핑된 프로세스가 살아나면 다시 "UP"으로 표시
  • 프로세스 포트 모니터링에서 중요한 것은 "UP & DOWN" 표시
  • "probe duration"이나 "dns lookup" 정보들은 프로세스보다는 프로세스가 동작하는 인스턴스가 살아있음을 알려줌

참고 URL : https://lapee79.github.io/article/monitoring-http-using-blackbox-exporter/
참고 URL : https://gurumee92.tistory.com/235?category=933410
참고 URL : https://github.com/prometheus/blackbox_exporter

+ Recent posts