서버

운영 서버와 모니터링 서버 구축(엑추에이터, 프로메테우스, 그라파나)

김승진 2024. 11. 6. 17:53

 

 

 

🔫 시작하기

 

인프런 워밍업 클럽 2기를 마치고 수료식에서 네트워킹을 하면서 박우빈님이 해주신 말이 생각나 적용하게 되었습니다.

단순 개발은 누구나 할 수 있지만 이를 유지보수하는데 실력 차이가 드러난다고 했습니다.

그래서 단순 개발을 떠나 장애 대응, 성능 개선 등에 대한 고민이 필요하다고 생각하여 성능 테스트에서 지표를 확인하는 용도로 모니터링에 대한 구성을 적어 봅니다.

원리와 개념보다는 서버에서 구성하여 테스트하기 위함과 구현에 있어 작성했습니다. 물론 보안 문제에 대한 고려를 일부 배제한 점은 참고해 주세요.

자료는 하단 참고에서 사용했습니다.

 

 

 

🆘 구조

 

다음과 같은 구조로 설계했습니다.(그림 출처는 참조 자료) 엑추에이터의 접근을 허용하면 외부에서 애플리케이션의 중요 정보를 노출할 수 있기에 포트번호를 변경하여 내부망 서버에서 이용하거나 인증된 사용자만 접근할 수 있게 필터, 시큐리티 설정 등 고려가 필요합니다.

위와 같은 구조로 안전하게 사용하기 위해서는 보안 그룹의 인바운드 규칙을 적절히 적용해주면 됩니다.

추후 테스트를 하기 위해 모니터링 대상 서버(테스트할 운영 서버라 가정)에서 프로메테우스와 그라파나를 동작하지 않고 외부에 모니터링 서버를 구축하여 했습니다.(ec2 프리티어라 성능이 좋지 않을 것을 대비하여 구성)

 

 

 

[다른 점]

위 그림은 참조한 그림입니다. 빠른 연동과 테스트를 위해 모니터링 대상 서버에서 엑추에이터 포트를 8080으로 유지했다. (시큐리티, JWT 필터 등 보안 설정 이슈로 인해 설정함. 추후 바꿔야 한다.)

위 그림과는 프로메테우스의 접근 포트가 9292가 아닌 8080 입니다.

 

 

 

 


[엑추에이터, 프로메테우스 관련 설정]

모니터링 대상 서버에 대한 설정입니다.

엑추에이터, 그라파나

의존성과 yml 설정을 추가하면 이용할 수 있습니다.

# build.gradle

dependencies {
	// Spring Actuator
    implementation 'org.springframework.boot:spring-boot-starter-actuator'

	// Prometheus
    runtimeOnly 'io.micrometer:micrometer-registry-prometheus'
}

applicationyml 파일의 엑츄이이터 관련 설정 부분입니다.

management: #엑츄에어터
#  server:
#    port: 9292
  endpoints:
    web:
      exposure:
        include: "health,info,metrics,prometheus"  # 필요한 엔드포인트만 노출
    jmx:
      exposure:
        exclude: "*"

 

 

엔드포인트를 사용하려면 다음 2가지 과정이 모두 필요하다.

  1. 엔드포인트 활성화
  2. 엔드포인트 노출

엔드포인트를 활성화 한다는 것은 해당 기능 자체를 사용할지 말지 on , off 를 선택하는 것이다. 엔드포인트를 노출하는 것은 활성화된 엔드포인트를 HTTP에 노출할지 아니면 JMX에 노출할지 선택하는 것이다.

엔드포인트를 활성화하고 추가로 HTTP를 통해서 웹에 노출할지, 아니면 JMX를 통해서 노출할지 두 위치에 모두 노출할지 노출 위치를 지정해주어야 한다. 물론 활성화가 되어있지 않으면 노출도 되지 않는다.

아래와 같이 설정 파일로 엑추에이터의 활성화와 노출을 관리할 수 있다.

기본적으로 서버를 강제종료 시키는 ‘shut down’ 기능을 제외한 대부분의 기능이 활성화되어 있다.

HTTP와 JMX로 노출시킬 수 있는데 아래와 같이 설정해서 관리하면 된다.

 

 

보안 주의

액츄에이터가 제공하는 기능들은 우리 애플리케이션의 내부 정보를 너무 많이 노출한다. 그래서 외부 인터넷 망이 공개된 곳에 액츄에이터의 엔드포인트를 공개하는 것은 보안상 좋은 방안이 아니다.

액츄에이터의 엔드포인트들은 외부 인터넷에서 접근이 불가능하게 막고, 내부에서만 접근 가능한 내부망을 사용하는 것이 안전하다.

 

 

액츄에이터를 다른 포트에서 실행 

예를 들어서 외부 인터넷 망을 통해서 8080 포트에만 접근할 수 있고, 다른 포트는 내부망에서만 접근할 수 있다면 액츄에이터에 다른 포트를 설정하면 된다.

 

액츄에이터의 기능을 애플리케이션 서버와는 다른 포트에서 실행하려면 다음과 같이 설정하면 된다. 이 경우 기존 8080 포트에서는 액츄에이터를 접근할 수 없다.

  • 액츄에이터 포트 설정 management.server.port=9292

액츄에이터 URL 경로에 인증 설정 포트를 분리하는 것이 어렵고 어쩔 수 없이 외부 인터넷 망을 통해서 접근해야 한다면 /actuator 경로에 서블릿 필터, 또는 스프링 시큐티리를 통해서 인증된 사용자만 접근 가능하도록 추가 개발이 필요하다.

 

 

[EC2 서버 생성 및 보안관리]

보안 그룹의 인바운드 규칙을 해당 호스트에 맞게 설정해서 사용하면 된다.

이 부분은 번외로 생략하겠습니다.

 

 

 

모니터링 대상 서버에 프로메테우스, 그라파나 설치하기

프로메테우스 설치 및 설정

# 프로메테우스 설치
wget <https://github.com/prometheus/prometheus/releases/download/v2.45.1/prometheus-2.45.1.linux-amd64.tar.gz>
# 프로메테우스 압축 해제
tar xzvf prometheus-2.45.1.linux-amd64.tar.gz
# yml 파일이 있는 경로로 이동
cd prometheus-2.45.1.linux-amd64/
# prometheus yml 파일 설정
sudo vim prometheus.yml

위 과정을 끝내면 아래와 같이 나온다.

 

 

위 파일은 이미 수정한 파일이다. 실제로는 설치 이후, 아래와 같이 적용하면 된다.

우리는 prometheus.yml 파일에서 설정을 추가해주면 된다. 우리는 엑추에이터만 연결할 것이니 기존 코드에 아래 코드만 추가해주면 된다.

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["모니터링 서버 IP:프로메테우스 사용 포트"]

  - job_name: "spring-actuator"
    metrics_path: '/actuator/prometheus'
    scrape_interval: 30s
    static_configs:
      - targets: ['모니터링 대상 서버 IP:엑추에이터 사용 포트']

1번째는 테스트 겸 기존 것과 유사하다. 실제로는 엑추에이터에 관한 아래 형식만 추가하면 된다.

  • jop_name : 명칭으로 아무거나 해도 상관없다.
  • metrics_path : 호출할 URI
  • scrape_interval : 수집 시간 간격(s, m 등) 다양한 표시 가능
  • static_configs.targets : 접근할 해당 HOST

이후 시스템 서비스 같이 EC2 서버 부팅과 동시에 실행하고자 하면 아래 단계를 거치면 된다. 매번 직접 실행해줄거면 넘어가도 된다.

 

 

프로메테우스 service 등록

모니터링 EC2 인스턴스가 실행되면 바로 모니터링 서비스가 실행되도록 하고 싶다.

cd /etc/systemd/system # system 으로 이동
sudo vim prometheus.service # 해당 프로메테우스 서비스 파일 생성

 

 

 

중요한 건 해당 서비스 파일에 대한 설정을 위처럼 할 때, 실제 프로메테우스가 설치된 경로를 기반으로 지정해줘야 한다.

User, ExecStart과 해당 하위 설정까지 해당하는 경로에 맞게 해줘야 적용 가능하다. 경로 혹은 사용자 지정이 틀리다면 적용되지 않으니 주의해서 진행하면 된다.

잘 모르겠다면 아래 참조 링크 부분, 필자가 작성한 부분과 GPT 등 비교하여 보면 이해할 수 있을 것이다.

이후 프로메우스 서비스 실행을 적용하기 위해서는 다음과 같은 과정을 거치면 된다.

sudo systemctl daemon-reload #인식
sudo systemctl enable prometheus # 자동 시작 활성화
sudo systemctl start prometheus # 해당 서비스 실행
sudo systemctl status prometheus # 상태 확인

 

위 명령어 수행 후에 아래 그림과 같이 active가 나오면 적용된 것이다.

 

 

프로메테우스 연동 여부는 프로테우스 메뉴 → status → targets 에 들어가면 아래와 같이 확인 가능하다. State가 UP이어야 한다.

 

 

 

 

그라파나 설치 및 설정

#설치
wget <https://dl.grafana.com/enterprise/release/grafana-enterprise-10.2.2.linux-amd64.tar.gz>
#압축 해제
tar -zxvf grafana-enterprise-10.2.2.linux-amd64.tar.gz

만약 그라파나도 부팅과 함께 시작하고 싶으면 프로메테우스에서 진행한 시스템 설정을 똑같이 진행해주면 된다. 그라파나 프로그램 정보와 경로에 맞게 변경해서 넣어주면 된다.

그라파나도 잘 적용되었다면 설정한 URI로 접근하면 아래 사진처럼 접근 가능하다.

 

 

 

그라파나 대쉬보드 사용하기

그라파나는 프로메테우스를 통해서 데이터를 조회하고 보여주는 역할을 한다. 쉽게 이야기해서 그라파나는 대시보드의 껍데기 역할을 한다.

그라파나는 먼저 프로메테우스 데이터 소스를 사용해서 데이터를 가져와야 하기. 설정이 필요하다.

 

 

source에서 프로메테우스를 선택하여 추가하면 된다.

프로메테우스 데이터 소스 설정은 해당하는 URL로 지정해주고 Save & Test를 선택하면된다.

 

 

 

이제 가져온 데이터를 통해서 사용자가 파악하기 쉽게 대시보드가 필요하다. 대시보드를 만들기 전에는

먼저 다음 3가지를 꼭 수행해두어야 한다.

  • 애플리케이션 실행
  • 프로메테우스 실행
  • 그라파나 실행

대시보드 설정하는 방법은 크게 아래와 같다.

  • 직접 대시보드 설정하기
  • 템플릿처럼 만들어진 대시보드 import 하기

스프링 부트를 사용한다면 Spring Boot 2.1 System Monitor 와 JVM 대시보드를 사용하면 된다.

아래는 Spring Boot 2.1 System Monitor를 적용한 대시보드이다. 대부분의 필요한 정보를 확인할 수 있다.

 

 

개선할 점

이처럼 설정하면 처음 말한 구조와 같이 접근할 수 있다. 남은 개선 사항을 보자.

  • 도커 사용하기

만약 더 많은 서버가 필요하다면 직접 이렇게 설정해주는 것은 불편한 거 같다.

도커 허브와 도커를 사용하면 이미지를 통해 언제 어디서든 바로 사용할 수 있는 점과 성능, 경량, 안정성 등 다양한 이점을 얻을 수 있어 보인다.

서버 IP, 환경 변수 등 서버마다 변화가 필요한 것은 아래와 같은 방법을 알아보면 좋을 거 같다.

  • 환경 변수를 이용한 동적 설정(도커 컴포즈)
  • 외부 볼륨 마운트로 관리 - AWS EFS, S3와 같이 외부 파일 시스템에서 저장하여 도커 볼륨으로 마운트하여 관리하는 방법
  • 도커 이미지에 설정 파일을 포함하고 CI/CD 파이프라인에서 변수 주입
  • AWS ECS 또는 Kubernetes 활용

'서버' 카테고리의 다른 글

EC2에서 Google Text-To-Speech 설정 + Docker 사용  (0) 2024.04.22