diff --git a/plugin/cmd/kube-scheduler/app/BUILD b/plugin/cmd/kube-scheduler/app/BUILD index 64325cbaac0..39c97b1e6dc 100644 --- a/plugin/cmd/kube-scheduler/app/BUILD +++ b/plugin/cmd/kube-scheduler/app/BUILD @@ -30,6 +30,7 @@ go_library( "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/runtime:go_default_library", + "//vendor/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//vendor/k8s.io/apiserver/pkg/server/healthz:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library", diff --git a/plugin/cmd/kube-scheduler/app/server.go b/plugin/cmd/kube-scheduler/app/server.go index 74f403a7b83..05bbbec38fd 100644 --- a/plugin/cmd/kube-scheduler/app/server.go +++ b/plugin/cmd/kube-scheduler/app/server.go @@ -28,6 +28,7 @@ import ( "k8s.io/apiserver/pkg/server/healthz" + utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/client-go/informers" "k8s.io/client-go/tools/leaderelection" "k8s.io/client-go/tools/leaderelection/resourcelock" @@ -105,14 +106,14 @@ func Run(s *options.SchedulerServer) error { informerFactory.WaitForCacheSync(stop) controller.WaitForCacheSync("scheduler", stop, podInformer.Informer().HasSynced) - run := func(_ <-chan struct{}) { + run := func(stopCh <-chan struct{}) { sched.Run() - select {} + <-stopCh } if !s.LeaderElection.LeaderElect { - run(nil) - panic("unreachable") + run(stop) + return fmt.Errorf("finished without leader elect") } id, err := os.Hostname() @@ -129,23 +130,29 @@ func Run(s *options.SchedulerServer) error { EventRecorder: recorder, }) if err != nil { - glog.Fatalf("error creating lock: %v", err) + return fmt.Errorf("error creating lock: %v", err) } - leaderelection.RunOrDie(leaderelection.LeaderElectionConfig{ - Lock: rl, - LeaseDuration: s.LeaderElection.LeaseDuration.Duration, - RenewDeadline: s.LeaderElection.RenewDeadline.Duration, - RetryPeriod: s.LeaderElection.RetryPeriod.Duration, - Callbacks: leaderelection.LeaderCallbacks{ - OnStartedLeading: run, - OnStoppedLeading: func() { - glog.Fatalf("lost master") + leaderElector, err := leaderelection.NewLeaderElector( + leaderelection.LeaderElectionConfig{ + Lock: rl, + LeaseDuration: s.LeaderElection.LeaseDuration.Duration, + RenewDeadline: s.LeaderElection.RenewDeadline.Duration, + RetryPeriod: s.LeaderElection.RetryPeriod.Duration, + Callbacks: leaderelection.LeaderCallbacks{ + OnStartedLeading: run, + OnStoppedLeading: func() { + utilruntime.HandleError(fmt.Errorf("lost master")) + }, }, - }, - }) + }) + if err != nil { + return err + } - panic("unreachable") + leaderElector.Run() + + return fmt.Errorf("lost lease") } func startHTTP(s *options.SchedulerServer) {