Skip to content

Commit 6d5d463

Browse files
authored
feat: influence AZ selection with env hint (#699)
1 parent e4827b7 commit 6d5d463

File tree

4 files changed

+51
-3
lines changed

4 files changed

+51
-3
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package eksapi
2+
3+
import (
4+
"os"
5+
"slices"
6+
"strings"
7+
)
8+
9+
const AvailabilityZonePriorityEnv = "EKSAPI_AZ_PRIORITY"
10+
11+
func availabilityZoneHintedOrder(availabilityZones []string) []string {
12+
var priorityAZs []string
13+
if priorityAZsString, ok := os.LookupEnv(AvailabilityZonePriorityEnv); ok {
14+
priorityAZs = strings.Split(priorityAZsString, ",")
15+
}
16+
if len(priorityAZs) == 0 {
17+
return availabilityZones
18+
}
19+
return slices.SortedStableFunc(slices.Values(availabilityZones), func(az1, az2 string) int {
20+
if slices.Contains(priorityAZs, az1) {
21+
if slices.Contains(priorityAZs, az2) {
22+
return 0
23+
}
24+
return -1
25+
}
26+
return 0
27+
})
28+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package eksapi
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func Test_AZ_PRIORITY(t *testing.T) {
10+
t.Setenv(AvailabilityZonePriorityEnv, "us-west-2d")
11+
assert.Equal(t,
12+
[]string{"us-west-2d", "us-west-2b", "us-west-2c"},
13+
availabilityZoneHintedOrder([]string{"us-west-2b", "us-west-2c", "us-west-2d"}),
14+
)
15+
}

internal/deployers/eksapi/infra.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,8 @@ func (m *InfrastructureManager) normalizeAZs(opts *deployerOptions, subnetAZs []
416416
}
417417
}
418418

419+
// enforce users' preferred ordering over AZs
420+
filteredAZs = availabilityZoneHintedOrder(filteredAZs)
419421
// truncate the list if we went over the max
420422
filteredAZs = filteredAZs[:min(len(filteredAZs), expectedCount)]
421423

internal/deployers/eksapi/node.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -699,8 +699,12 @@ func (m *nodeManager) getValidAvailabilityZonesFilter(opts *deployerOptions, inf
699699
if describeResponse == nil || len(describeResponse.InstanceTypeOfferings) == 0 {
700700
return nil, fmt.Errorf("no instance type offerings in current region with filters %v", describeFilters)
701701
}
702+
var candidateAZs []string
703+
for _, offering := range describeResponse.InstanceTypeOfferings {
704+
candidateAZs = append(candidateAZs, aws.ToString(offering.Location))
705+
}
702706
// EFA traffic cannot cross an AZ https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html#efa-limits
703-
targetAZ := aws.ToString(describeResponse.InstanceTypeOfferings[0].Location)
707+
targetAZ := availabilityZoneHintedOrder(candidateAZs)[0]
704708
klog.Infof("Found availability zone %q with offering for instance types %v", targetAZ, opts.InstanceTypes)
705709
return []string{targetAZ}, nil
706710
}
@@ -718,8 +722,7 @@ func (m *nodeManager) getValidSubnets(opts *deployerOptions, infra *Infrastructu
718722
describeFilters = append(describeFilters, ec2types.Filter{
719723
Name: aws.String("availability-zone"),
720724
Values: availabilityZoneFilter,
721-
},
722-
)
725+
})
723726
}
724727
describeResponse, err := m.clients.EC2().DescribeSubnets(context.TODO(), &ec2.DescribeSubnetsInput{
725728
Filters: describeFilters,

0 commit comments

Comments
 (0)