- 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 확인
'AWS' 카테고리의 다른 글
[AWS] Deploy to ECS (Fargate) - Blue/Green (0) | 2024.10.28 |
---|---|
[AWS] Docker Image를 이용한 EKS로 WEB 페이지 운영하기 (3) | 2024.10.15 |
[AWS] EKS에 Karpenter 적용 (2) | 2024.10.14 |
[AWS] WEB/WAS/RDS 연동하기 (0) | 2024.10.14 |
[AWS] EKS - Cluster Autoscaler 설정 (0) | 2024.09.29 |