@@ -86,31 +86,31 @@ func NewHPARuleAverageUtilizationMemoryPercent(memoryPercentage int32) BuiltinAu
8686 }
8787}
8888
89- func GetBuiltinAutoScaler (builtinRule v1alpha1.BuiltinHPARule ) (BuiltinAutoScaler , int ) {
89+ func GetBuiltinAutoScaler (builtinRule v1alpha1.BuiltinHPARule , res corev1. ResourceRequirements ) (BuiltinAutoScaler , int ) {
9090 switch builtinRule {
9191 case v1alpha1 .AverageUtilizationCPUPercent80 :
92- return NewHPARuleAverageUtilizationCPUPercent (80 ), cpuRuleIdx
92+ return NewHPARuleAverageUtilizationCPUPercent (getUtilizationPercentage ( 80 , getResourceCPUFactor ( res )) ), cpuRuleIdx
9393 case v1alpha1 .AverageUtilizationCPUPercent50 :
94- return NewHPARuleAverageUtilizationCPUPercent (50 ), cpuRuleIdx
94+ return NewHPARuleAverageUtilizationCPUPercent (getUtilizationPercentage ( 50 , getResourceCPUFactor ( res )) ), cpuRuleIdx
9595 case v1alpha1 .AverageUtilizationCPUPercent20 :
96- return NewHPARuleAverageUtilizationCPUPercent (20 ), cpuRuleIdx
96+ return NewHPARuleAverageUtilizationCPUPercent (getUtilizationPercentage ( 20 , getResourceCPUFactor ( res )) ), cpuRuleIdx
9797 case v1alpha1 .AverageUtilizationMemoryPercent80 :
98- return NewHPARuleAverageUtilizationMemoryPercent (80 ), memoryRuleIdx
98+ return NewHPARuleAverageUtilizationMemoryPercent (getUtilizationPercentage ( 80 , getResourceMemoryFactor ( res )) ), memoryRuleIdx
9999 case v1alpha1 .AverageUtilizationMemoryPercent50 :
100- return NewHPARuleAverageUtilizationMemoryPercent (50 ), memoryRuleIdx
100+ return NewHPARuleAverageUtilizationMemoryPercent (getUtilizationPercentage ( 50 , getResourceMemoryFactor ( res )) ), memoryRuleIdx
101101 case v1alpha1 .AverageUtilizationMemoryPercent20 :
102- return NewHPARuleAverageUtilizationMemoryPercent (20 ), memoryRuleIdx
102+ return NewHPARuleAverageUtilizationMemoryPercent (getUtilizationPercentage ( 20 , getResourceMemoryFactor ( res )) ), memoryRuleIdx
103103 default :
104104 return nil , 2
105105 }
106106}
107107
108108// defaultHPAMetrics generates a default HPA Metrics settings based on CPU usage and utilized on 80%.
109- func defaultHPAMetrics () []autov2.MetricSpec {
110- return NewHPARuleAverageUtilizationCPUPercent (80 ).Metrics ()
109+ func defaultHPAMetrics (res corev1. ResourceRequirements ) []autov2.MetricSpec {
110+ return NewHPARuleAverageUtilizationCPUPercent (getUtilizationPercentage ( 80 , getResourceCPUFactor ( res )) ).Metrics ()
111111}
112112
113- func makeDefaultHPA (objectMeta * metav1.ObjectMeta , minReplicas , maxReplicas int32 , targetRef autov2.CrossVersionObjectReference ) * autov2.HorizontalPodAutoscaler {
113+ func makeDefaultHPA (objectMeta * metav1.ObjectMeta , minReplicas , maxReplicas int32 , targetRef autov2.CrossVersionObjectReference , res corev1. ResourceRequirements ) * autov2.HorizontalPodAutoscaler {
114114 return & autov2.HorizontalPodAutoscaler {
115115 TypeMeta : metav1.TypeMeta {
116116 APIVersion : "autoscaling/v2" ,
@@ -121,7 +121,7 @@ func makeDefaultHPA(objectMeta *metav1.ObjectMeta, minReplicas, maxReplicas int3
121121 ScaleTargetRef : targetRef ,
122122 MinReplicas : & minReplicas ,
123123 MaxReplicas : maxReplicas ,
124- Metrics : defaultHPAMetrics (),
124+ Metrics : defaultHPAMetrics (res ),
125125 },
126126 }
127127}
@@ -131,11 +131,11 @@ const (
131131 memoryRuleIdx
132132)
133133
134- func MakeMetricsFromBuiltinHPARules (builtinRules []v1alpha1.BuiltinHPARule ) []autov2.MetricSpec {
134+ func MakeMetricsFromBuiltinHPARules (builtinRules []v1alpha1.BuiltinHPARule , res corev1. ResourceRequirements ) []autov2.MetricSpec {
135135 isRuleExists := map [int ]bool {}
136136 metrics := []autov2.MetricSpec {}
137137 for _ , r := range builtinRules {
138- s , idx := GetBuiltinAutoScaler (r )
138+ s , idx := GetBuiltinAutoScaler (r , res )
139139 if s != nil {
140140 if isRuleExists [idx ] {
141141 continue
@@ -147,8 +147,8 @@ func MakeMetricsFromBuiltinHPARules(builtinRules []v1alpha1.BuiltinHPARule) []au
147147 return metrics
148148}
149149
150- func makeBuiltinHPA (objectMeta * metav1.ObjectMeta , minReplicas , maxReplicas int32 , targetRef autov2.CrossVersionObjectReference , builtinRules []v1alpha1.BuiltinHPARule ) * autov2.HorizontalPodAutoscaler {
151- metrics := MakeMetricsFromBuiltinHPARules (builtinRules )
150+ func makeBuiltinHPA (objectMeta * metav1.ObjectMeta , minReplicas , maxReplicas int32 , targetRef autov2.CrossVersionObjectReference , builtinRules []v1alpha1.BuiltinHPARule , res corev1. ResourceRequirements ) * autov2.HorizontalPodAutoscaler {
151+ metrics := MakeMetricsFromBuiltinHPARules (builtinRules , res )
152152 return & autov2.HorizontalPodAutoscaler {
153153 TypeMeta : metav1.TypeMeta {
154154 APIVersion : "autoscaling/v2" ,
@@ -182,11 +182,33 @@ func makeHPA(objectMeta *metav1.ObjectMeta, minReplicas, maxReplicas int32, podP
182182 }
183183}
184184
185- func MakeHPA (objectMeta * metav1.ObjectMeta , targetRef autov2.CrossVersionObjectReference , minReplicas , maxReplicas * int32 , policy v1alpha1.PodPolicy ) * autov2.HorizontalPodAutoscaler {
185+ func MakeHPA (objectMeta * metav1.ObjectMeta , targetRef autov2.CrossVersionObjectReference , minReplicas , maxReplicas * int32 , policy v1alpha1.PodPolicy , res corev1. ResourceRequirements ) * autov2.HorizontalPodAutoscaler {
186186 if isBuiltinHPAEnabled (minReplicas , maxReplicas , policy ) {
187- return makeBuiltinHPA (objectMeta , * minReplicas , * maxReplicas , targetRef , policy .BuiltinAutoscaler )
187+ return makeBuiltinHPA (objectMeta , * minReplicas , * maxReplicas , targetRef , policy .BuiltinAutoscaler , res )
188188 } else if ! isDefaultHPAEnabled (minReplicas , maxReplicas , policy ) {
189189 return makeHPA (objectMeta , * minReplicas , * maxReplicas , policy , targetRef )
190190 }
191- return makeDefaultHPA (objectMeta , * minReplicas , * maxReplicas , targetRef )
191+ return makeDefaultHPA (objectMeta , * minReplicas , * maxReplicas , targetRef , res )
192+ }
193+
194+ func getResourceCPUFactor (res corev1.ResourceRequirements ) float64 {
195+ if res .Requests .Cpu () != nil && res .Limits .Cpu () != nil {
196+ if ! res .Requests .Cpu ().IsZero () && ! res .Limits .Cpu ().IsZero () {
197+ return float64 (res .Limits .Cpu ().MilliValue ()) / float64 (res .Requests .Cpu ().MilliValue ())
198+ }
199+ }
200+ return 1.0
201+ }
202+
203+ func getResourceMemoryFactor (res corev1.ResourceRequirements ) float64 {
204+ if res .Requests .Memory () != nil && res .Limits .Memory () != nil {
205+ if ! res .Requests .Memory ().IsZero () && ! res .Limits .Memory ().IsZero () {
206+ return float64 (res .Limits .Memory ().Value ()) / float64 (res .Requests .Memory ().Value ())
207+ }
208+ }
209+ return 1.0
210+ }
211+
212+ func getUtilizationPercentage (val int32 , factor float64 ) int32 {
213+ return int32 (float64 (val ) * factor )
192214}
0 commit comments