Skip to content

Commit 4982070

Browse files
authored
Restrict subnet auto-discovery to new LB (#2125)
1 parent 9f4eae5 commit 4982070

File tree

4 files changed

+585
-19
lines changed

4 files changed

+585
-19
lines changed

controllers/ingress/group_controller.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import (
1616
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws"
1717
"sigs.k8s.io/aws-load-balancer-controller/pkg/config"
1818
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy"
19+
elbv2deploy "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/elbv2"
20+
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
1921
"sigs.k8s.io/aws-load-balancer-controller/pkg/ingress"
2022
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
2123
"sigs.k8s.io/aws-load-balancer-controller/pkg/model/core"
@@ -48,10 +50,12 @@ func NewGroupReconciler(cloud aws.Cloud, k8sClient client.Client, eventRecorder
4850
authConfigBuilder := ingress.NewDefaultAuthConfigBuilder(annotationParser)
4951
enhancedBackendBuilder := ingress.NewDefaultEnhancedBackendBuilder(k8sClient, annotationParser, authConfigBuilder)
5052
referenceIndexer := ingress.NewDefaultReferenceIndexer(enhancedBackendBuilder, authConfigBuilder, logger)
53+
trackingProvider := tracking.NewDefaultProvider(ingressTagPrefix, config.ClusterName)
54+
elbv2TaggingManager := elbv2deploy.NewDefaultTaggingManager(cloud.ELBV2(), logger)
5155
modelBuilder := ingress.NewDefaultModelBuilder(k8sClient, eventRecorder,
5256
cloud.EC2(), cloud.ACM(),
5357
annotationParser, subnetsResolver,
54-
authConfigBuilder, enhancedBackendBuilder,
58+
authConfigBuilder, enhancedBackendBuilder, trackingProvider, elbv2TaggingManager,
5559
cloud.VpcID(), config.ClusterName, config.DefaultTags, config.ExternalManagedTags,
5660
config.DefaultSSLPolicy, logger)
5761
stackMarshaller := deploy.NewDefaultStackMarshaller()

pkg/ingress/model_build_load_balancer.go

Lines changed: 42 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/hex"
77
"fmt"
88
"regexp"
9+
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
910
"strings"
1011

1112
awssdk "github.com/aws/aws-sdk-go/aws"
@@ -189,32 +190,48 @@ func (t *defaultModelBuildTask) buildLoadBalancerSubnetMappings(ctx context.Cont
189190
explicitSubnetNameOrIDsList = append(explicitSubnetNameOrIDsList, rawSubnetNameOrIDs)
190191
}
191192

192-
if len(explicitSubnetNameOrIDsList) == 0 {
193-
chosenSubnets, err := t.subnetsResolver.ResolveViaDiscovery(ctx,
193+
if len(explicitSubnetNameOrIDsList) != 0 {
194+
chosenSubnetNameOrIDs := explicitSubnetNameOrIDsList[0]
195+
for _, subnetNameOrIDs := range explicitSubnetNameOrIDsList[1:] {
196+
// subnetNameOrIDs order doesn't matter
197+
if !cmp.Equal(chosenSubnetNameOrIDs, subnetNameOrIDs, equality.IgnoreStringSliceOrder()) {
198+
return nil, errors.Errorf("conflicting subnets: %v | %v", chosenSubnetNameOrIDs, subnetNameOrIDs)
199+
}
200+
}
201+
chosenSubnets, err := t.subnetsResolver.ResolveViaNameOrIDSlice(ctx, chosenSubnetNameOrIDs,
194202
networking.WithSubnetsResolveLBType(elbv2model.LoadBalancerTypeApplication),
195203
networking.WithSubnetsResolveLBScheme(scheme),
196204
)
197205
if err != nil {
198-
return nil, errors.Wrap(err, "couldn't auto-discover subnets")
206+
return nil, err
199207
}
200208
return buildLoadBalancerSubnetMappingsWithSubnets(chosenSubnets), nil
201209
}
210+
stackTags := t.trackingProvider.StackTags(t.stack)
202211

203-
chosenSubnetNameOrIDs := explicitSubnetNameOrIDsList[0]
204-
for _, subnetNameOrIDs := range explicitSubnetNameOrIDsList[1:] {
205-
// subnetNameOrIDs orders doesn't matter.
206-
if !cmp.Equal(chosenSubnetNameOrIDs, subnetNameOrIDs, equality.IgnoreStringSliceOrder()) {
207-
return nil, errors.Errorf("conflicting subnets: %v | %v", chosenSubnetNameOrIDs, subnetNameOrIDs)
208-
}
209-
}
210-
chosenSubnets, err := t.subnetsResolver.ResolveViaNameOrIDSlice(ctx, chosenSubnetNameOrIDs,
211-
networking.WithSubnetsResolveLBType(elbv2model.LoadBalancerTypeApplication),
212-
networking.WithSubnetsResolveLBScheme(scheme),
213-
)
212+
sdkLBs, err := t.elbv2TaggingManager.ListLoadBalancers(ctx, tracking.TagsAsTagFilter(stackTags))
214213
if err != nil {
215214
return nil, err
216215
}
217-
return buildLoadBalancerSubnetMappingsWithSubnets(chosenSubnets), nil
216+
217+
if len(sdkLBs) == 0 {
218+
chosenSubnets, err := t.subnetsResolver.ResolveViaDiscovery(ctx,
219+
networking.WithSubnetsResolveLBType(elbv2model.LoadBalancerTypeApplication),
220+
networking.WithSubnetsResolveLBScheme(scheme),
221+
)
222+
if err != nil {
223+
return nil, errors.Wrap(err, "couldn't auto-discover subnets")
224+
}
225+
return buildLoadBalancerSubnetMappingsWithSubnets(chosenSubnets), nil
226+
}
227+
228+
availabilityZones := sdkLBs[0].LoadBalancer.AvailabilityZones
229+
subnetIDs := make([]string, 0, len(availabilityZones))
230+
for _, availabilityZone := range availabilityZones {
231+
subnetID := awssdk.StringValue(availabilityZone.SubnetId)
232+
subnetIDs = append(subnetIDs, subnetID)
233+
}
234+
return buildLoadBalancerSubnetMappingsWithSubnetIDs(subnetIDs), nil
218235
}
219236

220237
func (t *defaultModelBuildTask) buildLoadBalancerSecurityGroups(ctx context.Context, listenPortConfigByPort map[int64]listenPortConfig, ipAddressType elbv2model.IPAddressType) ([]core.StringToken, error) {
@@ -368,3 +385,13 @@ func buildLoadBalancerSubnetMappingsWithSubnets(subnets []*ec2sdk.Subnet) []elbv
368385
}
369386
return subnetMappings
370387
}
388+
389+
func buildLoadBalancerSubnetMappingsWithSubnetIDs(subnetIDs []string) []elbv2model.SubnetMapping {
390+
subnetMappings := make([]elbv2model.SubnetMapping, 0, len(subnetIDs))
391+
for _, subnetID := range subnetIDs {
392+
subnetMappings = append(subnetMappings, elbv2model.SubnetMapping{
393+
SubnetID: subnetID,
394+
})
395+
}
396+
return subnetMappings
397+
}

pkg/ingress/model_builder.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"k8s.io/client-go/tools/record"
1313
"sigs.k8s.io/aws-load-balancer-controller/pkg/annotations"
1414
"sigs.k8s.io/aws-load-balancer-controller/pkg/aws/services"
15+
elbv2deploy "sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/elbv2"
16+
"sigs.k8s.io/aws-load-balancer-controller/pkg/deploy/tracking"
1517
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
1618
"sigs.k8s.io/aws-load-balancer-controller/pkg/model/core"
1719
ec2model "sigs.k8s.io/aws-load-balancer-controller/pkg/model/ec2"
@@ -31,6 +33,7 @@ func NewDefaultModelBuilder(k8sClient client.Client, eventRecorder record.EventR
3133
ec2Client services.EC2, acmClient services.ACM,
3234
annotationParser annotations.Parser, subnetsResolver networkingpkg.SubnetsResolver,
3335
authConfigBuilder AuthConfigBuilder, enhancedBackendBuilder EnhancedBackendBuilder,
36+
trackingProvider tracking.Provider, elbv2TaggingManager elbv2deploy.TaggingManager,
3437
vpcID string, clusterName string, defaultTags map[string]string, externalManagedTags []string, defaultSSLPolicy string,
3538
logger logr.Logger) *defaultModelBuilder {
3639
certDiscovery := NewACMCertDiscovery(acmClient, logger)
@@ -47,6 +50,8 @@ func NewDefaultModelBuilder(k8sClient client.Client, eventRecorder record.EventR
4750
authConfigBuilder: authConfigBuilder,
4851
enhancedBackendBuilder: enhancedBackendBuilder,
4952
ruleOptimizer: ruleOptimizer,
53+
trackingProvider: trackingProvider,
54+
elbv2TaggingManager: elbv2TaggingManager,
5055
defaultTags: defaultTags,
5156
externalManagedTags: sets.NewString(externalManagedTags...),
5257
defaultSSLPolicy: defaultSSLPolicy,
@@ -71,6 +76,8 @@ type defaultModelBuilder struct {
7176
authConfigBuilder AuthConfigBuilder
7277
enhancedBackendBuilder EnhancedBackendBuilder
7378
ruleOptimizer RuleOptimizer
79+
trackingProvider tracking.Provider
80+
elbv2TaggingManager elbv2deploy.TaggingManager
7481
defaultTags map[string]string
7582
externalManagedTags sets.String
7683
defaultSSLPolicy string
@@ -93,6 +100,8 @@ func (b *defaultModelBuilder) Build(ctx context.Context, ingGroup Group) (core.S
93100
authConfigBuilder: b.authConfigBuilder,
94101
enhancedBackendBuilder: b.enhancedBackendBuilder,
95102
ruleOptimizer: b.ruleOptimizer,
103+
trackingProvider: b.trackingProvider,
104+
elbv2TaggingManager: b.elbv2TaggingManager,
96105
logger: b.logger,
97106

98107
ingGroup: ingGroup,
@@ -138,6 +147,8 @@ type defaultModelBuildTask struct {
138147
authConfigBuilder AuthConfigBuilder
139148
enhancedBackendBuilder EnhancedBackendBuilder
140149
ruleOptimizer RuleOptimizer
150+
trackingProvider tracking.Provider
151+
elbv2TaggingManager elbv2deploy.TaggingManager
141152
logger logr.Logger
142153

143154
ingGroup Group

0 commit comments

Comments
 (0)