Fix crash on kube manager's service-lb-controller after v1.31.0.

Co-authored-by: Antonio Ojea <antonio.ojea.garcia@gmail.com>
This commit is contained in:
carlory 2024-10-18 18:27:12 +08:00
parent f66782e8c4
commit fb63fe6926
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) {
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(
controllerContext.Cloud,
controllerContext.ClientBuilder.ClientOrDie("service-controller"),
@ -102,7 +108,7 @@ func startServiceLBController(ctx context.Context, controllerContext ControllerC
)
if err != nil {
// 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
}
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) {
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(
controllerContext.InformerFactory.Core().V1().Nodes(),
// cloud node lifecycle controller uses existing cluster role from node-controller

View File

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