Merge pull request #128236 from carlory/automated-cherry-pick-of-#128182-upstream-release-1.31

Automated cherry pick of #128182: Fix crash on kube manager's service-lb-controller after v1.31.0.
This commit is contained in:
Kubernetes Prow Robot 2024-11-12 09:13:00 +00:00 committed by GitHub
commit c9e75e73f4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 43 additions and 5 deletions

View File

@ -219,3 +219,29 @@ func TestTaintEvictionControllerGating(t *testing.T) {
}) })
} }
} }
func TestNoCloudProviderControllerStarted(t *testing.T) {
_, ctx := ktesting.NewTestContext(t)
ctx, cancel := context.WithCancel(ctx)
defer cancel()
controllerCtx := ControllerContext{
Cloud: nil,
LoopMode: IncludeCloudLoops,
}
controllerCtx.ComponentConfig.Generic.Controllers = []string{"*"}
for _, controller := range NewControllerDescriptors() {
if !controller.IsCloudProviderController() {
continue
}
controllerName := controller.Name()
checker, err := StartController(ctx, controllerCtx, controller, nil)
if err != nil {
t.Errorf("Error starting controller %q: %v", controllerName, err)
}
if checker != nil {
t.Errorf("Controller %q should not be started", controllerName)
}
}
}

View File

@ -92,6 +92,12 @@ func newServiceLBControllerDescriptor() *ControllerDescriptor {
} }
func startServiceLBController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) { func startServiceLBController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {
logger := klog.FromContext(ctx)
if controllerContext.Cloud == nil {
logger.Info("Warning: service-controller is set, but no cloud provider specified. Will not configure service controller.")
return nil, false, nil
}
serviceController, err := servicecontroller.New( serviceController, err := servicecontroller.New(
controllerContext.Cloud, controllerContext.Cloud,
controllerContext.ClientBuilder.ClientOrDie("service-controller"), controllerContext.ClientBuilder.ClientOrDie("service-controller"),
@ -102,7 +108,7 @@ func startServiceLBController(ctx context.Context, controllerContext ControllerC
) )
if err != nil { if err != nil {
// This error shouldn't fail. It lives like this as a legacy. // This error shouldn't fail. It lives like this as a legacy.
klog.FromContext(ctx).Error(err, "Failed to start service controller") logger.Error(err, "Failed to start service controller.")
return nil, false, nil return nil, false, nil
} }
go serviceController.Run(ctx, int(controllerContext.ComponentConfig.ServiceController.ConcurrentServiceSyncs), controllerContext.ControllerManagerMetrics) go serviceController.Run(ctx, int(controllerContext.ComponentConfig.ServiceController.ConcurrentServiceSyncs), controllerContext.ControllerManagerMetrics)
@ -261,6 +267,11 @@ func newCloudNodeLifecycleControllerDescriptor() *ControllerDescriptor {
func startCloudNodeLifecycleController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) { func startCloudNodeLifecycleController(ctx context.Context, controllerContext ControllerContext, controllerName string) (controller.Interface, bool, error) {
logger := klog.FromContext(ctx) logger := klog.FromContext(ctx)
if controllerContext.Cloud == nil {
logger.Info("Warning: node-controller is set, but no cloud provider specified. Will not configure node lifecyle controller.")
return nil, false, nil
}
cloudNodeLifecycleController, err := cloudnodelifecyclecontroller.NewCloudNodeLifecycleController( cloudNodeLifecycleController, err := cloudnodelifecyclecontroller.NewCloudNodeLifecycleController(
controllerContext.InformerFactory.Core().V1().Nodes(), controllerContext.InformerFactory.Core().V1().Nodes(),
// cloud node lifecycle controller uses existing cluster role from node-controller // cloud node lifecycle controller uses existing cluster role from node-controller

View File

@ -110,6 +110,7 @@ func New(
featureGate featuregate.FeatureGate, featureGate featuregate.FeatureGate,
) (*Controller, error) { ) (*Controller, error) {
registerMetrics() registerMetrics()
s := &Controller{ s := &Controller{
cloud: cloud, cloud: cloud,
kubeClient: kubeClient, kubeClient: kubeClient,
@ -128,6 +129,10 @@ func New(
lastSyncedNodes: make(map[string][]*v1.Node), lastSyncedNodes: make(map[string][]*v1.Node),
} }
if err := s.init(); err != nil {
return nil, err
}
serviceInformer.Informer().AddEventHandlerWithResyncPeriod( serviceInformer.Informer().AddEventHandlerWithResyncPeriod(
cache.ResourceEventHandlerFuncs{ cache.ResourceEventHandlerFuncs{
AddFunc: func(cur interface{}) { AddFunc: func(cur interface{}) {
@ -182,10 +187,6 @@ func New(
nodeSyncPeriod, nodeSyncPeriod,
) )
if err := s.init(); err != nil {
return nil, err
}
return s, nil return s, nil
} }