오토스케일링 기본 개념 및 유형
쿠버네티스에서 오토스케일링은 리소스 수요 변화에 탄력적이고 효율적으로 대응할 수 있도록 워크로드를 자동으로 업데이트하는 능력을 의미한다. 쿠버네티스는 세 가지 주요 오토스케일링 방식을 제공한다.
오토스케일링 유형
- HPA (Horizontal Pod Autoscaler): 파드의 복제본 수를 조정하는 수평적 스케일링
- VPA (Vertical Pod Autoscaler): 개별 파드의 CPU와 메모리 요청값을 조정하는 수직적 스케일링
- Cluster Autoscaler: 클러스터의 노드 수를 조정하는 클러스터 레벨 스케일링
HPA 심화 이해
HPA 기본 개념 및 작동 원리
HPA는 워크로드 리소스(디플로이먼트, 스테이트풀셋 등)를 자동으로 업데이트하여 수요에 맞게 워크로드 크기를 자동으로 스케일링하는 것을 목표로 한다. 수평 스케일링은 부하 증가에 대해 더 많은 파드를 배치하는 것을 의미한다.
HPA는 컨트롤 플레인 내에서 실행되는 컨트롤러로, 평균 CPU 사용률, 평균 메모리 사용률, 또는 다른 커스텀 메트릭 등의 관측된 메트릭을 목표에 맞추기 위해 목표물(예: 디플로이먼트)의 적정 크기를 주기적으로 조정한다.
기본 HPA YAML 예시
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: webapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
HPA YAML 주요 필드 설명
scaleTargetRef: 실제 어떤 대상을 오토스케일링할 것인지 설정한다.kind는 대상 객체 타입,name은 대상 객체 이름을 지정한다.minReplicas: 파드 개수를 줄일 때 최소 설정 개수만큼의 파드를 실행한다. 기본값은 1이다.maxReplicas: 오토스케일링이 적용되어서 최대 몇 개까지 파드 개수를 늘릴 수 있는지 설정한다.metrics: 스케일링 결정에 사용할 메트릭을 정의한다. CPU 사용률, 메모리 사용률, 커스텀 메트릭을 지원한다.
HPA 작동 메커니즘 상세
HPA 컨트롤러는 컨트롤러 매니저 안에서 주기적으로 실행하면서 설정된 HPA의 상태를 확인한다. 실행할 때마다 지정된 자원의 사용량을 쿠버네티스 API로 확인한 후 설정된 HPA 조건에 맞을 때 오토스케일링을 실행한다.
스케일링 계산 공식
HPA는 다음 공식을 사용하여 필요한 복제본 수를 계산한다.
desiredReplicas = ceil[currentReplicas × (currentMetricValue / desiredMetricValue)]
예를 들어, 현재 50개의 복제본이 있고 CPU 사용률이 90%이며 목표가 75%라면:
desiredReplicas = ceil[50 × (90 / 75)] = ceil[60] = 60
HPA 스케일링 정책 및 행동 제어
HPA v2에서는 spec.behavior 필드를 통해 스케일링 행동을 세밀하게 제어할 수 있다.
spec:
behavior:
scaleDown:
policies:
- type: Percent
value: 10
periodSeconds: 60
- type: Pods
value: 5
periodSeconds: 60
selectPolicy: Min
stabilizationWindowSeconds: 300
scaleUp:
policies:
- type: Percent
value: 100
periodSeconds: 15
- type: Pods
value: 4
periodSeconds: 15
selectPolicy: Max
stabilizationWindowSeconds: 0
scaleDown.policies: 스케일 다운 시 분당 10% 또는 최대 5개 파드까지만 제거selectPolicy: Min: 가장 보수적인 정책을 선택하여 서비스 안정성 확보stabilizationWindowSeconds: 스케일 다운 전 5분 대기로 급격한 변동 방지
HPA 상태 및 조건 확인
HPA의 현재 상태는 status.conditions 필드를 통해 확인할 수 있다.
AbleToScale: 스케일링이 가능한지 여부ScalingActive: HPA가 활성화되어 메트릭을 성공적으로 계산하고 있는지 여부ScalingLimited: 스케일링이 min/max 제한에 의해 제한되고 있는지 여부
CKA Tip: kubectl get hpa 명령어로 HPA의 현재 상태를 모니터링할 수 있고, kubectl describe hpa <hpa-name>으로 상세한 이벤트와 조건을 확인할 수 있다.
VPA 심화 이해
VPA 기본 개념 및 작동 원리
VPA는 사용자가 파드의 컨테이너에 대한 최신 리소스 요청을 설정할 필요성을 없애준다. 구성되면 사용량을 기반으로 요청을 자동으로 설정하여 각 파드에 적절한 리소스 양이 사용 가능하도록 노드에 적절한 스케줄링을 허용한다.
VPA는 시간이 지남에 따른 사용량을 기반으로 리소스를 과도하게 요청하는 파드를 축소하고, 리소스를 부족하게 요청하는 파드를 확대할 수 있다.
VPA 구성 요소
VPA는 세 가지 주요 구성 요소로 이루어져 있다.
VPA Recommender
- 리소스 사용률을 모니터링하고 목표 값을 계산한다
- 메트릭 히스토리, OOM 이벤트, VPA 배포 사양을 분석하여 공정한 요청값을 제안한다
- 정의된 limits-requests 비율에 따라 limits를 조정한다
VPA Updater
- 새로운 리소스 제한이 필요한 파드를 축출한다
updateMode: Auto가 정의된 경우 Recommender의 권장사항을 구현한다- 쿠버네티스 디자인상 실행 중인 파드의 리소스 요청을 동적으로 변경할 수 없기 때문에 파드를 재시작한다
VPA Admission Controller
- 새로운 파드가 시작될 때마다 파드 리소스 권장사항을 적용한다
- webhook을 사용하여 VPA Updater가 파드를 축출하고 재시작할 때 CPU와 메모리 설정을 변경한다
- 파드 API 요청에 업데이트된 리소스 요청 및 제한 값을 주입한다
기본 VPA YAML 예시
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: webapp-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: webapp
maxAllowed:
cpu: 1
memory: 500Mi
minAllowed:
cpu: 100m
memory: 50Mi
mode: "Auto"
VPA YAML 주요 필드 설명
targetRef: VPA가 모니터링할 대상 워크로드를 지정한다updatePolicy.updateMode: VPA 작동 모드를 설정한다"Off": 권장사항만 생성하고 적용하지 않음"Initial": 새로운 파드 생성 시에만 권장사항 적용"Auto": 기존 파드와 새로운 파드 모두에 권장사항 적용
resourcePolicy: 컨테이너별 리소스 정책을 정의한다maxAllowed/minAllowed: 허용되는 최대/최소 리소스 값mode: 특정 컨테이너에 대한 VPA 모드 설정
VPA와 HPA 함께 사용하기
VPA와 HPA는 서로 다른 목적을 가지므로 함께 사용할 수 있다:
- VPA: 개별 파드의 적절한 리소스 크기 조정
- HPA: 수요에 따른 파드 복제본 수 조정
# HPA - 외부 메트릭 기반 스케일링
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: webapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: External
external:
metric:
name: queue_depth
target:
type: AverageValue
averageValue: "30"
---
# VPA - CPU/메모리 리소스 최적화
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: webapp-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: webapp
updatePolicy:
updateMode: "Auto"
최신 오토스케일링 기능
HPA ContainerResource 메트릭 (v1.27+ Beta)
쿠버네티스 1.27에서 ContainerResource 타입 메트릭이 베타로 승격되었다. 이 기능을 통해 개별 컨테이너의 리소스 사용량을 기반으로 오토스케일링을 구성할 수 있다.
metrics:
- type: ContainerResource
containerResource:
name: cpu
container: application
target:
type: Utilization
averageUtilization: 60
이는 사이드카 컨테이너가 있는 파드에서 특히 유용하다. 기존 Resource 메트릭은 파드 전체의 평균 사용률을 계산하지만, ContainerResource는 특정 컨테이너만을 대상으로 할 수 있다.
HPA 구성 가능한 허용 오차 (v1.33+ Alpha)
쿠버네티스 v1.33에서는 HPAConfigurableTolerance 기능 게이트를 통해 HPA의 허용 오차를 구성할 수 있다.
spec:
behavior:
scaleUp:
tolerance: 1 # 1% 허용 오차로 빠른 스케일 업
scaleDown:
tolerance: 5 # 5% 허용 오차로 안정적인 스케일 다운
오토스케일링 모범 사례 및 제한사항
HPA 모범 사례
- 적절한 메트릭 선택: CPU/메모리 사용률 외에도 애플리케이션별 커스텀 메트릭 활용
- 안정화 창 설정: 급격한 스케일링을 방지하기 위해
stabilizationWindowSeconds설정 - 리소스 요청값 정확성: HPA의 정확한 작동을 위해 적절한 resource requests 설정 필수
- PodDisruptionBudget 활용: 스케일 다운 시 서비스 가용성 보장
VPA 모범 사례
- 장기 실행 워크로드: VPA는 오랜 시간 실행되는 동질적인 워크로드에 가장 적합
- 초기 모드 활용: 파드 재시작을 원하지 않는 경우
updateMode: "Initial"사용 - 리소스 범위 설정:
minAllowed/maxAllowed로 리소스 할당 범위 제한 - JVM 워크로드 주의: JVM 기반 애플리케이션은 실제 메모리 사용량 가시성이 제한적이어서 VPA 사용 권장하지 않음
주요 제한사항
- VPA 파드 재시작: VPA Auto 모드에서는 리소스 조정 시 파드가 재시작되어 일시적 다운타임 발생 가능
- HPA/VPA 충돌: 동일한 메트릭(CPU/메모리)에 대해 HPA와 VPA를 동시 사용하면 충돌 가능
- 스케일링 지연: 메트릭 수집과 의사결정에 시간이 소요되어 급격한 부하 증가에 즉시 대응 어려움
- 상태를 가진 애플리케이션: 데이터베이스와 같은 StatefulSet은 HPA 사용 시 주의 필요
참고 자료:
'CKA' 카테고리의 다른 글
| 로깅과 모니터링 정리 (0) | 2025.07.10 |
|---|---|
| 쿠버네티스 DNS 정리 (0) | 2025.07.09 |
| 클러스터 네트워킹 구성 정리 (0) | 2025.07.08 |
| 데이터 저장 정리 (0) | 2025.07.07 |
| 인증과 권한 관리 정리 (0) | 2025.07.04 |