Skip to content

Commit c6d2f0d

Browse files
committed
feat: add new spot allocation strategies
This commit adds two new spot allocation strategies: capacity-optimized-prioritized and price-capacity-optimized.
1 parent 15109f8 commit c6d2f0d

File tree

4 files changed

+52
-3
lines changed

4 files changed

+52
-3
lines changed

config/crd/bases/infrastructure.cluster.x-k8s.io_awsmachinepools.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,8 @@ spec:
747747
enum:
748748
- lowest-price
749749
- capacity-optimized
750+
- capacity-optimized-prioritized
751+
- price-capacity-optimized
750752
type: string
751753
type: object
752754
overrides:

exp/api/v1beta2/types.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,16 @@ var (
151151
// SpotAllocationStrategyCapacityOptimized will make the Auto Scaling group launch
152152
// instances using Spot pools that are optimally chosen based on the available Spot capacity.
153153
SpotAllocationStrategyCapacityOptimized = SpotAllocationStrategy("capacity-optimized")
154+
155+
// SpotAllocationStrategyCapacityOptimizedPrioritized will make the Auto Scaling group launch
156+
// instances using Spot pools that are optimally chosen based on the available Spot capacity
157+
// while also taking into account the priority order specified by the user for Instance Types.
158+
SpotAllocationStrategyCapacityOptimizedPrioritized = SpotAllocationStrategy("capacity-optimized-prioritized")
159+
160+
// SpotAllocationStrategyPriceCapacityOptimized will make the Auto Scaling group launch
161+
// instances using Spot pools that consider both price and available Spot capacity to
162+
// provide a balance between cost savings and allocation reliability.
163+
SpotAllocationStrategyPriceCapacityOptimized = SpotAllocationStrategy("price-capacity-optimized")
154164
)
155165

156166
// InstancesDistribution to configure distribution of On-Demand Instances and Spot Instances.
@@ -159,7 +169,7 @@ type InstancesDistribution struct {
159169
// +kubebuilder:default=prioritized
160170
OnDemandAllocationStrategy OnDemandAllocationStrategy `json:"onDemandAllocationStrategy,omitempty"`
161171

162-
// +kubebuilder:validation:Enum=lowest-price;capacity-optimized
172+
// +kubebuilder:validation:Enum=lowest-price;capacity-optimized;capacity-optimized-prioritized;price-capacity-optimized
163173
// +kubebuilder:default=lowest-price
164174
SpotAllocationStrategy SpotAllocationStrategy `json:"spotAllocationStrategy,omitempty"`
165175

pkg/cloud/services/autoscaling/autoscalinggroup.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,17 @@ func (s *Service) SDKToAutoScalingGroup(v *autoscaling.Group) (*expinfrav1.AutoS
7070
}
7171

7272
spotAllocationStrategy := aws.StringValue(v.MixedInstancesPolicy.InstancesDistribution.SpotAllocationStrategy)
73-
if spotAllocationStrategy == string(expinfrav1.SpotAllocationStrategyLowestPrice) {
73+
switch spotAllocationStrategy {
74+
case string(expinfrav1.SpotAllocationStrategyLowestPrice):
7475
i.MixedInstancesPolicy.InstancesDistribution.SpotAllocationStrategy = expinfrav1.SpotAllocationStrategyLowestPrice
75-
} else {
76+
case string(expinfrav1.SpotAllocationStrategyCapacityOptimized):
7677
i.MixedInstancesPolicy.InstancesDistribution.SpotAllocationStrategy = expinfrav1.SpotAllocationStrategyCapacityOptimized
78+
case string(expinfrav1.SpotAllocationStrategyCapacityOptimizedPrioritized):
79+
i.MixedInstancesPolicy.InstancesDistribution.SpotAllocationStrategy = expinfrav1.SpotAllocationStrategyCapacityOptimizedPrioritized
80+
case string(expinfrav1.SpotAllocationStrategyPriceCapacityOptimized):
81+
i.MixedInstancesPolicy.InstancesDistribution.SpotAllocationStrategy = expinfrav1.SpotAllocationStrategyPriceCapacityOptimized
82+
default:
83+
return nil, fmt.Errorf("unsupported spot allocation strategy: %s", spotAllocationStrategy)
7784
}
7885
}
7986

pkg/cloud/services/autoscaling/autoscalinggroup_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ func TestServiceGetASGByName(t *testing.T) {
9797
MixedInstancesPolicy: &autoscaling.MixedInstancesPolicy{
9898
InstancesDistribution: &autoscaling.InstancesDistribution{
9999
OnDemandAllocationStrategy: aws.String("prioritized"),
100+
SpotAllocationStrategy: aws.String("price-capacity-optimized"),
100101
},
101102
LaunchTemplate: &autoscaling.LaunchTemplate{},
102103
},
@@ -301,6 +302,34 @@ func TestServiceSDKToAutoScalingGroup(t *testing.T) {
301302
},
302303
wantErr: false,
303304
},
305+
{
306+
name: "invalid input - incorrect spot allocation strategy",
307+
input: &autoscaling.Group{
308+
AutoScalingGroupARN: aws.String("test-id"),
309+
AutoScalingGroupName: aws.String("test-name"),
310+
DesiredCapacity: aws.Int64(1234),
311+
MaxSize: aws.Int64(1234),
312+
MinSize: aws.Int64(1234),
313+
CapacityRebalance: aws.Bool(true),
314+
MixedInstancesPolicy: &autoscaling.MixedInstancesPolicy{
315+
InstancesDistribution: &autoscaling.InstancesDistribution{
316+
OnDemandAllocationStrategy: aws.String("prioritized"),
317+
OnDemandBaseCapacity: aws.Int64(1234),
318+
OnDemandPercentageAboveBaseCapacity: aws.Int64(1234),
319+
SpotAllocationStrategy: aws.String("INVALIDSPOTALLOCATIONSTRATEGY"),
320+
},
321+
LaunchTemplate: &autoscaling.LaunchTemplate{
322+
Overrides: []*autoscaling.LaunchTemplateOverrides{
323+
{
324+
InstanceType: aws.String("t2.medium"),
325+
WeightedCapacity: aws.String("test-weighted-cap"),
326+
},
327+
},
328+
},
329+
},
330+
},
331+
wantErr: true,
332+
},
304333
}
305334
for _, tt := range tests {
306335
t.Run(tt.name, func(t *testing.T) {
@@ -381,6 +410,7 @@ func TestServiceASGIfExists(t *testing.T) {
381410
MixedInstancesPolicy: &autoscaling.MixedInstancesPolicy{
382411
InstancesDistribution: &autoscaling.InstancesDistribution{
383412
OnDemandAllocationStrategy: aws.String("prioritized"),
413+
SpotAllocationStrategy: aws.String("price-capacity-optimized"),
384414
},
385415
LaunchTemplate: &autoscaling.LaunchTemplate{},
386416
},

0 commit comments

Comments
 (0)