---
# System prepended metadata

title: prometheus_CRD와 Controller_2020-01-30
tags: [OSMASTER]

---

# prometheus_CRD와 Controller_2020-01-30

###### tags: `OSMASTER`

* Operator Pattern을 사용해 Prometheus을 Kubernetes Cluster 모니터링에 사용할 수 있도록 만든 Prometheus Operator란 얘가 있다.

Prometheus Operator의 등장 배경
* 항상 변하는 k8s 환경 (예: Pods는 생성되고 꺼지고 한다) 에 맞춰 Prometheus 설정을 일일히 직접 manually 해줄 수 없기 때문에 좀 더 쉽게 Prometheus 설정을 할 수 있도록

Prometheus Operator의 구상도
![](https://i.imgur.com/pafZOKW.png)

Operator는 Controller를 포함하는 개념 이다
* Operator는 CRD와 controller (image) 를 사용해서 application-specific 한 동작을 하도록 만든 솔루션을 칭함.

Prometheus Operator의 controller가 하는 일
* Prometheus CRD (ServiceMonitor, Prometheus) 등을 관찰 (watch) 및 Prometheus Server 설정을 바꾼다.

CRD로서 Prometheus
* 쿠베 환경에 알맞은 Prometheus 서버 설정을 하는데 사용된다.
* Prometheus CRD 인스턴스 마다 controller는 StatefulSet을 deploy 한다.
    * StatefulSet Pod 내부에는 서버 설정 정보를 담은 Secret을 마운트 하도록 되어있음
* 중요한 것은 Prometheus 서버 설정을 어떻게 항상 변하는 쿠베 환경에도 알맞게 자동으로 해줄거냐 인것이다.
* Prometheus가 모니터링 해야될 서비스의 추가 및 관리는 ServiceMonitor 그리고 파드 추가 및 관리는 PodMonitor를 사용한다.
    * controller는 SeviceMonitor, PodMonitor에서 생성한 설정을 토대로 Secret에 서버 설정을 업데이트 시킨다.

ServiceMonitor (CRD) 란
* 새로운 서비스가 생기더라도 레이블만 적용되있으면 발견하고 metric 수치를 수집 할 수 있게 해줌.
    * 라벨 셀렉션을 사용해서 서비스 발견
    * 서비스 내 파드가 변경될 때마다 또는 새로운 서비스가 생길 때 마다 따로 manually 서버 설정을 해주지 않아도 된다.

ServiceMonitor가 구체적으로 하는 일 
* k8s에서 앱을 모니터링 하려면 Endpoints 객체에 대한 정보를 알고 있어야 한다. (Pod의 IP와 Port Number 등 을 알아야함)
    * Service 는 하나 이상의 service port를 노출하고 이 port는 각각 하나의 Pod를 가리키는 endpoints 리스트로 되어 있다. (이 정보를 담고 있는 객체를 Endpoints 객체라고 하고 Service 객체는 각자 Endpoints 객체를 갖고 있다.)
* ServiceMonitor가 하는 일은
    1. 라벨 셀렉션을 통해 Service 객체를 셀렉트 하고. 
    2. 해당 Service 객체의 Endpoints 객체를 찾고. 
    3. 해당 Pods들을 모니터 할 수 있도록 설정을 생성한다.

PodMonitor
* 로드밸런싱에 따라 매번 바뀌는 다이나믹한 파드 들을 어떻게 모니터 할지 정의 하였다.
    * 우선, 어떤 파드를 모니터링 할지는 레이블을 통해 지정된다.
    * 그러면 PodMonitor는 라벨 셀렉션으로 모니터링 할 Pod을 찾고, 모니터링에 필요한 설정을 생성한다.

Alertmanager
* 쿠베 환경에 맞게 Alertmanager를 돌릴 수 있도록 Alertmanager 설정 또는 실행을 담당한다.
    * 복제 또는 지속적인 저장소 (Persistent storage) 를 사용할 수 있는 옵션을 준다.
    * StatefulSet으로 deploy된다

Prometheus의 YAML의 적인 API의 정체
* CRD를 정의 할 때 해당 CRD에 대한 CRUD를 할 때 호출할 API를 적는다.
    * 예) 정의 .yaml의 spec에서 group에 samplecontroller.k8s.io
* 기본적인 CRUD를 위해서는 API server aggregation이 필요 없다
    * aggregation layer는 그 외 CRD에 필요한 작업을 하기 위해 필요하다