1 # 터미널 1 wa watch -d kubectl get hpa,deploy,rs,svc,pods 2 # 터미널 2 k ns default # 1. 기존에 잘못 생성된 레포지토리 설정 삭제 (에러 방지) sudo rm -f /etc/yum.repos.d/dl.k6.io_bin_repo.rpm.repo # 2. k6 최신 버전 바이너리 다운로드 (압축 파일) curl -L https://github.com/grafana/k6/releases/download/v0.49.0/k6-v0.49.0-linux-amd64.tar.gz -o k6.tar.gz # 3. 압축 해제 tar -xvzf k6.tar.gz # 4. 실행 파일을 시스템 경로로 이동 sudo cp k6-v0.49.0-linux-amd64/k6 /usr/bin/ # 5. 설치 확인 k6 version 3 cat < load-test.js import http from 'k6/http'; import { sleep, check } from 'k6'; export const options = { // 테스트 시나리오 설정 stages: [ { duration: '20s', target: 10 }, // 20초 동안 가상 사용자 10명까지 증가 { duration: '40s', target: 10 }, // 40초 동안 10명 유지 { duration: '20s', target: 0 }, // 20초 동안 0명으로 감소 ], // 성공 기준 설정 (이 기준을 못 넘으면 테스트 실패로 표시됨) thresholds: { http_req_duration: ['p(95)<500'], // 95%의 요청이 0.5초 이내에 완료될 것 http_req_failed: ['rate<0.01'], // 에러율 1% 미만 유지 }, }; export default function () { // 테스트할 서비스 DNS 주소 const url = 'http://afd671b40dd63456382dd8b6357833ad-1090539973.ap-northeast-2.elb.amazonaws.com'; const res = http.get(url); // 응답 코드가 200인지 체크 check(res, { 'status is 200': (r) => r.status === 200, }); sleep(1); // 사용자당 1초의 대기 시간을 가짐 } EOF 4 k6 run load-test.js 5 # 터미널 3 # 부하가 걸리는 동안 CPU/메모리 사용량 확인 (Metrics Server 설치 시 가능) kubectl top pods # 포드가 부하를 못 견디고 Restart 되는지 확인 kubectl get pods -w ------------ # HPA 적용 1 # 1. 설치 확인 (결과가 안 나오면 설치 필요) kubectl get apiservice v1beta1.metrics.k8s.io # 2. Metrics Server 설치 (Amazon Linux 2 / kops 환경용) kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 3. (중요) kops 환경에서 인증서 무시 설정 추가 (필요 시) kubectl patch deployment metrics-server -n kube-system --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}]' kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 또는 수동 삭제 kubectl delete deployment metrics-server -n kube-system # 1. 재설치 kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml # 2. (핵심) Kops 환경을 위한 필수 인자들 추가 kubectl patch deployment metrics-server -n kube-system --type='json' -p='[ {"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-insecure-tls"}, {"op": "add", "path": "/spec/template/spec/containers/0/args/-", "value": "--kubelet-preferred-address-types=InternalIP"} ]' # 1. API 서비스 상태 확인 kubectl get apiservice v1beta1.metrics.k8s.io # 2. 실제 노드/포드 데이터 수집 확인 kubectl top nodes kubectl top pods 2 cat < mario-hpa-final.yaml apiVersion: apps/v1 kind: Deployment metadata: name: mario-hpa spec: replicas: 1 selector: matchLabels: app: mario-hpa template: metadata: labels: app: mario-hpa spec: containers: - name: mario image: pengbai/docker-supermario resources: requests: cpu: "100m" # HPA의 기준점 limits: cpu: "200m" --- apiVersion: v1 kind: Service metadata: name: mario-hpa-svc spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: mario-hpa EOF kubectl apply -f mario-hpa-final.yaml 3 # HPA 설정 (CPU 10% 기준) kubectl autoscale deployment mario-hpa --cpu-percent=10 --min=1 --max=5 # HPA 상태 확인 kubectl get hpa -w 4 # load-test.js 수정 (가상 사용자 50명으로 증가) sed -i 's/target: 10/target: 50/g' load-test.js # 부하 테스트 실행 k6 run load-test.js 5 # mario-hpa-svc의 실제 EXTERNAL-IP(DNS) 가져오기 HPA_URL=$(kubectl get svc mario-hpa-svc -o jsonpath='{.status.loadBalancer.ingress[0].hostname}') echo "현재 접속 가능한 주소는: http://$HPA_URL 입니다." 6 cat < load-test.js import http from 'k6/http'; import { sleep } from 'k6'; export const options = { vus: 30, // 동시 접속자 30명 (충분히 부하를 주기 위함) duration: '1m', // 1분간 지속 }; export default function () { // 환경변수에서 가져온 주소로 테스트 http.get('http://$HPA_URL'); sleep(0.1); } EOF 7 # 터미널 1: k6 실행 k6 run load-test.js ----------------- # 트라블 슈팅 1 # 1. 새 로드밸런서(a5faf7...) 보안 그룹 80포트 개방 ELB_HPA_SG=$(aws elb describe-load-balancers --region ap-northeast-2 --query 'LoadBalancerDescriptions[?contains(DNSName, `a5faf768`)].SecurityGroups[0]' --output text) aws ec2 authorize-security-group-ingress --region ap-northeast-2 --group-id $ELB_HPA_SG --protocol tcp --port 80 --cidr 0.0.0.0/0 # 2. 새 NodePort(31983) 확인 및 노드 보안 그룹 개방 # (NODE_SG_ID는 sg-0d5e0264d8660c1b5 사용) aws ec2 authorize-security-group-ingress --region ap-northeast-2 --group-id sg-0d5e0264d8660c1b5 --protocol tcp --port 31983 --cidr 0.0.0.0/0 2 cat < load-test.js import http from 'k6/http'; import { sleep } from 'k6'; export const options = { stages: [ { duration: '30s', target: 30 }, // 30초 동안 30명까지 증가 { duration: '1m', target: 30 }, // 1분 동안 부하 유지 { duration: '30s', target: 0 }, ], }; export default function () { // 새 주소 입력 http.get('http://a5faf768fbb9742d0a09a7eb3da57edf-58407766.ap-northeast-2.elb.amazonaws.com'); sleep(0.1); // 아주 빠른 속도로 요청 발송 } EOF 3 k6 run load-test.js 4 kubectl get hpa mario-hpa -w ------------ Every 2.0s: kubectl get hpa,deploy,rs,svc,pods Thu Feb 19 11:11:35 2026 NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE horizontalpodautoscaler.autoscaling/mario-hpa Deployment/mario-hpa cpu: /2% 1 5 1 6m1s horizontalpodautoscaler.autoscaling/php-apache Deployment/php-apache cpu: 0%/10% 1 10 1 11h NAME READY UP-TO-DATE AVAILABLE AGE # 1. 포드별 실제 CPU 사용량 확인 (여기서 수치가 나와야 합니다) kubectl top pods # 2. 만약 "error: metrics not available"이 뜬다면 Metrics Server 재시작 kubectl rollout restart deployment metrics-server -n kube-system # 3. HPA 상세 정보 확인 (Events 항목에 에러 메시지가 있는지 보세요) kubectl describe hpa mario-hpa --------- 삭제 # 1. HPA 설정 삭제 kubectl delete hpa mario-hpa php-apache # 2. 모든 마리오 관련 Deployment 삭제 kubectl delete deploy mario-hpa mario-perfect mario-insecure # 3. 모든 마리오 관련 Service 삭제 (로드밸런서 포함) kubectl delete svc mario-hpa-svc mario-service php-apache # 4. 생성한 테스트용 YAML 파일들 삭제 rm -f mario-hpa-final.yaml mario-hpa-ready.yaml load-test.js 2. Metrics Server 삭제 (필요 시) 클러스터의 자원 감시를 중단하려면 Metrics Server를 삭제합니다. (나중에 다시 사용하려면 남겨두셔도 됩니다.) kubectl delete -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml 3. 부하 테스트 도구(k6) 삭제 Amazon Linux 2에서 바이너리로 설치한 k6를 삭제합니다. # 실행 파일 삭제 sudo rm /usr/bin/k6 # 다운로드했던 압축 파일 및 폴더 삭제 rm -rf k6.tar.gz k6-v0.49.0-linux-amd64 최종 확인 (매우 중요) 삭제 후 아래 명령어를 입력하여 남은 자원이 없는지 확인하세요. 특히 EXTERNAL-IP가 있는 서비스가 없어야 AWS 비용이 추가로 발생하지 않습니다. # 모든 자원 상태 확인 (default 네임스페이스) kubectl get all # 로드밸런서가 실제로 삭제되었는지 AWS CLI로 확인 aws elb describe-load-balancers --query 'LoadBalancerDescriptions[*].LoadBalancerName' --output table