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
}
}
}