쿠버네티스에서 HPA를 활용한 자동 스케일링 구현

수평적 파드 자동 스케일링(Horizontal Pod Autoscaler) 소개

Horizontal Pod Autoscaler(HPA)는 쿠버네티스에서 Deployment, StatefulSet과 같은 워크로드 리소스의 파드 수를 실시간 메트릭에 따라 자동으로 조절하는 기능입니다. 예를 들어 CPU 또는 메모리 사용률이 증가할 경우 파드를 추가로 생성하여 부하를 분산하고, 트래픽이 감소하면 불필요한 파드를 제거함으로써 리소스 효율을 극대화합니다.

사전 준비 사항

HPA를 사용하기 위해서는 클러스터 내에서 메트릭 수집 시스템이 동작해야 합니다. Kubernetes 1.23 이상 버전에서는 metrics-server를 통해 노드와 파드의 리소스 사용량을 수집할 수 있습니다. 아래 명령어로 최신 버전의 metrics-server를 설치합니다.

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

네트워크 문제로 인해 이미지 다운로드에 실패할 수 있으므로, 알리바바 클라우드 미러를 이용해 이미지를 사전에 로컬에 가져온 후 태그를 재지정할 수 있습니다.

ctr -n k8s.io image pull registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1
ctr -n k8s.io image tag registry.cn-hangzhou.aliyuncs.com/google_containers/metrics-server:v0.7.1 registry.k8s.io/metrics-server/metrics-server:v0.7.1

기본적으로 kubelet은 HTTPS를 통해 메트릭을 제공하지만, 자체 서명된 인증서를 사용하므로 metrics-server가 이를 검증하지 않도록 설정해야 합니다. 다음 명령어로 배포를 수정하고 --kubelet-insecure-tls 플래그를 추가합니다.

kubectl -n kube-system edit deployment metrics-server

수정 후에는 metrics-server가 정상 실행 중인지 확인합니다.

kubectl -n kube-system get deployment metrics-server

CPU 기반 자동 확장 실습

HPA는 파드의 리소스 요청(requests) 값이 설정되어 있어야 올바르게 작동합니다. 그렇지 않으면 "missing request for cpu"와 같은 오류가 발생합니다. 아래는 Nginx를 배포하고 최소 1개, 최대 3개까지 자동 확장되도록 구성하는 예제입니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: app-container
        image: docker.io/library/nginx:1.23-alpine
        ports:
        - containerPort: 80
          protocol: TCP
          name: http
        resources:
          requests:
            cpu: 10m

배포 후, HPA를 생성하여 CPU 사용률이 30%를 초과하면 확장되도록 지정합니다.

kubectl autoscale deployment web-server --max=3 --cpu-percent=30

생성된 HPA 상태를 확인합니다.

$ kubectl get hpa
NAME         REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
web-server   Deployment/web-server  1%/30%    1         3         1          2m

현재 CPU 사용률은 매우 낮으며(kubectl top pod로 확인 가능), 따라서 스케일링이 발생하지 않습니다. 실제 부하를 발생시켜보겠습니다. 예를 들어, 한 파드에 접속하여 ab(Apache Bench)나 hey 도구를 사용해 지속적인 요청을 보냅니다.

ab -n 100000 -c 100 http://<service-ip>/

부하가 증가하면 HPA는 CPU 사용률이 목표치(30%)를 초과했다고 판단하고, 새로운 파드를 추가로 생성합니다. 몇 분 내에 아래와 같이 두 개 이상의 파드가 실행되는 것을 확인할 수 있습니다.

$ kubectl get pods
NAME                          READY   STATUS    RESTARTS   AGE
web-server-6d5b8c4f9c-2xklp   1/1     Running   0          5m
web-server-6d5b8c4f9c-7m9nz   1/1     Running   0          1m
web-server-6d5b8c4f9c-pq2v4   1/1     Running   0          1m

확장 및 축소 속도 제어

Kubernetes HPA는 스케일링 반응 속도를 세밀하게 제어할 수 있습니다. 예를 들어, 너무 빠른 확장이나 자주 반복되는 스케일링을 방지하기 위해 아래와 같은 정책을 적용할 수 있습니다.

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: web-server
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: web-server
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 30
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 60
      policies:
      - type: Pods
        value: 2
        periodSeconds: 60
    scaleDown:
      stabilizationWindowSeconds: 300
      policies:
      - type: Percent
        value: 10
        periodSeconds: 60

이 설정은 확장 시 60초 이내에 최대 2개의 파드만 추가하고, 축소는 더 보수적으로 300초 동안 안정화된 후 점진적으로 진행하도록 합니다.

자세한 API 사양은 공식 문서를 참고하세요: HorizontalPodAutoscaler v2 API.

태그: kubernetes HPA autoscaling metrics-server containerd

5월 28일 15:13에 게시됨