향후 학습을 위한 Horizontal Pod Autoscaler (HPA) 간략 소개
이 단계에서는 리소스 사용률을 기반으로 애플리케이션을 자동으로 확장하는 강력한 Kubernetes 기능인 Horizontal Pod Autoscaler (HPA) 에 대한 소개를 받게 됩니다. HPA 를 사용하면 CPU 사용률, 메모리 사용량 또는 사용자 정의 메트릭과 같은 메트릭을 기반으로 확장 규칙을 정의할 수 있습니다.
HPA 이해:
HPA 는 관찰된 CPU 또는 메모리 사용량 또는 애플리케이션에서 제공하는 사용자 정의 메트릭을 기반으로 Deployment, ReplicaSet 또는 StatefulSet 에서 실행 중인 Pod 레플리카 수를 자동으로 조정합니다. 이를 통해 애플리케이션은 변화하는 트래픽 부하를 처리하도록 자동으로 확장되어 성능과 가용성을 향상시킬 수 있습니다.
Minikube 에서 metrics server 애드온을 활성화합니다:
minikube addons enable metrics-server
예시 출력:
* The 'metrics-server' addon is enabled
metrics server 는 Kubernetes 에 리소스 사용량 데이터를 제공하며 HPA 가 작동하는 데 필수적입니다.
리소스 요청과 함께 배포를 생성합니다:
nano ~/project/k8s-manifests/hpa-example.yaml
다음 내용을 추가합니다:
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
replicas: 1
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: k8s.gcr.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
배포를 적용합니다:
kubectl apply -f ~/project/k8s-manifests/hpa-example.yaml
YAML 구성 설명:
- 이 YAML 파일은 PHP 애플리케이션에 대한 Deployment 와 해당 Service 를 정의합니다.
- Deployment 구성은 NGINX 구성과 매우 유사하며, 다음을 제외합니다:
name: php-apache: 배포 및 Pod 컨테이너의 이름입니다.
image: k8s.gcr.io/hpa-example: 컨테이너에 대한 Docker 이미지입니다.
resources: 이 섹션은 컨테이너에 대한 리소스 요구 사항을 지정합니다.
limits.cpu: 500m: 컨테이너가 사용할 수 있는 최대 CPU 입니다.
requests.cpu: 200m: 컨테이너에 할당된 보장된 CPU 양입니다.
- 서비스는 내부적으로 배포를 노출하는 표준 서비스 구성입니다.
HPA 구성을 생성합니다:
nano ~/project/k8s-manifests/php-apache-hpa.yaml
다음 HPA 매니페스트를 추가합니다:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: php-apache
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: php-apache
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
HPA 구성을 적용합니다:
kubectl apply -f ~/project/k8s-manifests/php-apache-hpa.yaml
YAML 구성 설명:
apiVersion: autoscaling/v2: HorizontalPodAutoscaler 에 대한 API 버전을 지정합니다.
kind: HorizontalPodAutoscaler: 이것이 HPA 객체임을 나타냅니다.
metadata: HPA 에 대한 메타데이터를 포함합니다.
name: php-apache: HPA 의 이름입니다.
spec: HPA 사양을 포함합니다.
scaleTargetRef: 확장될 대상 Deployment 를 정의합니다.
apiVersion: apps/v1: 대상 리소스의 API 버전입니다.
kind: Deployment: 대상 리소스 유형으로, Deployment 입니다.
name: php-apache: 확장할 대상 Deployment 의 이름입니다.
minReplicas: 1: 실행을 유지할 최소 레플리카 수입니다.
maxReplicas: 10: 확장할 최대 레플리카 수입니다.
metrics: 확장 메트릭을 결정하는 방법을 정의합니다.
type: Resource: 리소스 메트릭을 기반으로 확장합니다.
resource.name: cpu: CPU 사용량을 기반으로 확장합니다.
resource.target.type: Utilization: Pod 가 요청한 CPU 의 백분율을 기반으로 확장합니다.
resource.target.averageUtilization: 50: 모든 Pod 의 평균 CPU 사용량이 요청의 50% 를 초과하면 확장합니다.
HPA 구성을 확인합니다:
kubectl get hpa
예시 출력:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
부하 시뮬레이션 및 실시간 자동 스케일링 관찰
높은 부하를 시뮬레이션하고 오토스케일러를 트리거하려면 한 터미널에서 부하 생성기를 실행하고 별도의 터미널에서 확장 활동을 모니터링합니다.
먼저, 부하 생성기를 위한 터미널을 엽니다:
kubectl run -i --tty load-generator --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
부하 생성기가 있는 터미널을 닫지 마십시오. 다른 터미널을 열어 확장 활동을 모니터링합니다.
두 번째 터미널에서는 자동 스케일링을 실시간으로 관찰하기 위해 여러 명령을 사용할 수 있습니다:
- HPA 상태 모니터링 (몇 초마다 업데이트):
kubectl get hpa -w
- HPA 가 확장됨에 따라 생성되는 Pod 를 관찰합니다:
kubectl get pods -w
- 확장 활동과 관련된 이벤트를 추적합니다:
kubectl get events --sort-by='.lastTimestamp' -w
이러한 명령 중 하나를 실행하여 자동 스케일링 프로세스의 다양한 측면을 관찰할 수 있습니다. 예를 들어, -w 플래그를 사용하여 Pod 를 관찰하면 시스템이 확장됨에 따라 Pod 가 실시간으로 생성되는 것을 볼 수 있습니다:
kubectl get pods -w의 예시 출력:
NAME READY STATUS RESTARTS AGE
php-apache-xxxxxxxxx-xxxxx 1/1 Running 0 2m
load-generator 1/1 Running 0 30s
php-apache-xxxxxxxxx-yyyyy 0/1 Pending 0 0s
php-apache-xxxxxxxxx-yyyyy 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-yyyyy 1/1 Running 0 3s
php-apache-xxxxxxxxx-zzzzz 0/1 Pending 0 0s
php-apache-xxxxxxxxx-zzzzz 0/1 ContainerCreating 0 0s
php-apache-xxxxxxxxx-zzzzz 1/1 Running 0 2s
HPA 가 증가된 부하에 대응하여 Pod 수를 확장하는 것을 볼 수 있습니다. 메트릭 업데이트는 변경 사항을 반영하는 데 1 분 이상 걸릴 수 있습니다:
kubectl get hpa -w의 예시 출력:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 0%/50% 1 10 1 30s
php-apache Deployment/php-apache 68%/50% 1 10 1 90s
php-apache Deployment/php-apache 68%/50% 1 10 2 90s
php-apache Deployment/php-apache 79%/50% 1 10 2 2m
php-apache Deployment/php-apache 79%/50% 1 10 4 2m15s
관찰을 마치면 Ctrl+C를 눌러 모니터링 명령을 중지하고, 첫 번째 터미널로 돌아가 Ctrl+C를 눌러 부하 생성기를 중지합니다.
HPA 에 대한 주요 사항:
- 리소스 사용률을 기반으로 Pod 를 자동으로 확장하여 애플리케이션 복원력을 향상시킵니다.
- CPU, 메모리 또는 사용자 정의 메트릭을 기반으로 확장할 수 있습니다.
- 최소 및 최대 레플리카 수를 정의하여 균형 있고 효율적인 확장을 보장합니다.
- HPA 는 변화하는 부하에서 애플리케이션 성능과 가용성을 유지하는 데 중요한 구성 요소입니다.
kubectl 명령과 함께 -w (watch) 플래그를 사용하면 클러스터 변경 사항을 실시간으로 모니터링할 수 있습니다.