Merge pull request #1314 from kerthcet/bug/flush-in-agent

bug: agent's os.Exit will not wait for the defer function
This commit is contained in:
karmada-bot 2022-01-27 17:10:33 +08:00 committed by GitHub
commit 05f696f150
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 15 deletions

View File

@ -82,13 +82,13 @@ func run(ctx context.Context, karmadaConfig karmadactl.KarmadaConfig, opts *opti
klog.Infof("karmada-agent version: %s", version.Get()) klog.Infof("karmada-agent version: %s", version.Get())
controlPlaneRestConfig, err := karmadaConfig.GetRestConfig(opts.KarmadaContext, opts.KarmadaKubeConfig) controlPlaneRestConfig, err := karmadaConfig.GetRestConfig(opts.KarmadaContext, opts.KarmadaKubeConfig)
if err != nil { if err != nil {
return fmt.Errorf("error building kubeconfig of karmada control plane: %s", err.Error()) return fmt.Errorf("error building kubeconfig of karmada control plane: %w", err)
} }
controlPlaneRestConfig.QPS, controlPlaneRestConfig.Burst = opts.KubeAPIQPS, opts.KubeAPIBurst controlPlaneRestConfig.QPS, controlPlaneRestConfig.Burst = opts.KubeAPIQPS, opts.KubeAPIBurst
clusterConfig, err := controllerruntime.GetConfig() clusterConfig, err := controllerruntime.GetConfig()
if err != nil { if err != nil {
return fmt.Errorf("error building kubeconfig of member cluster: %s", err.Error()) return fmt.Errorf("error building kubeconfig of member cluster: %w", err)
} }
clusterKubeClient := kubeclientset.NewForConfigOrDie(clusterConfig) clusterKubeClient := kubeclientset.NewForConfigOrDie(clusterConfig)
// ensure namespace where the impersonation secret to be stored in member cluster. // ensure namespace where the impersonation secret to be stored in member cluster.
@ -106,13 +106,12 @@ func run(ctx context.Context, karmadaConfig karmadactl.KarmadaConfig, opts *opti
err = registerWithControlPlaneAPIServer(controlPlaneRestConfig, clusterConfig, opts) err = registerWithControlPlaneAPIServer(controlPlaneRestConfig, clusterConfig, opts)
if err != nil { if err != nil {
return fmt.Errorf("failed to register with karmada control plane: %s", err.Error()) return fmt.Errorf("failed to register with karmada control plane: %w", err)
} }
executionSpace, err := names.GenerateExecutionSpaceName(opts.ClusterName) executionSpace, err := names.GenerateExecutionSpaceName(opts.ClusterName)
if err != nil { if err != nil {
klog.Errorf("Failed to generate execution space name for member cluster %s, err is %v", opts.ClusterName, err) return fmt.Errorf("failed to generate execution space name for member cluster %s, err is %v", opts.ClusterName, err)
return err
} }
controllerManager, err := controllerruntime.NewManager(controlPlaneRestConfig, controllerruntime.Options{ controllerManager, err := controllerruntime.NewManager(controlPlaneRestConfig, controllerruntime.Options{
@ -125,28 +124,28 @@ func run(ctx context.Context, karmadaConfig karmadactl.KarmadaConfig, opts *opti
LeaderElectionResourceLock: opts.LeaderElection.ResourceLock, LeaderElectionResourceLock: opts.LeaderElection.ResourceLock,
}) })
if err != nil { if err != nil {
klog.Errorf("failed to build controller manager: %v", err) return fmt.Errorf("failed to build controller manager: %w", err)
}
if err = setupControllers(controllerManager, opts, ctx.Done()); err != nil {
return err return err
} }
setupControllers(controllerManager, opts, ctx.Done())
// blocks until the context is done. // blocks until the context is done.
if err := controllerManager.Start(ctx); err != nil { if err := controllerManager.Start(ctx); err != nil {
klog.Errorf("controller manager exits unexpectedly: %v", err) return fmt.Errorf("controller manager exits unexpectedly: %w", err)
return err
} }
return nil return nil
} }
func setupControllers(mgr controllerruntime.Manager, opts *options.Options, stopChan <-chan struct{}) { func setupControllers(mgr controllerruntime.Manager, opts *options.Options, stopChan <-chan struct{}) error {
restConfig := mgr.GetConfig() restConfig := mgr.GetConfig()
dynamicClientSet := dynamic.NewForConfigOrDie(restConfig) dynamicClientSet := dynamic.NewForConfigOrDie(restConfig)
controlPlaneInformerManager := informermanager.NewSingleClusterInformerManager(dynamicClientSet, 0, stopChan) controlPlaneInformerManager := informermanager.NewSingleClusterInformerManager(dynamicClientSet, 0, stopChan)
resourceInterpreter := resourceinterpreter.NewResourceInterpreter("", controlPlaneInformerManager) resourceInterpreter := resourceinterpreter.NewResourceInterpreter("", controlPlaneInformerManager)
if err := mgr.Add(resourceInterpreter); err != nil { if err := mgr.Add(resourceInterpreter); err != nil {
klog.Fatalf("Failed to setup custom resource interpreter: %v", err) return fmt.Errorf("failed to setup custom resource interpreter: %w", err)
} }
objectWatcher := objectwatcher.NewObjectWatcher(mgr.GetClient(), mgr.GetRESTMapper(), util.NewClusterDynamicClientSetForAgent, resourceInterpreter) objectWatcher := objectwatcher.NewObjectWatcher(mgr.GetClient(), mgr.GetRESTMapper(), util.NewClusterDynamicClientSetForAgent, resourceInterpreter)
@ -167,7 +166,7 @@ func setupControllers(mgr controllerruntime.Manager, opts *options.Options, stop
} }
if err := controllers.StartControllers(controllerContext); err != nil { if err := controllers.StartControllers(controllerContext); err != nil {
klog.Fatalf("error starting controllers: %v", err) return fmt.Errorf("error starting controllers: %w", err)
} }
// Ensure the InformerManager stops when the stop channel closes // Ensure the InformerManager stops when the stop channel closes
@ -175,6 +174,8 @@ func setupControllers(mgr controllerruntime.Manager, opts *options.Options, stop
<-stopChan <-stopChan
informermanager.StopInstance() informermanager.StopInstance()
}() }()
return nil
} }
func startClusterStatusController(ctx controllerscontext.Context) (bool, error) { func startClusterStatusController(ctx controllerscontext.Context) (bool, error) {

View File

@ -21,12 +21,19 @@ import (
) )
func main() { func main() {
if err := runAgentCmd(); err != nil {
os.Exit(1)
}
}
func runAgentCmd() error {
logs.InitLogs() logs.InitLogs()
defer logs.FlushLogs() defer logs.FlushLogs()
ctx := apiserver.SetupSignalContext() ctx := apiserver.SetupSignalContext()
if err := app.NewAgentCommand(ctx).Execute(); err != nil { if err := app.NewAgentCommand(ctx).Execute(); err != nil {
os.Exit(1) return err
} }
return nil
} }