Dev/server env

Kubernetes Autoscaling

Luigi.yoon 2025. 5. 29. 17:55

Autoscaling

pod 리소스 부족 시 긴급 대응하려면 pod 를 늘리고 원인을 찾게 되는데, pod 를 자동으로 늘리고 알림을 받으면 리소스 알림을 받은 뒤 직접 처리하는 것보다 더 빠르게 대응할 수 있을것 으로 보여 autoscaling 활용 방법을 알아 봅니다.

  1. k8s pod 의 리소스가 부족할 때 pod 개수가 늘어났다가(scaleUp), 리소스 사용량이 줄어들면 pod 개수가 줄어드는(scaleDown) autoscaling 기능에 대해서 알아본다. 
  2. autoscaling 을 사용해도 리소스 사용량이 증가한 문제 해결을 위해서는 담당자가 알고 있어야 하므로, scaleUp / scaleDown 이 발생했을 때 알림을 받을 수 있는지 알아본다. 

 

1.  HorizontalPodAutoscaler 를 이용한 autoscaling

 

CPU 사용량 또는 메모리 사용량에 따른 autoscaling 예제

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: cpu-memory-autoscaler
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: my-app  # 대상 Deployment 이름
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50  # CPU 사용률 50% 초과 시 스케일 아웃
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 75  # 메모리 사용률 75% 초과 시 스케일 아웃

 

 

 

2. kubectl cli 를 이용한 오토스케일

$ kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU]
$ kubectl autoscale deployment {{ hello-container-deployment }} --min=2 --max=10 --cpu-percent=50

 

 


 

HorizontalPodAutoscaler 사용 시 유의사항

  • HPA 는 기본 15초 간격으로 메트릭을 체크합니다. 

1. autoscaling 설정에 의해 발생할 수 있는 Thrashing 문제

문제 상황

  • scaleUp / scaleDown 이 반복해서 계속 발생하는 문제
예를 들면
CPU 사용량 60% 기준으로 autoscaling 설정했을 때
pod CPU 사용량이 60% 넘어서 scaleUp 발생하고,
pod 가 많아져서 CPU 사용량이 60% 미만으로 줄어들면 scaleDown 이 발생하고,
줄어든 pod 개수에서는 다시 CPU 사용량이 60% 넘어서 scaleUp 이 발생하는 것을 반복
 

 

2. ArgoCD 동기화 문제

문제 발생 순서

  1. 기본적으로 deployment 의 spec.replicas 정보는 ArgoCD 에 동기화하고 있습니다.
  2. HPA 에서는 리소스 사용량에 따라 spec.replicas 를 동적으로 변경해서 Pod 개수를 늘리게 됩니다.
  3. ArgoCD 동기화 정보랑 달라진 spec.replicas 를 감지하고 Pod 개수를 원복시킵니다.

문제 해결 방법

  • spec.replicas 정보를 ArgoCD 동기화에서 제외해야 합니다.
  설명
수정할 내용 argocd Application 에 동기화 무시 옵션(spec.ignoreDifferences)정보를 추가해야 합니다.
yaml 수정 예제 apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: your-application
spec:
  syncPolicy:
    syncOptions:
    - CreateNamespace=true
    - RespectIgnoreDifferences=true  # 이 옵션을 추가하여 ignoreDifferences 적용을 강제
  ignoreDifferences:
  - group: apps
    kind: Deployment
    name: your-deployment       # 리소스 이름 지정
    namespace: your-namespace  # 네임스페이스 지정
    jsonPointers:
    - /spec/replicas  # 'replicas' 필드 동기화 무시

 

3. 리소스 사용량이 증가해도 autoscaling 이 동작하지 않는 증상

문제 상황

  • HPA 리소스 사용량 검사 기준은 Pod 들의 평균값이라, 특정 Pod 만 리소스가 높으면 HPA 는 동작하지 않을 수 있습니다.
  • 특정 Pod 만 메모리 사용량이 증가하면 Pod 는 증가하지 않고, 결국 OOM 이 발생할 수 있습니다. 
예를 들어, HPA 메모리에 대해 averageUtilization이 50% 로 설정되어 있고, 4개의 Pod가 있는 경우:
Pod 1: 90% 메모리 사용
Pod 2: 10% 메모리 사용
Pod 3: 10% 메모리 사용
Pod 4: 10% 메모리 사용

전체 평균 메모리 사용량은 30% 이므로, HPA는 Pod 수를 늘리지 않습니다.

 

 

4. Pod 가 maxReplicas 까지 증가하는 증상

문제 상황

  • memory leak 문제 같이, Pod 개수가 증가해도 리소스 사용량이 낮아지지 않으면 Pod 는 max 까지 증가합니다.

참고

  • 다만, memory leak 이 발생해서 Pod 가 OOM Killed 되고, 다시 메모리 사용량이 줄어들면 Pod 개수가 줄어듭니다. 

 

5. Pod 가 늘어나는건 자동, 줄어드는건 수동으로 되도록 설정할 수 있는가?

할 수 없습니다. HPA 를 적용하면 deployment 의 replicas 제어를 HPA 가 하게 됩니다.

HPA 에 Pod 를 줄이는(scaleDown) 설정은 줄이는 양, 시간만 제어할 수 있습니다.

 


Autoscaling 관련 yaml 설정

설명k8s yaml설명

 

k8s yaml 설명
apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3
Deployment 설정
spec.replicas:
  • Deployment 에서 만드는 Pod 개수 초기값. 초기생성 이후 HPA 가 제어합니다.
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: your-deployment
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 30  # CPU 사용률 30% 초과 시 스케일 아웃
    - type: Resource
      resource:
        name: memory
        target:
          type: Utilization
          averageUtilization: 30  # 메모리 사용률 30% 초과 시 스케일 아웃

  behavior:
    scaleDown:
      stabilizationWindowSeconds: 600 # 600초 유지 (0~3600 초 설정 가능)
      policies:
      - type: Percent 
        value: 10 # 한 번에 10 % 줄일 수 있음
        periodSeconds: 60 # 60초 동안 유지되면 동작 (0~1800 초 설정 가능)
      - type: Pods
        value: 1 # 한 번에 1개만 줄일 수 있음
        periodSeconds: 60 # 60초 동안 유지되면 동작 (0~1800 초 설정 가능)
      selectPolicy: Min # Percent , Pods 설정 중 작은 값만큼 Pod 감소 
    scaleUp:
      stabilizationWindowSeconds: 0 # 0초 - 리소스 부족 즉시 (0~3600 초 설정 가능)
      policies:
      - type: Percent
        value: 100
        periodSeconds: 15 # (0~1800 초 설정 가능)
      - type: Pods
        value: 4
        periodSeconds: 15 # (0~1800 초 설정 가능)
      selectPolicy: Max # Percent , Pods 설정 중 큰 값만큼 Pod 증가  
HorizontalPodAutoscaler 설정


spec.scaleTargetRef:
  • autoscaling 적용 대상이 되는 deployment 를 지정합니다.


spec.minReplicas:
  • autoscaling 적용 시 최소 Pod 개수 ( 기본값 1)


spec.maxReplicas:
  • autoscaling 적용 시 최대 Pod 개수 ( 필수 입력입니다. 기본값 없습니다. )


spec.metrics.[*] : autoscaling 적용 기준 설정


spec.behavior.[*] : autoscaling 에 따른 증가량/감소량 설정, 반응 시간, 유지 시간 설정 등

 

 


기타 참고사항: HPAScaleToZero 기능

Event Driven Autoscaling 기능도 있습니다.. 요청이 없을 때 Pod 개수를 0까지 줄이고, 요청이 있을때만 Pod 를 생성해서 쓰는 기능

HPAScaleToZero 기능은 일반적인 Kubernetes HPA만으로는 지원되지 않으며, 추가적인 설정이 필요합니다.