Prometheus
모니터링의 필수 요소인 Grafana Prometheus에 대해서 다뤄봅니다.
일단 Prometheus가 무엇인지 부터 정리해보겠습니다.
SoundCloud사에서 만든 오픈소스 모니터링 툴입니다. 이제는 CNCF 재단에서 관리하고 있습니다.
특징
- TSDB(Time Series DataBase)라는 시계열 데이터베이스를 사용하고 있습니다. 기본적으로 데이터를 key:value 형식으로 저장합니다.
- PromQL이라는 자체 쿼리문을 사용합니다. 이를 통해 빠르고 쉽게 조회가 가능합니다.
- 분산 스토리지에 의존하지 않는 자율적 노드. 서버 자체가 데이터를 수집하고 저장합니다. 그렇기 때문에 단순하게 설정할 수 있고 쉽게 확장할 수 있습니다.
- HTTP 기반의 pull 모델 데이터 수집이 가능합니다. 기본적으로 agent 형의 push 모델을 많이 사용하는데 prometheus는 pull 방식을 사용합니다. 그렇기 때문에 부하를 컨트롤 하는데 용이합니다.
- 강력한 시각화 기능 제공. 과거보다 최근에는 UI가 많이 개선되어서 대시보드에서 확인도 가능하고, 그래프도 잘 그려줍니다. 물론 그라파나를 따라갈 수 없어서 그라파나를 연동해서 많이 활용합니다.
아키텍처 & 구성요소 소개

- Prometheus 서버가 TSDB를 스크랩하거나 데이터를 적재합니다.
- Client 라이브러리를 통해서 HTTP 엔드포인트(보통 /metrics)를 자동으로 노출시켜 Prometheus 서버가 데이터를 수집할 수 있게 합니다.
- push gateway는 일시적으로 실행되는 작업(배치 작업, 서버리스 함수 등)이 종료되기 전에 메트릭을 저장할 수 있는 중간 저장소입니다.
- exporters를 통해서 다양한 목적의 서비스를 제공합니다. 예를 들면 HAProxy, StatsD 등이 있습니다.
- alertmanager는 알림을 발생시킬 수 있도록 관리합니다.
자 바로 일단 prometheus 스택부터 설치해봅시다
설치
certificate까지 적용하고 도메인 적용을 위해서 환경변수를 입력한뒤 아래 yaml을 통해 배포해봅니다.
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo "alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN"
cat <<EOT > monitor-values.yaml
prometheus:
prometheusSpec:
scrapeInterval: "15s"
evaluationInterval: "15s"
podMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
retention: 5d
retentionSize: "10GiB"
storageSpec:
volumeClaimTemplate:
spec:
storageClassName: gp3
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 30Gi
ingress:
enabled: true
ingressClassName: alb
hosts:
- prometheus.$MyDomain
paths:
- /*
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
alb.ingress.kubernetes.io/success-codes: 200-399
alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
grafana:
defaultDashboardsTimezone: Asia/Seoul
adminPassword: prom-operator
ingress:
enabled: true
ingressClassName: alb
hosts:
- grafana.$MyDomain
paths:
- /*
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
alb.ingress.kubernetes.io/success-codes: 200-399
alb.ingress.kubernetes.io/load-balancer-name: myeks-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
persistence:
enabled: true
type: sts
storageClassName: "gp3"
accessModes:
- ReadWriteOnce
size: 20Gi
alertmanager:
enabled: false
defaultRules:
create: false
kubeControllerManager:
enabled: false
kubeEtcd:
enabled: false
kubeScheduler:
enabled: false
prometheus-windows-exporter:
prometheus:
monitor:
enabled: false
EOT
지정한 config를 가지고 helm을 배포합니다.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.0.0 -f monitor-values.yaml --namespace monitoring
배포 확인
kubectl get pod,pvc,svc,ingress -n monitoring

node-exporter는 물리 노드에 리소스 메트릭을 확인하는데 사용됩니다.
operator는 시스템 경고 메시지 정책으로 애플리케이션 모니터링을 추가하거나 작업을 할 수 있도록 도와주는 역할을 합니다.
kube-state-matrics는 쿠버네티스 클러스터의 상태를 메트릭으로 확인할 수 있습니다.
GUI확인
node-exporter이 9100으로 열려있는데 한번 확인해봅시다.
kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter

기본적으로 config에서 DNS 설정까지 완료되었으므로 제대로 배포되었다면 다음과 같이 모두 있어야한다.

LB에서도 다음과 같이 라우팅이 되는 것을 확인할 수 있습니다.

일단 먼저 prometheus 부터 들어가보자. Query에서 간단히 container_memory_usage_bytes를 조회해도 잘 나오는 것을 확인할 수 있습니다.

PromQL은 다양하게 활용할 수 있다. 다음과 같이 컨테이너 cpu 사용량을 확인할 수 있습니다.
container_cpu_usage_seconds_total

이렇게 특정 네임스페이스만 확인도 가능합니다.
container_cpu_usage_seconds_total{namespace="istio-system"}

Status에서 Target health를 확인하면 타겟으로 등록된 인스턴스가 모두 식별됩니다.
타겟정보를 바꾸고싶으면 config를 변경해야 합니다.

Grafana
그라파나는 데이터 시각화 툴로 같이 깔려있습니다.
다음 명령어를 통해서 admin 사용자의 초기 패스워드를 가져올 수 있습니다. 접속해봅시다.
kubectl --namespace monitoring get secrets kube-prometheus-stack-grafana -o jsonpath="{.data.admin-password}" | base64 -d ; echo
그라파나에서는 data sources를 등록해야만 볼 수 있는데 이미 prometheus가 등록된것을 확인할 수 있습니다.

이렇게 다양한 대시보드도 기본으로 제공해줍니다.

Coredns 쪽을 살펴봤다. 그림이 매우 잘 나오는 것을 확인할 수 있습니다.

대시보드 가져오기
그라파나에서는 타인이 만들어놓은 대시보드를 가져와서 사용할 수 있습니다. import하는 방법은 다음과 같습니다.
Dashboard → New → Import → 15757 입력 후 Load ⇒ 데이터소스(Prometheus 선택) 후 Import 클릭합니다.

너무 예쁘게 잘 되고, 다른사람들이 이미 만들어놓은 좋은 대시보드를 사용할 수 있습니다.
다른 여러 대시보드는 여기서 찾을 수 있습니다.

만약 쿼리를 수정해보고 싶다면 edit 설정에 들어가서 다음과 같이 Builder 혹은 Code를 놓고, 아래 입력한 다음 Run queries하면됩니다.
Builder는 선택형으로 필터링하고, Code는 직접 QL을 입력하는 것이다. 잘 활용하면 Code가 나중에는 더 편할 것입니다.
sum by (instance) (irate(node_cpu_seconds_total{mode!~"guest.*|idle|iowait", instance="$instance"}[5m]))

적용할때는 반드시 save를 눌러줘야합니다.

이런 필터링 설정은 Settings > Variables에서 설정할 수 있습니다.


이상으로 Prometheus, Grafana를 알아보았습니다.