Skip to content

Commit f83f7bb

Browse files
authored
Merge pull request #4406 from zac-nixon/znixon/gw-backend-refactor
[gw api] Support literal target group ARNs
2 parents fbe59ea + 3a4327b commit f83f7bb

35 files changed

+628
-256
lines changed

controllers/gateway/gateway_controller.go

Lines changed: 48 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package gateway
33
import (
44
"context"
55
"fmt"
6+
"sigs.k8s.io/aws-load-balancer-controller/pkg/shared_utils"
67
"time"
78

89
elbv2types "github.com/aws/aws-sdk-go-v2/service/elasticloadbalancingv2/types"
@@ -56,13 +57,13 @@ const (
5657
var _ Reconciler = &gatewayReconciler{}
5758

5859
// NewNLBGatewayReconciler constructs a gateway reconciler to handle specifically for NLB gateways
59-
func NewNLBGatewayReconciler(routeLoader routeutils.Loader, referenceCounter referencecounter.ServiceReferenceCounter, cloud services.Cloud, k8sClient client.Client, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters, targetGroupCollector awsmetrics.TargetGroupCollector) Reconciler {
60-
return newGatewayReconciler(constants.NLBGatewayController, elbv2model.LoadBalancerTypeNetwork, controllerConfig.NLBGatewayMaxConcurrentReconciles, constants.NLBGatewayTagPrefix, shared_constants.NLBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L4RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, nlbAddons, logger, metricsCollector, reconcileCounters.IncrementNLBGateway, targetGroupCollector)
60+
func NewNLBGatewayReconciler(routeLoader routeutils.Loader, referenceCounter referencecounter.ServiceReferenceCounter, cloud services.Cloud, k8sClient client.Client, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters, targetGroupCollector awsmetrics.TargetGroupCollector, targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper) Reconciler {
61+
return newGatewayReconciler(constants.NLBGatewayController, elbv2model.LoadBalancerTypeNetwork, controllerConfig.NLBGatewayMaxConcurrentReconciles, constants.NLBGatewayTagPrefix, shared_constants.NLBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L4RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, nlbAddons, targetGroupNameToArnMapper, logger, metricsCollector, reconcileCounters.IncrementNLBGateway, targetGroupCollector)
6162
}
6263

6364
// NewALBGatewayReconciler constructs a gateway reconciler to handle specifically for ALB gateways
64-
func NewALBGatewayReconciler(routeLoader routeutils.Loader, cloud services.Cloud, k8sClient client.Client, referenceCounter referencecounter.ServiceReferenceCounter, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters, targetGroupCollector awsmetrics.TargetGroupCollector) Reconciler {
65-
return newGatewayReconciler(constants.ALBGatewayController, elbv2model.LoadBalancerTypeApplication, controllerConfig.ALBGatewayMaxConcurrentReconciles, constants.ALBGatewayTagPrefix, shared_constants.ALBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L7RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, albAddons, logger, metricsCollector, reconcileCounters.IncrementALBGateway, targetGroupCollector)
65+
func NewALBGatewayReconciler(routeLoader routeutils.Loader, cloud services.Cloud, k8sClient client.Client, referenceCounter referencecounter.ServiceReferenceCounter, eventRecorder record.EventRecorder, controllerConfig config.ControllerConfig, finalizerManager k8s.FinalizerManager, networkingManager networking.NetworkingManager, networkingSGReconciler networking.SecurityGroupReconciler, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager, subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider, sgResolver networking.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters, targetGroupCollector awsmetrics.TargetGroupCollector, targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper) Reconciler {
66+
return newGatewayReconciler(constants.ALBGatewayController, elbv2model.LoadBalancerTypeApplication, controllerConfig.ALBGatewayMaxConcurrentReconciles, constants.ALBGatewayTagPrefix, shared_constants.ALBGatewayFinalizer, routeLoader, referenceCounter, routeutils.L7RouteFilter, cloud, k8sClient, eventRecorder, controllerConfig, finalizerManager, networkingSGReconciler, networkingManager, networkingSGManager, elbv2TaggingManager, subnetResolver, vpcInfoProvider, backendSGProvider, sgResolver, albAddons, targetGroupNameToArnMapper, logger, metricsCollector, reconcileCounters.IncrementALBGateway, targetGroupCollector)
6667
}
6768

6869
// newGatewayReconciler constructs a reconciler that responds to gateway object changes
@@ -72,7 +73,7 @@ func newGatewayReconciler(controllerName string, lbType elbv2model.LoadBalancerT
7273
finalizerManager k8s.FinalizerManager, networkingSGReconciler networking.SecurityGroupReconciler,
7374
networkingManager networking.NetworkingManager, networkingSGManager networking.SecurityGroupManager, elbv2TaggingManager elbv2deploy.TaggingManager,
7475
subnetResolver networking.SubnetsResolver, vpcInfoProvider networking.VPCInfoProvider, backendSGProvider networking.BackendSGProvider,
75-
sgResolver networking.SecurityGroupResolver, supportedAddons []addon.Addon, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector,
76+
sgResolver networking.SecurityGroupResolver, supportedAddons []addon.Addon, targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector,
7677
reconcileTracker func(namespaceName types.NamespacedName), targetGroupCollector awsmetrics.TargetGroupCollector) Reconciler {
7778

7879
trackingProvider := tracking.NewDefaultProvider(gatewayTagPrefix, controllerConfig.ClusterName)
@@ -84,49 +85,51 @@ func newGatewayReconciler(controllerName string, lbType elbv2model.LoadBalancerT
8485
cfgResolver := newGatewayConfigResolver()
8586

8687
return &gatewayReconciler{
87-
controllerName: controllerName,
88-
lbType: lbType,
89-
maxConcurrentReconciles: maxConcurrentReconciles,
90-
finalizer: finalizer,
91-
gatewayLoader: routeLoader,
92-
routeFilter: routeFilter,
93-
k8sClient: k8sClient,
94-
modelBuilder: modelBuilder,
95-
backendSGProvider: backendSGProvider,
96-
stackMarshaller: stackMarshaller,
97-
stackDeployer: stackDeployer,
98-
finalizerManager: finalizerManager,
99-
eventRecorder: eventRecorder,
100-
logger: logger,
101-
metricsCollector: metricsCollector,
102-
reconcileTracker: reconcileTracker,
103-
cfgResolver: cfgResolver,
104-
serviceReferenceCounter: serviceReferenceCounter,
105-
gatewayConditionUpdater: prepareGatewayConditionUpdate,
88+
controllerName: controllerName,
89+
lbType: lbType,
90+
maxConcurrentReconciles: maxConcurrentReconciles,
91+
finalizer: finalizer,
92+
gatewayLoader: routeLoader,
93+
routeFilter: routeFilter,
94+
k8sClient: k8sClient,
95+
modelBuilder: modelBuilder,
96+
backendSGProvider: backendSGProvider,
97+
stackMarshaller: stackMarshaller,
98+
stackDeployer: stackDeployer,
99+
finalizerManager: finalizerManager,
100+
eventRecorder: eventRecorder,
101+
logger: logger,
102+
metricsCollector: metricsCollector,
103+
reconcileTracker: reconcileTracker,
104+
cfgResolver: cfgResolver,
105+
serviceReferenceCounter: serviceReferenceCounter,
106+
gatewayConditionUpdater: prepareGatewayConditionUpdate,
107+
targetGroupNameToArnMapper: targetGroupNameToArnMapper,
106108
}
107109
}
108110

109111
// gatewayReconciler reconciles a Gateway.
110112
type gatewayReconciler struct {
111-
controllerName string
112-
lbType elbv2model.LoadBalancerType
113-
finalizer string
114-
maxConcurrentReconciles int
115-
gatewayLoader routeutils.Loader
116-
routeFilter routeutils.LoadRouteFilter
117-
k8sClient client.Client
118-
modelBuilder gatewaymodel.Builder
119-
backendSGProvider networking.BackendSGProvider
120-
secretsManager k8s.SecretsManager
121-
stackMarshaller deploy.StackMarshaller
122-
stackDeployer deploy.StackDeployer
123-
finalizerManager k8s.FinalizerManager
124-
eventRecorder record.EventRecorder
125-
logger logr.Logger
126-
metricsCollector lbcmetrics.MetricCollector
127-
reconcileTracker func(namespaceName types.NamespacedName)
128-
serviceReferenceCounter referencecounter.ServiceReferenceCounter
129-
gatewayConditionUpdater func(gw *gwv1.Gateway, targetConditionType string, newStatus metav1.ConditionStatus, reason string, message string) bool
113+
controllerName string
114+
lbType elbv2model.LoadBalancerType
115+
finalizer string
116+
maxConcurrentReconciles int
117+
gatewayLoader routeutils.Loader
118+
routeFilter routeutils.LoadRouteFilter
119+
k8sClient client.Client
120+
modelBuilder gatewaymodel.Builder
121+
backendSGProvider networking.BackendSGProvider
122+
secretsManager k8s.SecretsManager
123+
stackMarshaller deploy.StackMarshaller
124+
stackDeployer deploy.StackDeployer
125+
finalizerManager k8s.FinalizerManager
126+
eventRecorder record.EventRecorder
127+
targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper
128+
logger logr.Logger
129+
metricsCollector lbcmetrics.MetricCollector
130+
reconcileTracker func(namespaceName types.NamespacedName)
131+
serviceReferenceCounter referencecounter.ServiceReferenceCounter
132+
gatewayConditionUpdater func(gw *gwv1.Gateway, targetConditionType string, newStatus metav1.ConditionStatus, reason string, message string) bool
130133

131134
cfgResolver gatewayConfigResolver
132135
}
@@ -274,7 +277,6 @@ func (r *gatewayReconciler) reconcileHelper(ctx context.Context, req reconcile.R
274277
r.logger.Error(err, "Failed to process gateway delete")
275278
return err
276279
}
277-
r.serviceReferenceCounter.UpdateRelations([]types.NamespacedName{}, k8s.NamespacedName(gw), true)
278280
return nil
279281
}
280282
r.serviceReferenceCounter.UpdateRelations(getServicesFromRoutes(allRoutes), k8s.NamespacedName(gw), false)
@@ -310,6 +312,7 @@ func (r *gatewayReconciler) reconcileDelete(ctx context.Context, gw *gwv1.Gatewa
310312
if err := r.backendSGProvider.Release(ctx, networking.ResourceTypeGateway, []types.NamespacedName{k8s.NamespacedName(gw)}); err != nil {
311313
return err
312314
}
315+
r.serviceReferenceCounter.UpdateRelations([]types.NamespacedName{}, k8s.NamespacedName(gw), true)
313316
// remove gateway finalizer
314317
if err := r.finalizerManager.RemoveFinalizers(ctx, gw, r.finalizer); err != nil {
315318
r.eventRecorder.Event(gw, corev1.EventTypeWarning, k8s.GatewayEventReasonFailedRemoveFinalizer, fmt.Sprintf("Failed remove gateway finalizer due to %v", err))
@@ -363,7 +366,7 @@ func (r *gatewayReconciler) deployModel(ctx context.Context, gw *gwv1.Gateway, s
363366
}
364367

365368
func (r *gatewayReconciler) buildModel(ctx context.Context, gw *gwv1.Gateway, cfg elbv2gw.LoadBalancerConfiguration, listenerToRoute map[int32][]routeutils.RouteDescriptor, currentAddonConfig []addon.Addon) (core.Stack, *elbv2model.LoadBalancer, []addon.AddonMetadata, bool, []types.NamespacedName, error) {
366-
stack, lb, newAddOnConfig, backendSGRequired, secrets, err := r.modelBuilder.Build(ctx, gw, cfg, listenerToRoute, currentAddonConfig, r.secretsManager)
369+
stack, lb, newAddOnConfig, backendSGRequired, secrets, err := r.modelBuilder.Build(ctx, gw, cfg, listenerToRoute, currentAddonConfig, r.secretsManager, r.targetGroupNameToArnMapper)
367370
if err != nil {
368371
r.eventRecorder.Event(gw, corev1.EventTypeWarning, k8s.GatewayEventReasonFailedBuildModel, fmt.Sprintf("Failed build model due to %v", err))
369372
return nil, nil, nil, false, nil, err

controllers/gateway/targetgroup_configuration_controller.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
"github.com/go-logr/logr"
7+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
78
"k8s.io/apimachinery/pkg/types"
89
"k8s.io/client-go/kubernetes"
910
"k8s.io/client-go/tools/record"
@@ -98,7 +99,14 @@ func (r *targetgroupConfigurationReconciler) handleDelete(tgConf *elbv2gw.Target
9899
}
99100

100101
for _, gw := range partial {
101-
allGateways = append(allGateways, k8s.NamespacedName(gw))
102+
103+
if gw.Status.Conditions != nil {
104+
for _, cond := range gw.Status.Conditions {
105+
if cond.Type == string(gwv1.GatewayReasonAccepted) && cond.Status == metav1.ConditionTrue {
106+
allGateways = append(allGateways, k8s.NamespacedName(gw))
107+
}
108+
}
109+
}
102110
}
103111
}
104112

controllers/gateway/utils.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package gateway
33
import (
44
"context"
55
"fmt"
6+
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
67
"sort"
78
"strconv"
89
"strings"
@@ -15,7 +16,6 @@ import (
1516
"k8s.io/apimachinery/pkg/util/sets"
1617
elbv2gw "sigs.k8s.io/aws-load-balancer-controller/apis/gateway/v1beta1"
1718
"sigs.k8s.io/aws-load-balancer-controller/pkg/gateway/routeutils"
18-
"sigs.k8s.io/aws-load-balancer-controller/pkg/k8s"
1919
"sigs.k8s.io/controller-runtime/pkg/client"
2020
gwv1 "sigs.k8s.io/gateway-api/apis/v1"
2121
)
@@ -171,7 +171,9 @@ func getServicesFromRoutes(listenerRouteMap map[int32][]routeutils.RouteDescript
171171
for _, route := range routes {
172172
for _, rr := range route.GetAttachedRules() {
173173
for _, be := range rr.GetBackends() {
174-
res.Insert(k8s.NamespacedName(be.Service))
174+
if be.ServiceBackend != nil {
175+
res.Insert(k8s.NamespacedName(be.ServiceBackend.Service))
176+
}
175177
}
176178
}
177179
}

controllers/ingress/group_controller.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"fmt"
66
awsmetrics "sigs.k8s.io/aws-load-balancer-controller/pkg/metrics/aws"
7+
"sigs.k8s.io/aws-load-balancer-controller/pkg/shared_utils"
78

89
"sigs.k8s.io/controller-runtime/pkg/reconcile"
910

@@ -53,7 +54,7 @@ func NewGroupReconciler(cloud services.Cloud, k8sClient client.Client, eventReco
5354
networkingManager networkingpkg.NetworkingManager, networkingSGReconciler networkingpkg.SecurityGroupReconciler, subnetsResolver networkingpkg.SubnetsResolver,
5455
elbv2TaggingManager elbv2deploy.TaggingManager, controllerConfig config.ControllerConfig, backendSGProvider networkingpkg.BackendSGProvider,
5556
sgResolver networkingpkg.SecurityGroupResolver, logger logr.Logger, metricsCollector lbcmetrics.MetricCollector, reconcileCounters *metricsutil.ReconcileCounters,
56-
targetGroupCollector awsmetrics.TargetGroupCollector) *groupReconciler {
57+
targetGroupCollector awsmetrics.TargetGroupCollector, targetGroupNameToArnMapper shared_utils.TargetGroupARNMapper) *groupReconciler {
5758

5859
annotationParser := annotations.NewSuffixAnnotationParser(annotations.AnnotationPrefixIngress)
5960
authConfigBuilder := ingress.NewDefaultAuthConfigBuilder(annotationParser)
@@ -66,7 +67,7 @@ func NewGroupReconciler(cloud services.Cloud, k8sClient client.Client, eventReco
6667
authConfigBuilder, enhancedBackendBuilder, trackingProvider, elbv2TaggingManager, controllerConfig.FeatureGates,
6768
cloud.VpcID(), controllerConfig.ClusterName, controllerConfig.DefaultTags, controllerConfig.ExternalManagedTags,
6869
controllerConfig.DefaultSSLPolicy, controllerConfig.DefaultTargetType, controllerConfig.DefaultLoadBalancerScheme, backendSGProvider, sgResolver,
69-
controllerConfig.EnableBackendSecurityGroup, controllerConfig.EnableManageBackendSecurityGroupRules, controllerConfig.DisableRestrictedSGRules, controllerConfig.IngressConfig.AllowedCertificateAuthorityARNs, controllerConfig.FeatureGates.Enabled(config.EnableIPTargetType), logger, metricsCollector)
70+
controllerConfig.EnableBackendSecurityGroup, controllerConfig.EnableManageBackendSecurityGroupRules, controllerConfig.DisableRestrictedSGRules, controllerConfig.IngressConfig.AllowedCertificateAuthorityARNs, controllerConfig.FeatureGates.Enabled(config.EnableIPTargetType), targetGroupNameToArnMapper, logger, metricsCollector)
7071
stackMarshaller := deploy.NewDefaultStackMarshaller()
7172
stackDeployer := deploy.NewDefaultStackDeployer(cloud, k8sClient, networkingManager, networkingSGManager, networkingSGReconciler, elbv2TaggingManager,
7273
controllerConfig, ingressTagPrefix, logger, metricsCollector, controllerName, controllerConfig.FeatureGates.Enabled(config.EnhancedDefaultBehavior), targetGroupCollector)

docs/guide/gateway/gateway.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,4 +130,34 @@ the target group will not be materialized on any ALBs that the route attaches to
130130
An [503 Fixed Response](https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_FixedResponseActionConfig.html)
131131
will be added to any Listener Rules that would have referenced the invalid backend.
132132

133+
## Specify out-of-band Target Groups
134+
135+
Use an existing AWS Target Group with a Gateway-managed Load Balancer.
136+
This lets you integrate or migrate legacy applications that are already
137+
registered with an AWS Target Group outside the controller's lifecycle.
138+
139+
```yaml
140+
apiVersion: gateway.networking.k8s.io/v1alpha2
141+
kind: TCPRoute
142+
metadata:
143+
name: tcproute
144+
namespace: example-ns
145+
spec:
146+
parentRefs:
147+
- group: gateway.networking.k8s.io
148+
kind: Gateway
149+
name: nlb-gw
150+
sectionName: tls
151+
rules:
152+
- backendRefs:
153+
- group: ""
154+
kind: TargetGroupName
155+
name: test-gw-import123
156+
weight: 1
157+
```
158+
159+
This support exists for all route types managed by the controller.
160+
161+
162+
133163

0 commit comments

Comments
 (0)