# 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에 필요한 작업을 하기 위해 필요하다