넓게 보면 NoSQL이라고 말할 수 있지만 자세히 보면 범용적인 데이터를 저장할 수 있는 구조는 아니기에 일상적으로 말하는 데이터 베이스와는 거리가 있을 수 있음.
그렇기에 Prometheus는 모니터링 시스템이며, 실시간 처리에 최적화된 데이터를 가지고 있다. 라고 말하는 것이 더 정확할 수 있음
kube-prometheus-stack 구성 및 설치
Helm으로 설치 시에 KubeStateMetrics, NodeExporter, Grafana, Operator가 설치가 됨.
앞에 kube가 붙어있는 것이 아닌 그냥 Prometheus인 패키지라면 operator는 없으니 주의 바람
NodeExporter는 DaemonSet으로 설치되어 각 노드의 정보를 노출하는 데 사용이 됨.
KubeStateMetrics는 Deployment로 설치되어 kube-apiserver와 통신하여 리소스 정보를 노출 시킴 ex) pod의 개수
Operator는 CRD를 보고 Prometheus, AlertManager를 만들어 줌.
또한 ServiceMonitor의 정보를 보고 Prometheus의 Secret 정보를 만들어줌 -> 그걸 보고 Prometheus가 연결해 줌
Grafana는 Deployment이기에 PVC를 통해 PV를 만들고 Prometheus는 기본적으로 DB 이기 때문에 StatefulSet으로 만들어야 하기에 PV를 만들어서 연결해줌
Prometheus는 단일 서버 용으로 만들어져있기에 여러 개를 만들기가 힘듦
Thanos가 이를 해결해줌
새로운 리소스가 추가될 때 해당 리소스의 매트릭을 수집하는 방법
위 그림에서 Nginx가 새로이 만들어진다면 다음과 같은 절차를 거침.
Nginx가 배포가 됨 -> ServiceMonitor(Nginx)를 만듦 -> Operator가 이를 보고 Secret을 업데이트 함 -> Prometheus의 ConfigReloader가 이를 감지하여 Nginx의 매트릭을 수집함
위와 같은 단계 덕분에 재기동을 시키지 않아도 됨.
리소스 (CPU, Memory)
다른 자원들도 많이 있지만 CPU와 Memory가 가장 중요하기 때문에 일단 둘만 설명함.
node에 자원을 적절히 배치하기 위해 requests와 limits라는 속성이 존재함
requests는 Node의 Pod 배치의 기준이 되며 requests를 기준으로 매트릭이 표시가 됨
예를 들어 requests가 1이고 노드에 최대 값이 2라면 2개만 설치가 됨.
또한 requests가 1이고 pod가 사용량이 2까지 올라간다면 매트릭 표시 값은 200%가 됨.
limits는 pod의 최대 사용량 기준이 됨.
limits에 값을 넘긴다면 새로운 pod가 만들어짐
requests와 limits의 비율에 따라 쿠버네티스의 노드를 인식할 때 3가지 종류가 있음.
Guaranteed
requests와 limits를 같게 만드는 것으로 기준치 밖에 못쓰기에 노드 자원이 비효율적이나 서비스의 안정성을 보장됨.
BestEffort
requests와 limits를 아얘 설정하지 않는 것으로 자유롭게 사용이 되기 때문에 노드의 자원을 효율적으로 사용하나 만약 노드의 자원이 떨어져도 Pod를 새로 생성하고 하나의 Pod에서 많은 양의 자원이 사용이 될 수 있기에 서비스의 안정성은 보장하지 않음
Burstable
Guaranteed와 BestEffort에 해당되지 않는 나머지로 필요에 따라 requests와 limits를 조정시키는 것
가장 많이 사용됨.
Node의 자원 부족시 BestEffort > Burstable 순으로 Pod를 삭제 시킴. Guaranteed는 유지
초기 값의 경우 memory는 부족하면 Pod가 생성이 안될 수 있기에 우선 requests와 limits를 같게하여 생성을 보장시키고 모니터링하며 조정하는 것이 좋음. CPU는 부족해도 쓰로틀링이 걸릴 뿐 memory 처럼 바로 터지진 않기에 일단 requests와 limits 비율을 1:2로 설정한 후 모니터링을 하며 조정하는 것이 좋음
Grafana Dashboard
많은 대시보드가 존재하며 목적에 따라 원하는 매트릭이 다르기 때문에 일단 목적을 정한 후 이에 맞는 대시보드를 찾아 복사한 후 수정하는 것이 좋음
PromQL 조인 쿼리
PromQL은 Prometheus에서 사용하는 쿼리를 뜻하는데 여러 문법들이 존재하지만 이를 모두 외우는 건 힘들기에 일단 대시보드에서 복사한 후 사용하는 것이 좋음
하지만 조인 쿼리의 경우 여러 곳에서 사용하기 좋기에 기억하는 것이 좋음
간단히 설명하자면 on은 해당 필드를 기준으로 매칭이 되는 것이며 group_left나 group_right의 경우 일을 기준으로 다의 데이터를 확장 시킬 때 사용함. (일과 다의 의미는 바로 위의 그림 참고)