From b4a19c4899cf44b823d92824322c0a1b526d6b80 Mon Sep 17 00:00:00 2001 From: Jacob See <5027680+jacobsee@users.noreply.github.com> Date: Tue, 9 Jun 2026 10:58:27 -0700 Subject: [PATCH 1/3] UPSTREAM: : fix unexpected request event emission --- staging/src/k8s.io/apiserver/pkg/server/genericapiserver.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 6e4b1c1a36a87dd85990bcde2365deaf10c1a762 Mon Sep 17 00:00:00 2001 From: Jacob See <5027680+jacobsee@users.noreply.github.com> Date: Sat, 20 Jun 2026 20:53:30 -0700 Subject: [PATCH 2/3] UPSTREAM: : introduce delay in the post-start hooks --- pkg/controlplane/apiserver/server.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/controlplane/apiserver/server.go b/pkg/controlplane/apiserver/server.go index 614c0fe4559c4..e9188b7eb27f2 100644 --- a/pkg/controlplane/apiserver/server.go +++ b/pkg/controlplane/apiserver/server.go @@ -320,6 +320,15 @@ func (c completedConfig) New(name string, delegationTarget genericapiserver.Dele s.GenericAPIServer.AddPostStartHookOrDie("storage-readiness", s.GenericAPIServer.StorageReadinessHook.Hook) } + // Simulate an additional readiness delay like we have on 1.36 (where WatchCacheInitializationPostStartHook defaults to true). + s.GenericAPIServer.AddPostStartHookOrDie("prove-pre-ready-window", func(hookContext genericapiserver.PostStartHookContext) error { + select { + case <-time.After(60 * time.Second): + case <-hookContext.Done(): + } + return nil + }) + s.GenericAPIServer.AddPostStartHookOrDie("start-legacy-token-tracking-controller", func(hookContext genericapiserver.PostStartHookContext) error { go legacytokentracking.NewController(client).RunWithContext(hookContext) return nil From 1d86ebc64423a666100af77b1cdb351ab71e4ed2 Mon Sep 17 00:00:00 2001 From: Jacob See <5027680+jacobsee@users.noreply.github.com> Date: Sat, 20 Jun 2026 21:12:23 -0700 Subject: [PATCH 3/3] UPSTREAM: : tmp commit to prove issue - i could be doing something fun right now but i am not --- pkg/controlplane/apiserver/aggregator.go | 17 +++++++++++++++++ pkg/controlplane/apiserver/server.go | 9 --------- 2 files changed, 17 insertions(+), 9 deletions(-) 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/pkg/controlplane/apiserver/server.go b/pkg/controlplane/apiserver/server.go index e9188b7eb27f2..614c0fe4559c4 100644 --- a/pkg/controlplane/apiserver/server.go +++ b/pkg/controlplane/apiserver/server.go @@ -320,15 +320,6 @@ func (c completedConfig) New(name string, delegationTarget genericapiserver.Dele s.GenericAPIServer.AddPostStartHookOrDie("storage-readiness", s.GenericAPIServer.StorageReadinessHook.Hook) } - // Simulate an additional readiness delay like we have on 1.36 (where WatchCacheInitializationPostStartHook defaults to true). - s.GenericAPIServer.AddPostStartHookOrDie("prove-pre-ready-window", func(hookContext genericapiserver.PostStartHookContext) error { - select { - case <-time.After(60 * time.Second): - case <-hookContext.Done(): - } - return nil - }) - s.GenericAPIServer.AddPostStartHookOrDie("start-legacy-token-tracking-controller", func(hookContext genericapiserver.PostStartHookContext) error { go legacytokentracking.NewController(client).RunWithContext(hookContext) return nil