1. 프로메테우스 스택 설치
이번 실습은 4장 Amazon EKS 원클릭 배포 환경에서 진행합니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.
기본 설정 명령어
1.1. 프로메테우스 스택 설치
신규터미널 - 네임 스페이스 추가 및 모니터링
kubectl create ns monitoring
kubectl get ns
Bash
복사
# monitoring 네임 스페이스 추가 및 확인
watch kubectl get pod,svc,ingress,pv,pvc -n monitoring
Bash
복사
# [신규 터미널] pod, svc, ingress, pv, pvc 모니터링
helm repo 추가
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
Bash
복사
# helm chart repository 추가
프로메테우스 스택 설치
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/monitor-values.yaml
cat monitor-values.yaml | yh
Bash
복사
# values 파일 다운로드 및 확인
export MyDomain=$MyDomain CERT_ARN=$CERT_ARN
Bash
복사
# 환경 변수 선언
envsubst < monitor-values.yaml | helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack --version 45.27.2 \
--set prometheus.prometheusSpec.scrapeInterval='15s' \
--set prometheus.prometheusSpec.evaluationInterval='15s' \
-f - --namespace monitoring
Bash
복사
# 프로메테우스 스택 배포
1.2. 프로메테우스 설치 확인
mornitoring 네임 스페이스에 helm list와 설치된 모든 자원 확인
helm list -n monitoring
Bash
복사
# monitoring 네임 스페이스에 helm list 확인
kubectl get-all -n monitoring
Bash
복사
# monitoring 네임 스페이스에 모든 자원 확인
StatefulSet, DaemonSet, Deployment 확인
kubectl get sts,ds,deploy -n monitoring
Bash
복사
# monitoring 네임 스페이스에 sts, ds, deploy 확인
kubectl describe sts -n monitoring
Bash
복사
# StatefulSet 상세 정보
kubectl describe ds -n monitoring
Bash
복사
# DaemonSet 상세 정보
crd, ServiceMonitors, TargetGroupBindings 확인
kubectl get crd | grep monitoring
Bash
복사
# monitoring 관련 crd 확인
kubectl get servicemonitors -n monitoring
Bash
복사
# monitoring 네임 스페이스에 ServiceMonitors 확인
kubectl get targetgroupbindings -n monitoring
Bash
복사
# monitoring 네임 스페이스에 TargetGroupBindings 확인
2. 프로메테우스 기본 사용
2.1. 모니터링 대상 확인
node-exporter 확인
kubectl describe ds -n monitoring | grep Port
Bash
복사
# node-exporter의 포트 정보
kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus-node-exporter
Bash
복사
# node-exporter의 서비스와 엔드포인트 확인
모니터링 대상별 /metrics 확인
ssh ec2-user@$N1 curl -s localhost:9100/metrics | tail
Bash
복사
# node-export - 노드에서 localhost로 9100 포트에 /metrics 접속
kubectl get servicemonitors -n monitoring
Bash
복사
# servicemonitors 확인
echo ">>>monitoring NS<<<"; kubectl get ep -n monitoring; \
echo ">>>kube-system NS<<<"; kubectl get ep -n kube-system; \
echo ">>>default NS<<<"; kubectl get ep
Bash
복사
# 네임 스페이스별 엔드포인트 확인
ssh ec2-user@$N1 curl -s localhost:10249/metrics | tail
Bash
복사
# kube-proxy - 노드에서 localhost로 10249 포트에 /metrics 접속
2.2. 프로메테우스 ingress 도메인 접속 및 확인
프로메테우스 ingress 정보 확인
kubectl get ingress -n monitoring kube-prometheus-stack-prometheus
Bash
복사
# 프로메테우스 ingress 정보 확인
kubectl describe ingress -n monitoring kube-prometheus-stack-prometheus
Bash
복사
# 프로메테우스 ingress 정보 확인 (상세)
echo -e "Prometheus Web URL = https://prometheus.$MyDomain"
Bash
복사
# 프로메테우스 ingress 도메인으로 웹 접속 URL 확인
프로메테우스 상단 메뉴
1.
경고(Alert) : 사전에 정의한 시스템 경고 정책(Prometheus Rules)에 대한 상황
2.
그래프(Graph) : 프로메테우스 자체 검색 언어 PromQL을 이용하여 메트릭 정보를 조회 → 단순한 그래프 형태 조회
3.
상태(Status) : 경고 메시지 정책(Rules), 모니터링 대상(Targets) 등 다양한 프로메테우스 설정 내역을 확인
4.
도움말(Help)
프로메테우스 설정 확인
kubectl exec -it -n monitoring sts/prometheus-kube-prometheus-stack-prometheus \
-- cat /etc/prometheus/config_out/prometheus.env.yaml
Bash
복사
# 프로메테우스 설정 파일 확인
kubectl exec -it -n monitoring sts/prometheus-kube-prometheus-stack-prometheus \
-- cat /etc/prometheus/config_out/prometheus.env.yaml | grep job_name:
Bash
복사
# 프로메테우스 설정에서 job_name 확인
kubectl exec -it -n monitoring sts/prometheus-kube-prometheus-stack-prometheus \
-- cat /etc/prometheus/config_out/prometheus.env.yaml | grep node-exporter/ -A 9
Bash
복사
# 프로메테우스 설정에서 node-export 확인
kubectl get ep -n monitoring; kubectl get ep -n kube-system
Bash
복사
# 엔드포인트 확인
노드 그룹의 보안 그룹 수정
NGSGID=$(aws ec2 describe-security-groups --filters Name=group-name,Values='*ng1*' --query "SecurityGroups[*].[GroupId]" --output text)
Bash
복사
# 보안 그룹 ID 변수 지정
aws ec2 authorize-security-group-ingress --group-id $NGSGID --protocol '-1' --cidr 192.168.1.100/32
Bash
복사
# 작업용 인스턴스의 모든 트래픽 허용
PromQL 예시
1- avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))
Bash
복사
# [PromQL] 전체 클러스터 노드의 CPU 사용량 평균
avg(process_resident_memory_bytes{job="apiserver"})
Bash
복사
# [PromQL] api-server 상주 메모리 평균
scrape_duration_seconds{job="node-exporter"}
Bash
복사
# [PromQL] node-export 스크랩 기간
3. 그라파나 대시보드 사용
3.1. 그라파나 정보 확인
그라파나 정보 확인
kubectl exec -it -n monitoring deploy/kube-prometheus-stack-grafana -- grafana-cli --version
Bash
복사
# 그라파나 버전 확인
kubectl get ingress -n monitoring kube-prometheus-stack-grafana
Bash
복사
# 그라파나 ingress 확인
echo -e "Grafana Web URL = https://grafana.$MyDomain"
Bash
복사
# ingress 도메인으로 웹 접속 URL 확인 (기본 계정 - admin / prom-operator)
그라파나 메뉴 정보
1.
Starred : 즐겨 찾기 대시보드
2.
Dashboards : 대시보드 목록 확인
3.
Explore : PromQL로 메트릭 정보를 그래프 형태로 표현
4.
Alerting : 경고 정책을 구성해 사용자에게 경고를 전달
5.
Connections : 연결할 데이터 소스 설정
6.
Administration : 사용자, 조직, 플러그인 등을 설정
3.2. 그라파나 기본 대시보드 확인
그라파나 메뉴에서 Connections 확인
•
Connections 메뉴에서 Your connections에 진입하면 데이터 소스에 프로메테우스 자동 생성
•
대상 데이터 소스를 클릭하면 상세 정보 출력
프로메테우스 접근 정보 확인
kubectl get svc,ep -n monitoring kube-prometheus-stack-prometheus
Bash
복사
# 프로메테우스의 서비스와 엔드포인트 주소 확인
테스트용 파드를 배포하고 확인
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: netshoot-pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
Bash
복사
# 테스트용 파드 배포
kubectl get pod netshoot-pod
Bash
복사
# 생성된 파드 확인
테스트용 파드에서 프로메테우스 주소 확인
kubectl exec -it netshoot-pod -- nslookup kube-prometheus-stack-prometheus.monitoring
Bash
복사
# 프로메테우스 접속 주소로 nslookup 확인
kubectl exec -it netshoot-pod -- curl -s kube-prometheus-stack-prometheus.monitoring:9090/graph -v ; echo
Bash
복사
# 프로메테우스 접속 주소로 그래프 경로 접근
테스트용 파드 삭제
kubectl delete pod netshoot-pod
Bash
복사
# 실습 자원 삭제
기본 대시보드 사용
•
Dashboards 메뉴에 진입해서 general 폴더 접근
•
Kubernetes / Networking / Cluster 선택
•
Kubernetes / Persistent Volumes 선택
•
Node Exporter / Nodes 선택
3.3. 그라파나 대시보드 사용
대시보드 유형
•
기본 대시보드 : 프로메테우스 스택을 통해 기본적으로 설치된 대시보드
•
공식 대시보드 : 링크
대시보드 추가 방법
•
Dashboard » New » Import » ID 입력 » Load » Prometheus » Import
추천 공식 대시보드
•
[Kubernetes / Views / Global] : 15757
•
[1 Kubernetes All-in-one Cluster Monitoring KR] : 13770 or 17900
•
[Node Exporter Full] : 1860
•
[Node Exporter for Prometheus Dashboard based on 11074] : 15172
•
[kube-state-metrics-v2] : 13332
4. 애플리케이션 모니터링 설정 및 대시보드 추가
4.1. NGINX 웹 서버 배포
helm repository 추가
helm repo add bitnami https://charts.bitnami.com/bitnami
Bash
복사
# bitnami helm repo 추가
NGINX 파라미터 파일 생성
cat <<EOT > nginx-values.yaml
service:
type: NodePort
ingress:
enabled: true
ingressClassName: alb
hostname: nginx.$MyDomain
path: /*
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}, {"HTTP":80}]'
alb.ingress.kubernetes.io/certificate-arn: $CERT_ARN
alb.ingress.kubernetes.io/success-codes: 200-399
alb.ingress.kubernetes.io/load-balancer-name: $CLUSTER_NAME-ingress-alb
alb.ingress.kubernetes.io/group.name: study
alb.ingress.kubernetes.io/ssl-redirect: '443'
metrics:
enabled: true
service:
port: 9113
serviceMonitor:
enabled: true
namespace: monitoring
interval: 10s
EOT
cat nginx-values.yaml | yh
Bash
복사
# nginx values 파일 생성 및 확인
NGINX 배포 및 확인
helm install nginx bitnami/nginx --version 14.1.0 -f nginx-values.yaml
Bash
복사
# nginx 배포
kubectl get pod,svc,ep
Bash
복사
# 파드, 서비스, 엔드포인트 확인
4.2. 프로메테우스 서비스 모니터 확인
서비스 모니터 확인
kubectl get servicemonitor -n monitoring
Bash
복사
# 서비스 모니터 확인
kubectl get servicemonitor nginx -n monitoring -o json | jq
Bash
복사
# nginx 서비스 모니터 확인
kubectl get pod,svc,ep
Bash
복사
# 파드, 서비스, 엔드포인트 확인
NGINX 메트릭 확인
NGINXIP=$(kubectl get pod -l app.kubernetes.io/instance=nginx -o jsonpath={.items[0].status.podIP}); echo $NGINXIP
Bash
복사
# NGINX IP 변수 선언
curl -s http://$NGINXIP:9113/metrics
Bash
복사
# NGINX IP로 메트릭 확인
curl -s http://$NGINXIP:9113/metrics | grep ^nginx_connections_active
Bash
복사
# NGINX IP로 메트릭 확인 (필터링)
NGINX 접속
curl -s https://nginx.$MyDomain
Bash
복사
# NGINX 1회 접속
while true; do curl -s https://nginx.$MyDomain -I | head -n 1; date; sleep 1; done
Bash
복사
# NGINX 1초 간격 접속
curl -s http://$NGINXIP:9113/metrics | grep ^nginx_connections_active
Bash
복사
# NGINX 메트릭 확인 - nginx_connections_active
4.3. NGINX 모니터링 대시보드 추가
NGINX 모니터링 대시보드 추가
•
NGINX 모니터링 대시보드 : 12708
NGINX 부하 발생
yum install -y httpd
Bash
복사
# httpd 설치
ab -c 100 -n 1000 https://nginx.$MyDomain/
Bash
복사
# 100회씩 총 1000회 접속 수행
5. 실습 환경 삭제
4장 전체 실습이 종료되어 Amazon EKS 원클릭 배포를 삭제해 모든 실습 환경을 삭제합니다.
실습 종료 후 자원 삭제
helm uninstall -n kube-system kube-ops-view
helm uninstall nginx
helm uninstall -n monitoring kube-prometheus-stack
Bash
복사
# helm chart 삭제
kubectl delete pvc prometheus-kube-prometheus-stack-prometheus-db-prometheus-kube-prometheus-stack-prometheus-0 -n monitoring
Bash
복사
# 프로메테우스 PVC 삭제 (프로메테우스 스택에 의해 나머지 삭제된 후)
eksctl delete cluster --name $CLUSTER_NAME && aws cloudformation delete-stack --stack-name $CLUSTER_NAME
Bash
복사
# Amazon EKS 원클릭 배포 삭제
Warning: Amazon EKS 원클릭 배포의 삭제는 약 15분 정도 소요됩니다. 삭제가 완료될 때 까지 SSH 연결 세션을 유지합니다.
Warning: 만약에 CloudFormation 스택이 삭제되지 않는다면 수동으로 VPC(myeks-VPC )를 삭제 후 CloudFormation 스택을 다시 삭제해 주세요.
여기까지 4장의 모든 실습을 마칩니다.
수고하셨습니다 :)