Fix auth registration for statusz and flagz

Co-authored-by: Jordan Liggitt <jordan@liggitt.net>
This commit is contained in:
Richa Banker
2026-03-04 14:47:05 -08:00
parent 5bc6d200a2
commit 426bb7cded
4 changed files with 32 additions and 34 deletions

View File

@@ -312,18 +312,17 @@ func NewServer(
server.InstallAuthNotRequiredHandlers(ctx)
if kubeCfg != nil && kubeCfg.EnableDebuggingHandlers {
logger.Info("Adding debug handlers to kubelet server")
server.InstallAuthRequiredHandlers(ctx)
// To maintain backward compatibility serve logs and pprof only when enableDebuggingHandlers is also enabled
// see https://github.com/kubernetes/kubernetes/pull/87273
server.InstallSystemLogHandler(kubeCfg.EnableSystemLogHandler, kubeCfg.EnableSystemLogQuery)
server.InstallProfilingHandler(kubeCfg.EnableProfilingHandler, kubeCfg.EnableContentionProfiling)
server.InstallDebugFlagsHandler(kubeCfg.EnableDebugFlagsHandler)
// must be done last so all paths are included in /statusz
server.InstallAuthRequiredHandlers(ctx)
} else {
server.InstallDebuggingDisabledHandlers()
}
server.installStatusZ()
return server
}
@@ -387,7 +386,14 @@ func (s *Server) InstallTracingFilter(tp oteltrace.TracerProvider, opts ...otelr
s.restfulCont.Filter(otelrestful.OTelFilter("kubelet", append(opts, otelrestful.WithTracerProvider(tp))...))
}
func (s *Server) installStatusZ() {
func (s *Server) InstallZPages() {
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {
if s.flagz != nil {
s.addMetricsBucketMatcher("flagz")
flagz.Install(s.restfulCont, ComponentKubelet, s.flagz)
}
}
// must be done last so all paths are included in /statusz
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentStatusz) {
s.addMetricsBucketMatcher("statusz")
statusz.Install(s.restfulCont, ComponentKubelet, statusz.NewRegistry(compatibility.DefaultBuildEffectiveVersion(), statusz.WithListedPaths(s.restfulCont.RegisteredHandlePaths())))
@@ -598,13 +604,6 @@ func (s *Server) InstallAuthRequiredHandlers(ctx context.Context) {
s.addMetricsBucketMatcher("configz")
configz.InstallHandler(s.restfulCont)
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {
if s.flagz != nil {
s.addMetricsBucketMatcher("flagz")
flagz.Install(s.restfulCont, ComponentKubelet, s.flagz)
}
}
// The /runningpods endpoint is used for testing only.
s.addMetricsBucketMatcher("runningpods")
ws = new(restful.WebService)
@@ -626,6 +625,9 @@ func (s *Server) InstallAuthRequiredHandlers(ctx context.Context) {
Operation("checkpoint"))
s.restfulCont.Add(ws)
}
// must be done last so all paths are included in /statusz
s.InstallZPages()
}
// InstallDebuggingDisabledHandlers registers the HTTP request patterns that provide better error message

View File

@@ -293,23 +293,25 @@ func NodeRules() []rbacv1.PolicyRule {
// ClusterRoles returns the cluster roles to bootstrap an API server with
func ClusterRoles() []rbacv1.ClusterRole {
monitoringRules := []rbacv1.PolicyRule{
rbacv1helpers.NewRule("get").URLs(
"/metrics", "/metrics/slis",
"/livez", "/readyz", "/healthz",
"/livez/*", "/readyz/*", "/healthz/*",
).RuleOrDie(),
// Needed for kubelet metrics
rbacv1helpers.NewRule("get").Groups(legacyGroup).Resources("nodes/metrics").RuleOrDie(),
monitoringURLs := []string{
"/metrics", "/metrics/slis",
"/livez", "/readyz", "/healthz",
"/livez/*", "/readyz/*", "/healthz/*",
}
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {
monitoringRules = append(monitoringRules, rbacv1helpers.NewRule("get").URLs("/flagz").RuleOrDie())
monitoringURLs = append(monitoringURLs, "/flagz")
}
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentStatusz) {
monitoringRules = append(monitoringRules, rbacv1helpers.NewRule("get").URLs("/statusz").RuleOrDie())
monitoringURLs = append(monitoringURLs, "/statusz")
}
monitoringRules := []rbacv1.PolicyRule{
rbacv1helpers.NewRule("get").URLs(monitoringURLs...).RuleOrDie(),
// Needed for kubelet metrics
rbacv1helpers.NewRule("get").Groups(legacyGroup).Resources("nodes/metrics").RuleOrDie(),
}
roles := []rbacv1.ClusterRole{

View File

@@ -1052,6 +1052,7 @@ items:
name: system:monitoring
rules:
- nonResourceURLs:
- /flagz
- /healthz
- /healthz/*
- /livez
@@ -1060,6 +1061,7 @@ items:
- /metrics/slis
- /readyz
- /readyz/*
- /statusz
verbs:
- get
- apiGroups:
@@ -1068,14 +1070,6 @@ items:
- nodes/metrics
verbs:
- get
- nonResourceURLs:
- /flagz
verbs:
- get
- nonResourceURLs:
- /statusz
verbs:
- get
- apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:

View File

@@ -468,15 +468,15 @@ func (s *GenericAPIServer) PrepareRun() preparedGenericAPIServer {
s.installReadyz()
componentName := "apiserver"
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentStatusz) {
statusz.Install(s.Handler.NonGoRestfulMux, componentName, statusz.NewRegistry(s.EffectiveVersion, statusz.WithListedPaths(s.ListedPaths())))
}
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) {
if s.Flagz != nil {
flagz.Install(s.Handler.NonGoRestfulMux, componentName, s.Flagz)
}
}
// statusz is installed last so that it can list all the paths that have been registered
if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentStatusz) {
statusz.Install(s.Handler.NonGoRestfulMux, componentName, statusz.NewRegistry(s.EffectiveVersion, statusz.WithListedPaths(s.ListedPaths())))
}
return preparedGenericAPIServer{s}
}