{% hint style="info" %} targetCPUUtilizationPercentage 계산은 어떻게 되는가 {% endhint %}
targetCPUUtilizationPercentage
계산 방식:targetCPUUtilizationPercentage
는 현재 CPU 사용량이requests.cpu
에 대해 차지하는 백분율을 기반으로 계산
공식 문서 인용: Horizontal Pod Autoscaler Walkthrough (Kubernetes 공식 문서)
desiredReplicas = ceil(currentReplicas * ( currentMetricValue / desiredMetricValue ))
- currentReplicas:
- 현재 실행 중인 파드의 .
- 예를 들어, 1개 파드로 시작하면
currentReplicas
는1
.
- currentMetricValue:
- 현재 메트릭 값.
- CPU 사용량을 기준으로 한다면 현재 CPU 사용량이 된다.
- 예를 들어, 현재 CPU 사용량이
80m
일 때currentMetricValue
는80m
.
- desiredMetricValue:
- 목표 메트릭 값.
- CPU 사용률을 기준으로 한다면
targetCPUUtilizationPercentage
에 해당하는 값이 된다. - 예를 들어,
targetCPUUtilizationPercentage
가75%
로 설정되었다면desiredMetricValue
는75%
.
-
공식:
desiredReplicas = ceil(currentReplicas * (currentMetricValue / desiredMetricValue))
-
대입 값:
currentReplicas = 1
currentMetricValue = 80m
desiredMetricValue = 75%
-
계산 과정:
- 첫 번째 단계:
80m / 75%
80m
을75%
로 나누면80 / 0.75
.- 이때 퍼센트(
%
)는 소수점으로 환산되므로,75% = 0.75
. - 따라서
80m / 75% = 80 / 0.75 = 106.67
- 두 번째 단계:
ceil(1 * 106.67)
currentReplicas
가1
이므로1 * 106.67
은106.67
.ceil
함수를 사용해 이 값을 올림 처리.ceil(106.67) = 2
- 헷갈리니 그냥 75를 나눠도 된다
- 첫 번째 단계:
-
최종 결과:
- 최종적으로 필요한 파드 수는
2
개.
- 최종적으로 필요한 파드 수는
- Initial Setup:
requests.cpu
: 100mtargetCPUUtilizationPercentage
: 75%- Initial Pod Count: 3
- Initial CPU Usage: 240m (80m * 3)
- CPU 사용률 계산:
- 현재 CPU 사용률:
(240m / (100m * 3)) * 100% = 80%
- 목표 사용률(
targetCPUUtilizationPercentage
): 75%
- 현재 CPU 사용률:
- 필요한 파드 수 계산:
desiredReplicas = ceil(3 * (80 / 75)) = ceil(3 * 1.0667) = 4
- 따라서, HPA는 파드 수를 4개로 늘린다.
Step 1: CPU 사용량이 감소해 현재 CPU 사용률이 40%로 떨어졌다고 가정.
-
파드 수 감소 계산 공식 적용:
- 현재 CPU 사용률: 40%
targetCPUUtilizationPercentage
: 75%
desiredReplicas = ceil(4 * (40 / 75)) = ceil(4 * 0.5333) = 3
-
결과:
- HPA는 파드 수를 4개에서 3개로 줄인다.
Step 2: CPU 사용량이 더 감소해 현재 CPU 사용률이 20%로 떨어졌다고 가정.
-
파드 수 감소 계산 공식 적용:
- 현재 CPU 사용률: 20%
targetCPUUtilizationPercentage
: 75%
desiredReplicas = ceil(3 * (20 / 75)) = ceil(3 * 0.2667) = 1
-
결과:
- HPA는 파드 수를 3개에서 1개로 줄입니다.
- Cool-down 기간:
- Pod 수를 줄이거나 늘릴 때 Cool-down 기간이 필요할 수 있다.
- Cool-down 기간을 통해 스케일링 동작이 빈번하게 발생하는 것을 방지할 수 있다.
- 최소 파드 수:
minReplicas
값은 파드 수가 설정된 최소 값 이하로 줄어들지 않도록 보장한다.
- 운영 중지 파드 결정:
- Pod 수를 줄이는 경우 어느 파드가 중지될지 결정해야 한다.
- Kubernetes는 파드의 라이프사이클 상태, 사용 리소스 등을 기반으로 파드 종료를 결정한다.
-
ceil
함수를 사용해 결과를 올림 처리하여 최종적으로 2개의 파드를 요구한다. -
ceil
은 수학 함수로, 특정 숫자를 올림하여 정수로 반환하는 함수이다. 이 함수를 사용하여 HPA의 파드 수를 계산할 때 최종적으로 필요한 파드 수를 정수로 결정한다.\ -
ceil 함수 설명
ceil
함수는 주어진 소수점 숫자를 올림하여 정수로 반환하는 수학 함수. 이는 특정 수가 소수점 이하 값을 가질 때, 그 수보다 크거나 같은 가장 작은 정수를 반환한다.- 예를 들어,
ceil(1.0667)
은2
를 반환한다. 1.0667
은 소수점 이하 값이 존재하므로, 올림 처리를 위해 가장 작은 정수를 찾는다.1.0667
보다 크거나 같은 가장 작은 정수는2
.
- 예를 들어,
- ceil 함수의 역할:
- HPA에서 파드 수를 계산할 때 소수점이 발생할 수 있으므로 이를 올림하여 최종 파드 수를 정수로 결정한다.
ceil(1.0667) = 2
ceil(2.5) = 3
ceil(3.9) = 4
ceil(-1.1) = -1
{% hint style="info" %} 그래서 resource.request.cpu가 없으면 hpa resource가 ns에 배포되지 않는 것 같다 {% endhint %}
currentMetricValue
는requests
와 직접적인 관계를 갖지는 않지만, 현재 CPU 사용량을requests
값에 대한 백분율로 비교해 계산된다.
-
HPA는 CPU 또는 메모리 requests가 지정되지 않은 경우 작동하지 않을 수 있다.
-
HPA는
resources.requests.cpu
나resources.requests.memory
를 기준으로 계산하기 때문이다. -
만약
resources
섹션이 비어있거나 설정되어 있지 않다면 HPA는currentMetricValue
를 계산할 수 없어 리소스가 생성되지 않는다. -
공식 문서의 관련 내용은 다음과 같다:
{% embed url="https://discuss.kubernetes.io/t/kubernetes-amount-of-pods-vs-amount-of-cpu-requests/17493/2" %}
The Horizontal Pod Autoscaler automatically scales the number of pods in a replication controller, deployment or replica set based on observed CPU utilization (or, with custom metrics support, on some other application-provided metrics).
- CPU 또는 메모리
requests
의 필요성:- HPA가 제대로 작동하려면
requests.cpu
또는requests.memory
를 설정해야 한다. requests
값이 없으면 HPA는 리소스 사용률을 계산할 수 없다.
- HPA가 제대로 작동하려면
{% hint style="info" %}
이 문제도 해결되고 나니 hpa가 배포되었다. 근데 k get top pods
로 리소스를 봤는데
NAME CPU(cores) MEMORY(bytes)
staging-7bddbc6d7-bw87t 1m 108Mi
staging-7bddbc6d7-l4tpw 1m 109Mi staging-7bddbc6d7-lnnqf 1m 106Mi
이렇게 cpu가 1m ( 0.001 코어 ) 밀리코어 가 잡혀있었다
내가 예상했던 건 resources.requests.cpu
에 명시한 cpu를 할당하고 시작하는 줄 알았다
{% endhint %}