apiservers: add synchronous shutdown mechanism on SIGTERM+INT
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
Copyright 2014 The Kubernetes Authors.
|
||||
Copyright 2017 The Kubernetes Authors.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
@@ -25,12 +25,14 @@ import (
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"github.com/spf13/pflag"
|
||||
|
||||
"k8s.io/apimachinery/pkg/util/wait"
|
||||
"k8s.io/apiserver/pkg/server"
|
||||
utilflag "k8s.io/apiserver/pkg/util/flag"
|
||||
"k8s.io/apiserver/pkg/util/logs"
|
||||
utiltemplate "k8s.io/kubernetes/pkg/util/template"
|
||||
"k8s.io/kubernetes/pkg/version/verflag"
|
||||
|
||||
"github.com/spf13/pflag"
|
||||
)
|
||||
|
||||
// HyperKube represents a single binary that can morph/manage into multiple
|
||||
@@ -115,7 +117,7 @@ func (hk *HyperKube) Printf(format string, i ...interface{}) {
|
||||
}
|
||||
|
||||
// Run the server. This will pick the appropriate server and run it.
|
||||
func (hk *HyperKube) Run(args []string) error {
|
||||
func (hk *HyperKube) Run(args []string, stopCh <-chan struct{}) error {
|
||||
// If we are called directly, parse all flags up to the first real
|
||||
// argument. That should be the server to run.
|
||||
command := args[0]
|
||||
@@ -174,7 +176,22 @@ func (hk *HyperKube) Run(args []string) error {
|
||||
logs.InitLogs()
|
||||
defer logs.FlushLogs()
|
||||
|
||||
err = s.Run(s, s.Flags().Args())
|
||||
if !s.RespectsStopCh {
|
||||
// For commands that do not respect the stopCh, we run them in a go
|
||||
// routine and leave them running when stopCh is closed.
|
||||
errCh := make(chan error)
|
||||
go func() {
|
||||
errCh <- s.Run(s, s.Flags().Args(), wait.NeverStop)
|
||||
}()
|
||||
select {
|
||||
case <-stopCh:
|
||||
return errors.New("interrupted") // This error text is ignored.
|
||||
case err = <-errCh:
|
||||
// fall-through
|
||||
}
|
||||
} else {
|
||||
err = s.Run(s, s.Flags().Args(), stopCh)
|
||||
}
|
||||
if err != nil {
|
||||
hk.Println("Error:", err)
|
||||
}
|
||||
@@ -184,11 +201,10 @@ func (hk *HyperKube) Run(args []string) error {
|
||||
|
||||
// RunToExit will run the hyperkube and then call os.Exit with an appropriate exit code.
|
||||
func (hk *HyperKube) RunToExit(args []string) {
|
||||
err := hk.Run(args)
|
||||
if err != nil {
|
||||
stopCh := server.SetupSignalHandler()
|
||||
if err := hk.Run(args, stopCh); err != nil {
|
||||
os.Exit(1)
|
||||
}
|
||||
os.Exit(0)
|
||||
}
|
||||
|
||||
// Usage will write out a summary for all servers that this binary supports.
|
||||
|
Reference in New Issue
Block a user