Kubernetes Autoscaling

inuit·2025년 6월 1일

All about 쿠버네티스

목록 보기
15/21
post-thumbnail

최근 업데이트일 2024-11-23

따라하며 배우는 쿠버네티스: Kubernetes AutoScaling - 이론편

쿠버네티스: Horizontal Pod Autoscaling

Kubernetes의 꽃인 오토스케일링을 구현하는 컨트롤러와 컨트롤러가 필요로 하는 구성요소를 알아보자.

1. Autoscaling 개념

쿠버네티스에서 워크로드의 부하 변화에 따라 자동으로 리소스를 확장/축소하는 기능

  • 쿠버네티스 클러스터는 각 Pod/Node의 상태를 모니터링하기 위해 다양한 지표(Metric)를 수집한다.
    • CPU 사용률
    • 메모리 사용량
    • 네트워크 트래픽
    • 사용자 정의 지표(예: 요청 수)
  • Metric을 바탕으로 오토스케일러가 판단하여 자동으로 Pod 개수나 Node 개수를 조절한다.
  • Autoscaling Controller 유형

    유형대상설명
    HPA (Horizontal Pod Autoscaler)Pod부하에 따라 Replica 개수를 자동 조절
    VPA (Vertical Pod Autoscaler)PodPod에 할당된 CPU/Memory 양을 자동 조절
    Cluster AutoscalerNode전체 클러스터의 Node 수를 자동 조절

2. Vertical Pod Autoscaler (VPA)

Pod의 CPU, 메모리 요청/제한량(Resource Request/Limit)을 자동으로 조정해주는 컨트롤러

  • 주요 구성 요소
    • Recommender: 리소스 사용량을 기반으로 적절한 요청/제한량을 추천
    • Updater: 설정된 정책에 따라 Pod를 종료 후 새 리소스로 재생성
    • Admission Plugin: 새로 생성되는 Pod에 적절한 요청/제한량을 자동 삽입
  • 단점
    • Pod를 재시작해야 반영되기 때문에 실시간 반응성이 떨어짐
    • HPA와 동시에 사용 시 충돌 가능성이 존재하여, 잘 사용하지 않는다.

3. Horizontal Pod Autoscaler (HPA)

사용 리소스를 기준으로 Pod의 수를 자동으로 조정하는 컨트롤러

  • 동작 원리
    1. Kubelet + cAdvisor: 각 Node에서 Pod들의 리소스 사용률을 수집
      • 리눅스 커널의 cgroup에 의해 격리된 각 컨테이너에 대해 cAdvisor는 아래 경로들을 통해 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: 네트워크 사용량
    2. Metrics Server: 전체 Pod의 메트릭을 수집 및 정리
    3. HPA Controller: 수집된 Metric과 목표를 비교하여 스케일링 여부 결정
  • 사용 예시
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

cAdvisor (Container Advisor)

구글에서 만든 오픈소스 도구로, 컨테이너의 리소스 사용량을 실시간으로 수집한다.

  • 컨테이너 런타임과 직접 통신하며, /sys/fs/cgroup · /proc 등의 리눅스 커널 정보를 읽어온다.
  • 단독으로도 실행 가능하지만, Kubernetes에서는 kubelet에 내장되어 동작한다. (= 모든 Node에 설치되어 있다.)
  • kubelet → 내장 cAdvisor가 주기적으로 각 컨테이너의 cgroup 디렉토리에서 리소스 사용 정보를 읽는 역할을 한다.

4. Cluster Autoscaler (CA)

클러스터 전체에서 Pod가 부족하면 Node를 추가하고, 사용량이 낮으면 Node를 삭제하는 컨트롤러형 프로그램

  • Deployment 형태로 클러스터 안에 실행되나, 독립적인 프로그램이기 때문에 외부에서도 설치할 수 있다.
  • 대게 클라우드 환경(GKE, EKS, AKS 등)에서 사용되어 Node 변화가 필요할 때 API 요청을 하는 방식으로 동작한다.
  • 클라우드 Provider가 관리하는 동일한 설정을 가진 노드들의 묶음인 Node Group 단위로 동작한다.
    • Pod가 스케줄링되지 못하는 상태 → 새 Node 자동 생성
    • 특정 Node가 비어 있고 Pod를 재배치할 수 있다면 → 해당 Node 삭제
  • 클라우드가 아닌 환경에서 CA를 사용하려면 노드 추가/삭제를 대신할 무언가가 필요하다.
  • CA를 yaml로 배포할 때, --cloud-provider, --nodes, --scale-down-enabled 등의 파라미터로 설정해야 한다.

metrics-server와 함께 동작하는 경우가 많지만, Node 수준에서 동작하며 HPA와는 다른 레벨의 Autoscaling을 담당한다.


5. Metrics Server

쿠버네티스 클러스터의 각 Pod, Node 등의 리소스 사용량을 수집하고 집계하여 API로 제공하는 컴포넌트

  • kube-system 네임스페이스에서 실행되는 Deployment 형태이다.
  • Horizontal Pod Autoscaler(HPA), 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
  • 설치 시 클러스터 내부에서 Metrics Server Pod가 하나 실행된다.
  • 네트워크 문제, 인증 이슈로 Kubelet에 접근하지 못 하면 동작이 불가하다.
  • 동작 흐름
    1. 사용자가 kubectl top 명령 등으로 metric 데이터를 조회한다.
    2. Metrics Server는 일정 주기로 모든 Node에 있는 Kubelet에 HTTPS 요청을 보내서 metric을 중앙 수집하고 있다.
    3. Kubernetes API Server는 사용자의 요청을 metrics.k8s.io/v1beta1 API로 전달한다.
    4. Metrics Server가 해당 API를 받아 필요한 데이터로 응답한다.

Autoscaling은 클러스터의 자원을 탄력적으로 사용하고 비용을 최적화하며, 트래픽 폭증에도 유연하게 대응할 수 있는 핵심 구성 요소이다.

profile
It’s always white night here.

0개의 댓글