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장 - 파드 오토스케일링 실습을 마칩니다.
수고하셨습니다 :)