Dev/server env
Kubernetes Autoscaling
Luigi.yoon
2025. 5. 29. 17:55
Autoscaling
pod 리소스 부족 시 긴급 대응하려면 pod 를 늘리고 원인을 찾게 되는데, pod 를 자동으로 늘리고 알림을 받으면 리소스 알림을 받은 뒤 직접 처리하는 것보다 더 빠르게 대응할 수 있을것 으로 보여 autoscaling 활용 방법을 알아 봅니다.
- k8s pod 의 리소스가 부족할 때 pod 개수가 늘어났다가(scaleUp), 리소스 사용량이 줄어들면 pod 개수가 줄어드는(scaleDown) autoscaling 기능에 대해서 알아본다.
- autoscaling 을 사용해도 리소스 사용량이 증가한 문제 해결을 위해서는 담당자가 알고 있어야 하므로, scaleUp / scaleDown 이 발생했을 때 알림을 받을 수 있는지 알아본다.
1. HorizontalPodAutoscaler 를 이용한 autoscaling
- deployment / replica set / stateful set 의 오토스케일 (DeamonSet 은 오토스케일 불가능)
- 리소스 사용량이 증가하면 Pod 개수가 늘고, 리소스 사용량이 감소하면 다시 Pod 개수가 줄어들 수 있음
- 참고
- k8s 공식문서 HPA 설명 : https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale/
- k8s 공식문서 HPA yaml spec : https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/horizontal-pod-autoscaler-v2/#HorizontalPodAutoscalerSpec
- k8s 공식문서 HPA 연습 : https://kubernetes.io/ko/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
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 로 autoscaling 설정할 수있다는 건 참고만 합니다.
- kubectl 문서 : https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#autoscale
$ 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 동기화 문제
문제 발생 순서
- 기본적으로 deployment 의 spec.replicas 정보는 ArgoCD 에 동기화하고 있습니다.
- HPA 에서는 리소스 사용량에 따라 spec.replicas 를 동적으로 변경해서 Pod 개수를 늘리게 됩니다.
- 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:
|
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:
spec.minReplicas:
spec.maxReplicas:
spec.metrics.[*] : autoscaling 적용 기준 설정 spec.behavior.[*] : autoscaling 에 따른 증가량/감소량 설정, 반응 시간, 유지 시간 설정 등 |
기타 참고사항: HPAScaleToZero 기능
Event Driven Autoscaling 기능도 있습니다.. 요청이 없을 때 Pod 개수를 0까지 줄이고, 요청이 있을때만 Pod 를 생성해서 쓰는 기능
HPAScaleToZero 기능은 일반적인 Kubernetes HPA만으로는 지원되지 않으며, 추가적인 설정이 필요합니다.