diff --git a/pkg/controlplane/apiserver/aggregator.go b/pkg/controlplane/apiserver/aggregator.go index 690bcae56cf75..6aec4fab7db41 100644 --- a/pkg/controlplane/apiserver/aggregator.go +++ b/pkg/controlplane/apiserver/aggregator.go @@ -21,6 +21,7 @@ import ( "net/http" "strings" "sync" + "time" apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1" apiextensionsinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/externalversions/apiextensions/v1" @@ -196,6 +197,22 @@ func CreateAggregatorServer(aggregatorConfig aggregatorapiserver.CompletedConfig return nil, err } + // temporary hook to prove the pre-ready request window exists on 1.35. + // This hook is registered on the aggregator's GenericAPIServer so its readyz check + // blocks the aggregator's /readyz endpoint. + // + // This simulates the readiness delay that storage-readiness causes on 1.36, which + // propagates through apiservice-wait-for-first-sync to block the aggregator's HasBeenReady. + // A hook on the kube-apiserver level does NOT work because its readyz check is on + // the kube-apiserver's mux, which is shadowed by the aggregator's /readyz handler. + aggregatorServer.GenericAPIServer.AddPostStartHookOrDie("prove-pre-ready-window", func(hookContext genericapiserver.PostStartHookContext) error { + select { + case <-time.After(5 * time.Second): + case <-hookContext.Done(): + } + return nil + }) + err = aggregatorServer.GenericAPIServer.AddBootSequenceHealthChecks( makeAPIServiceAvailableHealthCheck( "autoregister-completion", diff --git a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go index 0cb1007495741..03bca2ab2e13d 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go +++ b/staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go @@ -593,7 +593,7 @@ func (s preparedGenericAPIServer) RunWithContext(ctx context.Context) error { Listener: s.SecureServingInfo.Listener, lateStopCh: lateStopCh, } - unexpectedRequestsEventf.Store(s.Eventf) + unexpectedRequestsEventf.Store(eventfFunc(s.Eventf)) // close socket after delayed stopCh shutdownTimeout := s.ShutdownTimeout