개요
AWS 인프라 구축 프로젝트를 진행할 때, 약 1주일 간 모니터링 시스템 없이 EKS를 운영해야 하는 상황을 겪으면서 모니터링 시스템의 필요성을 체감할 수 있었습니다.
당시 모니터링 시스템 구축을 담당하지 않았고 DataDog을 모니터링 도구로 사용했기 때문에, 많은 회사에서 사용하고 있고 kubernetes의 사실상 표준 모니터링 시스템으로 사용되는 Prometheus와 Grafana를 사용해볼 기회가 없었습니다.
따라서 이번 기회에 Prometheus와 Grafana를 학습하고 이를 사용해 kubeadm으로 로컬 환경에 구축한 클러스터의 모니터링 환경을 구축한 방법을 작성해보려 합니다.
Prometheus
Prometheus는 SoundCloud에서 개발된 오픈소스 시스템 모니터링 및 알림 시스템입니다. Kubernetes 환경에서 컨테이너화된 애플리케이션의 성능과 상태를 실시간으로 모니터링하는 데 사용됩니다.
주요 특징
- Pull 방식 데이터 수집: Prometheus 서버가 직접 타겟 시스템의 데이터를 주기적으로 가져옵니다. Prometheus 서버는 타겟 시스템의 위치와 접근 정보만 알면 되고 복잡한 에이전트 설치나 구성이 필요하지 않습니다.
- 강력한 쿼리 언어 (PromQL): PromQL은 Prometheus Query Language의 약자로, 수집된 시계열 데이터를 유연하게 조회하고 분석할 수 있는 강력한 기능을 제공합니다. 다양한 함수와 연산자를 통해 복잡한 쿼리를 작성할 수 있습니다.
- Kubernetes 환경 최적화: Node Exporter, CAdvisor 등 다양한 exporter를 통해 Kubernetes 클러스터의 노드, 컨테이너, Pod 등에 대한 상세한 메트릭을 수집합니다.
- 확장성: 다양한 exporter를 통해 다양한 시스템과 서비스의 메트릭을 수집할 수 있으며, Federation 기능을 통해 여러 Prometheus 서버에서 수집된 메트릭 데이터를 하나의 Prometheus 서버에서 통합하여 관리하고 대규모 환경을 모니터링할 수 있습니다.
- 알림 기능: Alertmanager와 연동하여 특정 조건이 발생할 때 알림을 받을 수 있습니다. Slack, Email 등 다양한 알림 채널을 지원합니다.
구축 과정
1. Homebrew를 이용해 Helm을 설치한 후, prometheus-community repository를 추가합니다.
brew install helm
# helm repo update
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
2. monitoring 네임스페이스를 만들고, 클러스터의 해당 네임스페이스에 Prometheus Helm 차트를 install합니다.
kubectl create namespace monitoring
helm install prometheus prometheus-community/prometheus --namespace monitoring
다음 명령어로 정상적으로 install 되었는지 확인합니다.
kubectl get pods -n monitoring
저의 경우 다음과 같이 prometheus-server와 alertmanager가 pending 상태인 것을 확인할 수 있었습니다.
이는 helm 차트를 이용해 prometheus의 필수 구성 요소들을 설치할 경우 다음과 같은 PersistentVolumeClaim이 생성되는 데, 해당 pvc가 bound될 PersistentVolume이 없기 때문에 발생한 문제입니다.
따라서 다음과 같은 방법으로 해결할 수 있었습니다.
StorageClass 생성
cat << EOF | kubectl apply -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
EOF
worker node에 /data/volumes dir 생성하고 권한 수정
sudo mkdir -p /data/volumes
sudo chmod 777 /data/volumes
PersistentVolume 생성
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/volumes
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node01
EOF
cat << EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolume
metadata:
name: local-pv2
spec:
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
storageClassName: local-storage
local:
path: /data/volumes
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- node02
EOF
EKS와 같이 PV provisioner(AWS)가 있는 클러스터의 PersistentVolumeClaim에서 StorageClass를 지정하면, 해당 StorageClass 스펙에 맞는 PersistentVolume이 동적으로 프로비저닝 되어 pvc에 바운딩됩니다.
그러나 지금은 로컬 클러스터이기 때문에 위와 같이 수동으로 StorageClass 스펙에 맞는 PV를 생성해주어야 합니다.
이후 prometheus-server와 alertmanager Pod에서 사용하는 PVC의 storageClass를 새로 생성한 storageClass로 수정하면 정적으로 생성한 PV가 자동으로 PVC에 바운딩됩니다.
helm upgrade -i prometheus prometheus-community/prometheus \
--namespace monitoring \
--set alertmanager.persistentVolume.storageClass="local-storage",server.persistentVolume.storageClass="local-storage"
저의 경우에는 위 명령을 실행해도 alertmanager는 계속 pending 상태였기 때문에, storage-prometheus-alertmanager-0에 storageClassName을 수동으로 추가한 후, 기존의 Pod를 삭제해 수정된 Pod가 재생성되게 하여 해결할 수 있었습니다. (alertmanager는 StatefulSet으로 생성됨)
3. NodePort를 생성하여 host에서 브라우저를 이용해 prometheus server에 접근할 수 있도록 합니다.
kubectl expose service prometheus-server --namespace monitoring --type=NodePort --target-port=9090 --name=prometheus-server-ext\
위와 같이 host의 브라우저에서 prometheus server의 UI에 접근할 수 있습니다.
http://{node ip address}:{nodePort}
# http://192.168.10.118:31440
Grafana
Grafana는 데이터를 시각화하고 분석하는 데 특화된 오픈소스 플랫폼입니다. 수집된 다양한 데이터를 그래프, 차트, 테이블 등으로 표현하여 시스템의 상태를 한눈에 파악하고, 문제를 빠르게 진단할 수 있도록 돕습니다.
주요 특징
- 다양한 데이터 소스 지원: Prometheus 외에도 Graphite, Elasticsearch, InfluxDB 등 다양한 데이터베이스를 지원하여, 여러 시스템의 데이터를 통합하여 시각화할 수 있습니다.
- 맞춤형 대시보드: 사용자의 요구에 맞춰 다양한 패널을 활용하여 맞춤형 대시보드를 제작할 수 있습니다.
- 높은 유연성과 확장성: 오픈소스이기 때문에 사용자의 요구에 맞게 자유롭게 커스터마이징이 가능하며, 다양한 플러그인을 통해 기능을 확장할 수 있습니다.
구축 과정
1. helm repo에 grafana를 추가하고 monitoring 네임스페이스에 grafana를 설치합니다.
helm repo add grafana https://grafana.github.io/helm-charts
helm install grafana grafana/grafana --namespace monitoring
2. 다음 명령어를 통해 grafana admin password를 확인합니다.
kubectl get secret --namespace monitoring grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
# YPEvsGitMfBAQzdfWujQDYMSlB908vMcX5sQvGQu
3. NodePort를 생성하여 host에서 브라우저를 이용해 grafana server에 접근할 수 있도록 합니다.
kubectl expose service grafana --namespace monitoring --type=NodePort --target-port=3000 --name=grafana-ext
위와 같이 host의 브라우저에서 grafana server의 UI에 접근한 후, id에 admin, Password에 2번 과정에서 확인한 password를 입력하여 로그인할 수 있습니다.
http://{node ip address}:{nodePort}
# http://192.168.10.118:30543
4. Home->DATA SOURCES->Prometheus를 클릭하여 이동한 후, Connection에 prometheus server의 URL을 입력하여 data source로 prometheus를 추가합니다.
5. 대시보드를 import 합니다.
대시보드를 grafana.com/board에서 적절한 대시보드를 import하여 사용합니다. 사용한 대시보드의 ID를 확인한 후 텍스트 필드에 입력하면 됩니다.
예시:
1860
3119
13770
14282
대시보드를 import한 후 Settings에서 Variables를 수정하거나, Query를 수정하여 원하는 정보를 시각화할 수 있습니다.
회고
이전 프로젝트에서 DataDog을 이용한 모니터링 시스템 구축을 직접 경험해보지도 않았고, Prometheus와 Grafana에 대해 깊이 있게 학습한 후 사용해본 것은 아니지만, 이번에 로컬 클러스터에 Prometheus와 Grafana를 이용해 모니터링 시스템을 구축해보면서 느낀점은 다음과 같습니다.
오픈소스인 Prometheus와 Grafana는 DataDog에 비해 커뮤니티 기반으로 풍부한 생태계를 갖추고 있어, 다양한 문제 해결을 위한 솔루션과 지식을 쉽게 얻을 수 있었습니다. 또한, 자유로운 커스터마이징을 통해 특정 환경에 최적화된 모니터링 시스템을 구축할 수 있다는 장점이 있다고 느꼈습니다.
그러나 생각보다 Prometheus를 kubernete 클러스터에 구성하는 예시나 문서가 없어 helm 차트를 이용해 클러스터에 설치하였는데 직접 리소스들을 생성하면서 개념이나 구성 방법등을 익히지 못해 아쉬었고, 또한 Prometheus의 PromQL을 학습하여 이해도를 높인다면 다양한 메트릭을 더욱 유연하게 수집하고 저장하여 더 유용하고 중요한 정보를 보기 쉽게 시각화할 수 있을 것이라 생각합니다.
'Cloud engineering' 카테고리의 다른 글
OpenStack을 이용해 로컬 환경에 클라우드 시스템 구축하기 (0) | 2024.11.21 |
---|---|
리눅스 기본 요소들을 이용해 Pod 생성하기 (0) | 2024.11.09 |
kubeadm으로 구축한 쿠버네티스 환경에서 GitOps 구축하기 (2) | 2024.10.08 |
kubeadm 이용해 K8s cluster 구축하기 (3) | 2024.09.30 |
AWS Innovate Migrate, Modernize, Build 특집 온라인 컨퍼런스 후기 (6) | 2024.09.28 |