[Kubernetes] Prometheus, Grafana를 사용한 EKS 모니터링

2025. 1. 21. 13:35Kubernetes/Kubernetes_Service

반응형

안녕하세요, 달콤한달팽이입니다.🐌🙂

 

이번 시간에는 프로메테우스와 그라파나에 대하여 알아보고,

이를 통해 EKS를 모니터링하는 시스템을 구현해보도록  하겠습니다.


프로메테우스(Prometheus)란?

프로메테우스란, 오픈소스 모니터링 툴로 대상 시스템으로부터 각종 모니터링 지표를 수집하여 저장하고 검색할 수 있는 툴입니다.

 

프로메테우스의 특징

 1) MySQL, Tomcat, Kubernetes 등 다양한 시스템을 대상으로 적용할 수 있습니다.

 2) 시계열 데이터(시간에 따른 변화 기록) 측정에 강점을 가지고 있습니다.

 3) 메트릭 데이터를 대상 시스템이 프로메테우스로 전달하는 것이 아닌, 프로메테우스가 엔드포인트를 호출하여 메트릭을 가져가는 풀링 방식을 사용합니다.

 4) 정해진 주기에 한 번씩 풀링을 수행해 정확한 수치의 값을 측정할 수 없습니다.

 5) 싱글 호스트로 구성되어 서버 다운시 그 동안의 메트릭은 유실됩니다.

 

프로메테우스의 컴포넌트 & 동작 과정

프로메테우스는 아래와 같은 구성을 가지고 있습니다.

(프로메테우스 공식 홈페이지에서 제공하는 아키텍처를 다시 그린 아키텍처입니다.)

1) Prometheus Server

 - 프로메테우스의 주요 기능 3가지를 수행하는 요소입니다.

 (1) 수집기 역할 : 대상 시스템으로부터 메트릭 데이터를 수집합니다.

  ** 수집 대상은 서비스 디스커버리를 사용하며 아래와 같은 순서로 메트릭 데이터를 가져오게됩니다.

   1. Configmap에 정의된 내용을 바탕으로 대상 정보 습득

   2. 읽어온 대상에 대해 메트릭 수집을 위해 API 서버로 정보 요청

   3. 요청을 통해 알아온 경로로 메트릭 데이터 수집

 (2) 시계열 데이터베이스 역할 : 수집한 메트릭데이터를 시계열 단위로 저장합니다.

 (3) 웹 UI 역할 : 저장된 데이터에 질의하여 대상 상태를 확인할 수 있습니다.

2) Exporter

 - 모니터링 대상의 메트릭 데이터를 수집하고 Prometheus Server가 메트릭 데이터를 가져갈 수 있도록 Endpoint 제공합니다.

3) Kube State Metrics

 - API 서버로 쿠버네티스 클러스터의 여러 메트릭 데이터를 수집한 후, 이를 프로메테우스 서버가 수집할 수 있는 메트릭 데이터로 변환합니다.

3) PushGateway

 - 배치성 작업들의 상태를 저장하고 모아 프로메테우스가 주기적으로 가져갈 수 있도록 공개하며, 외부망에서 접근할 수 없는 시스템의 경우 프록시 형태로 내부 시스템의 메트릭을 전달하는 역할도 수행합니다.

4) AlertManager

 - 프로메테우스에 경보 규칙을 설정하고, 이를 대상에게 전달하는 기능을 수행합니다.


그라파나(Grafana)란?

그라파나란, 오픈소스 모니터링 툴로 수집되어 있는 시계열 데이터 지표를 시각화해주는 툴입니다.

 

그라파나의 특징

 1) 그라파나가 수집하는 데이터에서 임계치 이상의 리소스가 사용될 경우 알람을 전달받을 수 있습니다.

 2) 대시보드를 커스터마이징 기능을 제공하여 원하는 대로 사용이 가능합니다.

 3) 다양한 플러그인을 제공하여 기능 확장이 용이합니다.


그럼 이제 프로메테우스와 그라파나를 사용하여 EKS를 모니터링하는 시스템을 구축해보도록 하겠습니다.
(EKS는 이미 구성되어있다는 것을 전제로 수행하겠습니다!)
 

1) 사전준비사항

프로메테우스를 구성하기 위해선 EKS의 관찰성 탭에서 스크레이퍼를 활성화시켜주셔야 합니다.

더보기

스크레이퍼(scraper)란?

 - 스크레이퍼란, EKS 클러스터의 지표를 수집하여 Prometheus로 전송하는 역할을 수행합니다.

 이를 활성화하지 않고 프로메테우스를 배포할 경우 PV, PVC가 정상적으로 생성되지 않는 이슈가 발생합니다..!

 

이제, EBS CSI Driver를 설치해보도록 하겠습니다.

 

우선 IAM 서비스 어카운트를 생성하여 Role을 통해 EBS 볼륨을 관리할 권한을 부여해주세요.

$ eksctl create iamserviceaccount \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster test-eks \
  --region ap-northeast-2 \
  --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy \
  --approve \
  --role-only \
  --role-name AmazonEKS_EBS_CSI_DriverRole

 

이제 연결된 권한을 사용하여 EBS CSI Driver 애드온을 설치해주세요.

$ eksctl create addon \
 --name aws-ebs-csi-driver \
 --cluster test-eks \
 --region ap-northeast-2 \
 --service-account-role-arn arn:aws:iam::{AWS ID}:role/AmazonEKS_EBS_CSI_DriverRole \
 --force

 

해당 과정이 정상적으로 완료되었다면, 이제 본격적으로 EKS 클러스터에 프로메테우스를 설치해보도록 하겠습니다.

 

2) 프로메테우스 배포

우선 프로메테우스에서 사용될 네임스페이스를 생성해주세요.

$ kubectl create ns monitoring
$ kubectl get ns | grep monitoring

 

Helm을 사용하여 prometheus-community 레포지토리를 추가해보겠습니다.

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

 

이제 Helm 명령어를 사용하여 프로메테우스를 배포해보겠습니다!

$ helm upgrade -i prometheus prometheus-community/prometheus \
 --namespace monitoring \
 --set alertmanager.persistence.storageClass="gp2" \
 --set server.persistentVolume.storageClass="gp2"

 

Pod와 PV,PVC가 정상적으로 설치되었는지 확인해보도록 하겠습니다.

$ kubectl get pods -n monitoring
$ kubectl get pv,pvc -A

 

이제 도메인을 사용하여 프로메테우스에 접속할 수 있도록, Ingress를 배포해주겠습니다. 

(Ingress 파일은 아래를 참고해주세요!)

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: monitoring-ingress
  namespace: monitoring
  annotations:
    alb.ingress.kubernetes.io/certificate-arn: {ACM ARN}
    alb.ingress.kubernetes.io/subnets: {Subnet ID AZ-a}, {Subnet ID AZ-c}
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/ssl-redirect: '443'
spec:
  ingressClassName: alb
  rules:
  - host: prometheus.sweetysnail.co.uk
    http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus-server
                port:
                  number: 80

 

이후 Route53에 ALB 주소를 등록한 후, 도메인을 사용하여 정상적으로 접속되는지 확인해주세요.

 

이제 프로메테우스는 잠시 미뤄두고, 그라파나를 설치해보도록 하겠습니다.

 

3) 그라파나 배포

그파파나 역시 프로메테우스와 동일한 방식으로 배포를 진행하도록 하겠습니다.

(Helm이 아니라 yaml 파일로 배포하고 싶으면 그라파나 공식문서를 참고해주세요!)

 

아래와 같이 Helm을 추가하고, 리스트를 확인해주세요.

$ helm repo add grafana https://grafana.github.io/helm-charts
$ helm repo list

 

그리고 monitoring 네임스페이스에 그라파나를 설치해주세요.

$ helm install grafana grafana/grafana -n monitoring

 

이후 get 명령어를 사용해 정상 배포를 확인해주도록 하겠습니다.

$ k get all -n monitoring | grep grafana

 

이제, 그라파나 역시 프로메테우스와 동일하게 도메인을 사용한 접속이 가능하도록 인그레스 배포를 수행하겠습니다.

 

아래 인그레스 파일은 기존 프로메테우스 Ingress에 그라파나를 추가한 것이고,

이 경우 rule만 추가된 것이기 때문에 재배포가 아닌 규칙 추가만 수행됩니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: monitoring-ingress
  namespace: monitoring
  annotations:
    alb.ingress.kubernetes.io/certificate-arn: {ACM ARN}
    alb.ingress.kubernetes.io/subnets: {Subnet ID AZ-a}, {Subnet ID AZ-c}
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/ssl-redirect: '443'
spec:
  ingressClassName: alb
  rules:
  - host: prometheus.sweetysnail.co.uk
    http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: prometheus-server
                port:
                  number: 80
  - host: grafana.sweetysnail.co.uk
    http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: grafana
                port:
                  number: 80

 

Ingress가 정상 배포되었을 경우 아래와 같이 도메인 접속이 가능해집니다.

 

이제 아래 명령어를 통해 그라파나의 암호를 얻어주세요.

$ kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

 

주어진 계정 정보(admin/PW)를 사용하여 관리자 계정으로 접속하면 그라파나 설치도 완료입니다!


이제 프로메테우스와 그라파나 설치가 완료되었습니다!

 

프로메테우스와 그라파나를 활용하여 모니터링에 도움되셨으면 좋게습니다.

 

감사합니다!

반응형