
Kubernetes의 꽃인 오토스케일링을 구현하는 컨트롤러와 컨트롤러가 필요로 하는 구성요소를 알아보자.
쿠버네티스에서 워크로드의 부하 변화에 따라 자동으로 리소스를 확장/축소하는 기능
Autoscaling Controller 유형
| 유형 | 대상 | 설명 |
|---|---|---|
| HPA (Horizontal Pod Autoscaler) | Pod | 부하에 따라 Replica 개수를 자동 조절 |
| VPA (Vertical Pod Autoscaler) | Pod | Pod에 할당된 CPU/Memory 양을 자동 조절 |
| Cluster Autoscaler | Node | 전체 클러스터의 Node 수를 자동 조절 |
Pod의 CPU, 메모리 요청/제한량(Resource Request/Limit)을 자동으로 조정해주는 컨트롤러
사용 리소스를 기준으로 Pod의 수를 자동으로 조정하는 컨트롤러
/sys/fs/cgroup/cpu,cpuacct/<cgroup_path>/cpuacct.usage: 누적 CPU 사용량/sys/fs/cgroup/memory/<cgroup_path>/memory.usage_in_bytes: 메모리 사용량/proc/net/dev, /proc/diskstats: 네트워크 사용량apiVersion: autoscaling/v2 #
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec: # CPU 사용률이 평균 50%를 넘으면 Pod 수를 2~10개 사이에서 조절
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
# Busybox 기반의 임시 Pod 실행 후, 쉘 환경으로 진입
kubectl run -i --tty load-generator --image=busybox /bin/sh
# 내부에서 무한 루프 실행 → CPU 부하가 인위적으로 생성 → Pod 수 증가
while true; do wget -q -O- http://myapp; done
구글에서 만든 오픈소스 도구로, 컨테이너의 리소스 사용량을 실시간으로 수집한다.
/sys/fs/cgroup · /proc 등의 리눅스 커널 정보를 읽어온다.클러스터 전체에서 Pod가 부족하면 Node를 추가하고, 사용량이 낮으면 Node를 삭제하는 컨트롤러형 프로그램
--cloud-provider, --nodes, --scale-down-enabled 등의 파라미터로 설정해야 한다.metrics-server와 함께 동작하는 경우가 많지만, Node 수준에서 동작하며 HPA와는 다른 레벨의 Autoscaling을 담당한다.
쿠버네티스 클러스터의 각 Pod, Node 등의 리소스 사용량을 수집하고 집계하여 API로 제공하는 컴포넌트
kube-system 네임스페이스에서 실행되는 Deployment 형태이다.kubectl top 명령어, 일부 대시보드가 Metrics Server를 사용한다.kubectl top: Pod/Node의 현재 CPU, 메모리 사용량 확인# 설치
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 사용자 명령
kubectl top pod / kubectl top node
# 실제로 접근되는 API Group: 기능별로 분리된 다양한 API (엔드포인트)
GET /apis/metrics.k8s.io/v1beta1/nodes
GET /apis/metrics.k8s.io/v1beta1/pods
kubectl top 명령 등으로 metric 데이터를 조회한다.metrics.k8s.io/v1beta1 API로 전달한다.Autoscaling은 클러스터의 자원을 탄력적으로 사용하고 비용을 최적화하며, 트래픽 폭증에도 유연하게 대응할 수 있는 핵심 구성 요소이다.