Skip to content

Commit 7caa30b

Browse files
committed
feat(l4): Add support for enabling L4 NetLB Regional Backend Services by default
1 parent 931b4c7 commit 7caa30b

File tree

6 files changed

+75
-13
lines changed

6 files changed

+75
-13
lines changed

pkg/context/context.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ type ControllerContextConfig struct {
138138
EnableL4ILBMixedProtocol bool
139139
EnableL4NetLBMixedProtocol bool
140140
EnableL4NetLBForwardingRulesOptimizations bool
141+
EnableL4NetLBRBSByDefault bool
141142
}
142143

143144
// NewControllerContext returns a new shared set of informers.

pkg/flags/flags.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ var F = struct {
149149
EnableNEGsForIngress bool
150150
L4ILBLegacyHeadStartTime time.Duration
151151
EnableIPv6NodeNEGEndpoints bool
152+
EnableL4NetLBRBSByDefault bool
152153

153154
// ===============================
154155
// DEPRECATED FLAGS
@@ -362,6 +363,7 @@ L7 load balancing. CSV values accepted. Example: -node-port-ranges=80,8080,400-5
362363
flag.BoolVar(&F.EnableNEGsForIngress, "enable-negs-for-ingress", true, "Allow the NEG controller to create NEGs for Ingress services.")
363364
flag.DurationVar(&F.L4ILBLegacyHeadStartTime, "prevent-legacy-race-l4-ilb", 0*time.Second, "Delay before processing new L4 ILB services without existing finalizers. This gives the legacy controller a head start to claim the service, preventing a race condition upon service creation.")
364365
flag.BoolVar(&F.EnableIPv6NodeNEGEndpoints, "enable-ipv6-node-neg-endpoints", false, "Enable populating IPv6 addresses for Node IPs in GCE_VM_IP NEGs.")
366+
flag.BoolVar(&F.EnableL4NetLBRBSByDefault, "enable-l4-netlb-rbs-by-default", false, "Enable L4 NetLB Regional Backend Services by default for new L4 NetLB services.")
365367
}
366368

367369
func Validate() {

pkg/l4lb/l4netlbcontroller.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,7 @@ type L4NetLBController struct {
8585
serviceVersions *serviceVersionsTracker
8686
enableNEGSupport bool
8787
enableNEGAsDefault bool
88+
enableRBSDefault bool
8889

8990
hasSynced func() bool
9091

@@ -121,6 +122,7 @@ func NewL4NetLBController(
121122
serviceVersions: NewServiceVersionsTracker(),
122123
logger: logger,
123124
hasSynced: ctx.HasSynced,
125+
enableRBSDefault: ctx.EnableL4NetLBRBSByDefault,
124126
}
125127
var networkLister cache.Indexer
126128
if ctx.NetworkInformer != nil {
@@ -388,7 +390,13 @@ func (lc *L4NetLBController) isRBSBasedService(svc *v1.Service, svcLogger klog.L
388390
if svc.Spec.LoadBalancerClass != nil {
389391
return annotations.HasLoadBalancerClass(svc, annotations.RegionalExternalLoadBalancerClass)
390392
}
391-
return annotations.HasRBSAnnotation(svc) || utils.HasL4NetLBFinalizerV2(svc) || utils.HasL4NetLBFinalizerV3(svc) || lc.hasRBSForwardingRule(svc, svcLogger)
393+
if utils.HasL4NetLBFinalizerV1(svc) {
394+
return false
395+
}
396+
if lc.hasLegacyForwardingRule(svc, svcLogger) {
397+
return false
398+
}
399+
return lc.enableRBSDefault || annotations.HasRBSAnnotation(svc) || utils.HasL4NetLBFinalizerV2(svc) || utils.HasL4NetLBFinalizerV3(svc) || lc.hasRBSForwardingRule(svc, svcLogger)
392400
}
393401

394402
func (lc *L4NetLBController) preventLegacyServiceHandling(service *v1.Service, key string, svcLogger klog.Logger) (bool, error) {
@@ -472,6 +480,23 @@ func (lc *L4NetLBController) hasRBSForwardingRule(svc *v1.Service, svcLogger klo
472480
return existingFR != nil && existingFR.LoadBalancingScheme == string(cloud.SchemeExternal) && existingFR.BackendService != ""
473481
}
474482

483+
// hasLegacyForwardingRule checks if services loadbalancer has forwarding rule pointing to target pool
484+
func (lc *L4NetLBController) hasLegacyForwardingRule(svc *v1.Service, svcLogger klog.Logger) bool {
485+
frName := utils.LegacyForwardingRuleName(svc)
486+
487+
// to optimize number of api calls, at first, check if forwarding rule does not exists in annotation
488+
if lc.hasForwardingRuleAnnotation(svc, frName) {
489+
return false
490+
}
491+
492+
existingFR, err := lc.forwardingRules.Get(frName)
493+
if err != nil {
494+
svcLogger.Error(err, "Error getting forwarding rule", "forwardingRule", frName)
495+
return false
496+
}
497+
return existingFR != nil && existingFR.LoadBalancingScheme == string(cloud.SchemeExternal) && existingFR.Target != ""
498+
}
499+
475500
func (lc *L4NetLBController) SystemHealth() error {
476501
lastEnqueueTime := lc.enqueueTracker.Get()
477502
lastSyncTime := lc.syncTracker.Get()

pkg/l4lb/l4netlbcontroller_test.go

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ func getFakeGCECloud(vals gce.TestClusterValues) *gce.Cloud {
309309
return fakeGCE
310310
}
311311

312-
func buildContext(vals gce.TestClusterValues, readOnlyMode bool) (*ingctx.ControllerContext, error) {
312+
func buildContext(vals gce.TestClusterValues, readOnlyMode bool, isRBSdefault bool) (*ingctx.ControllerContext, error) {
313313
fakeGCE := getFakeGCECloud(vals)
314314
kubeClient := fake.NewSimpleClientset()
315315
networkClient := netfake.NewSimpleClientset()
@@ -318,22 +318,31 @@ func buildContext(vals gce.TestClusterValues, readOnlyMode bool) (*ingctx.Contro
318318
namer := namer.NewNamer(clusterUID, "", klog.TODO())
319319

320320
ctxConfig := ingctx.ControllerContextConfig{
321-
Namespace: v1.NamespaceAll,
322-
ResyncPeriod: 1 * time.Minute,
323-
NumL4NetLBWorkers: 5,
324-
MaxIGSize: 1000,
325-
ReadOnlyMode: readOnlyMode,
321+
Namespace: v1.NamespaceAll,
322+
ResyncPeriod: 1 * time.Minute,
323+
NumL4NetLBWorkers: 5,
324+
MaxIGSize: 1000,
325+
ReadOnlyMode: readOnlyMode,
326+
EnableL4NetLBRBSByDefault: isRBSdefault,
326327
}
327328
return ingctx.NewControllerContext(kubeClient, nil, nil, nil, svcNegClient, nil, networkClient, nil, kubeClient /*kube client to be used for events*/, fakeGCE, namer, "" /*kubeSystemUID*/, ctxConfig, klog.TODO())
328329
}
329330

330331
func newL4NetLBServiceController() *L4NetLBController {
331-
return createL4NetLBServiceController(test.DefaultTestClusterValues(), false)
332+
return createL4NetLBServiceController(test.DefaultTestClusterValues(), false, false)
332333
}
333334

334-
func createL4NetLBServiceController(vals gce.TestClusterValues, readOnlyMode bool) *L4NetLBController {
335+
func newL4NetLBServiceControllerReadOnlyMode(readOnlyMode bool) *L4NetLBController {
336+
return createL4NetLBServiceController(test.DefaultTestClusterValues(), readOnlyMode, false)
337+
}
338+
339+
func newL4NetLBServiceControllerRBSDefault(isRBSdefault bool) *L4NetLBController {
340+
return createL4NetLBServiceController(test.DefaultTestClusterValues(), false, isRBSdefault)
341+
}
342+
343+
func createL4NetLBServiceController(vals gce.TestClusterValues, readOnlyMode bool, isRBSdefault bool) *L4NetLBController {
335344
stopCh := make(chan struct{})
336-
ctx, err := buildContext(vals, readOnlyMode)
345+
ctx, err := buildContext(vals, readOnlyMode, isRBSdefault)
337346
if err != nil {
338347
klog.Fatalf("Failed to build context: %v", err)
339348
}
@@ -1663,6 +1672,7 @@ func TestIsRBSBasedService(t *testing.T) {
16631672
finalizers []string
16641673
annotations map[string]string
16651674
frHook getForwardingRuleHook
1675+
isRBSDefault bool
16661676
expectRBSService bool
16671677
}{
16681678
{
@@ -1699,13 +1709,30 @@ func TestIsRBSBasedService(t *testing.T) {
16991709
frHook: test.GetLegacyForwardingRule,
17001710
expectRBSService: false,
17011711
},
1712+
{
1713+
desc: "Should detect RBS by default",
1714+
isRBSDefault: true,
1715+
expectRBSService: true,
1716+
},
1717+
{
1718+
desc: "Should not detect RBS by forwarding rule pointed to target pool, even if RBS is default",
1719+
frHook: test.GetLegacyForwardingRule,
1720+
isRBSDefault: true,
1721+
expectRBSService: false,
1722+
},
1723+
{
1724+
desc: "Legacy service should not be marked as RBS, even if RBS is default",
1725+
finalizers: []string{common.NetLBFinalizerV1},
1726+
isRBSDefault: true,
1727+
expectRBSService: false,
1728+
},
17021729
}
17031730

17041731
for _, testCase := range testCases {
17051732
t.Run(testCase.desc, func(t *testing.T) {
17061733
// Setup
17071734
svc := test.NewL4LegacyNetLBService(8080, 30234)
1708-
controller := newL4NetLBServiceController()
1735+
controller := newL4NetLBServiceControllerRBSDefault(testCase.isRBSDefault)
17091736
svc.Annotations = testCase.annotations
17101737
svc.ObjectMeta.Finalizers = testCase.finalizers
17111738
controller.ctx.Cloud.Compute().(*cloud.MockGCE).MockForwardingRules.GetHook = testCase.frHook
@@ -2317,7 +2344,7 @@ func TestEnsureExternalLoadBalancerClass(t *testing.T) {
23172344
},
23182345
} {
23192346
t.Run(tc.desc, func(t *testing.T) {
2320-
lc := createL4NetLBServiceController(test.DefaultTestClusterValues(), false)
2347+
lc := newL4NetLBServiceController()
23212348

23222349
svc := test.NewL4LBServiceWithLoadBalancerClass(tc.loadBalancerClass)
23232350
if tc.loadBalancerClass == "" {
@@ -2420,7 +2447,7 @@ func TestEnsureReadOnlyModeDoesNotProvision(t *testing.T) {
24202447
},
24212448
} {
24222449
t.Run(tc.desc, func(t *testing.T) {
2423-
lc := createL4NetLBServiceController(test.DefaultTestClusterValues(), tc.readOnlyModeEnabled)
2450+
lc := newL4NetLBServiceControllerReadOnlyMode(tc.readOnlyModeEnabled)
24242451

24252452
svc := test.NewL4LBServiceWithLoadBalancerClass(tc.loadBalancerClass)
24262453
if tc.loadBalancerClass == "" {

pkg/utils/common/finalizer.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ const (
4040
ILBFinalizerV2 = "gke.networking.io/l4-ilb-v2"
4141
// NegFinalizerKey is the finalizer used by neg controller to ensure NEG CRs are deleted after corresponding negs are deleted
4242
NegFinalizerKey = "networking.gke.io/neg-finalizer"
43+
// NetLBFinalizerV1 is the finalizer used by legacy cloud controller manager that manage L4 External LoadBalancer services.
44+
NetLBFinalizerV1 = "gke.networking.io/l4-netlb-v1"
4345
// NetLBFinalizerV2 is the finalizer used by newer controllers that manage L4 External LoadBalancer services.
4446
NetLBFinalizerV2 = "gke.networking.io/l4-netlb-v2"
4547
// NetLBFinalizerV3 is the finalizer used by the NEG backed variant of the L4 External LoadBalancer services.

pkg/utils/utils.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -761,6 +761,11 @@ func HasL4ILBFinalizerV2(svc *api_v1.Service) bool {
761761
return slice.ContainsString(svc.ObjectMeta.Finalizers, common.ILBFinalizerV2, nil)
762762
}
763763

764+
// HasL4NetLBFinalizerV1 returns true if the given Service has NetLBFinalizerV1
765+
func HasL4NetLBFinalizerV1(svc *api_v1.Service) bool {
766+
return slice.ContainsString(svc.ObjectMeta.Finalizers, common.NetLBFinalizerV1, nil)
767+
}
768+
764769
// HasL4NetLBFinalizerV2 returns true if the given Service has NetLBFinalizerV2
765770
func HasL4NetLBFinalizerV2(svc *api_v1.Service) bool {
766771
return slice.ContainsString(svc.ObjectMeta.Finalizers, common.NetLBFinalizerV2, nil)

0 commit comments

Comments
 (0)