Skip to content

Commit b145894

Browse files
authored
update HPA correctly when changing the spec (#372)
1 parent 3bfe391 commit b145894

File tree

6 files changed

+22
-17
lines changed

6 files changed

+22
-17
lines changed

api/autoscaling/v2/webhook_suite_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ var _ = BeforeSuite(func() {
164164
eventRecorder := mgr.GetEventRecorderFor("tortoise-controller")
165165
tortoiseService, err := tortoise.New(mgr.GetClient(), eventRecorder, config.RangeOfMinMaxReplicasRecommendationHours, config.TimeZone, config.TortoiseUpdateInterval, config.GatheringDataPeriodType)
166166
Expect(err).NotTo(HaveOccurred())
167-
hpaService, err := hpa.New(mgr.GetClient(), eventRecorder, config.ReplicaReductionFactor, config.MaximumTargetResourceUtilization, 100, time.Hour, 1000, 10000, "")
167+
hpaService, err := hpa.New(mgr.GetClient(), eventRecorder, config.ReplicaReductionFactor, config.MaximumTargetResourceUtilization, 100, time.Hour, 1000, 10000, 3, "")
168168
Expect(err).NotTo(HaveOccurred())
169169

170170
hpaWebhook := New(tortoiseService, hpaService)

controllers/tortoise_controller_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,7 @@ func startController(ctx context.Context) func() {
245245
Expect(err).ShouldNot(HaveOccurred())
246246
cli, err := vpa.New(mgr.GetConfig(), recorder)
247247
Expect(err).ShouldNot(HaveOccurred())
248-
hpaS, err := hpa.New(mgr.GetClient(), recorder, 0.95, 90, 25, time.Hour, 1000, 10000, ".*-exclude-metric")
248+
hpaS, err := hpa.New(mgr.GetClient(), recorder, 0.95, 90, 25, time.Hour, 1000, 10000, 3, ".*-exclude-metric")
249249
Expect(err).ShouldNot(HaveOccurred())
250250
reconciler := &TortoiseReconciler{
251251
Scheme: scheme,

main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ func main() {
155155
os.Exit(1)
156156
}
157157

158-
hpaService, err := hpa.New(mgr.GetClient(), eventRecorder, config.ReplicaReductionFactor, config.MaximumTargetResourceUtilization, config.HPATargetUtilizationMaxIncrease, config.HPATargetUtilizationUpdateInterval, config.MaximumMinReplicas, config.MaximumMaxReplicas, config.HPAExternalMetricExclusionRegex)
158+
hpaService, err := hpa.New(mgr.GetClient(), eventRecorder, config.ReplicaReductionFactor, config.MaximumTargetResourceUtilization, config.HPATargetUtilizationMaxIncrease, config.HPATargetUtilizationUpdateInterval, config.MaximumMinReplicas, config.MaximumMaxReplicas, int32(config.MinimumMinReplicas), config.HPAExternalMetricExclusionRegex)
159159
if err != nil {
160160
setupLog.Error(err, "unable to start hpa service")
161161
os.Exit(1)

pkg/hpa/service.go

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ type Service struct {
3737
tortoiseHPATargetUtilizationMaxIncrease int
3838
recorder record.EventRecorder
3939
tortoiseHPATargetUtilizationUpdateInterval time.Duration
40+
minimumMinReplicas int32
4041
maximumMinReplica int32
4142
maximumMaxReplica int32
4243
externalMetricExclusionRegex *regexp.Regexp
@@ -50,6 +51,7 @@ func New(
5051
tortoiseHPATargetUtilizationMaxIncrease int,
5152
tortoiseHPATargetUtilizationUpdateInterval time.Duration,
5253
maximumMinReplica, maximumMaxReplica int32,
54+
minimumMinReplicas int32,
5355
externalMetricExclusionRegex string,
5456
) (*Service, error) {
5557
var regex *regexp.Regexp
@@ -70,6 +72,7 @@ func New(
7072
recorder: recorder,
7173
tortoiseHPATargetUtilizationUpdateInterval: tortoiseHPATargetUtilizationUpdateInterval,
7274
maximumMinReplica: maximumMinReplica,
75+
minimumMinReplicas: minimumMinReplicas,
7376
maximumMaxReplica: maximumMaxReplica,
7477
externalMetricExclusionRegex: regex,
7578
}, nil
@@ -256,8 +259,8 @@ func (c *Service) CreateHPA(ctx context.Context, tortoise *autoscalingv1beta3.To
256259
Name: tortoise.Spec.TargetRefs.ScaleTargetRef.Name,
257260
APIVersion: tortoise.Spec.TargetRefs.ScaleTargetRef.APIVersion,
258261
},
259-
MinReplicas: ptr.To[int32](int32(math.Ceil(float64(replicaNum) / 2.0))),
260-
MaxReplicas: replicaNum * 2,
262+
MinReplicas: ptr.To[int32](c.minimumMinReplicas),
263+
MaxReplicas: c.maximumMaxReplica,
261264
Behavior: globalRecommendedHPABehavior,
262265
},
263266
}
@@ -513,6 +516,7 @@ func (c *Service) UpdateHPASpecFromTortoiseAutoscalingPolicy(
513516
c.recorder.Event(tortoise, corev1.EventTypeNormal, event.HPACreated, fmt.Sprintf("Initialized a HPA %s/%s because tortoise has resource to scale horizontally", tortoise.Namespace, tortoise.Status.Targets.HorizontalPodAutoscaler))
514517
return tortoise, nil
515518
}
519+
516520
return tortoise, fmt.Errorf("failed to get hpa on tortoise: %w", err)
517521
}
518522

@@ -530,9 +534,10 @@ func (c *Service) UpdateHPASpecFromTortoiseAutoscalingPolicy(
530534
return fmt.Errorf("failed to get hpa on tortoise: %w", err)
531535
}
532536

537+
// update only metrics
533538
hpa.Spec.Metrics = newhpa.Spec.Metrics
534539

535-
return c.c.Update(ctx, newhpa)
540+
return c.c.Update(ctx, hpa)
536541
}
537542

538543
if err := retry.RetryOnConflict(retry.DefaultRetry, updateFn); err != nil {

pkg/hpa/service_test.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2290,7 +2290,7 @@ func TestClient_UpdateHPAFromTortoiseRecommendation(t *testing.T) {
22902290

22912291
for _, tt := range tests {
22922292
t.Run(tt.name, func(t *testing.T) {
2293-
c, err := New(fake.NewClientBuilder().WithRuntimeObjects(tt.initialHPA).Build(), record.NewFakeRecorder(10), 0.95, 90, 50, time.Hour, 1000, 10001, tt.excludeMetricRegex)
2293+
c, err := New(fake.NewClientBuilder().WithRuntimeObjects(tt.initialHPA).Build(), record.NewFakeRecorder(10), 0.95, 90, 50, time.Hour, 1000, 10001, 3, tt.excludeMetricRegex)
22942294
if err != nil {
22952295
t.Fatalf("New() error = %v", err)
22962296
}
@@ -2371,8 +2371,8 @@ func TestService_InitializeHPA(t *testing.T) {
23712371
Namespace: "default",
23722372
},
23732373
Spec: v2.HorizontalPodAutoscalerSpec{
2374-
MinReplicas: ptrInt32(2),
2375-
MaxReplicas: 8,
2374+
MinReplicas: ptrInt32(3),
2375+
MaxReplicas: 1000,
23762376
Metrics: []v2.MetricSpec{
23772377
{
23782378
Type: v2.ContainerResourceMetricSourceType,
@@ -2513,12 +2513,12 @@ func TestService_InitializeHPA(t *testing.T) {
25132513
}
25142514
for _, tt := range tests {
25152515
t.Run(tt.name, func(t *testing.T) {
2516-
c, err := New(fake.NewClientBuilder().Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 100, 1000, "")
2516+
c, err := New(fake.NewClientBuilder().Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 100, 1000, 3, "")
25172517
if err != nil {
25182518
t.Fatalf("New() error = %v", err)
25192519
}
25202520
if tt.initialHPA != nil {
2521-
c, err = New(fake.NewClientBuilder().WithRuntimeObjects(tt.initialHPA).Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 100, 1000, "")
2521+
c, err = New(fake.NewClientBuilder().WithRuntimeObjects(tt.initialHPA).Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 100, 1000, 3, "")
25222522
if err != nil {
25232523
t.Fatalf("New() error = %v", err)
25242524
}
@@ -4071,12 +4071,12 @@ func TestService_UpdateHPASpecFromTortoiseAutoscalingPolicy(t *testing.T) {
40714071
}
40724072
for _, tt := range tests {
40734073
t.Run(tt.name, func(t *testing.T) {
4074-
c, err := New(fake.NewClientBuilder().Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 1000, 10000, "")
4074+
c, err := New(fake.NewClientBuilder().Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 1000, 10000, 3, "")
40754075
if err != nil {
40764076
t.Fatalf("New() error = %v", err)
40774077
}
40784078
if tt.initialHPA != nil {
4079-
c, err = New(fake.NewClientBuilder().WithRuntimeObjects(tt.initialHPA).Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 1000, 10000, "")
4079+
c, err = New(fake.NewClientBuilder().WithRuntimeObjects(tt.initialHPA).Build(), record.NewFakeRecorder(10), 0.95, 90, 100, time.Hour, 1000, 10000, 3, "")
40804080
if err != nil {
40814081
t.Fatalf("New() error = %v", err)
40824082
}

pkg/recommender/recommender.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ type Service struct {
4747
}
4848

4949
func New(
50-
MaxReplicasRecommendationMultiplier float64,
51-
MinReplicasRecommendationMultiplier float64,
50+
maxReplicasRecommendationMultiplier float64,
51+
minReplicasRecommendationMultiplier float64,
5252
maximumTargetResourceUtilization int,
5353
minimumTargetResourceUtilization int,
5454
minimumMinReplicas int,
@@ -83,8 +83,8 @@ func New(
8383

8484
return &Service{
8585
eventRecorder: eventRecorder,
86-
MaxReplicasRecommendationMultiplier: MaxReplicasRecommendationMultiplier,
87-
MinReplicasRecommendationMultiplier: MinReplicasRecommendationMultiplier,
86+
MaxReplicasRecommendationMultiplier: maxReplicasRecommendationMultiplier,
87+
MinReplicasRecommendationMultiplier: minReplicasRecommendationMultiplier,
8888
maximumTargetResourceUtilization: int32(maximumTargetResourceUtilization),
8989
minimumTargetResourceUtilization: int32(minimumTargetResourceUtilization),
9090
minimumMinReplicas: int32(minimumMinReplicas),

0 commit comments

Comments
 (0)