2024. 3. 22. 00:06ㆍProject/FootballManager(MSA)
메트릭 수집을 위한 프로메테우스와, 수집한 메트릭을 시각화 해주는 도구인 그라파나를 저번 포스팅에서 처음 사용해 보았다. 실제 클라우드 서버에 도입하기 전 로컬에서 먼저 환경을 구성해보고 테스트까지 진행해보았다.
이번에는 실제 클라우드 서버에 프로메테우스와 그라파나를 도입해보고자 한다.
현재 서버에서 실행중인 각 마이크로 서비스들은 다음과 같이 구성되어 있다.
인스턴스 1 - Eureka, Gateway-Service
인스턴스 2 - User-Service, Team-Service
각 서비스들은 모두 도커로 가동되고 있으며, 동일한 VPC에 존재하고 있다.
모니터링 시스템을 도입하기 전 고려해야 할 사항을 정리해보았다.
- 현재 각 인스턴스에 두 개의 서비스들이 돌아가는 중인데, 만약 프로메테우스와 그라파나를 도입하게 된다면 인스턴스 리소스가 부족할 수 있다. 만약 기존 인스턴스에 도입하였을 때 리소스 부족 문제가 발생하면, 인스턴스의 성능을 업그레이드 하거나 새로운 리소스를 생성 후 구성해야 할 것이다.
- prometheus.yml에는 메트릭을 수집해올 각 서비스들의 주소가 명시되어야 한다. 만약 같은 도커 네트워크에서 모두 실행중이라면 크게 문제될 일은 없겠지만, 현재 우리는 다른 도커 네트워크를 사용중이기에 이를 하나의 네트워크로 묶어주는 방법이나 퍼블릭 ip를 통해 통신하는 방법을 적용해야 할 것이다.
- 유레카를 제외한 모든 마이크로서비스는 Gateway-Service를 통해 로드벨런싱 처리된다. 그러면 프로메테우스 메트릭을 가져올 때 또한 Gateway-Service를 통해 /actuator/prometheus 엔드포인트를 접근해야 하는지, 아니면 각 마이크로서비스에 직접 접근해야 하는지 여부 또한 결정해야 한다.
우선은 인스턴스 1에 프로메테우스와 그라파나를 적용시켜보고 리소스 부족 문제가 발생하지 않는다면, Docker Swarm을 사용하여 하나의 네트워크로 묶는 과정을 진행보려고 한다. 또한 게이트웨이를 통해 모든 메트릭을 수집하는 경우, 게이트웨이에 부하가 집중될 수 있을 것이기에 각 서비스로부터 직접 메트릭을 수집하는 것을 목표로 개발을 진행해보려 한다.
1. Prometheus, Grafna 설치
먼저 인스턴스 1에 접속 후 프로메테우스와 그라파나 이미지를 가져온다.
# 프로메테우스 pull
sudo docker pull prom/prometheus
# 그라파나 pull
sudo docker pull grafana/grafana
2. Docker Swarm 클러스터 구성
도커 스웜으로 클러스터를 구성하는 것은 내용이 많기에 다음과 같이 따로 포스팅하였다.
Docker Swarm을 사용하여 컨테이너 간 네트워크 통신 설정
프로젝트 진행 중 모니터링 시스템 도입을 위해 각자 다른 인스턴스 내 컨테이너들을 같은 네트워크에 묶어주어야 하는 상황이 발생하였다. 프로메테우스가 메트릭을 가져오기 위해 각 마이크
bes99.tistory.com
3. prometheus.yml 구성 및 실행
도커 스웜으로 클러스터를 구성하였다면 각 컨테이너들의 정보를 prometheus.yml파일에 명시해주어야 한다.
이후 프로메테우스 관련 디렉토리를 만들고, 그 안에 yml파일을 생성해준다.
# 프로메테우스 디렉토리 생성
mkdir -p /home/ubuntu/prometheus
# yml파일 생성
touch prometheus.yml
# vim 에디터 사용하여 편집
vim prometheus.yml
Docker Swarm에서는 서비스 이름을 통해 해당 서비스의 모든 인스턴스에 도달할 수 있으므로, IP 주소를 직접 지정할 필요가 없다.
때문에 서비스 이름과 포트 번호를 정확하게만 명시해주면 된다.
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'eureka-service'
metrics_path: '/actuator/prometheus'
dns_sd_configs:
- names:
- 'tasks.eureka-service'
type: 'A'
port: 8761
- job_name: 'gateway-service'
metrics_path: '/actuator/prometheus'
dns_sd_configs:
- names:
- 'tasks.gateway-service'
type: 'A'
port: 8000
- job_name: 'team-service'
metrics_path: '/actuator/prometheus'
dns_sd_configs:
- names:
- 'tasks.team-service'
type: 'A'
port: 8081
- job_name: 'user-service'
metrics_path: '/actuator/prometheus'
dns_sd_configs:
- names:
- 'tasks.user-service'
type: 'A'
port: 8080
type은 'A', 'AAAA', 'SRV' 등이 존재하며 각 설명은 다음과 같다.
- A 레코드는 호스트 이름을 IPv4 주소로 매핑.
- AAAA 레코드는 호스트 이름을 IPv6 주소로 매핑.
- SRV 레코드는 서비스와 관련된 정보(호스트와 포트 등)를 제공.
yml파일까지 작성이 완료되었으면 프로메테우스 컨테이너를 실행시킨다. 이때 컨테이너를 Docker Swarm에서 정의한 오버레이 네트워크에 연결해야 한다.
docker run -d \
-p 9090:9090 \
-v /home/ubuntu/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
--network my-overlay \
--name prometheus \
prom/prometheus
***** docker: Error response from daemon: Could not attach to network my-overlay: rpc error: code = PermissionDenied desc = network my-overlay not manually attachable. 오류
-> my-overlay 네트워크가 "manually attachable" 상태가 아니기 때문에, 컨테이너를 수동으로 해당 네트워크에 연결할 수 없다는 것을 나타낸다. Docker Swarm에서 오버레이 네트워크를 컨테이너에 직접 연결하려면 네트워크를 생성할 때 --attachable 옵션을 사용하여야 한다.
때문에 새로운 오버레이 네트워크를 생성하고 각 서비스들을 업데이트 해주는 과정을 진행하여 해결하였다.
# 새로운 오버레이 네트워크 생성
docker network create -d overlay --attachable new-overlay
# 기존 서비스들을 새로운 오버레이 네트워크로 연결한다.
docker service update --network-add new-overlay <service-name>
# 기존 연결되어 있던 오버레이 네트워크의 연결을 해제한다.
docker service update --network-rm my-overlay <service-name>
오버레이 네트워크를 수정한 후 다음 명령어를 다시 실행한다
docker run -d \
-p 9090:9090 \
-v /home/ubuntu/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \
--network new-overlay \
--name prometheus \
prom/prometheus
각 서비스들에서 한 개의 서비스만 정상적으로 연결되었으며, 다른 하나의 레플리카는 정상적으로 연결되지 않는 현상이 발생했다.
아마 인스턴스의 리소스 부족 문제로 요청을 제대로 처리하지 못하고 있을 가능성이 크다고 생각한다.
이후 수정 시 레플리카를 만들지 않고 다시 시도해볼 예정이다.
4. Grafana 실행
그라파나 이미지를 3000번 포트를 통해 실행시킨다.
docker run -d -p 3000:3000 grafana/grafana
도커를 통해 실행시킨 그라파나는 정상적으로 프로메테우스와 연결되는 것을 확인할 수 있었다.
이로서 클라우드 서버에 모니터링 시스템을 도입하는 과정을 모두 마쳤다. 처음 도입해보는 기술이기에 어려움이 있었는데, 서로 다른 인스턴스에서 Docker Swarm을 통해 각 컨테이너들을 같은 네트워크로 묶는 과정에서 새롭게 알게 된 개념이 많아 좋은 경험이 되었다고 생각한다.
'Project > FootballManager(MSA)' 카테고리의 다른 글
[Prometheus, Grafana] EC2 인스턴스 모니터링 구성 (1) | 2024.05.03 |
---|---|
⚽ FootballManager(MSA) (0) | 2024.03.29 |
Docker Swarm을 사용하여 컨테이너 간 네트워크 통신 설정 (0) | 2024.03.21 |
Prometheus, Grafana, Springboot 연동하기 (1) (0) | 2024.03.21 |
Kafka 서버 구성 (0) | 2024.03.20 |