이번 4주차 주제로는 우리가 가장 많이 사용하는 프로메테우스, 그라파나 모니터링에 대한 글입니다.
프로메테우스 개요
프로메테우스는 대표적인 Pull방식의 메트릭 서버입니다.
Pull방식 과 Push 방식이 있는데, 그 차이는 무엇일까요?
우리가 흔히 사용하는 모니터링 서버는 대부분 push 방식입니다. Datadog이나 Whatap 같이 대부분 agent를 설치하고 대상 서버에서 agent가 메트릭을 수집하고 중앙 서버에 push 합니다. 그러면 그 중앙 서버는 메트릭값을 모아 중앙에서 관리하게 됩니다.
그렇다면 pull 방식의 경우는 대상 서버에서 알아서 자신의 메트릭값을 open하고 있습니다. 그럼 중앙 서버에서는 대상 서버의 메트릭값을 pull로 수집을 해 저장합니다. 따라서 agent 운영에 대한 피로나 리소스 사용에 대한 부담이 매우 덜합니다.
프로메테우스 아키텍처는 아래와 같습니다.
프로메테우스에는 다양한 기능을 가진 서버가 있다.
- alertmanager : 대표적으로 슬랙과 같은 경보 채널을 따서 사전에 정의한 정책 기반에 따라 (ex. 노드다운 등) 시스템의 경고 메시지를 푸쉬한다.
- grafana : 프로메테우스의 제품은 아니지만 거의 같이 쓰이는 시각화 도구이다. 참고로 프로메테우스도 당연히 시각화 그래프를 제공하지만 그라파나는 모니터링 대쉬보드에 아주 특화된 제품으로 대부분 프로메테우스 기본 기능이 아니라 그라파나를 연동해서 사용한다.
- prometheus : 프로메테우스의 일종의 핵심 서버로
- node-exporter : 물리 노드에 대한 자원 사용량(네트워크, 스토리지 등 전체) 정보를 메트릭 형태로 변경하여 노출한다.
- Operator : 시스템의 경고 메시지 정책과 애플리케이션 모니터링 대상 추가 작업에 대한 편의성을 갖춘 CRD를 지원한다.
설치
헬름을 통해서 프로메테우스에 대한 차트를 추가하고 인증서 정보를 등록합니다.
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 사용 리전의 인증서 ARN 확인
CERT_ARN=`aws acm list-certificates --query 'CertificateSummaryList[].CertificateArn[]' --output text`
echo "alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN"
배포를 위한 yaml을 작성해 공유합니다.
# 파라미터 파일 생성
cat <<EOT > ~/monitor-values.yaml
alertmanager:
ingress:
enabled: true
ingressClassName: alb
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/group.name: "monitoring"
hosts:
- alertmanager.$KOPS_CLUSTER_NAME
paths:
- /*
grafana:
defaultDashboardsTimezone: Asia/Seoul
adminPassword: prom-operator
ingress:
enabled: true
ingressClassName: alb
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/group.name: "monitoring"
hosts:
- grafana.$KOPS_CLUSTER_NAME
paths:
- /*
prometheus:
ingress:
enabled: true
ingressClassName: alb
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/group.name: "monitoring"
hosts:
- prometheus.$KOPS_CLUSTER_NAME
paths:
- /*
prometheusSpec:
podMonitorSelectorNilUsesHelmValues: false
serviceMonitorSelectorNilUsesHelmValues: false
retention: 5d
retentionSize: "10GiB"
EOT
이제 배포를 진행합니다.
헬름을 통해서 설치하며 기존 인터벌 타임이 15초로 설정합니다.
# 배포
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.7.1 \
--set prometheus.prometheusSpec.scrapeInterval='15s' --set prometheus.prometheusSpec.evaluationInterval='15s' \
-f monitor-values.yaml --namespace monitoring
NAME READY STATUS RESTARTS AGE
kube-prometheus-stack-kube-state-metrics-7c44b8c9c4-hp9rw 1/1 Running 0 117s
kube-prometheus-stack-operator-75b7b9747d-gkd2c 1/1 Running 0 117s
kube-prometheus-stack-prometheus-node-exporter-98f6m 1/1 Running 0 117s
kube-prometheus-stack-prometheus-node-exporter-jfbfp 1/1 Running 0 117s
kube-prometheus-stack-prometheus-node-exporter-xrbqr 1/1 Running 0 117s
기본적으로 프로메테우스는 metrics 정보를 오픈할 때는 9100번 포트를 사용합니다.
따라서 9100번 포트로 접속시 이와 같은 화면이 등장합니다.
잘 읽어보면 메트릭값을 지속적으로 표시하게 되는데 이것을 프로메테우스 서버는 pull 방식으로 가져가게 됩니다.
프로메테우스 서버
9090포트를 기반으로 프로메테우스 서버로 접속해봅니다.
프로메테우스는 기본적으로 PromQL이라는 언어를 사용해 조회가 가능합니다.
저렇게 검색창에 pod만 쳐도 수집되는 모든 정보에 대한 내용을 표시해줍니다.
이처럼 pod의 ready 상태만 조회해봐도 이렇게 자세한 내용이 표시되며, 그래프도 그릴 수 있습니다.
프로메테우스의 그래프는 너무 시각적으로 단순하기 때문에 grafana를 많이 연동해 사용하는 것입니다.
프로메테우스의 Status에서 Targets에 들어가면 현재 타겟으로 설정된 호스트 정보들이 표시됩니다. state에서 상태 체크를 진행할 수 있습니다.
그라파나
그라파나는 시각화 툴로 기본적으로 3000번 포트를 사용합니다.
이번 예제의 경우 템플릿이 대부분 저장되어있는데 이게 헬름의 장점이기도 합니다.
그라파나의 큰 장점은 이처럼 시각화를 매우 고급지게 표현이 가능하다는 점입니다.
일반적인 그라파나 등록절차는 다음과 같습니다.
1. 설정 > 데이터 소스 입력
- 지금과 같이 프로메테우스를 데이터소스로 이용하려면 데이터 소스에 프로메테우스를 입력합니다.
대부분 서버의 호스트 url을 입력해 해당 서버에 접근할 수 있도록 해줍니다.
대쉬보드에서 새로운 대쉬보드를 추가합니다.
이처럼 데이터 소스를 프로메테우스로 입력합니다.
위의 예제처럼 pod_container_status_ready를 그라파나에 등록해보겠습니다.
만약 promQL을 그대로 사용해보고 싶다면 쿼리옵션을 이처럼 코드로 변경하면 입력할 수 있습니다.
이렇게 등록이 잘되는 것을 확인할 수 있습니다.
이상으로 프로메테우스 설치 및 그라파나 등록을 마치겠습니다.