2가지 실습을 한다 HPA (Horizontal Pod Autoscaler): 트래픽이 몰릴 때 Pod 개수를 자동으로 늘리기 # Helm을 이용한 Prometheus 스택 설치 - 모니터링 시스템 구축 1 # HPA (Horizontal Pod Autoscaler): 트래픽이 몰릴 때 Pod 개수를 자동으로 늘리기 # Metrics Server 설치 (사전 준비) k ns kube-system # 터미널 2 watch -d kubectl get hpa,pod,no,svc,deploy,rs # 터미널 3 # 1초마다 HPA와 Pod 상태를 갱신해서 보여줍니다. watch -n 1 "kubectl get hpa,pods" # 터미널 1 # Metrics Server 설치 kubectl top nodes # 결과가 나오면 메트릭 서버가 설치된것이다. # 안나오면 아래 명령어로 설치한다. kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml #설치 후 (2분 걸림) kubectl top nodes # 명령어를 입력했을 때 노드의 리소스 상태가 보이면 성공입니다. # 메트릭 서버가 설치되어야 보입니다. 안보인다면 메트릭 서버 재설치 2 # HPA 작동을 위한 Deployment 설정 # HPA가 제대로 작동하려면, Pod가 사용할 리소스의 최솟값(requests)이 명시되어야 합니다. # 그래야 "사용률(%)"을 계산할 수 있기 때문입니다. k ns kube-system # 불필요한 부분 삭제 k ns default k delete deployment.apps/my-web-app 3 cd mkdir 6 cd 6 cat < my-app-hpa.yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-web-app spec: replicas: 2 # 1. 어떤 Pod를 관리할지 선택하는 셀렉터 추가 selector: matchLabels: app: my-web-app template: metadata: # 2. Pod에 부여할 라벨 추가 (위의 selector와 일치해야 함) labels: app: my-web-app spec: containers: - name: nginx image: nginx resources: requests: cpu: "100m" memory: "128Mi" limits: cpu: "500m" memory: "256Mi" EOF kubectl apply -f my-app-hpa.yaml # replicas: 2 대 이다. 4 # HPA 리소스 생성 # 이제 CPU 사용량이 10%를 넘어가면 Pod를 최대 10개까지 늘리도록 설정해 보겠습니다. cat < hpa-config.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: my-web-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: my-web-app # 대상 Deployment 이름 minReplicas: 2 # 최소 유지 Pod 개수 maxReplicas: 50 # 최대 확장 Pod 개수 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 10 # CPU 사용률이 10%를 초과하면 확장 EOF kubectl apply -f hpa-config.yaml # 상태 확인 # watch상태 확인하자. # my-web-hpa Deployment/my-web-app cpu: 0%/10% 2 50 2 38s # 아니면 아래 명령어로 확인 k ns default kubectl get hpa -w 5 # 로드밸런서 생성하여 부하를 주자. cat < service1.yaml apiVersion: v1 kind: Service metadata: name: my-web-service spec: selector: app: my-web-app ports: - protocol: TCP port: 80 # 서비스가 노출할 포트 targetPort: 80 # 파드 내부의 포트 type: LoadBalancer # ALB 연동을 위해서는 NodePort 혹은 IP 모드로 설정 EOF kubectl apply -f service1.yaml # 로드밸런서로 접속 확안 - MS 에지 브라우저로 확인하세요 a7dfd455291344828b755eb5fe8e31a0-825623016.ap-northeast-2.elb.amazonaws.com 6 # 부하 테스트 도구(Hey)를 사용하여 실제로 Pod가 늘어나는 것을 확인 # amazon 리눅스에 부하 테스트 도구 설치법 1. 바이너리 직접 다운로드 (가장 추천) 컴파일 과정 없이 실행 파일만 내려받아 바로 사용하는 방법입니다. # 아래 부분 복사 # 1. 아키텍처 확인 (x86_64 인지 arm64 인지 확인) arch # 2. 최신 바이너리 다운로드 (대부분의 EC2는 Linux 64bit) curl -O https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64 # 3. 실행 권한 부여 chmod +x hey_linux_amd64 # 4. 경로 이동 (어디서든 실행할 수 있게 bin 폴더로 이동) sudo mv hey_linux_amd64 /usr/local/bin/hey # 5. 설치 확인 # hey -n 10 -c 2 http://localhost:3000 # 본인 로드밸런서 url로 변경 hey -z 2m -c 50 http://a7dfd455291344828b755eb5fe8e31a0-825623016.ap-northeast-2.elb.amazonaws.com 부하 테스트 실행: # -z: 2분 동안, -c: 50개의 커넥션으로 유지하며 공격 # 파드 늘어난것 확인 # 10분후 다른툴로 재 테스트 - 10분 지나면 파드가 줄어든다. ----------- # 참고 - Linux (Ubuntu 기준) 설치법 sudo apt update && sudo apt install -y hey 7 # 참고 # HPA 부하 테스트 자동화 스크립트 (test-hpa.sh) a7dfd455291344828b755eb5fe8e31a0-825623016.ap-northeast-2.elb.amazonaws.com # 아래 URL="http://<내-ALB-도메인-주소>" # 테스트할 서비스 주소로 수정해야 한다. # 1. 설정 변수 (본인의 환경에 맞게 수정) # 아래 실행 cat << 'EOF' > hpa-load-test.sh #!/bin/bash URL="http://a7dfd455291344828b755eb5fe8e31a0-825623016.ap-northeast-2.elb.amazonaws.com" DURATION="300s" CONCURRENCY=50 echo "🚀 HPA 부하 테스트를 시작합니다..." echo "대상 URL: $URL" echo "설정: $DURATION 동안 $CONCURRENCY 명의 동시 접속 시뮬레이션" echo "" echo "📊 현재 HPA 상태" kubectl get hpa echo "" echo "🔥 부하 테스트 시작..." # hey 실행 (백그라운드) hey -z $DURATION -c $CONCURRENCY $URL & # 실시간 모니터링 echo "📈 실시간 상태 모니터링 중..." while pgrep -x "hey" > /dev/null do clear echo "===============================" echo "현재 HPA 상태" kubectl get hpa echo "" echo "현재 Pod 상태" kubectl get pods -l app=my-web-app echo "===============================" sleep 2 done echo "" echo "✅ 부하 테스트가 완료되었습니다." EOF chmod +x hpa-load-test.sh ./hpa-load-test.sh ------------------------------------------------------------------------------------- 8 # Helm을 이용한 Prometheus 스택 설치 # 1. Helm 레포지토리 추가 helm repo add prometheus-community https://github.com/prometheus-community/helm-charts helm repo update # 2. 모니터링 전용 네임스페이스 생성 kubectl create namespace monitoring 9 # 3. 스택 설치 helm install monitoring prometheus-community/kube-prometheus-stack --namespace monitoring 10 k ns monitoring 11 # 포트 포워딩으로 웹사이트 띠우자 kubectl port-forward --address 0.0.0.0 svc/monitoring-grafana 3000:80 -n monitoring 12 # 웹브라우저로 공인ip 접속 # ec2 .공인 ip 확인하자. http://43.203.179.86:3000/ http://52.79.182.49:3000/ 접속하고, 아이디 `admin`과 위에서 얻은 비밀번호로 로그인 # 새 터미널에서 암호 확인 kubectl get secret --namespace monitoring monitoring-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo 43krG5tId6TRf1Q0DXaOIy2Bek2LWlTxeuxpZMEc ------------------------------------------------- 13 # 아래는 암호를 잊어 버렸을때 사용한다. # 지금은 테스트 할 필요는 없다. 1 # 암호 초기화 helm upgrade monitoring prometheus-community/kube-prometheus-stack \ --namespace monitoring \ --reuse-values \ --set grafana.adminPassword=admin echo "PASSWORD IS: [$(kubectl get secret --namespace monitoring monitoring-grafana -o jsonpath="{.data.admin-password}" | base64 --decode)]" admin admin -------------------------------------------- 14 # 그라파나 웹사이트 사용 Dashboards 오른쪽 위 NEW 클릭 > Import 3119 Load DS_PROMETHEUS 에서 Prometheus로 지정 > import 15 # 참고 다른 대시 보드 보기 ID 1860 (Node Exporter Full): * 용도: 개별 노드(Server)의 CPU, 메모리, 디스크, 네트워크 상세 지표 확인. 특징: 하드웨어 레벨의 병목 현상을 잡을 때 필수적입니다. ID 15757 또는 15758 (Kubernetes / Views / Global): 용도: 여러 클러스터를 운영하거나, 전체적인 리소스 할당량(Quota) 대비 사용량을 시각화할 때 좋습니다. 특징: 깔끔한 UI와 직관적인 가동률(Utilization) 그래프를 제공합니다. --------- 마이크로서비스 및 워크로드 중심 애플리케이션이 잘 돌아가고 있는지, 특정 Pod에 문제가 없는지 확인할 때 적합합니다. ID 15661 (Kubernetes / Kube-State-Metrics): 용도: Deployment, StatefulSet, Pod의 상태(Running, Pending, Failed)를 한눈에 파악. 특징: 3119보다 최신 Kubernetes 버전의 지표를 더 잘 반영합니다. ID 6706 (NGINX Ingress Controller): 용도: Ingress를 통해 들어오는 트래픽(L7) ------------ 클라우드 서비스 및 데이터베이스 매니지드 서비스(Managed Services)를 사용 중이라면 다음 대시보드가 효율적입니다. ID 6073 (Prometheus CloudWatch Exporter): * 용도: AWS의 다양한 서비스 지표를 그라파나에서 통합 관리. ID 7362 (MySQL / MariaDB Overview): 용도: 데이터베이스의 커넥션 수, 쿼리 처리 속도, 버퍼 풀 상태 등을 모니터링. 특징: DB 성능 튜닝 시 시각적인 지표로 활용하기 좋습니다. 16 # 삭제 필요시 cd cd 16 terraform destroy -auto-approve (15분 소요) 17 # 기타 - eksctl 로 생성한 경우는 아래 명령어로 삭제 # 본인 리전으로 하세요. 여기서는 서울 리전 eksctl delete cluster --name eks-demo --region ap-northeast-2 또는 export AWS_REGION=ap-northeast-2 echo ${AWS_REGION} eksctl delete cluster -f eks-demo-cluster.yaml (15분 소요)