Clean shutdown of kcm, ccm and scheduler
This commit is contained in:
@@ -45,7 +45,10 @@ type Config struct {
|
||||
// the rest config for the master
|
||||
Kubeconfig *restclient.Config
|
||||
|
||||
// the event sink
|
||||
// EventBroadcaster is broadcaster events to all sinks.
|
||||
EventBroadcaster record.EventBroadcaster
|
||||
|
||||
// EventRecord is a sink for events.
|
||||
EventRecorder record.EventRecorder
|
||||
|
||||
// ClientBuilder will provide a client for this controller to use
|
||||
|
@@ -34,6 +34,7 @@ import (
|
||||
"k8s.io/apiserver/pkg/server/healthz"
|
||||
cacheddiscovery "k8s.io/client-go/discovery/cached"
|
||||
"k8s.io/client-go/informers"
|
||||
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||
"k8s.io/client-go/metadata"
|
||||
"k8s.io/client-go/metadata/metadatainformer"
|
||||
"k8s.io/client-go/restmapper"
|
||||
@@ -142,6 +143,11 @@ func Run(c *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface
|
||||
// To help debugging, immediately log version
|
||||
klog.Infof("Version: %+v", version.Get())
|
||||
|
||||
// Start events processing pipeline.
|
||||
c.EventBroadcaster.StartStructuredLogging(0)
|
||||
c.EventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: c.Client.CoreV1().Events("")})
|
||||
defer c.EventBroadcaster.Shutdown()
|
||||
|
||||
// setup /configz endpoint
|
||||
if cz, err := configz.New(ConfigzName); err == nil {
|
||||
cz.Set(c.ComponentConfig)
|
||||
@@ -182,8 +188,10 @@ func Run(c *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface
|
||||
}
|
||||
|
||||
if !c.ComponentConfig.Generic.LeaderElection.LeaderElect {
|
||||
run(context.TODO(), controllerInitializers)
|
||||
panic("unreachable")
|
||||
ctx, _ := wait.ContextForChannel(stopCh)
|
||||
run(ctx, controllerInitializers)
|
||||
<-stopCh
|
||||
return nil
|
||||
}
|
||||
|
||||
// Identity used to distinguish between multiple cloud controller manager instances
|
||||
@@ -251,7 +259,8 @@ func Run(c *cloudcontrollerconfig.CompletedConfig, cloud cloudprovider.Interface
|
||||
})
|
||||
}
|
||||
|
||||
select {}
|
||||
<-stopCh
|
||||
return nil
|
||||
}
|
||||
|
||||
// startControllers starts the cloud specific controller loops.
|
||||
@@ -304,7 +313,8 @@ func startControllers(ctx context.Context, cloud cloudprovider.Interface, contro
|
||||
c.SharedInformers.Start(stopCh)
|
||||
controllerContext.InformerFactory.Start(controllerContext.Stop)
|
||||
|
||||
select {}
|
||||
<-stopCh
|
||||
return nil
|
||||
}
|
||||
|
||||
// InitCloudFunc is used to initialize cloud
|
||||
|
@@ -30,7 +30,6 @@ import (
|
||||
"k8s.io/client-go/informers"
|
||||
clientset "k8s.io/client-go/kubernetes"
|
||||
"k8s.io/client-go/kubernetes/scheme"
|
||||
v1core "k8s.io/client-go/kubernetes/typed/core/v1"
|
||||
restclient "k8s.io/client-go/rest"
|
||||
"k8s.io/client-go/tools/clientcmd"
|
||||
"k8s.io/client-go/tools/record"
|
||||
@@ -175,7 +174,8 @@ func (o *CloudControllerManagerOptions) ApplyTo(c *config.Config, userAgent stri
|
||||
return err
|
||||
}
|
||||
|
||||
c.EventRecorder = createRecorder(c.Client, userAgent)
|
||||
c.EventBroadcaster = record.NewBroadcaster()
|
||||
c.EventRecorder = c.EventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: userAgent})
|
||||
|
||||
rootClientBuilder := clientbuilder.SimpleControllerClientBuilder{
|
||||
ClientConfig: c.Kubeconfig,
|
||||
@@ -241,10 +241,3 @@ func (o *CloudControllerManagerOptions) Config(allControllers, disabledByDefault
|
||||
|
||||
return c, nil
|
||||
}
|
||||
|
||||
func createRecorder(kubeClient clientset.Interface, userAgent string) record.EventRecorder {
|
||||
eventBroadcaster := record.NewBroadcaster()
|
||||
eventBroadcaster.StartStructuredLogging(0)
|
||||
eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")})
|
||||
return eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: userAgent})
|
||||
}
|
||||
|
Reference in New Issue
Block a user