본문 바로가기

컨테이너/Prometheus

[프로메테우스] (3) CAdvisor란?

안녕하세요.

프로메테우스에 대해서 궁금해서 들어온 여러분들

설치부터 해보셨겠죠?  만약 안해보셨다면 해보고 오시죠

2020.12.11 - [컨테이너/Prometheus] - [프로메테우스] (1) 프로메테우스 설치

 

목표:

쿠버네티스를 사용하다 보면 수많은 컨테이너와 그에 대한 리소스들을 어떻게 인프라 영역과 컨테이너 영역에서 모니터링 할수 있을가에 대한 고민을 하게됩니다.

 

특히 클러스터의 다양한 애플리케이션 및 구성 요소가 현재 얼마나 많은 CPU, 메모리 및 네트워크 리소스를 사용하고 있는지 알아야 합니다. 리눅스에서는 top , mpstat 등의 명령어로 확인하던 리소스 사용률을 쿠버네티스에서는 어떻게 관리할까요?

 

Kubernetes는 이러한 메트릭(cpu,memory,network) 을 제공하는 모니터링 솔루션인 cAdvisor를 기본으로 제공합니다.

 

 

 cAdvisor ?

cAdvisor는 컨테이너에 대한 정보를 수집, 처리 및 내보내는 데몬입니다.

  • cAdvisor는 컨테이너 모니터링 도구 (Container Advisor) 

  • cAdvisor는 Kubelet 바이너리의 일부이므로 Kubelet과 긴밀하게 결합됩니다 - 수집 + 처리 하는 도구입니다.

 

  • 프로메테우스 스택 설치 시 보통 기본적으로 같이 설치되며, 메트릭을 노출시킴
    CAdvisor 같은 모니터링 에이전트 부류의 도구들은 /metrics라고 하는 경로를 외부에 노출시켜 제공합니다. 이 
    /metrics 경로로 요청을 보내면 CAdvisor는 키-값 쌍으로 구성된 메트릭 데이터의 목록을 반환하는데, 이 
    메트릭 데이터를 프로메테우스 같은 시계열 데이터베이스에 저장할 수 있습니다. 프로메
    테우스는 CAdvisor의 엔드포인트를 미리 지정해주면 CAdvisor의 /metrics에 접근해 자동으로 데이터를 수집하
    므로 CAdvisor의 데이터를 직접 프로메테우스에 저장할 필요가 없습니다. 단, 이를 위해서는 프로메테우스가 CAdv
    CAdvisor에 접근해 메트릭을 가져갈 수 있도록 CAdivisor의 엔드포인트 정보를 프로메테우스에 미리 지정해둬야 합니다.
    출처: https://ihp001.tistory.com/249 [효팍이의 프로그래밍:티스토리]  

 

Prometheus?  cAdvisor ? 

기본적으로 프로메테우스는 에이전트를 활용해서 메트릭을 수집하는데 프로메테우스 홈페이지를 들어가보면 여러가지 exporter들을 활용하여 메트릭을 수집하는것을 알수있다. 

cAdvisor는 컨테이너 기반의 모니터링 메트릭을 수집하는 exporter이다. 그런데 왜 다운로드에 exporter가 없을까?

기본적으로 kubelet에서 제공하기 때문일까?  

 

쿠버네티스는 다음과 같이 Metric Server을 설치하면 이를 통해 kubectl top 명령어를 사용할수 있다.

이때 데이터를 모아주는것이 cAdvisor이다.

컨테이너별 실시간 리소스 사용량을 컨테이너 런타임으로부터 전달받아 대시보드에 보여주며, 처리결과를 kubelet으로도 넘겨준다.

 

 

✅ Docker-compose로 설치하는 방법 

  • 아직 쿠버네티스를 학습하지 못한 분들은 이런 방법으로 쉽게 테스트를 해보면서 감을 잡는것도 좋은것 같다.

https://themapisto.tistory.com/38?category=950753 

 

[프로메테우스] (1) 프로메테우스 설치

프로메테우스는 각 노드( 관리하고자 하는 서버들에 자기가 원하는 모듈을 설치 후 실행) 하여 방문을 하면서 각 노드들이 수집한 정보들을 가져오는 방식으로 구성된다. 각 노드들에 방문하기

themapisto.tistory.com

 프로메테우스 설치 방법은 위에 블로그에서 포스팅 했으니 참고 하기 바람.
  • 하지만 동일한 폴더에서 prometheus.yaml 파일을 만들고 docker-compose.yml을 만들어주면 cAdvisor은 자동으로 설치 하면서 target으로 잡아서 연동까지 가능하다.
version: '3.2'
services:
  prometheus:
    image: prom/prometheus:latest
    container_name: prometheus
    ports:
    - 9090:9090
    command:
    - --config.file=/etc/prometheus/prometheus.yml
    volumes:
    - ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
    depends_on:
    - cadvisor
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    container_name: cadvisor
    ports:
    - 8080:8080
    volumes:
    - /:/rootfs:ro
    - /var/run:/var/run:rw
    - /sys:/sys:ro
    - /var/lib/docker/:/var/lib/docker:ro
    depends_on:
    - redis
  redis:
    image: redis:latest
    container_name: redis
    ports:
    - 6379:6379

https://prometheus.io/docs/guides/cadvisor/

 

Monitoring Docker container metrics using cAdvisor | Prometheus

An open-source monitoring system with a dimensional data model, flexible query language, efficient time series database and modern alerting approach.

prometheus.io

위 공식문서는 cadvisor exporter은 연동하는 방법에 대해 알려준다. ( 여기에도 Docker-compose를 통해 설치한다 )

 

✅ Helm 으로 Prometheus 설치 했을때 연동하는 방법

  • 하지만, 쿠버네티스 환경에서 설치 하는 상황이 더 많을것이다. 
  • Helm은 쿠버네티스 환경에서 Prometheus나 Harbor 등 오픈소스를 굉장히 쉽게 설치하는 패키지 설치 방식이다. 
  • 꼭 학습해두도록 하자.
# 헬름 설치 

root@node1:~# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
root@node1:~# chmod 700 get_helm.sh
root@node1:~# ./get_helm.sh


# 헬름 레포 

helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

# 깃 레포지토리는 values.yaml을 사용하기 위해 클론한다.
git clone https://github.com/prometheus-community/helm-charts
cd helm-charts/charts/prometheus

# charts안에 values.yaml이 기본 저장 되어 있다.
# 이를 수정해서 사용한다.

 

  • PersistentVolume만 False로 비활성화 해서 설치하면 Node 기본 Volume을 사용하여 설치할수 있다.
$ vi values.yaml

# 검색해보면 persistentVolume이 enable되어 있는 부분이 1군데 있을것이다.
# false로 바꿔주자.
...
  persistentVolume:
    ## If true, alertmanager will create/use a Persistent Volume Claim
    ## If false, use emptyDir
    ##
    enabled: false
...
  persistentVolume:
    ## If true, pushgateway will create/use a Persistent Volume Claim
    ##
    enabled: false
...
  persistentVolume:
    ## If true, Prometheus server will create/use a Persistent Volume Claim
    ## If false, use emptyDir
    ##
    enabled: false
...
  • 설치 전에 네임스페이스를 만들어줘야한다.
  • 설치는 values.yaml을 참조해서 helm으로 설치한다.
$ kubectl create ns monitoring
$ helm install prometheus prometheus-community/prometheus -f values.yaml --namespace monitoring


# 설치후에 svc를 Nodeport로 잠시 변경해서 UI를 통해 설치가 잘되었는지 확인할수 있다.
# 추후에 LB나 ingress로 변경할 예정

$ kubectl edit svc -n monitoring prometheus-server
  • 여기까지 prometheus를 설치했는데, 자동으로 cadvisor가 타겟등록 되는것을 확인할수 있다.

 

 

 

 


 

✅  사용 방법  (1)

  • 쿠버네티스 배포시 kubelet 내부에 포함되어 있다 하지만 kubectl 명령어로 이를 사용하려면 metric-server의 도움이 필요하다.
  • kubelet에 포함된 cAdvisor가 메트릭(지표)을 수집해 metrics-server로 전송하는 구조
  • Metric-server 배포 하면 kubectl top 을 통해 컨테이너 리소스 사용량 확인할수 있다.
  • metrics-server는 기본적인 리소스 모니터링만 가능하므로, 세부적인 모니터링은 프로메테우스 그라파나 활용 필요
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# kube-system 네임스페이스 확인

kubectl get deploy -n kube-system

NAME                      READY   UP-TO-DATE   AVAILABLE   AGE
calico-kube-controllers   1/1     1            1           4d6h
coredns                   2/2     2            2           4d6h
dns-autoscaler            1/1     1            1           4d6h
metrics-server            0/1     1            0           96s

kubectl edit deploy -n kube-system metrics-server


# tls-insecure 모드로 변경 
# HostNetwork로 변경 
# 메트릭 서버가 통신을 못하는 경우

root@node1:~# kubectl top node

NAME    CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
node1   80m          4%     2806Mi          73%       
node2   74m          3%     2734Mi          71%       
node3   56m          2%     2643Mi          69%       
node4   48m          2%     2580Mi          67%       
node5   37m          1%     2672Mi          69%       
node6   43m          2%     2752Mi          71%

✅  사용 방법  (2) 

세부적인 모니터링은 프로메테우스 / 그라파나 스택을 이용한다.
# prometheus 접속
http://10.20.2.19:30723/
  • node cpu 코어 확인

모니터링은 기본적으로 CPU / MEM / NET / DISK 를 기반으로 구성해야합니다.

그러기 위해선 먼저, CPU와 메모리의 성능 및 사용량을 어떤 기준으로 확인 할지에 대한 이해가 선행 되어야 합니다.

https://themapisto.tistory.com/152

 

[서버] CPU와 메모리 (1)

클라우드, 가상화, 서버 , 네트워크 , 스토리지 기초에 대해서 진짜 쉽게 내 방식대로 정리해봄 비전공자로서 처음 개발자로 취업을 했을때 컴퓨터 지식 ( Computer Sceience ) 대해서 전혀 아는것이

themapisto.tistory.com

CPU와 메모리의 성능 및 사용량에 대해서 어느정도 이해한 후에, 다음 포스팅으로 넘어가서 프로메테우스의 모니터링 쿼리를 

학습 해보겠습니다.

https://themapisto.tistory.com/55