현재 근무하는 회사의 팀에서는 항상 주기적으로 발생하는 이벤트가 있다.

 

그것은 API 서버 or DB의 CPU 리소스가 과부하되면서 서비스에 문제가 발생하는 이벤트이다.

 

위 상황에서는 리소스 모니터링을 위해서 AWS의 CloudWatch 같은 기본 모니터링을 통해 리소스를 체크한다.

 

하지만 기본으로 제공되는 모니터링 대시보드는 상세 매트릭 정보를 전달받지 못한다는 문제가 있다.

 

=> 무슨 소리냐? 1분 단위로 상세 매트릭도 구성이 가능하고 대시보드도 원하는 형태로 커스텀이 가능할텐데???

 

커스텀이 가능한것은 사실이지만, 상세 매트릭 정보를 전달 받지 못한다고 표현하는 이유는 우리팀은 돈에 매우 인색하기 때문이다.

 

비용 문제 + 시간 문제로 현재 팀에서는 클라우드 서버 or 온프레미스 서버 등의 하이브리드 구성에 대한 종합 모니터링 도구가 없다.

 

그래서 지금까지는 서비스를 관리하는 담당자들은 필요하다면 직접 수동으로 모니터링 했었다.

 

무한 루프마냥 반복되는 이 과정을 더이상 겪고 싶지 않아서 서버들의 리소스 모니터링 도구로 대표적으로 사용되는 조합인 Grafana + Promethues 조합을 활용해서 모니터링 시스템을 도입했다. 

 

=> 모니터링 시스템을 도입했으니 서버들의 자원 리소스 모니터링이나 상태 체크가 편해졌을건데 뭘 더 추가하냐? 너무 게으른거 아니냐?

 

리소스 모니터링 대상에 대한 기본적인 관리 방법은 리스트는 정적 형태의 설정으로 관리하는 구조이다.

 

그래서 새롭게 추가되는 서버가 생기게 될때마다 서버리스트에 직접 추가해야한다.

 

아래는 모니터링 리스트를 설정하는 Promethues에서 사용되는 config 파일인 prometheus.yml이다.

## prometheus.yml

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'node_exporter'
    static_configs:
      - targets: ['dashboard-prod-1:9100']
        labels:
          instance: dashboard-prod-1
      - targets: ['dashboard-prod-2:9100']
        labels:
          instance: dashboard-prod-2
      - targets: ['dashboard-prod-3:9100']
        labels:
          instance: dashboard-prod-3

      # 아래로 모니터링이 필요한 신규 서버에 대한 추가 정보 입력
      ....

 

서비스를 운영하는 서버가 추가되면 모니터링 대시보드에서 보여지도록 연결하는데까지 다음의 과정이 수행된다.

 

[서버 내 리소스 수집을 위한 Exporter 설치 -> 방화벽 내 Exporter 전용 포트 개방 설정 -> 공인 IP 확인 -> config 수정 -> config 적용을 위해 모니터링 시스템 리로드]

 

=> 어 뭐야? 별거 없는 그냥 반복 작업 아닌가요?

 

제목을 보면 알다싶이 나는 매우 게으른편에 속하기 때문에 삭제하고 추가하고 하는 과정을 반복하는게 싫었다. 

 

이 생각을 하던 도중에 "정적 파일을 추가 or 삭제하는 과정을 없애버리면 되는것 아닌가?" 라는 생각이 들었고, 그래서 Consul이라는 도구를 도입하기로 결정했다. (무엇인지 궁금하시다면 설명하기 귀찮기 때문에 링크를 넣어두겠습니다.)

 

Consul 공식 사이트 : Link

 

=> 한대 맞기 전에 빨리 Consul이 무엇인지 잘 설명해봅시다. 

 

정확한 설명은 링크(Link)에서 보시고.. 대신 Consul을 사용한 목적을 빠르고 뇌에 정확히 꽃히도록 설명해드리겠습니다.

 

정적으로 관리되는 서버 목록을 동적으로 편하게 관리하기 위한 목적으로 사용했으며, 아래 이해하기 쉽도록 동작 방식을 정리했습니다.

 

이제 Consul을 도입하기 위한 과정을 아래 순서대로 작성하겠습니다.

- Grafana + Promethues + Consul 서비스에 대해서 구성했다는 전제하에 작성합니다!

 

▶ Promethues의 정적 설정 대신 Consul의 서비스 목록을 바라보도록 config 수정 (promethues.yml)

주의 : docker-compose로 구성해서 사용중이기 때문에, 도입 환경에 따라 설정값이 달라질 수 있습니다.

 

global:
  scrape_interval: 15s

scrape_configs:
  # Consul 설정
  - job_name: 'consul-discovered-services'
    consul_sd_configs:
      - server: 'consul:8500'
        datacenter: 'dc1'
        tags:
          - monitoring
    
    # 서비스 이름을 job 레이블로 설정
    relabel_configs:
      - source_labels: [__meta_consul_service]
        target_label: job
      
      # 서비스 주소와 포트 설정
      - source_labels: [__meta_consul_service_address, __meta_consul_service_port]
        target_label: __address__
        separator: ':'

 

▶ Consul 서비스가 정상적으로 동작한다는 가정하에 아래 캡처 이미지처럼 확인 가능합니다.

 

 

▶ Consul에 서비스를 등록하는 방법은 2가지가 있다.

- Consul Agent를 리소스 모니터링이 필요한 해당 서버에 설치하는 방법

- HTTP API를 통해 직접 등록하는 방법

 

나는 유연한 방식을 선호하기 때문에 API 방식으로 Consul 서비스 목록을 등록하는 방법을 사용했다. (반대로 API를 통해 서비스 목록에서 제외하는것도 가능합니다.)

서비스 목록 리스트에 동적으로 추가되는것을 확인할 수 있습니다.

 

또한 Grafana 대시보드에서 Consul에서 추가한 리스트가 자동으로 반영되는것도 확인 가능합니다.

 

 

=> 그 Node Exporter랑 Consul 서비스 목록에 등록할때 사용한 스크립트 정도는 제공해주셔야하지 않겠습니까?

 

그러실줄 알고 제가 사용했었던 설정 스크립트를 파일로 첨부했습니다! 

 

이 글을 읽는 분들도 Consul을 도입해서 리소스 모니터링에 필요한 서버 리스트를 편하게 관리할 수 있게 한번 도전해보시면 좋겠습니다.

 

 

저의 부족한 글에 관심을 가지고 읽어주셔서 정말 감사합니다. 

마침

install_node_exporter.sh
0.01MB

Ubuntu에서 Node.js 및 npm 설치 방식은 2가지가 나뉘며, 그 방식들에 대해 설명하고 설치 방법 및 삭제 방법을 공유하려고 한다.

 

<방법>

1. Ubuntu 운영체제에 기본으로 설정된 APT 레포지토리에서 가져와서 설치하는 방식

2. NodeSource 저장소에서 설치하는 방식

 

[ 여기서 각각의 설치 방식에 따른 차이점을 정리해서 한줄로 요약한다. ]

 

- 1번 방식은 Node.js 12 버전 이후로 레포지토리에 등록된 버전이 없기에 최신 버전 (18 버전 등)을 다운받고 싶다면 2번 방식으로 Node.js 및 npm 설치를 권장한다.

 

- [ 1번 방식 설치 ]


    #1. APT 레포지토리 업데이트
    $ sudo apt update

    #2. nodejs && npm 설치
    $ sudo apt install -y nodejs npm

    #3 버전 확인

    $ npm -v  # npm 버전 확인
    $ node -v  # node 버전 확인

APT로 설치하는 경우 아래와 같은 버전이 나오게 된다.

- [ 2번 방식 설치 ]

2번 방식의 경우 설치 방법이 조금 다르게 진행된다.
nvm이라는 관리 도구를 통해 nodejs와 npm을 설치하게 되는데 즉 2번 과정에서는 nvm 설치를 베이스로 진행된다고 보면 된다.


    #1. nvm 설치 (특정 버전이 아닌 최신 버전으로 설치)
    $ curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash

    #2. nvm version 확인
    $ nvm --version

    #3. nvm 명령어를 찾지 못하는 경우 해당 유저의 개인 환경 설정 갱신 작업이 필요합니다.
    $ source ~/.profile

    #4. nvm version 재확인
    $ nvm --version

    #5. nodejs 및 npm 설치
    $ nvm install --lts

    #6 nodejs 및 npm 버전 확인
    $ node -v
    $ npm -v

- 기존 nodejs 및 npm이 설치되어있는 경우 nvm 설치 전 삭제를 진행하고 2번 방식을 진행하시면 됩니다.

- nodejs 및 npm 삭제


    $ sudo apt -y remove --purge nodejs
    $ sudo apt -y remove --purge npm

    # 해당 과정까지 설치하고 다시 nodejs 등을 설치하는 경우 다른 저장 공간에 남은 관련 파일들로 인해 충돌이 발생하거나 문제가 생길 수 있습니다.
    # 아래 과정을 통해 잔여 데이터까지 모두 삭제해주세요.

    $ sudo rm -rf /usr/local/bin/npm /usr/local/share/man/man1/node* /usr/local/lib/dtrace/node.d ~/.npm ~/.node-gyp /opt/local/bin/node /opt/local/include/node /opt/local/lib/node_modules

    $ sudo rm -rf /usr/local/lib/node*

    $ sudo rm -rf /usr/local/include/node*

    $ sudo rm -rf /usr/local/bin/node*

    # 이 과정까지 진행하고 버전을 검색하는 경우 버전이 뜨지 않고 깔끔하게 삭제 되었음을 알 수 있습니다.

설치환경

- Ubuntu 20.04 LTS Server

[ 16 CPU / 16G RAM / 200G Disk ]

-----------------------------

- docker 설치


## 현재 자신이 사용하는 OS가 무엇인지 모르겠다면 아래 명령어 수행
$ cat /etc/os-release

 

OS 정보 확인 결과

## 1. docker을 설치하기 위해 의존성에 관련된 패키지 먼저 설치

 

$ sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

의존성 관련 패키지 설치

 

## 2. docker 관련 패키지를 가지고 있는 apt repository 추가 처리

 

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

docker GPG Key 추가
apt repository 추가

## 3. apt repository 업데이트 및 docker 설치

 

$ sudo apt update -y && sudo apt install -y docker-ce

 

docker 설치 완료

- 정상적으로 설치가 된다면 심볼릭 링크까지 문제 없이 자동으로 생성이 됨

 

## 4. docker version check

 

$ sudo docker --version

 

docker 버전 확인

## 5. docker 관련 설정

 

## 시스템 재부팅 시 docker 데몬을 자동으로 시작하도록 구성
​
$ sudo systemctl enable docker
​
​
​
## 도커 데몬 상태 확인
​
$ sudo systemctl status docker
​
​
​
## 루트 유저가 아닌 일반 유저로 docker 명령어 수행하기 위한 권한 할당
​
$ sudo usermod -aG docker $USER

 

## 6. 재부팅 및 권한 확인

 

## 재부팅 수행
​
$ sudo systemctl reboot
​
​
​
## 재부팅 이후 권한이 할당된 일반 계정에서 superuser 명령어 없이 docker가 잘 작동하는 것을 확인할 수 있음
$ docker ps -a

+ Recent posts