[CKA] 컨테이너 스케일링
스케일링이란?
수직적 확장이란 CPU나 메모리의 증설을 뜻하고, 수평적 확장은 서버의 갯수를 늘리는 것이다.
쿠버네티스에서는 이러한 두 가지 방식의 스케일링 방식을 지원한다.
HPA
Pod 수를 자동으로 스케일링(늘렸다가 줄였다가)하는 스케일러
언제나 자리에 앉아서 kubectl top depoly
를 할 수는 없는 노릇이다. 이를 위해 자동으로 Metrics Server가 가져온 자원을 바탕으로 설정된 값에 따라 워크로드 크기(pod의 숫자)를 업데이트하는 리소스이다.
HPA 생성하기
cpu의 request
가 100m라면 아래와 같이 HPA를 설정한다면?
1
2
3
4
kubectl autoscale deployment myapp \
--cpu-percent=50 \
--min=2 \
--max=10
CPU가 50% 이상 점유되어진다면 pod를 최대 10개까지 스케일 업한다. 하지만 pod는 2개 이하로 줄어들지 않는다.
HPA yaml
예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
HPA 상태 확인 명령어
HPA는 쿠버네티스 리소스이기에 get
으로 상태를 불러올 수 있다.
1
2
kubectl get hpa
kubectl describe hpa myapp-hpa
VPA
수직적 오토스케일러로 Pod의 CPU 및 메모리 요청과 제한을 자동으로 조절하는 컨트롤러
VPA의 구성요소
구성요소 | 설명 |
---|---|
Recommender | 파드의 리소스 사용량을 수집하고, 적절한 리소스를 계산 |
Updater | 파드가 리소스 조정이 필요하면 재시작 요청 |
Admission Controller | 새로 생성되는 파드에 추천된 리소스 적용 |
VPA는 pod의 리소스 사용 데이터를 직접 수집하는데 과거 데이터를 기반으로 cpu와 memory 등을 추천해준다.
Sample yaml
1
2
3
4
5
6
7
8
9
10
11
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: myapp-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: myapp
updatePolicy:
updateMode: "Auto"
targetRef
은 리소스를 조정할 대상을 설정한다. 위 예에서는 Deployment를 target 리소스로 한다. updatePolicy
의 경우 자동으로 리소스를 조정하고 pod를 재시작(pod를 지우고 시작하는 것과 동일)한 작업을 한다.
VPA 상태 확인
1
kubectl describe vpa myapp-vpa
VPA는 거의 대부분의 상황에서 스케일링시 Pod의 재시작이 요구되어진다. 또한 과거 기록을 기반으로 추천하기에 AP에 영향이 갈 확률이 높다.
⚠️ HPA와 동시 사용시 충돌한다!