DevOps/Kubernetes

[Kubernetes] 쿠버네티스 모니터링 (Monitoring) - Prometheus & Grafana 설치

TTOII 2022. 6. 8. 12:10
728x90

🚀 Prometheus Monitoring

쿠버네티스 모니터링의 역사

Heapster → metrics-server → Prometheus

Prometheus는 기본적으로 모니터링에 목적이 있다.
CPU, Memoty, Network IO, Disk IO 등을 모니터링 할 수 있다.
오로지 쿠버네티스만이 아닌 BM, VM, Docker 등 시스템을 위해 구성되는 것이며 metric값을 수집해서 시각적으로 확인할 수 있도록 한다.

 

📌 프로메테우스 아키텍처

주황색 아웃라인이 그려진 것들이 프로메테우스의 구성요소이다. 각 구성요소들이 파드로 실행된다.

가장 중요한 것은 중앙의 Prometheus server이다. 그 중 Retrieval은 회수/수집의 의미를 가진다.

 

Prometheus targets - 프로메테우스가 측정할 대상, VM, 컨트롤 플레인, 워커 노드의 호스트, 파드 등의 CPU, Memory 정보가 될 수 있다.

Jobs/exporters - Job은 프로세스나 App이 될 수 있다.

 

Short-lived jobsmetrix을 수집해서 가져온다. (Pull metrics)
metric이란 수집 가능한 요소(: CPU, Memoty, Network IO, Disk IO)들을 수집한 것이다.

 

Short-lived jobs(금방 생성되고 금방 삭제되는 것)들은 제대로 측정을 하지 못하는 경우가 생긴다.
생명주기가 짧은 애들은 미쳐 가져오기도 전에 생명주기가 끝나서 모니터링을 할 수 없다.

Pushgateway - 생명주기가 짧은 것들은 Pushgateway가 대신해서 생명주기가 끝나기 전에 메트릭을 미리 받아둔다.

 

즉, RetrievalPushgateway 또는 해당되는 타겟의 해당되는 메트릭을 pulling하여 데이터를 수집한다.

 

중요한 것은 타겟을 어떻게 정하느냐 ?이다.

반드시 쿠버네티스만이 대상이 되는 것이 아니므로 VM이나 특정 App이 대상이 될 수도 있다.

 

Service discovery
따라서 프로메테우스에서 타겟을 찾기위한 서비스 디스커버리를 해야한다. 즉, 대상이 누구인지를 파악할 수 있어야 한다.

쿠버네티스를 대상으로 하면 간단하게 apiserver에 질의함으로써 서비스 디스커버리를 할 수 있다.
쿠버네티스와 상호작용해서 프로메테우스 서버가 수집대상을 가지고 온다.

 

file\_sd - 타겟이되는 서버를 직접 파일로 정할 수 있다.

TSDB - Time Series DB 시계열 데이터베이스

시계열 DB란 ? CPU, Memory의 값들의 사용량은 시간순으로 바뀐다.
이것을 DB에 시간대별로 저장하기 좋게 만들어 놓은 DB를 시계열 DB라고 한다.

TSDB를 통해 데이터를 로컬에 저장한다. 쿠버네티스의 경우 pv, pvc를 사용한다.

 

HTTP server + Dashboard - 그래픽 기반의 웹

Data visualization - 데이터 시각화, 사람이 눈으로 측정값들을 보기 좋게 그래프같은 것으로 만들어주는 형태를 대시보드라고 한다.

Prometheus web UI를 통해서 HTTP server에 접속해서 값들을 볼 수 있다. 개발용, 테스트용으로 사용한다.

 

PromQL - 시계열 DB에 저장되어 있는 여러가지 측정값들을 검색할 수 있는 Query Language

PromQL을 통해 시각화 데이터를 볼 수 있다.

 

Alertmanager - 알람, 특정 CPU, Memoty, Network IO, Disk IO를 모니터링 하다가 설정한 기준치를 넘으면 알림을 보낼 수 있다.

 

pagerduty - 별도의 SaaS 서비스, alert들을 통합해서 전송해주고 관리해주는 서비스

 

Prometheus web UI로는 사실상 모니터링이 불가하므로 별개의 오픈소스인 Grafana를 사용한다.

Grafana는 쿠버네티스 뿐만 아니라 다양한 소스로부터 데이터를 가지고와서 시각화해주는 도구이다.

 

 

📌 Prometheus helm chart repository

https://github.com/prometheus-community/helm-charts/tree/main/charts/kube-prometheus-stack

kube-prometheus-stack : Prometheus의 모든 컴포넌트를 한번에 설치할 수 있음

kube-prometheus-stack은 Prometheus Operator에 의해 만들어졌다.

Operator란 무엇인가 ?

 

 

🚀 kubernetes operator

오퍼레이터(operator) 패턴 | Kubernetes

오퍼레이터를 정의하기 위해서 사용자 정의 리소스(CRD)를 사용한다.

❯ kubectl api-resources | grep crd
customresourcedefinitions         crd,crds     apiextensions.k8s.io/v1                false        CustomResourceDefinition
bgpconfigurations                              crd.projectcalico.org/v1               false        BGPConfiguration
bgppeers                                       crd.projectcalico.org/v1               false        BGPPeer
blockaffinities                                crd.projectcalico.org/v1               false        BlockAffinity
clusterinformations                            crd.projectcalico.org/v1               false        ClusterInformation
felixconfigurations                            crd.projectcalico.org/v1               false        FelixConfiguration
globalnetworkpolicies                          crd.projectcalico.org/v1               false        GlobalNetworkPolicy
globalnetworksets                              crd.projectcalico.org/v1               false        GlobalNetworkSet
hostendpoints                                  crd.projectcalico.org/v1               false        HostEndpoint
ipamblocks                                     crd.projectcalico.org/v1               false        IPAMBlock
ipamconfigs                                    crd.projectcalico.org/v1               false        IPAMConfig
ipamhandles                                    crd.projectcalico.org/v1               false        IPAMHandle
ippools                                        crd.projectcalico.org/v1               false        IPPool
kubecontrollersconfigurations                  crd.projectcalico.org/v1               false        KubeControllersConfiguration
networkpolicies                                crd.projectcalico.org/v1               true         NetworkPolicy
networksets                                    crd.projectcalico.org/v1               true         NetworkSet

Calico를 설치할 때 crd라는 리소스를 통해서 사용자 정의 리소스를 만들 수 있다.

사용자만의 리소스를 정의할 수 있다. 그것을 정의하는 리소스가 crd라는 리소스이다.

 

📌 operator flamework
Welcome to Operator framework
operator와 crd를 합쳐서 나만의 리소스를 만들 수 있고 리소스의 생성 순서도 정의할 수 있다.

 

kube-prometheus-stack에는 Prometheus rules가 있다.
프로메테우스 서버가 있고 exporter가 프로메테우스 서버를 가리켜야 한다.
alert는 서버랑 어떻게 연동 시킬 것인지 ? 등을 세세하게 세팅해야 하는데 이런 세팅까지도 모두 포함되어 있다.

따라서 매우 쉽게 쿠버네티스 클러스터의 모니터링을 제공할 수 있다.

 

 

🚀 Prometheus & Grafana 설치

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

 

prom-values.yaml

grafana:
  service:
    type: LoadBalancer
❯ kubectl create ns monitor
namespace/monitor created

default 네임스페이스가 아닌 별도의 네임스페이스를 생성해서 분리시키는 것이 좋다.

 

helm install prom prometheus-community/kube-prometheus-stack -f prom-values.yaml -n monitor
❯ helm list -n monitor
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                           APP VERSION
prom    monitor         1               2022-05-28 05:56:22.319291077 +0000 UTC deployed        kube-prometheus-stack-35.4.2    0.56.2

❯ kubens monitor
Context "kubernetes-admin@cluster.local" modified.
Active namespace is "monitor".

❯ kubectl get all

 

홈 화면에서 왼쪽 상단의 General / Home 을 클릭하면 미리 만들어져 있는 대시보드의 리스트를 볼 수 있다.

 

Kubernetes / Compute Resources / Cluster 를 클릭하면 리소스 사용량을 네임스페이스별로 파악할 수 있다.

728x90