티스토리 뷰

728x90
반응형

목차

     

    프리티어로 프로젝트를 진행하다가 EC2가 자주 뻗는 것 같아서 이런저런 최적화를 진행했다.

     

    이후엔 직전 프로젝트에서 사용하려다 우선순위에서 밀린 모니터링 툴을 써보자고 마음을 먹었는데,

     

    검색해 보면 정보가 너무 많거나 너무 적다는 생각을 지울 수가 없었다.

     

    그래서 일단 제목에 적은 각각의 스택에 대해 짧게 정리하고, 그냥 복붙 해서 쓰면 되는 docker-compose.yml을 공유하기로.

     

    그러니까 당장 실행되는 yml과 설정파일이 필요한 분은 스크롤을 내리시길.

     

    cAdvisor

     

    cAdvisor는 구글에서 개발하고 Apache2.0 라이선스로 공개되어 있는 리소스 모니터링 도구 중 하나이다.

     

    특히 도커와 같은 컨테이너 환경의 리소스, 그러니까 Cpu, Ram, 디스크 I/O, 네트워크 등을 모니터링하는데 특화되어 있고

     

    컨테이너 내부에서 벌어지는 프로세스에 대한 정보도 수집할 수 있으며, 정보를 수집해서 시각화하기 좋게 자료를 구성한다.

     

    또한 단일 컨테이너뿐 아니라 쿠버네티스와 같은 오케스트레이션 시스템과 궁합이 좋아 전체 시스템을 모니터링할 수 있으며

     

    뒤에 알아볼 Prometheus와도 연동이 쉽다.

     

    Prometheus

     

    Prometheus는 오픈소스 모니터링 시스템으로, 전에 읽은 논문에 의하면 완벽하진 않으나 가장 인기 많은 모니터링 툴이다.

     

    역시 컨테이너 환경에 최적화되게 설계되었으며, 분산 시스템에서의 데이터 수집, 저장, 쿼리, 경고 등을 지원한다.

     

    특징으로는 pull 방식을 사용해서, 그러니까 HTTP 요청을 보내서 데이터를 받아온다는 점이다.

     

    데이터베이스는 당연하다면 당연하게도 시계열 데이터베이스(Time-Series Database)를 사용하며,

     

    자체적인 쿼리를 위해 PromQL(Query Language for Prometheus)이라는 쿼리 언어를 제공한다.

     

    이를 이용하면 저장된 데이터에 대한 쿼리뿐 아니라 알림이나 경고 역시 설정할 수 있다.

     

    수집된 메트릭 데이터를 시각화하기 위해 어려 대시보드 도구와 통합될 수 있지만, 주로 Grafana와 함께 사용된다.

     

    Grafana

     

    Grafana는 역시 오픈소스인 데이터 시각화/대시보드 툴로, 앞선 두 개의 툴과 같은 소스로부터

     

    데이터를 받아 시계열로 시각화하는 기능을 제공한다.

     

    Grafana를 사용하면, 뒤에 보겠지만 사용자가 선택한 데이터 소스에서 데이터를 검색하고, 원하는 정보를 모아

     

    대시보드를 커스터마이징 할 수도 있다.

     

    시계열 데이터 시각화를 위해 설계된 만큼 많은 숫자의 데이터 포인트를 처리할 수 있으며,

     

    지금 나와 같은 작은 프로젝트부터 대규모 시스템의 서버, 네트워크, 디비, 앱 등의 운영과 모니터링에 사용될 수 있다.

     

    위에 언급했듯이 자유로운 대시보드의 구성이 가능하며, 역시 이상 현상이 있거나 할 때 알림을 받을 수 있다.

     

    특히 알림은 이메일뿐 아니라 Slack으로도 받을 수 있기 때문에 개발자는 빠르게 문제에 대응하는 것이 가능하다.

     

    위와 같은 모니터링의 흐름을 아주아주 간략하게 나타내면 아래와 같다.

     

    1. cAdvisor가 컨테이너의 리소스와 네트워크의 사용률, 성능과 같은 메트릭 데이터를 수집한다.
    2. Prometheus는 cAdvisor가 수집한 메트릭 데이터를 시계열 데이터베이스에 저장한다.
    3. Grafana는 Prometheus와 연동해 저장된 시계열 메트릭 데이터를 시각화한다.
      이때 유연하고 자유로운 대시보드 구성으로 시스템 전체, 혹은 앱의 상태를 쉽게 파악할 수 있다.

     

    docker-compose.yml

     

    이어서 몇 차례 강조했듯이, 그냥 복붙 하면 돌아가는 도커 컴포즈 파일이다.

     

    컨테이너가 돌아가고 있는 노드에서, 다른 컴포즈 파일과 섞이지 않기 위해 아무 폴더나 만들어준다.

     

    예를 들자면 나는 그냥 prom이라는 폴더를 생성했다.

     

    그리고 그 안에 prometheus라는 폴더를 하나 더 생성해 준다.

     

    이는 프로메테우스 설정파일을 만들어주기 위함이다.

     

    그리고 그 안에, 그러니까 prom/prometheus/ 아래에 prometheus.yml 파일을 만들고 아래와 같이 적어준다.

    global:
      scrape_interval: 10s
    
    scrape_configs:
      - job_name: 'cadvisor'
        static_configs:
          - targets: ['cadvisor:8081']

    이 파일은 Prometheus가 데이터를 수집할 대상과 그 설정을 정의하는 파일이다.

     

    • global: 전체 설정을 담는 곳이다. 여기서는 scrape-interval을 10s로 설정해 10초마다 모든 대상을 스크래핑하도록 했다.
    • scrape-configs: Prometheus가 데이터를 받아올 대상과 그 대상의 설정을 구성한다.

      • job-name: 데이터를 받아올 대상이다. 여기서는 cadvisor를 설정했다.
      • static_configs: 정적인 대상을 정의한다. 여기서 정적이라는 말은 대상 서버의 IP나 DNS가 변하지 않는다는 말이다.
      • targets: 말 그대로 대상을 정한다. 여기서는 cadvisor의 8081 포트를 지정했다(8080은 내가 쓰고 있기 때문이다).

    여러 복잡한 설정과 커스터마이징이 가능하지만 그건 나중으로 미루고, 상위 폴더인 prom/ 으로 돌아가

     

    docker-compose.yml 파일을 아래와 같이 구성한다.

    version: '3.7'
    services:
      cadvisor:
        image: google/cadvisor:latest
        container_name: cadvisor
        volumes:
          - /:/rootfs:ro
          - /var/run:/var/run:rw
          - /sys:/sys:ro
          - /var/lib/docker/:/var/lib/docker:ro
        ports:
          - "8081:8080"
    
      prometheus:
        image: prom/prometheus:latest
        container_name: prometheus
        ports:
          - "9090:9090"
        volumes:
          - ./prometheus:/etc/prometheus
        command:
          - '--config.file=/etc/prometheus/prometheus.yml'
    
      grafana:
        image: grafana/grafana:latest
        container_name: grafana
        ports:
          - "3000:3000"
        environment:
          - GF_SECURITY_ADMIN_PASSWORD=admin
        volumes:
          - grafana-storage:/var/lib/grafana
    
    volumes:
      grafana-storage:

    service 아래에 우리가 사용할 cadvisor, prometheus, grafana를 위한 공간을 만들어준다.

     

    주의할 점은 cadvisor의 포트를 방금 전에 만든 파일과 일치시켜야 한다는 점이다. 보통 8080을 쓴다고 한다.

     

    계속해서 짧게 설명을 달자면

     

    • image: 실행하려는 컨테이너 이미지의 이름이다. docker-compose up -d를 해주면 해당 이미지를 다운로드한다.
    • container: 다운로드한 이미지로 생성할 컨테이너의 이름이다.
    • volumes
      쉽게 말하면 호스트 머신에 마련된 컨테이너를 위한 별도의 저장공간을 가리킨다. 정확하게는 컨테이너 내부의 특정 경로를 컨테이너 외부, 그러니까 호스트 머신의 특정 경로와 연결하여 데이터를 보존하는 데 사용하는 것이다. 당연히 호스트 머신에서 독립적이면서도 데이터 공유가 가능하며, 무엇보다 컨테이너 외부에 저장되기 때문에 컨테이너를 삭제하더라도 데이터는 사라지지 않는다. 또한 복수의 컨테이너가 하나의 볼륨을 공유해서 사용하는 것도 가능한데, 위와 같은 설정의 경우 'grafana-storage'라는 볼륨을 만들어 grafana 컨테이너 내부의 데이터를 'var/lib/grafana'에 저장하여 호스트와 공유하는 데 사용하고 있다.
      계속해서 각각의 설정을 요약하면

      • cadvisor

        • '/'를 '/rootfs'로 읽기 전용으로 마운트 한다. 마운트는 위에 언급된 연결과 같은 의미라고 보면 된다.
        • '/var/run'을 '/var/run'으로 읽기/쓰기 모드로 마운트 한다. 해당 경로에는 호스트에서 실행 중인 컨테이너와 시스템 서비스 등의 실행파일과 인터프리터의 PID(Process ID) 파일이 저장된다.
        • '/sys'를 '/sys'로 읽기 전용으로 마운트 한다. 이 경로는 리눅스 커널과 하드웨어 정보를 제공하는 가상 파일 시스템이다.
        • '/var/lib/docker'를 '/var/lib/docker'로 읽기 전용으로 마운트 한다. 이 경로는 실행 중인 도커 컨테이너의 이미지와 데이터를 저장하는 곳이다.
      • prometheus

        • './prometheus'(위에서 만든 폴더를 가리킨다)를 '/etc/prometheus'로 마운트 한다. 프로메테우스의 설정 파일을 저장하는 폴더이다.
      • grafana

        • 'grafana-storage' 볼륨을 'var/lib/grafana'로 마운트 한다. 이 경로에 Grafana 데이터가 저장된다.
    • ports: 컨테이너를 외부에 노출시킬 때 사용할 포트를 가리킨다. 호스트와의 연결에 사용된다.
    • environment: 말 그대로 환경변수다. 시크릿 키 등을 설정하는데 쓰인다.

     

    설명이 전혀 짧지 않아 졌지만 어쨌건 읽지 않아도 상관없다. 위와 같이 파일을 구성한 후

    docker-compose up -d

    를 입력하면 도커가 알아서 이미지를 받아 컨테이너를 생성해 호스트 노드에 띄워준다.

     

    그리고 각각 포트를 접속해 보면 알아서 일을 잘하는 것을 확인할 수 있는데,

     

    Grafana의 경우 이렇게 아무것도 없는 화면이 덩그러니 뜬다(아이디와 비밀번호는 admin/admin이다).

     

    위에서 좋게 말한 유연성과 자유도가 여기에서 발현되는데, 내가 원하는 데이터를 원하는 형태의 대시보드를 만들어서

     

    모니터링할 수 있게 되는 것이다.

     

    하지만 자유도가 너무 높아 아무것도 할 수가 없을 땐, 누군가 구성해 둔 대시보드를 가져오면 된다.

     

    우선 구성 Data source에 들어간다.

     

    새로운 데이터 소스 추가.

     

    프로메테우스를 선택하고

     

    이름은 아무래도 좋지만 URL은 제대로 입력해 준다.

     

    현재 프로메테우스가 돌아가고 있는 호스트의 IP:9090을 적어주어야 한다.

     

    로컬에서 돌리는 경우가 아니면 위처럼 입력해선 아무것도 볼 수 없다.

     

    추가 설정은 건드리지 않아도 된다.

     

    하고 아래로 내려 Save & test. 

     

    위와 같이 보인다면 성공이다.

     

    이어서 Dashboards - Import

     

    여기에서 다른 사람이 만들어둔 대시보드를 가져올 수 있다. 경로를 입력해도 되고, JSON을 복붙 해도 되고,

     

    이렇게 숫자만 입력하고 오른쪽의 Load만 눌러도 된다.

     

    이름은 적당히 입력하고,

     

    아래의 프로메테우스 항목을 열어 방금 설정해 준 아이로 설정해 준 뒤 Import를 눌러준다.

     

    이게 그 결과물.

     

    바로 모니터링을 시작해도 손색없을 정도의 데이터 시각화가 제공된다.

     

    여기까지 왔으면 짐작했겠지만, 미리 만들어진 대시보드는 굉장히 다양하다.

     

    물론 그중에는 다른 툴을 위한 대시보드도 있고, 지금처럼 우리의 툴에 최적화된 대시보드도 있다.

     

    검색하면 아주 많이 나오니, 처음엔 대시보드로 익숙해지고 나중에 커스터마이징을 하도록 하자.

     

    또한 경고 같은 것도 여기서 쉽게 설정할 수 있으니, 이제부턴 그냥 이것저것 만져보자.

     

    바로 쓸 수 있는 정보가 없어 빡친 김에 쓴 글이 사진 때문인지 길어져 버렸다.

     

    모두 즐거운 모니터링 하시길!

    반응형
    댓글
    공지사항
    최근에 올라온 글
    최근에 달린 댓글
    Total
    Today
    Yesterday
    링크
    «   2024/06   »
    1
    2 3 4 5 6 7 8
    9 10 11 12 13 14 15
    16 17 18 19 20 21 22
    23 24 25 26 27 28 29
    30
    글 보관함