Before 2022/AWS & DevOps

서버 H/W 모니터링 시스템 만들기

Eljoe 2021. 2. 21. 18:48

구성요소

모니터링 시스템 구성요소

서버의 경우 아마존 EC2 프리티어(t2-micro) 인스턴스를 이용하기로 하였고, A서버에는 도커를 설치하여 Prometheus 컨테이너를 실행하고, 시각화 도구로는 Prometheus와 항상 세트인 Grafana를 활용하기로 하였다.

 

B 서버에는 Node Exporter를 설치하기로 했는데, 이 Node Exporter는 CPU, Memory, Disk 사용량과 같은 호스트 관련 metric을 수집하여 API로 노출하는 Exporter이다.

 

먼저 EC2 2개를 t2 인스턴스로 실행시키고, 각각의 Inbound 설정은 다음과 같다.

서버 Inbound 비고
A Server 9090 Prometheus
3000 Grafana
B Server 9100 Node Exporter

Docker 설치

A Server에 Putty로 접속하여 다음과 같은 Docker 설치 명령어를 입력한다.

sudo yum -y upgrade
sudo yum -y install docker

그룹에 사용자 추가 및 파일 권한 변경

sudo usermod -a -G docker ec2-user
sudo chmod 666 /var/run/docker.sock

Docker 시작

sudo service docker start

Prometheus 설정 yml 파일 생성(작성은 후술)

sudo mkdir /tmp
cd tmp
sudo touch prometheus.yml

Prometheus Container 구동

docker run \
-p 9090:9090 \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
prom/prometheus

Public DNS 접속(A Server:9090)

Port 9090으로 접속 시 위와 같은 Prometheus 페이지가 뜨는 걸 확인하면 Prometheus 설치는 끝났다.

아무런 설정도 하지않았기 때문에 현재 수집되는 데이터가 없다.

도커 종료(터미널에서 ctrl + c) 후 해당 서버에서 Grafana를 설치한다.

Grafana 설치

Grafana 다운로드 페이지에서 Linux > Red Hat, CentOS, RHEL, and Fedora 명령어를 그대로 입력한다.

#사용자 디렉토리로 이동한다.(ex:/home/ec2-user)
wget https://dl.grafana.com/oss/release/grafana-7.4.2-1.x86_64.rpm
sudo yum install grafana-7.4.2-1.x86_64.rpm

Grafana Service 실행

sudo service grafana-server start

Public DNS 접속(A server:3000)

Port 3000으로 접속 시 위와 같은 grafana 로그인 페이지로 접속된다.

Admin 초기 아이디/비밀번호는 admin/admin이므로 입력하고 로그인해보자.

Home Dashboard까지 접속했다면 성공이다.

 

이젠 B서버로 접근하여 Node Exporter를 설치하여 H/W Metirc Data들을 수집해보자.

Node Exporter 설치

Node Exporter Releases Page에서 다음과 같은 최신 버전의 링크를 복사한다. 

(https://github.com/prometheus/node_exporter/releases/download/v*/node_exporter-*.*-amd64.tar.gz)

wget https://github.com/prometheus/node_exporter/releases/download/v1.1.1/node_exporter-1.1.1.linux-amd64.tar.gz
tar xvfz node_exporter-1.1.1.linux-amd64.tar.gz
cd node_exporter-1.1.1.linux-amd64.tar.gz

# '&'을 붙여 백그라운드 실행(터미널 종료 시점까지 유효)
./node_exporter &

Public DNS 접속(B Server:9100)

B서버의 9100 Port 접속 시 위와 같은 페이지가 뜨며 Metrics 링크를 클릭하면 실시간으로 Metirc Data를 수집하는걸 알 수 있다.

 

다시 A 서버로 돌아와 Prometheus가 B서버의 Node Exporter 접근하여 Data를 Pull할 수 있도록 Prometheus.yml을 작성한다.

Prometheus.yml 설정

cd /tmp
sudo vim prometheus.yml

# 다음과 같은 설정 값을 입력한다.
scrape_configs:
  - job_name: 'node_exporter'
    scrape_interval: 10s
    static_configs:
      - targets: ['YourIP:9100']

Prometheus Container 백그라운드 구동(-d 옵션)

docker run \
-p 9090:9090 \
-v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
-d prom/prometheus

A Server의 9090 포트에 다시 접속 후 입력 창에 up을 입력 후 Execute 실행 시, 결과에 B서버의 IP 주소가 뜨면 성공한 것이다.

이제 Grafana에 Promehteus를 연결하여 그래프를 만들어보자.

Grafana 접속

Home Dashboard에서 DATA SOURCES 페이지로 접근한다.

 

여러 시계열 DB들의 목록이 나온다.

Prometheus를 클릭하자.

 

URL에 'http://localhost:9090'를 입력하고 하단 Save & Test 버튼을 누른다.

 

위와 같은 결과 값이 뜨면 Grafana와 Prometheus간의 연결이 성공한 것이다.

 

이제 수집된 데이터가 정상적으로 출력되는지 살펴보자.

 

좌측 Tab에서 4번째 메뉴인 'Explore'로 접근하여 입력창에 아래와 같은 쿼리를 입력한다.

rate(go_memstats_frees_total{job="node_exporter"}[5m])

'Run Query'를 실행하면 아래와 같이 B 서버의 최근 5분동안 실제 사용가능한 메모리 용량을 확인할 수 있다.

 

이제 대시보드를 생성하고 Panel을 만들어야하지만 처음 Grafana를 접속한 사용자의 경우 패널 설정이나 PromQL 작성도 힘들다.

그러므로 우린 Grafana 공식 사이트에서 사용자가 만들어 제공하는 Dashboard를 이용해보겠다.

해당 사이트에 접속해서 Get this dashboard 하단에 Copy ID to Clipboard를 클릭하여 해당 ID를 복사한다.

Grafana 서버에서 좌측 Tab의 2번째 메뉴인 'Create'에서 'Import'로 접속한다.

 

'Import via grafana.com' 하단 입력 창에 클립보드에 복사해둔 ID를 입력하고 Load를 하면 다음과 같은 화면이 뜬다.

하단 'VictoriaMetrics' > 'Prometheus(default)' > 'Import'를 순서대로 진행하면 완성된 Dashboard가 생성됨을 확인할 수 있다.

 

(Public IP가 노출되어 Dashboard 이미지를 가져올 수 없는 점 양해 바람)

 

해당 패널들을 클릭 > Edit > 하단 Query에 입력된 PromQL을 보거나, Panel 속성을 살펴보며 패널 생성 및 PromQL 작성법을 숙지해보도록 한다.