Home
home

5장 실습 - 파드 오토스케일링 구성하기

1. HPA 환경 구성 및 동작 확인

이번 실습은 5장 Amazon EKS 원클릭 배포 환경에서 진행합니다.
인프라 배포를 진행하지 않은 경우 링크를 통해 배포 후 복귀 바랍니다.
그리고 새롭게 인프라를 배포하면 아래 기본 설정 명령을 입력 후 진행 바랍니다.
기본 설정 명령어
Note:
HPA 실습은 기준 메트릭을 CPU와 메모리를 분리해서 진행합니다.

1.1. HPA - CPU 기준 → 환경 구성

테스트용 php-apache 설치
curl -s -O https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/php-apache.yaml cat php-apache.yaml | yh
Bash
복사
# 테스트용 php-apache 다운로드 및 확인
watch -d 'kubectl get hpa; echo; \ kubectl get pod; echo; \ kubectl top pod; echo; \ kubectl top node'
Bash
복사
# [신규 터미널] hpa, 파드, 파드 메트릭, 노드 메트릭 - 모니터링
kubectl apply -f php-apache.yaml
Bash
복사
# 테스트용 php-apache 배포
kubectl exec -it deploy/php-apache -- cat /var/www/html/index.php
Bash
복사
# 테스트용 php-apache 동작 확인
접속 확인
PODIP=$(kubectl get pod \ -l run=php-apache \ -o jsonpath={.items[0].status.podIP})
Bash
복사
# 파드 IP 확인 및 접속 확인
curl -s $PODIP; echo
Bash
복사
HPA - CPU 기준 생성
kubectl autoscale deployment php-apache \ --cpu-percent=50 \ --min=1 \ --max=10
Bash
복사
# HPA 생성 - 파드의 요청 CPU의 50% 이상일 경우 스케일링 수행
kubectl describe hpa
Bash
복사
# HPA 확인

1.2. HPA - CPU 기준 → 동작 확인

그라파나 대시보드 생성
echo -e "Grafana Web URL = https://grafana.$MyDomain"
Bash
복사
# Grafana 웹 접속 URL 확인 (기본 계정 - admin / prom-operator)
Dashboard → New → Import → 아래 JSON 입력 → Load → Import
grafana dashboard json - HPA(CPU Load)
php-apache에 부하 발생
kubectl run -i --tty load-generator \ --rm --image=busybox:1.28 \ --restart=Never \ -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
Bash
복사
# 부하 발생 후 scale-out 확인
php-apache에 부하 중지
부하 중지 : 5분 후 scale-in 확인
Ctrl + C

1.3. HPA - CPU 기준실습 자원 삭제

실습 자원 삭제
kubectl delete deploy,svc,hpa,pod --all
Bash
복사
# 실습 자원 삭제

1.4. HPA - Memory 기준 → 환경 구성

테스트용 memory-leak 설치
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/refs/heads/master/_data/memory-leak.yaml cat memory-leak.yaml | yh
Bash
복사
# 테스트용 memory-leak 다운로드 및 확인
kubectl apply -f memory-leak.yaml
Bash
복사
# 테스트용 memory-leak 설치
HPA - Memory 기준 생성
cat << EOF > memory-leak-hpa.yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: memory-leak-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: memory-leak minReplicas: 1 maxReplicas: 5 behavior: scaleDown: stabilizationWindowSeconds: 300 policies: - type: Percent value: 100 periodSeconds: 15 metrics: - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80 EOF kubectl apply -f memory-leak-hpa.yaml
Bash
복사
# HPA 생성 - 파드의 요청 메모리의 80% 이상일 경우 스케일링 수행
Note:
kubectl autoscale 명령은 CPU 기준의 HPA만 생성할 수 있습니다.
메모리 기준의 HPA 생성은 YAML 파일을 작성하고 적용해야 합니다.
kubectl describe hpa
Bash
복사
# HPA 확인

1.5. HPA - Memory 기준 → 동작 확인

그라파나 대시보드 생성
Dashboard → New → Import → 아래 JSON 입력 → Load → Import
grafana dashboard json - HPA(Memory Load)
메모리 누수 발생
kubectl run curl \ --image=appropriate/curl \ --restart=Never \ --rm -it -- sh
Bash
복사
# 테스트용 파드 생성 후 접근
curl -s memory-leak-service:5000
Bash
복사
# [테스트용 파드] 대상 서버에 정상 접근
curl -s memory-leak-service:5000/leak
Bash
복사
# [테스트용 파드] 대상 서버에 메모리 강제 추가 (10M)
exit
Bash
복사
# [테스트용 파드] 종료

1.6. HPA - Memory 기준실습 자원 삭제

실습 자원 삭제
kubectl delete deploy,svc,hpa,pod --all
Bash
복사
# 실습 자원 삭제

2. KEDA 환경 구성 및 동작 확인

2.1. KEDA 환경 구성

네임 스페이스 생성
kubectl create namespace keda
Bash
복사
# keda 네임 스페이스 생성
KEDA 설치
helm repo add kedacore https://kedacore.github.io/charts helm repo update
Bash
복사
# helm repo 추가
watch kubectl get pod,svc,deploy -n keda
Bash
복사
# [신규 터미널] keda 네임 스페이스에 생성된 자원 모니터링
helm install keda kedacore/keda \ --namespace keda \ --version 2.17
Bash
복사
# keda 설치 (helm install)
KEDA 설치 확인
kubectl get validatingwebhookconfigurations keda-admission
Bash
복사
# keda-admission 확인
kubectl get validatingwebhookconfigurations keda-admission -o yaml
Bash
복사
# keda-admission 상세 확인
kubectl get crd | grep keda
Bash
복사
# keda crd 확인

2.2. KEDA - Cron 기준 → 동작 확인

그라파나 대시보드 생성
Dashboard → New → Import → 아래 JSON 입력 → Load → Import
grafana dashboard json - KEDA(Cron Job)
테스트용 php-apache 설치
curl -s -O https://raw.githubusercontent.com/kubernetes/website/main/content/en/examples/application/php-apache.yaml cat php-apache.yaml | yh
Bash
복사
# 테스트용 php-apache 다운로드 및 확인
watch -d 'kubectl get ScaledObject,hpa -n keda; echo; \ kubectl get pod,rs -l run=php-apache -n keda'
Bash
복사
# [신규 터미널] keda 네임 스페이스에 pod, ScaledObject, hpa, replicaset 확인
kubectl apply -f php-apache.yaml -n keda
Bash
복사
# 테스트용 php-apache 배포 (keda 네임 스페이스)
ScaledObject 정책 생성
cat <<EOT > keda-cron.yaml apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: php-apache-cron-scaled spec: minReplicaCount: 0 maxReplicaCount: 2 pollingInterval: 30 cooldownPeriod: 30 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: php-apache triggers: - type: cron metadata: timezone: Asia/Seoul start: 00,06,12,18,24,30,36,42,48,54 * * * * end: 03,09,15,21,27,33,39,45,51,57 * * * * desiredReplicas: "1" EOT cat keda-cron.yaml | yh
Bash
복사
# ScaledObject 정책 파일 생성 : cron
kubectl apply -f keda-cron.yaml -n keda
Bash
복사
# ScaledObject 정책 배포 (keda 네임 스페이스)
HPA 확인
kubectl get hpa -o jsonpath={.items[0].spec} -n keda | jq
Bash
복사
# HPA 상세 내용 확인
파드 오토스케일링 확인
Note:
시간에 따라 모니터링에서 정보를 확인합니다.
그라파나 대시보드에서 파드 수량 그래프를 확인합니다.

2.3. KEDA - Cron 기준 → 실습 자원 삭제

실습 자원 삭제
kubectl delete -f php-apache.yaml -n keda
Bash
복사
# php-apache 삭제
kubectl delete -f keda-cron.yaml -n keda
Bash
복사
# keda-cron 삭제

2.4. KEDA - Redis List 기준 → 동작 확인

Redis 디플로이먼트 파일 생성 및 배포
cat <<EOT > redis-deploy.yaml apiVersion: apps/v1 kind: Deployment metadata: name: redis spec: replicas: 1 selector: matchLabels: app: redis template: metadata: labels: app: redis spec: containers: - name: redis image: redis ports: - containerPort: 6379 --- apiVersion: v1 kind: Service metadata: name: redis spec: ports: - port: 6379 targetPort: 6379 selector: app: redis EOT cat redis-deploy.yaml | yh
Bash
복사
# redis-deploy.yaml 생성
watch -d 'kubectl get ScaledObject,hpa -n keda; echo; \ kubectl get pod,rs -l app=redis -n keda'
Bash
복사
# [신규 터미널] keda 네임 스페이스에 pod, ScaledObject, hpa, replicaset 확인
kubectl apply -f redis-deploy.yaml -n keda
Bash
복사
# redis-deploy.yaml 배포
ScaledObject 정책 생성
cat <<EOT > keda-redis.yaml apiVersion: keda.sh/v1alpha1 kind: ScaledObject metadata: name: redis-scaledobject spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: redis minReplicaCount: 1 maxReplicaCount: 5 triggers: - type: redis metadata: address: redis:6379 listName: myqueue listLength: "10" EOT cat keda-redis.yaml | yh
Bash
복사
# ScaledObject 정책 파일 생성 : redis
kubectl apply -f keda-redis.yaml -n keda
Bash
복사
# ScaledObject 정책 배포 (keda 네임 스페이스)
HPA 확인
kubectl get hpa -o jsonpath={.items[0].spec} -n keda | jq
Bash
복사
# HPA 상세 내용 확인
파드 오토스케일링 확인
kubectl run redis-client \ --image=redis \ --rm -it \ --namespace=keda -- /bin/sh
Bash
복사
# 테스트용 redis-client 접속
redis-cli -h redis -p 6379 lpush myqueue "Hello, Redis" redis-cli -h redis -p 6379 lpush myqueue "Hello, Redis" redis-cli -h redis -p 6379 lpush myqueue "Hello, Redis"
Bash
복사
# [테스트용 파드] redis 서버의 myqueue에 3회 주입
for i in $(seq 1 10); \ do redis-cli -h redis -p 6379 lpush myqueue "Hello, Redis $i"; \ done
Bash
복사
# [테스트용 파드] redis 서버의 myqueue에 10회 주입
exit
Bash
복사
# [테스트용 파드] 종료
Note:
Redis List 주입에 따라 모니터링에서 정보를 확인합니다.

2.5. KEDA - Redis List 기준 → 실습 자원 삭제

실습 자원 삭제
kubectl delete -f redis-deploy.yaml -n keda
Bash
복사
# redis-deploy 삭제
kubectl delete -f keda-redis.yaml -n keda
Bash
복사
# keda-reids 삭제
KEDA 삭제
helm uninstall keda -n keda kubectl delete ns keda
Bash
복사
# keda helm chart와 네임 스페이스 삭제

3. VPA 환경 구성 및 동작 확인

3.1. VPA 환경 구성

네임 스페이스 추가 및 모니터링 - 신규 터미널
kubectl create ns vpa
Bash
복사
# 네임 스페이스 추가
watch -d 'kubectl get pod -n vpa'
Bash
복사
# [신규 터미널] VPA 생성 자원 모니터링
VPA 설치
helm repo add fairwinds-stable https://charts.fairwinds.com/stable helm repo update
Bash
복사
# helm chart repository 추가
helm install vpa fairwinds-stable/vpa -n vpa
Bash
복사
# VPA 설치
kubectl get crd | grep autoscaling
Bash
복사
# VPA CRD 정보 확인

3.2. VPA 동작 확인

모니터링 - 신규 터미널
watch -d kubectl top pod
Bash
복사
# [신규 터미널] 파드 메트릭 수집 모니터링
테스트용 자원 설치
curl -s -O https://raw.githubusercontent.com/cloudneta/cnaeblab/master/_data/hamster.yaml cat hamster.yaml | yh
Bash
복사
# 테스트용 hamster 다운로드 및 확인
kubectl apply -f hamster.yaml && kubectl get vpa -w
Bash
복사
# [신규 터미널2] 테스트용 hamster 설치
VPA 동작 정보 확인
kubectl describe pod | grep Requests: -A2
Bash
복사
# 파드 리소스 요구 사항 확인
kubectl get events --sort-by=".metadata.creationTimestamp" | grep VPA
Bash
복사
# VPA에 의해 파드 삭제 및 생성 이벤트 확인

3.3. VPA 실습 자원 삭제

실습 자원 삭제
kubectl delete -f hamster.yaml
Bash
복사
# 테스트용 hamster 삭제
helm uninstall vpa -n vpa
Bash
복사
# VPA 삭제
Warning:
다음 섹션의 실습을 이어서 진행할 것으로 Amazon EKS 원클릭 배포를 유지합니다.
혹시나 다음 섹션을 진행하지 않을 경우 5장 Amazon EKS 원클릭 배포를 삭제해 주길 바랍니다.
여기까지 5장 - 파드 오토스케일링 실습을 마칩니다.
수고하셨습니다 :)