Skip to content

Commit a3c82e8

Browse files
committed
apiserver: add Retry-After header to response when apiserver is shutting down
1 parent 9aa68a5 commit a3c82e8

File tree

2 files changed

+16
-1
lines changed

2 files changed

+16
-1
lines changed

staging/src/k8s.io/apiserver/pkg/server/filters/BUILD

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,9 @@ go_library(
4343
importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/server/filters",
4444
importpath = "k8s.io/apiserver/pkg/server/filters",
4545
deps = [
46+
"//staging/src/k8s.io/api/core/v1:go_default_library",
4647
"//staging/src/k8s.io/apimachinery/pkg/api/errors:go_default_library",
48+
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
4749
"//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library",
4850
"//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library",
4951
"//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library",
@@ -53,6 +55,7 @@ go_library(
5355
"//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library",
5456
"//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library",
5557
"//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library",
58+
"//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library",
5659
"//vendor/k8s.io/klog:go_default_library",
5760
],
5861
)

staging/src/k8s.io/apiserver/pkg/server/filters/waitgroup.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@ package filters
1818

1919
import (
2020
"errors"
21+
"fmt"
2122
"net/http"
2223

24+
"k8s.io/api/core/v1"
25+
apierrors "k8s.io/apimachinery/pkg/api/errors"
26+
"k8s.io/apimachinery/pkg/runtime"
2327
utilwaitgroup "k8s.io/apimachinery/pkg/util/waitgroup"
2428
"k8s.io/apiserver/pkg/endpoints/handlers/responsewriters"
2529
apirequest "k8s.io/apiserver/pkg/endpoints/request"
30+
"k8s.io/client-go/kubernetes/scheme"
2631
)
2732

2833
// WithWaitGroup adds all non long-running requests to wait group, which is used for graceful shutdown.
@@ -38,7 +43,14 @@ func WithWaitGroup(handler http.Handler, longRunning apirequest.LongRunningReque
3843

3944
if !longRunning(req, requestInfo) {
4045
if err := wg.Add(1); err != nil {
41-
http.Error(w, "apiserver is shutting down.", http.StatusInternalServerError)
46+
// When apiserver is shutting down, signal clients to retry
47+
// There is a good chance the client hit a different server, so a tight retry is good for client responsiveness.
48+
w.Header().Add("Retry-After", "1")
49+
w.Header().Set("Content-Type", runtime.ContentTypeJSON)
50+
w.Header().Set("X-Content-Type-Options", "nosniff")
51+
statusErr := apierrors.NewServiceUnavailable("apiserver is shutting down").Status()
52+
w.WriteHeader(int(statusErr.Code))
53+
fmt.Fprintln(w, runtime.EncodeOrDie(scheme.Codecs.LegacyCodec(v1.SchemeGroupVersion), &statusErr))
4254
return
4355
}
4456
defer wg.Done()

0 commit comments

Comments
 (0)