func runControllers()

in cmd/glbc/main.go [265:371]


func runControllers(ctx *ingctx.ControllerContext) {
	stopCh := make(chan struct{})
	ctx.Init()
	lbc := controller.NewLoadBalancerController(ctx, stopCh)
	if ctx.EnableASMConfigMap {
		ctx.ASMConfigController.RegisterInformer(ctx.ConfigMapInformer, func() {
			lbc.Stop(false) // We want to trigger a restart, don't have to clean up all the resources.
		})
	}

	fwc := firewalls.NewFirewallController(ctx, flags.F.NodePortRanges.Values())

	if flags.F.RunL4Controller {
		l4Controller := l4lb.NewILBController(ctx, stopCh)
		go l4Controller.Run()
		klog.V(0).Infof("L4 controller started")
	}

	if flags.F.EnablePSC {
		pscController := psc.NewController(ctx)
		go pscController.Run(stopCh)
		klog.V(0).Infof("PSC Controller started")
	}

	var zoneGetter negtypes.ZoneGetter
	zoneGetter = lbc.Translator
	// In NonGCP mode, use the zone specified in gce.conf directly.
	// This overrides the zone/fault-domain label on nodes for NEG controller.
	if flags.F.EnableNonGCPMode {
		zone, err := ctx.Cloud.GetZone(context.Background())
		if err != nil {
			klog.Errorf("Failed to retrieve zone information from Cloud provider: %v; Please check if local-zone is specified in gce.conf.", err)
		} else {
			zoneGetter = negtypes.NewSimpleZoneGetter(zone.FailureDomain)
		}
	}

	enableAsm := false
	asmServiceNEGSkipNamespaces := []string{}
	if ctx.EnableASMConfigMap {
		cmconfig := ctx.ASMConfigController.GetConfig()
		enableAsm = cmconfig.EnableASM
		asmServiceNEGSkipNamespaces = cmconfig.ASMServiceNEGSkipNamespaces
	}
	// TODO: Refactor NEG to use cloud mocks so ctx.Cloud can be referenced within NewController.
	negController := neg.NewController(
		ctx.KubeClient,
		ctx.SvcNegClient,
		ctx.DestinationRuleClient,
		ctx.KubeSystemUID,
		ctx.IngressInformer,
		ctx.ServiceInformer,
		ctx.PodInformer,
		ctx.NodeInformer,
		ctx.EndpointInformer,
		ctx.EndpointSliceInformer,
		ctx.DestinationRuleInformer,
		ctx.SvcNegInformer,
		ctx.HasSynced,
		ctx.ControllerMetrics,
		ctx.L4Namer,
		ctx.DefaultBackendSvcPort,
		negtypes.NewAdapter(ctx.Cloud),
		zoneGetter,
		ctx.ClusterNamer,
		flags.F.ResyncPeriod,
		flags.F.NegGCPeriod,
		flags.F.EnableReadinessReflector,
		flags.F.RunIngressController,
		flags.F.RunL4Controller,
		flags.F.EnableNonGCPMode,
		enableAsm,
		asmServiceNEGSkipNamespaces,
		flags.F.EnableEndpointSlices,
	)

	ctx.AddHealthCheck("neg-controller", negController.IsHealthy)

	go negController.Run(stopCh)
	klog.V(0).Infof("negController started")

	go app.RunSIGTERMHandler(lbc, flags.F.DeleteAllOnQuit)

	go fwc.Run()
	klog.V(0).Infof("firewall controller started")

	ctx.Start(stopCh)

	nodeController := controller.NewNodeController(ctx, stopCh)
	go nodeController.Run()

	// The L4NetLbController will be run when RbsMode flag is Set
	if flags.F.RunL4NetLBController {
		l4netlbController := l4lb.NewL4NetLBController(ctx, stopCh)

		klog.V(0).Infof("L4NetLB controller started")
		go l4netlbController.Run()
	}
	lbc.Run()
	for {
		klog.Warning("Handled quit, awaiting pod deletion.")
		time.Sleep(30 * time.Second)
		if ctx.EnableASMConfigMap {
			return
		}
	}
}