본문 바로가기

AWS

[AWS] EKS - Grafana & Prometheus 연동 및 시각화

  • Grafana란?
    • 멑티플랙폼 오픈소스로, 메트릭 분석 및 메트릭 정보 시각화를 제공해주는 웹 어플리케이션
    • 인터렉티브한 시각화 기능 제공
    • Prometheus, InfluxDB, Elasticsearch 등 다양한 데이터 소스와 연동 가능
    • 시계열 메트릭 데이터 수집에 최적화
    • 서버 리소스의 메트릭 정보나 로그 같은 데이터를 시각화 할 때 많이 사용
  • Grafana 특징
    • 오픈 소스
    • 알람 기능
    • 데이터 저장 방식
    • 확장성
    • 플러그 인
    • 가시성
  • Prometheus 란
    • 메트릭 수집, 시각화, 알림, 서비스 디스커버리 기능을 모두 제공하는 오픈 소스 모니터링 시스템
  • Prometheus 기능
    • 풀 방식의 메트릭 수집, 시계열 데이터 저장
    • PromQL을 활용하여 저장된 시계열을 쿼리 및 집계
    • 서비스 디스커버리
    • 데이터 시각화

 

Promethus 실습

  • Prometheus 배포
    • EBS를 PV 로 사용하기 위해 접근 권한 설정
eksctl create iamserviceaccount \
  --name ebs-csi-controller-sa \
  --namespace kube-system \
  --cluster ydy-eks \
  --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 ydy-eks --service-account-role-arn arn:aws:iam::759320821027:role/AmazonEKS_EBS_CSI_DriverRole --force
  • Amazon EBS CSI 드라이버 확인

  • namespace 생성
kubectl create namespace monitoring
  • prometheus-community 차트 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts

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

  • prometheus-server의 타겟 그룹의 헬스 체크 경로 추가
kubectl get service prometheus-server -n monitoring -o yaml > prometheus-service.yaml

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Service
metadata:
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: /metrics -> 이 부분 추가
    meta.helm.sh/release-name: prometheus
    meta.helm.sh/release-namespace: monitoring
  creationTimestamp: "2024-06-04T09:49:24Z"
  labels:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: prometheus
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/name: prometheus
    app.kubernetes.io/part-of: prometheus
    app.kubernetes.io/version: v2.52.0
    helm.sh/chart: prometheus-25.21.0
  name: prometheus-server
  namespace: monitoring
  resourceVersion: "107679"
  uid: 7ad7bf7a-93c0-4cbb-af16-6b975e53526d
spec:
  clusterIP: 172.20.12.145
  clusterIPs:
  - 172.20.12.145
  internalTrafficPolicy: Cluster
  ipFamilies:
  - IPv4
  ipFamilyPolicy: SingleStack
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 9090
  selector:
    app.kubernetes.io/component: server
    app.kubernetes.io/instance: prometheus
    app.kubernetes.io/name: prometheus
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

 

 

Grafana

  • Grafana 배포
    • grafana.yaml 생성 및 apply
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: grafana-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: grafana
  name: grafana
spec:
  selector:
    matchLabels:
      app: grafana
  template:
    metadata:
      labels:
        app: grafana
    spec:
      securityContext:
        fsGroup: 472
        supplementalGroups:
          - 0
      containers:
        - name: grafana
          image: grafana/grafana:latest
          imagePullPolicy: IfNotPresent
          ports:
            - containerPort: 3000
              name: http-grafana
              protocol: TCP
          readinessProbe:
            failureThreshold: 3
            httpGet:
              path: /robots.txt
              port: 3000
              scheme: HTTP
            initialDelaySeconds: 10
            periodSeconds: 30
            successThreshold: 1
            timeoutSeconds: 2
          livenessProbe:
            failureThreshold: 3
            initialDelaySeconds: 30
            periodSeconds: 10
            successThreshold: 1
            tcpSocket:
              port: 3000
            timeoutSeconds: 1
          resources:
            requests:
              cpu: 250m
              memory: 750Mi
          volumeMounts:
            - mountPath: /var/lib/grafana
              name: grafana-pv
      volumes:
        - name: grafana-pv
          persistentVolumeClaim:
            claimName: grafana-pvc
---
apiVersion: v1
kind: Service
metadata:
  namespace: monitoring
  name: grafana
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: /login
spec:
  ports:
    - port: 80
      protocol: TCP
      targetPort: 3000
  selector:
    app: grafana
  sessionAffinity: None
  type: ClusterIP
---
kubectl apply -f grafana.yaml

  • Ingress 생성 및 배포 (AWS Load Balanc Controller)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  namespace: monitoring
  name: monitoring-ingress
  annotations:
    # Ingress 코어 설정
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=60
    alb.ingress.kubernetes.io/subnets: subnet-0e3b82a26c19c99f9, subnet-01f2f26c1054492a1
    # SSL 설정
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS": 443}]'
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:ap-northeast-2:759320821027:certificate/77bfdd32-7a35-4320-80fb-b02b4d735874
    alb.ingress.kubernetes.io/ssl-redirect: '443'
spec:
  rules:
  - host: prometheus.dyyeom.store
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: prometheus-server
              port:
                number: 80
  - host: grafana.dyyeom.store
    http:
      paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: grafana
              port:
                number: 80


Grafana & Prometheus 연동

  • Grafana 홈페이지 → Connections → Data sources → Add new data source

  • Prometheus 선택
  • Connection ( Prometheus server URL 입력 후 저장 )
http://prometheus-server.monitoring.svc:80

 

 

Grafana Dashboard Setting

  • Grafana 홈페이지 → Dashboard 클릭 → New ( New dashboard 클릭 ) → Import a dashboard
    • 13770 입력 후 Load

  • Dashboard 확인