Grafana & Prometheus
Grafana란 메트릭, 로그 등을 모니터링하고 분석할 수 있는 오픈 소스 시각 및 분석 툴이다.
데이터 소스 수집툴인 Cloud Watch, 프로메테우스등과 통합하여 대시보드에 다양한 그래프, 차트, 표 등으로 시각화할 수 있다.
Prometheus는 오픈 소스 시계열 데이터베이스 및 모니터링 시스템이다. 서버, 애플리케이션, 네트워크 등 다양한 시스템의 상태를 실시간으로 수집하고 저장하는 기능을 제공한다.
데이터 수집툴로는 DataDog, CloudWatch, Prometheus 등이 있지만 프로젝트에서의 구현을 위해 오픈소스인 Prometheus를 사용한다.
구성 방법
쿠버네티스 클러스터의 리소스를 모니터링하기 위해 Prometheus와 Grafana를 사용한다.
쿠버네티스 클러스터는 쿠버네티스 내장 도구인 cAdvisor에서 컨테이너 메트릭을 수집한다.
프로메테우스의 수집기는 서비스 디스커버리(service discovery)라는 방식으로 수집 대상을 찾는다.
완전한 모니터링 파이프라인으로 구성한 프로메테우스는 여러 수집 대상이 공개하는 메트릭 데이터를 모아 시계열 데이터베이스에 저장한다.
프로메테우스의 데이터 수집이 완료한 후에는 시계열 데이터베이스에 저장된다. grafana에서는 prometheus의 데이터베이스의 내용을 시각화하여 모니터링 한다.
grafana의 alert manager 기능을 사용하여 CPU와 memory 사용량이 임계치를 넘었을때 slack으로 알림을 보내는 기능을 구현한다.
Prometheus & Grafana 설치 과정
설치 환경은 AWS의 서비스인 EKS가 설치되어있는 서버에서 진행한다.
먼저 모니터링할 쿠버네티스 클러스터 생성
eksctl create cluster --name proCluster --region ap-northeast-2 --node-type t2.small
—name : 이름은 클라우드 내에서 겹치면 안된다.
—region : 서울 리전
—node-type : 인스턴스 타입
헬름 설치 → linux설치 방법
docs : https://docs.aws.amazon.com/ko_kr/eks/latest/userguide/helm.html
curl -fsSL -o get_helm.sh [https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3](https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3)
chmod 700 get_helm.sh
./get_helm.sh
→ 운영체제에 맞는 방법으로 설치한다.
헬름 레파지토리 추가
helm repo add prometheus-community [https://prometheus-community.github.io/helm-charts](https://prometheus-community.github.io/helm-charts)
helm repo add grafana [https://grafana.github.io/helm-charts](https://grafana.github.io/helm-charts)
helm repo update
helm repo list
→ helm repository에 prometheus를 추가하여 이후 설치한다.
EKS cluster 확인하기
eksctl get clusters --region ap-northeast-2
export AWS_REGION=ap-northeast-2
eksctl get cluster
EKS란?
EKS는 AWS에서 제공하는 Amazon Elastic Kubernetes Service의 약자이다. EKS는 관리형 Kubernetes 서비스로, 사용자가 Kubernetes 클러스터를 프로비저닝하고 관리하는 데 도움을 준다.
EKS를 사용하면 사용자는 클러스터의 인프라 관리에 신경 쓰지 않고 애플리케이션에 집중할 수 있다.
EKS는 AWS에서 Kubernetes 마스터 컨트롤 플레인을 완전히 관리하므로 사용자는 클러스터의 설치, 업그레이드, 확장 등과 같은 복잡한 작업을 처리할 필요가 없다.
대신, 사용자는 간단한 명령을 사용하여 원하는 수의 워커 노드를 프로비저닝하고 관리할 수 있다.
즉, EKS를 사용하게 되면 마스터 컨트롤 플레인이 해당 쿠버네티스 서버가 아닌 EKS에서 관리하기 때문에 쿠버네티스를 설치한 서버가 다운되더라도 배포한 서비스에는 영향이 없다는 장점이 있다.
prometheus 와 Grafana의 구조
- Prometheus Server
Prometheus의 핵심 구성 요소로, 데이터 수집, 저장 및 질의를 담당한다.
서버는 메트릭 데이터를 수집하고 내부의 시계열 데이터베이스에 저장한다.
PromQL( Prometheus Query Language)을 사용하여 데이터를 쿼리하여 결과를 반환한다. - Exporters
Exporter는 특정 시스템에서 메트릭 데이터를 추출하여 Prometheus가 수집할 수 있는 형식으로 변환한다. - Target
Prometheus가 수집하려는 데이터의 소스이다.
Prometheus는 타겟을 지정하여 해당 타겟에서 메트릭 데이터를 주기적으로 스크랩하고, Exporter가 설치된 서버, 애플리케이션 등이 될 수 있다. - Alertmanager
Alertmanager는 Prometheus 서버에서 생성된 경고를 관리하고 처리하는 역할이다.
Alertmanager는 경고를 필터링하고 그룹화하며, 다양한 방법으로 경고를 전달하거나 알림을 생성하여 Slack, PagerDuty 등의 경로를 통해 알림을 전송할 수 있다. - Pushgateway
Pushgateway는 짧은 지속 시간 동안 실행되는 작업과 같이 지속적인 메트릭 수집이 어려운 작업을 위한 중간 저장소 역할을 한다.
장기 실행 작업이나 지속적인 서비스의 메트릭을 수집해야하는 경우에는 Exporter를 사용하는 것이 좋다. Pushgateway는 주로 한 번에 메트릭을 생성하고 즉시 수집할 수 있는 일회성 또는 배치 작업과 같은 사용 사례에 적합하다.
작업이 완료되면 작업자는 Pushgateway를 통해 메트릭 데이터를 전송하고 Prometheus가 해당 데이터를 가져올 수 있게 한다. - Grafana
Grafana는 Prometheus와 통합하여 데이터를 시각화하고 대시보드를 구성하기 위해 사용되는 오픈 소스 도구이다.
Grafana를 사용하면 Prometheus로부터 수집된 메트릭 데이터를 다양한 그래프, 차트, 표 등으로 시각화하고 모니터링할 수 있다. - Persistent Volume
Prometheus를 Kubernetes 클러스터에서 실행할 때, Prometheus 서버가 생성한 메트릭 데이터를 영구적으로 보존하기 위해 Persistent Volume을 사용할 수 있다.
Persistent Volume (PV)은 Kubernetes 클러스터 내에서 영구적인 스토리지 볼륨이다.
PV은 클러스터 외부의 스토리지 시스템과 연결되어 데이터를 저장하고 클러스터의 다른 파드에서 사용할 수 있다.
PV을 사용하면 Prometheus 서버가 삭제되더라도 메트릭 데이터가 보존되며, 다시 배포될 때 이전 데이터를 유지할 수 있다. 또한, PV을 사용하면 여러 Prometheus 인스턴스 간에 데이터를 공유하거나 백업 및 복원을 수행할 수도 있다.
Grafana 와 Prometheus를 설치하기 위한 yml 파일
mkdir /opt/grafana
cd /opt/grafana
→ 해당 디렉터리에서 관리한다.
cat << EOF > gravalue.yaml
replicas: 1
service:
type: LoadBalancer
persistence:
type: pvc
enabled: true
# storageClassName: default
accessModes:
- ReadWriteOnce
size: 10Gi
# annotations: {}
finalizers:
- kubernetes.io/pvc-protection
# Administrator credentials when not using an existing secret (see below)
adminUser: admin
adminPassword: 4gl
EOF
cat <<EOF > promvalue.yaml
server:
enabled: true
persistentVolume:
enabled: true
accessModes:
- ReadWriteOnce
mountPath: /data
size: 100Gi
replicaCount: 1
## Prometheus data retention period (default if not specified is 15 days)
##
retention: "30d"
EOF
이렇게 prometheus와 grafana 설치를 위한 준비가 되었다.
EBS 생성을 위한 권한 부여
oidc_id=$(aws eks describe-cluster --name <cluster 이름> --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
aws iam list-open-id-connect-providers | grep $oidc_id | cut -d "/" -f4
eksctl utils associate-iam-oidc-provider --cluster <cluster 이름> --approve
eksctl create iamserviceaccount --name ebs-csi-controller-sa --namespace kube-system --cluster <cluster 이름> --attach-policy-arn arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy --approve --role-only --role-name AmazonEKS_EBS_CSI_DriverRole
eksctl create addon --name aws-ebs-csi-driver --cluster <cluster 이름> --service-account-role-arn arn:aws:iam::<계정번호>:role/AmazonEKS_EBS_CSI_DriverRole --force
→ Prometheus 설치 과정에서 PV 생성이 안되는 에러가 발생, EBS 생성권한을
이렇게 설정 후 helm 으로 prometheus를 설치한다.
클러스터에서 관리할 네임스페이스 생성
kubectl create ns prometheus
prometheus 설치
helm install prometheus prometheus-community/prometheus -f promvalue.yaml -n prometheus --namespace prometheus --set alertmanager.persistentVolume.storageClass="gp2" --set server.persistentVolume.storageClass="gp2"
kubectl get pod,svc -n prometheus
→ prometheus 가 모두 running 상태인것을 확인한다.
namespace 설정하여 grafana 설치
helm install grafana grafana/grafana -f gravalue.yaml -n prometheus
이후 Loadbalancer의 주소로 접속하면 다음과 같은 화면을 볼 수 있다.
grafana 생성을 위한 yml 파일에서 작성한 계정으로 로그인한다.
트러블 슈팅
prometheus 를 helm으로 설치하고 파드로 다시 올리는 과정에서 문제가 발생했다.
eks 서버에서 클러스터를 새로 생성하고 prometheus를 설치하는데 ebs 역할 생성과정에서 문제가 발생
ebs 역할을 확인해보면 신뢰 자격증명관계 와 연관이 되어있는 것을 알 수 있다.
문제는 eks에 역할을 부여하는 명령어를 입력하면서 자격증명이 업데이트가 안된것이다.
전날에 만들었던 자격증명 공급자 ID를 방금 생성한 ID로 3군데를 변경해주면 해결이 된다.
Grafana 초기 설정
그라파나 접속 후 데이터 추가
source : prometheus
url : http://prometheus-server
오른쪽 위 + -> Import dashboard
Import via grafana.com
13770
하단 데이터 소스
아까 넣은 주소 선택
이렇게 추가하고 난 후에 다음과 같은 화면을 볼 수 있다.
pod 별로 리소스를 확인할 수 있다.
'프로젝트 > 클라우드' 카테고리의 다른 글
Jenkins Pipeline 구축부터 eks 클러스터 배포까지 (0) | 2023.06.26 |
---|---|
가상화 / 자동화 / 클라우드 기반 보안 네트워크 및 인프라 구현 (0) | 2023.06.24 |