프로메테우스를 이용한 쿠버네티스 모니터링 이해하기
kube-prometheus에 의해서 설치된 컴포넌트들을 살펴보도록 하겠습니다.
설치된 컴포넌트
kube-prometheus
를 설치하면, 다음과 같은 컴포넌트들이 생성됩니다.
- prometheus -operator : prometheus 와 alertmanager를 생성/삭제하고 관리하는 prometheus -operator가 설치됩니다.
- prometheus :
prometheus-k8s
라는 이름의 기본 프로메테우스 서버가 생성됩니다. - alertmanager :
alertmanager-main
라는 이름의 기본 알럿 매니저가 생성됩니다. - node-exporter : 노드의 메트릭을 수집하기 위한
node-exporter
가 생성됩니다. - prometheus -adapter : HPA를 위한
proemtheus-adapter
가 생성됩니다. - kube-state-metrics : 쿠버네티스 클러스터의 메트릭을 수집하기 위한
kube-state-metrics
가 생성됩니다. - grafana : 메트릭 시각화를 위한
grafana
가 생성됩니다.

메트릭 수집
기본적으로 생성되는 prometheus-k8s
라는 이름의 프로메테우스 서버에서 수집하는 대상들에 대해서 알아보겠습니다. 설치한 버전에 따라서 약간의 차이는 존재할 수 있습니다.
프로메테우스 서버에서 수집하는 대상은 프로메테우스 서버 웹 화면의 메뉴에서 Status → Targets을 클릭하면 확인해 볼 수 있습니다. kube-prometheus
를 이용하여 설치했기 때문에, 기본적인 수집 대상이 등록되어 있습니다.

kubelet
쿠버네티스의 각 노드들에는 kubelet
이 기본적으로 설치되어 있습니다. kubelet
에는 cAdvisor
가 통합되어 있는데, 이 cAdvisor
를 통해서 개별 컨테이너의 메트릭 정보들을 가져올 수 있습니다.
프로메테우스 서버는 kubelet
을 이용하여 컨테이너의 메트릭 정보들을 수집합니다.


node-exporter
node-exporter
는 쿠버네티스의 DaemonSet 리소스로 정의되어 있습니다. 그래서 쿠버네티스의 각 노드들에 node-exporter
가 설치됩니다. node-exporter
는 설치된 노드의 CPU, 메모리, 네트워크 같은 메트릭을 수집하도록 도와줍니다. node-exporter
에 대한 자세한 사항은 해당 페이지를 참고하시기 바랍니다.
프로메테우스 서버는 node-exporter
을 이용하여 노드의 메트릭 정보들을 수집합니다.


kube-state-metrics
kube-state-metrics
는 쿠버네티스 클러스터 레벨의 메트릭을 수집할 수 있도록 도와줍니다. 디플로이먼트(deployment)나 포드(pod) 등의 메트릭과 자원 예약 같은 정보를 제공합니다. kube-state-metrics
에서 제공하는 메트릭에 대한 자세한 내용은 해당 페이지를 참고 바랍니다.
프로메테우스 서버는 kube-state-metrics
을 이용하여 쿠버네티스 클러스터의 메트릭 정보들을 수집합니다.


기타 내부 컴포넌트
kube-system
네임스페이스 있는 내부 컴포넌트들의 메트릭도 수집을 합니다. etcd
, coredns
, kube-apiserver
, kube-controller-manager
, kube-scheduler
등이 있습니다.
알럿 관리
프로메테우스 서버에서 알럿 룰(AerltRule)을 정의하여, 알럿을 발생 시킬 수 있습니다. 발생한 알럿은 서버에 설정된 알럿 매니저(AlertManager)로 전송됩니다. prometheus-k8s
프로메테우스 서버의 경우에는 alertmanager-main
이라는 이름의 알럿 매니저로 알럿이 발송됩니다.

알럿 룰 (Alert Rules)
알럿 룰은 프로메테우스 서버에서 정의할 수 있습니다. 알럿 룰은 일반적으로 yaml 파일으로 이루어져 있으며 프로메테우스 서버가 해당 파일을 읽어서 알럿 룰을 읽어오게 됩니다.
알럿 룰은 프로메테우스 서버 웹 화면의 메뉴에서 Status → Rules 을 클릭하면 확인해 볼 수 있습니다. kube-prometheus
를 이용하여 설치했기 때문에, 기본적인 알럿 룰들이 등록되어 있습니다.

그리고 룰에 의해서 생성된 알럿들은 웹 화면의 메뉴의 Alerts 에서 확인할 수 있습니다.

알럿 룰은 알럿 룰을 정의한 yaml 파일은 만든 다음에, 프로메테우스 서버 설정에 추가 하면 됩니다. 이 글에서는 prometheus-operator
를 사용하기 때문에, PrometheusRule
라는 사용자 리소스를 이용하여 알럿 룰을 정의할 수 있습니다.
다음은 PrometheusRule 매니페스트의 일부분 입니다.
apiVersion: monitoring.coreos.com/v1 kind: PrometheusRule metadata: labels: prometheus: k8s role: alert-rules name: prometheus-k8s-rules namespace: monitoring spec: groups: - name: node-exporter rules: - alert: NodeFilesystemSpaceFillingUp annotations: description: Filesystem on {{ $labels.device }} at {{ $labels.instance }} has only {{ printf "%.2f" $value }}% available space left and is filling up. runbook_url: https://github.com/kubernetes-monitoring/kubernetes-mixin/tree/master/runbook.md#alert-name-nodefilesystemspacefillingup summary: Filesystem is predicted to run out of space within the next 24 hours. expr: | ( node_filesystem_avail_bytes{job="node-exporter",fstype!=""} / node_filesystem_size_bytes{job="node-exporter",fstype!=""} * 100 < 40 and predict_linear(node_filesystem_avail_bytes{job="node-exporter",fstype!=""}[6h], 24*60*60) < 0 and node_filesystem_readonly{job="node-exporter",fstype!=""} == 0 ) for: 1h labels: severity: warning
프로메테우서 서버에서 발생한 알럿은 알럿 매니저로 발송됩니다. 알럿 매니저는 해당 알럿을 받아서, 설정에 따라 노티피케이션을 발송하게 됩니다. 노티피케이션은 슬랙, 메일 등 다양한 곳으로 보낼 수 있습니다. 자세한 사항은 해당 페이지를 참고하시기 바랍니다.
기본적으로 생성된alertmanager-main
알럿 매니저에서 별다른 설정이 없기 때문에, 노티피케이션이 발송되지 않습니다.
다음은 알럿 매니저의 화면입니다.

메트릭 시각화
프로메테우스 서버의 웹 화면에서 간단한 그래프를 그릴 수 있지만, 전문 시각화 도구인 그라파나(Grafana)를 이용하면, 보다 편리하고 멋지게 시각화를 할 수 있습니다.
그라파나는 데이터를 가져올 수 있는 데이터 소스를 등록할 수 있습니다. kube-prometheus
를 이용하여 설치했기 때문에 기본적으로 proemtheus-k8s
가 데이터 소스로 등록되어 있습니다. 그리고, 기본적인 대시보드들도 등록되어 있기 때문에, 바로 쿠버네티스 클러스터의 상태를 대시보드로 확인할 수 있습니다.

다음은 기본적으로 등록되어 있는 대시보드 목록의 일부분입니다. 대시보드 이름을 클릭하면 대시보드 화면으로 이동합니다.

다음은 쿠버네티스 클러스터의 대시보드 화면입니다.
