본문 바로가기
사이드 프로젝트

[CI/CD 프로젝트] Prometeus + Grafana 를 통한 모니터링 가시성 높이기

by 간장공장공차장 2024. 11. 20.
반응형

Prometheus

  1. 데이터 수집: Prometheus는 애플리케이션, 서버, 네트워크 장비 등에서 성능 데이터를 수집한다.
  2. 시계열 데이터 저장: 수집된 데이터는 시계열 데이터베이스에 저장되며, 시간에 따른 변화 추이를 분석할 수 있다.
  3. 알림 기능: 특정 조건이 충족되면 Alertmanager와 연동하여 알림을 발송해 주는 역할을 한다.
  4. Pull 방식: Prometheus는 주로 Pull 방식으로 데이터를 수집하여, 필요할 때 데이터를 직접 가져오는 방식이다.
  5. Query Language (PromQL): PromQL이라는 전용 쿼리 언어를 사용하여 데이터를 필터링하거나 집계할 수 있어, 복잡한 분석을 구현할 수 있다.

Grafana

  1. 데이터 시각화: Prometheus나 다른 데이터 소스에서 가져온 데이터를 그래프, 차트, 게이지 등의 형태로 시각화하여 보여준다.
  2. 대시보드 생성: 각기 다른 지표들을 모아 한눈에 볼 수 있는 대시보드를 생성해 주어, 시스템의 전반적인 상태를 직관적으로 파악할 수 있도록 해준다.
  3. 다양한 데이터 소스 통합: Grafana는 Prometheus 외에도 ElasticSearch, InfluxDB, MySQL 등 다양한 데이터 소스를 통합하여 한 곳에서 관리할 수 있다.
  4. 경고 설정: Grafana는 특정 조건에 따라 경고를 설정할 수 있으며, Slack 등의 협업툴로 알림을 보낼 수 있다.

Prometheus + Grafana 연동의 장점

  • 실시간 모니터링: Prometheus의 시계열 데이터를 실시간으로 가져와 Grafana에서 시각화하여 현재 시스템 상태를 신속히 파악할 수 있다.
  • 효율적인 문제 해결: 성능 이상을 빠르게 발견하고, 알림 기능을 통해 즉시 조치를 취할 수 있어 장애 발생 전 예방이 가능하다.
  • 확장성과 유연성: Prometheus는 확장 가능하며 다양한 메트릭을 지원하며, Grafana는 여러 소스를 통합하여 전체 시스템을 종합적으로 관리할 수 있게 지원한다.

사용 예

  • 애플리케이션 성능 모니터링: CPU, 메모리, 트래픽 등 다양한 지표를 모니터링하고 분석하여 성능 최적화를 지원한다.
  • 클라우드 인프라 모니터링: 클러스터, 컨테이너, 네트워크 등 인프라의 사용량과 상태를 추적하여 리소스 활용을 최적화한다.
  • 사용자 맞춤 대시보드 구성: 대시보드 템플릿을 이용해 다양한 모니터링 지표를 손쉽게 시각화할 수 있다.

참고)

PV, PVC

Kubernetes에서 Persistent Volume (PV)와 Persistent Volume Claim (PVC)은 스토리지 관리를 위해 중요한 역할을 한다. 이 문서에서 이 내용을 다루는 이유는 Grafana와 Prometheus의 경우 Pod가 restart되거나 꺼진 후 다시 올라 올 때 Persistence한 데이터를 제공하기 위해 스토리지와 연결이 필요하다.

Persistent Volume (PV)

  • Persistent Volume은 클러스터의 스토리지 리소스를 추상화한 Kubernetes 리소스이다. PV는 클러스터에서 관리되는 물리적 스토리지로, NFS, iSCSI, Ceph, AWS EBS, GCE PD 등 다양한 스토리지 시스템과 연동할 수 있습니다.
  • 속성:
    • 용량: PV는 특정 용량을 가지며, 이를 통해 스토리지의 크기를 설정할 수 있습니다.
    • 액세스 모드: PV는 데이터가 어떻게 접근될 수 있는지를 정의합니다. 예를 들어 ReadWriteOnce, ReadOnlyMany, ReadWriteMany 같은 모드가 있다.
    • 레퍼런스: PV는 Kubernetes의 외부 리소스에 대한 연결을 제공한다.
  • 수명주기: PV는 클러스터에서 독립적으로 존재하며, 사용자가 수동으로 삭제하지 않는 한 스토리지 자원이 계속 유지된다.

Persistent Volume Claim (PVC)

  • Persistent Volume Claim은 사용자(주로 Pod)가 스토리지 리소스를 요청할 때 사용하는 요청입니다. PVC는 사용자가 원하는 스토리지의 크기와 액세스 모드를 정의합니다.
  • 속성:
    • 용량 요청: PVC는 필요한 스토리지의 용량을 명시하며, 이 용량이 PV의 용량과 일치해야 PV가 PVC에 바인딩됩니다.
    • 액세스 모드 요청: PVC는 데이터에 대한 액세스 방식을 정의한다. 이 모드는 PV의 액세스 모드와 일치해야 한다.
  • 바인딩: PVC는 클러스터 내의 PV와 자동으로 바인딩된다. 사용자가 PVC를 생성하면 Kubernetes는 해당 PVC에 맞는 PV를 찾아 연결한다. 만약 적합한 PV가 없으면 PVC는 Pending 상태로 남아 있다.

Persistent Volume (PV) 생성

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath: 
    path: /mnt/data

Persistent Volume Claim (PVC) 생성

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

PVC와 PV 연결 확인

kubectl get pvc

Pod에서 PVC 사용

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: my-image
      volumeMounts:
        - mountPath: /data
          name: my-storage
  volumes:
    - name: my-storage
      persistentVolumeClaim:
        claimName: my-pvc

❈ PV는 ns에 국한되지 않고, 전역으로 사용된다. 그래서 용량, 모드가 같으면 의도하지 않은 PV와 PVC가 연결될 수 있는데, 이때 PVC에서 storageClassName을 지정하여 PV와 PVC의 연결관리를 진행한다.

실습

💡Promethus와 Grafana를 설치하고, 리소스 모니터링을 진행한다.

실습에 앞서, 디스크 용량이 부족할 수 있어 이전 내용은 모두 삭제한다.

helm uninstall argocd -n argocd
k delete ns backend
  • Promethus, Grafana helm repo 등록
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
  • monitoring을 위한 ns 생성
kubectl create namespace monitoring
  • Prometheus, Grafana 설치

Grafana의 대시보드에 접속하기 위해 NodePort를 설정해준다.

adminUser: admin
adminPassword: strongpassword

먼저, grafana의 Pod가 내려가도 지속적으로 사용할 수 있도록 pv와 pvc를 생성한다.

  • pvc 생성
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-pvc
  namespace: default  
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi  
  • pv 생성
apiVersion: v1
kind: PersistentVolume
metadata:
  name: grafana-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/grafana
  • Bound 확인

  • helm 설치
helm install grafana grafana/grafana -f values.yaml -n monitoring

정상적으로 persistence가 설정되었다. 이제 노드포트로 접근하면, 정상적으로 설치된 화면을 볼 수 있다.

  • values.yaml (이것도 prometheus helm chart git clone 해서 오기. 바꾼건 없음)
  • Prometheus 설치
helm install prometheus -f values.yaml prometheus-community/prometheus -n monitoring
  • 설치가 완료되면, pvc를 확인해본다.

현재 Pending상태이기 때문에 pv를 생성해준다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: storage-prometheus-alertmanager-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data/storage-prometheus-alertmanager
apiVersion: v1
kind: PersistentVolume
metadata:
  name: prometheus-pv
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data/prometheus

이제 모든 pvc가 잘 Bound된 것을 볼 수 있다.

  • Pod 상태 확인

pod 의 상태가 원활하지 않다. 확인을 위해 describe명령어를 사용해서 보면, 시작시에 pv가 없어서 발생한 문제로 보인다.(0/2 nodes are available: pod has unbound immediate PersistentVolumeClaims.)

따라서 모두 재시작을 진행해준다.

Warning FailedScheduling 32s default-scheduler 0/2 nodes are available: 1 node(s) had untolerated taint {node-role.kubernetes.io/control-plane: }, 1 node(s) had untolerated taint {node.kubernetes.io/disk-pressure: }. preemption: 0/2 nodes are available: 2 Preemption is not helpful for scheduling..

  • 상태 확인

모든 모니터링 서비스가 잘 뜬 것을 볼 수 있다.

  • Grafana - Prometheus 연동

성공하였다.

  • 대시보드 생성

많은 사람들이 만들어 놓은 dashboard 탬플릿을 import할 수도 있고, PromQL을 통해 원하는 값을 쿼리할 수도 있다.

https://grafana.com/grafana/dashboards/1320-dashboard-servers-linux/

  • PromQL

PromQL을 작성하여 Prometheus와 Grafana의 CPU 사용량을 가시성있게 비교해보도록 한다.

위와 같이 container별 cpu 사용량에 대한 수치를 가져올 수 있다.

TroubleShooting

  • values.yaml 적용해도 적용되지 않는 문제
grafana:
  enabled: true
  service:
    enabled: true
    annotations: {}
    type: NodePort
    port: 3000
    nodePort: 32000
  persistence:
    enabled: true
    existingClaim: grafana-pvc
    accessModes:
      - ReadWriteOnce
    size: 10Gi

→ 해결 : helm chart 다운받아서 values.yaml 사용하기 (인터넷에는 규격에 맞는 values.yaml 예시가 없나보다..)

git clone https://github.com/grafana/helm-charts.git
cd helm-charts/charts/grafana
vi values.yaml
  • 계속 prometheus 서버가 pending되는 현상
kubectl logs prometheus-server-6447659c76-8nskb -n monitoring -c prometheus-server

[ec2-user@k8s-master /]$ kubectl logs pod/prometheus-server-6447659c76-6vdhz -n monitoring -c prometheus-server
ts=2024-11-02T15:56:52.119Z caller=main.go:671 level=info msg="Starting Prometheus Server" mode=server version="(version=2.55.0, branch=HEAD, revision=91d80252c3e528728b0f88d254dd720f6be07cb8)"
ts=2024-11-02T15:56:52.119Z caller=main.go:676 level=info build_context="(go=go1.23.2, platform=linux/amd64, user=root@9fad779131cc, date=20241022-13:47:22, tags=netgo,builtinassets,stringlabels)"
ts=2024-11-02T15:56:52.119Z caller=main.go:677 level=info host_details="(Linux 6.1.112-122.189.amzn2023.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Oct 8 17:02:11 UTC 2024 x86_64 prometheus-server-6447659c76-6vdhz (none))"
ts=2024-11-02T15:56:52.119Z caller=main.go:678 level=info fd_limits="(soft=65535, hard=65535)"
ts=2024-11-02T15:56:52.119Z caller=main.go:679 level=info vm_limits="(soft=unlimited, hard=unlimited)"
ts=2024-11-02T15:56:52.120Z caller=query_logger.go:114 level=error component=activeQueryTracker msg="Error opening query log file" file=/data/queries.active err="open /data/queries.active: permission denied"
panic: Unable to create mmap-ed active query log

→ 해결 :

root권한으로 다 수행해버리기 (원래는 non root user 65534 였다.)

  • pv 생성 후 폴더 생성해주기
반응형