prometheus 서버와 모니터링 대상 서버가 서로 다른 네트워크에 위치하고 있으면 어떻게 할까?
단순히 방화벽을 열어 이를 해결할 수 있지만, 만약 다른 네트워크에 있는 모니터링 대상 서버가 여러 개일 때 복잡해질 수 있다.
이 때 사용할 수 있는 Prometheus agent 구성을 진행해보자.
Prometheus는 데이터를 직접 가져오는 Pull 모델이다.
이로 인해 Prometheus 서버와 메트릭 엔드포인트가 분리되는 경우 문제가 발생할 수 있다.(e.g. 인프라 구성, 방화벽 설정 등)
이러한 상황에서 prometheus agent mode를 구성하면 네트워크가 분리된 환경에서도 비교적 간편하게 데이터를 Pull해서 가져올 수 있다!
여담으로 prometheus agent mode는 prometheus-proxy라고도 말한다.
prometheus agent mode는 두 개의 서비스로 구성되어 있다.
Proxy
Prometheus 서버와 동일한 네트워크에서 실행한다.
Proxy는 Agent에서 오는 데이터를 받는다.
Agent
모니터링 대상과 동일한 네트워크에서 실행한다.
Agent는 Proxy에게 데이터를 전달한다.
아키텍처에 나온 서버는 총 3대이다.
web 서버에 모니터링을 위해 node exporter를 설치해주자.
설치 방법은 이전 블로그를 참고하면 된다.
prometheus-agent, prometheus 서버에 java를 설치해준다.
agent와 proxy는 모두 java 기반으로 동작하므로 모두 설치가 필요하다.
1) 패키지 매니저 업데이트
apt update
2) java 버전 확인
apt list openjdk-17*
3) java 설치
apt install openjdk-17-jdk
4) 설치 확인
java --version
5) /etc/profile
에 아래 내용 추가
아래 내용은 전체 사용자에게 java 환경변수 추가하는 것이다.
만약 해당 사용자마 적용하고 싶다면 ~/profile
에 추가하자.
vi /etc/profile
export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which java))))
export PATH=$PATH:$JAVA_HOME/bin
추가한 내용 반영
source /etc/profile
6) java 설치 확인
echo $JAVA_HOME
prometheus 서버에 proxy를 설치하자.
1) github에서 최신 버전 링크 복사
github: https://github.com/pambrose/prometheus-proxy/releases
2) 서버 접속하여 다운로드
wget https://github.com/pambrose/prometheus-proxy/releases/download/1.21.0/prometheus-proxy.jar
3) 실행
nohup java -jar prometheus-proxy.jar &
실행 시 아래와 같은 문구가 나오며 nohup.out이 생긴 것을 볼 수 있다.
이는 proxy가 실행되면서 출력한 결과를 이 곳에 쌓아두는 것이다.
nohup: appending output to 'nohup.out'
prometheus-agent 서버에서 agent 설치를 진행하자.
agent는 node exporter와 같이 수집한 지표를 agent 서버로 모아 prometheus proxy 서버로 전송한다.
1) github에 접속하여 최신 버전 링크 복사
github: https://github.com/pambrose/prometheus-proxy/releases
2) 서버에 접속하여 다운로드
wget https://github.com/pambrose/prometheus-proxy/releases/download/1.21.0/prometheus-agent.jar
3) 설정 파일 생성
vim monitoring.conf
agent {
pathConfigs: [
{
name: "hsyun-web01"
path: hsyun-web01 # 이후 prometheus에서 수집할 endpoint path 지정
url: "http://172.16.3.9:9100/metrics" # 수집할 메트릭 주소 (앞에 http 꼭 붙이기)
}
]
}
4) 실행 스크립트 작성
vim start-agent.sh
#!/bin/bash
nohup java -jar /usr/local/monitoring/prometheus-agent.jar --config /usr/local/monitoring/monitoring.conf --proxy <prometheus-agent>:50051 1> /dev/null 2>&1 &
실행하면서 아래 2개의 플래그를 사용하였다.
--config
: agent 설정 파일 명시, config 파일은 아래에 따로 자세하게 이야기 하겠다.--proxy
: prometheus proxy 서버 명시, 여기서 명시해준 곳으로 agent가 수집한 메트릭 정보를 보낸다.5) 실행
chmod 755 start-agent.sh
./start-agent.sh
node-exporter 설치한 값을 프로메테우스에서 보기 위해 아래 설정을 추가한다.
현재 prometheus-poxy 구성이므로 target endpoint를 신경써야한다.
agent 서버가 proxy 서버에게 데이터를 보내기 위한 설정
먼저, agent 서버가 지표를 잘 수집하는지 아래 명령어를 통해 확인해보자.
아래 사진과 같이 보이면, 잘 가지고 오는 것이다.
# agent 서버에서 아래 명령어 실행
curl <모니터링 대상 서버 IP>:9100/metrics
이 모니터링 지표 데이터를 prometheus proxy에게 보내주기 위해,
agent 서버에서 아래와 같이 설정 파일을 작성하자.
monitoring.conf
agent {
pathConfigs: [
{
name: "hsyun-web01"
path: hsyun-web01
url: "http://172.16.3.9:9100/metrics" # 수집할 메트릭 주소 (앞에 http 꼭 붙이기)
}
]
}
해당 설정에서 중요한 것은 아래 2개이다.
curl
로 데이터 가져오는지 확인한 urlagent는 url에 적힌 주소로 메트릭 정보를 가져와, proxy 서버로 push한다.
prometheus가 proxy에 있는 데이터를 조회하는 설정
위에서 agent가 proxy에게 메트릭 정보를 push했으니 prometheus가 pull하여 가져가는 설정을 해보자.
prometheus는 web (모니터링 대상 서버)의 메트릭 정보를 어떻게 접근할 수 있을까?
바로 proxy 서버에 접근하는 것이다. 구성도를 살펴보면 agent는 proxy에게 메트릭을 주고, prometheus는 proxy를 통히 메트릭을 가져간다.
proxy는 기본적으로 8080포트를 사용하므로, 따로 설정을 하지 않았다면 8080으로 접근이 가능할 것이다.
# prometheus 서버에서 아래 명령어 실행
curl <proxy서버>:8080
나의 경우 prometheus 서버 안에 proxy가 있으므로 아래와 같이 접근이 가능하다.
curl localhost:8080
위와 같이 입력하면 아마 4040 Not Found가 뜰 것이다.
경로가 잘못되었다는 것인데, 어떤 경로를 입력해야 하는 것일까?
monitoring.conf
설정 시 path라는 값을 설정한 값이 있을 것이다. 거기서 설정한 path 값을 추가하여 curl을 입력하면 메트릭 정보가 뜨는 것을 볼 수 있다.
curl <proxy서버>:8080/<monitoring.con의 path>
curl localhost:8080/hsyun-web01
메트릭 정보가 잘 가져와지는 것을 확인 후, prometheus.yml을 수정하여 모니터링 대상을 추가한다.
prometheus.yml
에 모니터링 대상 추가
scrape_configs:
#추가
- job_name: "hsyun-web01-node" # job 이름 설정
metrics_path: "/hsyun-web01" # monitoring.conf에 설정한 path
static_configs:
- targets:
- localhost:8080 # <프록시_서버_IP>:8080
labels: # 커스텀 라벨 추가
job: hsyun-web01-node
instance_name: hsyun-web01
agent의 설정과 비교하여 보면 아래와 같다.
프로메테우스 재시작 후, 프로메테우스_IP:9090/targets에 들어가면 아래와 같이 대상이 추가된 것을 볼 수 있다.
위의 실습을 진행하면서 추가한 방화벽 규칙들이다.
rule | IP | port |
---|---|---|
inboud | prometheus-agent 서버 IP | 9100 |
rule | IP | port |
---|---|---|
outbound | prometheus-proxy 서버 IP | 50051 |
** 현재 구성상 prometheus 서버 안에 proxy 설치되어 있음
rule | IP | port |
---|---|---|
inbound | prometheus-agent 서버 IP | 50051 |