update scheduler to return structured errors instead of process exit

This commit is contained in:
David Eads 2017-08-29 11:20:06 -04:00
parent 28f6b3fcc0
commit 539fc6ec95
2 changed files with 25 additions and 17 deletions

View File

@ -30,6 +30,7 @@ go_library(
"//vendor/k8s.io/api/core/v1:go_default_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/apis/meta/v1:go_default_library",
"//vendor/k8s.io/apimachinery/pkg/runtime: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/server/healthz:go_default_library",
"//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library", "//vendor/k8s.io/apiserver/pkg/util/feature:go_default_library",
"//vendor/k8s.io/client-go/informers:go_default_library", "//vendor/k8s.io/client-go/informers:go_default_library",

View File

@ -28,6 +28,7 @@ import (
"k8s.io/apiserver/pkg/server/healthz" "k8s.io/apiserver/pkg/server/healthz"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/client-go/informers" "k8s.io/client-go/informers"
"k8s.io/client-go/tools/leaderelection" "k8s.io/client-go/tools/leaderelection"
"k8s.io/client-go/tools/leaderelection/resourcelock" "k8s.io/client-go/tools/leaderelection/resourcelock"
@ -103,14 +104,14 @@ func Run(s *options.SchedulerServer) error {
informerFactory.WaitForCacheSync(stop) informerFactory.WaitForCacheSync(stop)
controller.WaitForCacheSync("scheduler", stop, podInformer.Informer().HasSynced) controller.WaitForCacheSync("scheduler", stop, podInformer.Informer().HasSynced)
run := func(_ <-chan struct{}) { run := func(stopCh <-chan struct{}) {
sched.Run() sched.Run()
select {} <-stopCh
} }
if !s.LeaderElection.LeaderElect { if !s.LeaderElection.LeaderElect {
run(nil) run(stop)
panic("unreachable") return fmt.Errorf("finished without leader elect")
} }
id, err := os.Hostname() id, err := os.Hostname()
@ -127,23 +128,29 @@ func Run(s *options.SchedulerServer) error {
EventRecorder: recorder, EventRecorder: recorder,
}) })
if err != nil { if err != nil {
glog.Fatalf("error creating lock: %v", err) return fmt.Errorf("error creating lock: %v", err)
} }
leaderelection.RunOrDie(leaderelection.LeaderElectionConfig{ leaderElector, err := leaderelection.NewLeaderElector(
Lock: rl, leaderelection.LeaderElectionConfig{
LeaseDuration: s.LeaderElection.LeaseDuration.Duration, Lock: rl,
RenewDeadline: s.LeaderElection.RenewDeadline.Duration, LeaseDuration: s.LeaderElection.LeaseDuration.Duration,
RetryPeriod: s.LeaderElection.RetryPeriod.Duration, RenewDeadline: s.LeaderElection.RenewDeadline.Duration,
Callbacks: leaderelection.LeaderCallbacks{ RetryPeriod: s.LeaderElection.RetryPeriod.Duration,
OnStartedLeading: run, Callbacks: leaderelection.LeaderCallbacks{
OnStoppedLeading: func() { OnStartedLeading: run,
glog.Fatalf("lost master") 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) { func startHTTP(s *options.SchedulerServer) {