본문 바로가기
Observability/Prometheus & Grafana

Prometheus + Grafana 설치

by wlsdn3004 2023. 4. 29.
728x90
반응형

 

본 글에서는 Prometheus와 grafana를 설치하고 대시보드를 통해 간단하게 메트릭 수집을 확인하는 실습을 다룬다.

 

Prometheus와 Grafana는 Helm 차트("prometheus-community.github.io")를 사용하여 Kubernetes 환경에서 간단하게 설치할 수 있다.

(Grafana만 따로 설치하고 싶다면 참고 : [Grafana 설치] )

 

 

설치를 완료하면 아래와 같은 Pod가 설치되는데, 각각의 역할은 다음과 같다.

  1. alertmanager
    Prometheus에서 수집된 경고 알림을 관리하고 전송하는 기능을 담당한다.
  2. grafana
    Grafana 서버로, Prometheus에서 수집된 데이터를 시각화하는 대시보드를 제공하는 서버이다.
  3. kube-state-metrics
    Kubernetes에서 제공하는 다양한 리소스의 상태를 수집하는 Prometheus exporter이다.
  4. prometheus-operator
    Kubernetes 클러스터에서 Prometheus를 관리하고 구성하는 데 사용되는 도구이다.
  5. node-exporter
    각 노드에서 실행 중인 시스템의 메트릭 데이터를 수집하는 Prometheus exporter이다.
  6. prometheus
    Prometheus 서버로, 수집된 메트릭 데이터를 저장하고 쿼리 하는 기능을 담당한다. 이를 위해 다양한 exporter와 함께 사용된다.

 

kube-state-metrics은 쿠버네티스 버전 호환성에 따라 메트릭을 수집을 못할 수 있으니 참고하자.

kube-state-metrics  Kubernetes client-go Version
v2.4.2  v1.23
v2.5.0  v1.24
v2.6.0  v1.24
v2.7.0  v1.25
v2.8.1  v1.26

만약 버전이 안 맞으면 아래와 같은 오류를 볼 수 있다.

- failed to list *v2.HorizontalPodAutoscaler: the server could not find the requested resource
- Failed to watch *v2.HorizontalPodAutoscaler: failed to list *v2.HorizontalPodAutoscaler: the server could not find the requested resource

오류 내용에 대해 간략하게 설명하자면, 최신 kube-state-metrics 버전(v2.4.2 이상)은 autoscaling/v2 api를 사용하는데, 해당 api는 쿠버네티스 1.23 버전부터 사용할 수 있다. 즉,  쿠버네티스 1.23 버전 미만에서는 사용할 수 없기 때문에 발생하는 오류 메세지 이다.

 

 

전제 조건

  • AWS EKS 클러스터
  • Helm CLI 도구

실습 환경

  • EKS 1.22.17
  • Helm 3.8.2

설치 버전

  • kube-prometheus-stack helm chart 버전 : 45.20.0
  • Grafana 버전 : 9.4.7

 

 

Prometheus Helm Chart를 등록한다.

$ helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

 

Prometheus Helm values.yaml 파일을 아래와 같이 작성한다.

## prometheus-values.yaml
grafana:
  enabled: true
prometheus:
  enabled: true
  prometheusSpec:  
    serviceMonitorSelectorNilUsesHelmValues: false  
    replicas: 1  
    resources:
      limits:
        cpu: 2000m
        memory: 4Gi
      requests:
        cpu: 2000m
        memory: 1Gi
    retention: 30d             ## 기본 10d
    retentionSize: 20GiB
    scrapeInterval: 15s        ## 기본 30s
    storageSpec:
      volumeClaimTemplate:
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 30Gi
          storageClassName: gp2

보관주기는 30일, scrape 주기는 15초로 설정했다.

[참고]
serviceMonitorSelectorNilUsesHelmValues: false

위 옵션의 기본값은 true이다. 해당 값이 true면 prometheus라는 CRD에서 아래와 같이 설정된다.
---
serviceMonitorNamespaceSelector: {},
serviceMonitorSelector:
  matchLabels:
    prometheus: release
---
이는 Prometheus가 추가 스크랩할 Targets을 serviceMonitor CRD로 지정할 때 serviceMonitor의  labels에 prometheus: release라는 label이 있어야 Targets 대상에 포함된다는 의미이다. 즉, serviceMonitor마다 해당 labels을 넣어줘야 한다.

해당 값을 false로 입력하면 아래와 같이 값이 바뀐다.
---
serviceMonitorNamespaceSelector: {},
serviceMonitorSelector: {}
---
위처럼 설정되면 serviceMonitor를 생성할 때 label에 상관없이 생성하여 사용할 수 있다.

 

[ServiceMonitor 예시]

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: podinfo
  namespace: test
  labels:
    release: prometheus  ## serviceMonitorSelectorNilUsesHelmValues값을 false로 하면 해당 labels은 안넣어줘도 된다.
spec:
  endpoints:
    - path: /metrics
      port: http        ## 반드시 숫자가 아닌 string 값으로 들어가야 한다.
      interval: 5s
  selector:
    matchLabels:
      app: podinfo
---
apiVersion: v1
kind: Service
metadata:
  name: podinfo
  namespace: test
  labels:
    app: podinfo
spec:
  type: ClusterIP
  ports:
    - port: 9898
      name: http        ## 위 ServiceMonitor가 선택할 Port의 이름으로 반드시 지정해 줘야 한다.
  selector:
    app: podinfo

 

이어서 위에서 생성한 Helm values.yaml 파일을 사용하여 설치한다.

$ kubectl create ns monitoring
$ helm upgrade -i prometheus -f prometheus-values.yaml prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set fullnameOverride=prometheus

 

정상 설치되었는지 확인해 보자.

$ kubectl get po -n monitoring 
NAME                                                     READY   STATUS    RESTARTS      AGE
alertmanager-prometheus-kube-prometheus-alertmanager-0   2/2     Running   1 (12s ago)   13s
prometheus-grafana-749c756979-dm9tm                      3/3     Running   0             58m
prometheus-kube-prometheus-operator-fcbb6587b-kdsgl      1/1     Running   0             13s
prometheus-kube-state-metrics-77dbb5cf79-dn8vl           1/1     Running   0             58m
prometheus-prometheus-kube-prometheus-prometheus-0       1/2     Running   0             13s
prometheus-prometheus-node-exporter-76nb5                1/1     Running   0             58m
prometheus-prometheus-node-exporter-gbnlt                1/1     Running   0             58m
prometheus-prometheus-node-exporter-pspt7                1/1     Running   0             58m
prometheus-prometheus-node-exporter-z5tb6                1/1     Running   0             58m
prometheus-prometheus-kube-prometheus-prometheus-0       2/2     Running   0             16s

 

kubectl port-forward를 통해 대시보드에 접근한다.

$ kubectl port-forward --address=0.0.0.0 -n monitoring prometheus-prometheuprometheus-0 8080:9090

 

메트릭 정보를 잘 가져오는지 확인해 보자. 간단하게 pod와 노드 개수를 확인해 보겠다.

$ kubectl get po --no-headers -A | wc -l
65

 

그라파나 대시보드에도 접근해 보자.

 

초기 ID, Passwd를 아래 명령으로 확인한다.

## ID
$ kubectl get secrets -n monitoring prometheus-grafana -ojsonpath="{.data.admin-user}" | base64 -d

## PASSWD
$ kubectl get secrets -n monitoring prometheus-grafana -ojsonpath="{.data.admin-password}" | base64 -d

 

kubectl port-forward를 사용하여 Grafana 대시보드에 접근한다.

$ kubectl port-forward --address=0.0.0.0 -n monitoring svc/prometheus-grafana 8080:80

 

위에서 추출한 ID, PASSWD를 입력하고 대시보드에 로그인한다.

 

기본적으로 여러 Dashboards를 제공하는 것을 확인할 수 있다.

 

 

마치며


사용자가 보기 편하게 대시보드를 커스텀 하게 만들어 운영하면 가시성을 높일 수 있고, Alerting 기능을 설정하여 문제가 발생할 경우 사용자에게 즉각적으로 알림이 가게 하여 실시간 대응이 가능하게 된다. 이렇게 해당 도구를 잘 활용한다면 보다 안정적으로 운영할 수 있게 될 것이다.

반응형

댓글