Skip to content

Commit eb9e371

Browse files
authored
making hpa utlization with factor (#795)
* making hpa utlization with factor * fix style
1 parent f2e04fc commit eb9e371

File tree

5 files changed

+44
-22
lines changed

5 files changed

+44
-22
lines changed

controllers/function_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ func createFunction(function *v1alpha1.Function) {
286286
if len(function.Spec.Pod.BuiltinAutoscaler) > 0 {
287287
Expect(len(hpa.Spec.Metrics)).Should(Equal(len(function.Spec.Pod.BuiltinAutoscaler)))
288288
for _, rule := range function.Spec.Pod.BuiltinAutoscaler {
289-
autoscaler, _ := spec.GetBuiltinAutoScaler(rule)
289+
autoscaler, _ := spec.GetBuiltinAutoScaler(rule, function.Spec.Resources)
290290
Expect(autoscaler).Should(Not(BeNil()))
291291
Expect(hpa.Spec.Metrics).Should(ContainElement(autoscaler.Metrics()[0]))
292292
}

controllers/spec/function.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ func MakeFunctionHPA(function *v1alpha1.Function) *autov2.HorizontalPodAutoscale
4343
Name: function.Name,
4444
APIVersion: function.APIVersion,
4545
}
46-
return MakeHPA(objectMeta, targetRef, function.Spec.MinReplicas, function.Spec.MaxReplicas, function.Spec.Pod)
46+
return MakeHPA(objectMeta, targetRef, function.Spec.MinReplicas, function.Spec.MaxReplicas, function.Spec.Pod, function.Spec.Resources)
4747
}
4848

4949
func MakeFunctionService(function *v1alpha1.Function) *corev1.Service {

controllers/spec/hpa.go

Lines changed: 40 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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
}

controllers/spec/sink.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ func MakeSinkHPA(sink *v1alpha1.Sink) *autov2.HorizontalPodAutoscaler {
4040
Name: sink.Name,
4141
APIVersion: sink.APIVersion,
4242
}
43-
return MakeHPA(objectMeta, targetRef, sink.Spec.MinReplicas, sink.Spec.MaxReplicas, sink.Spec.Pod)
43+
return MakeHPA(objectMeta, targetRef, sink.Spec.MinReplicas, sink.Spec.MaxReplicas, sink.Spec.Pod, sink.Spec.Resources)
4444
}
4545

4646
func MakeSinkService(sink *v1alpha1.Sink) *corev1.Service {

controllers/spec/source.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func MakeSourceHPA(source *v1alpha1.Source) *autov2.HorizontalPodAutoscaler {
4141
Name: source.Name,
4242
APIVersion: source.APIVersion,
4343
}
44-
return MakeHPA(objectMeta, targetRef, source.Spec.MinReplicas, source.Spec.MaxReplicas, source.Spec.Pod)
44+
return MakeHPA(objectMeta, targetRef, source.Spec.MinReplicas, source.Spec.MaxReplicas, source.Spec.Pod, source.Spec.Resources)
4545
}
4646

4747
func MakeSourceService(source *v1alpha1.Source) *corev1.Service {

0 commit comments

Comments
 (0)