From 51665ff776d4532e37e3f66ce24a6c38422fdb6d Mon Sep 17 00:00:00 2001 From: ylink-lfs Date: Fri, 25 Jul 2025 09:33:14 +0800 Subject: [PATCH] feat: list available endpoints in /statusz for kubelet --- pkg/kubelet/server/server.go | 3 ++- pkg/kubelet/server/server_test.go | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go index 4496a5a937d8c..3c98936f05e76 100644 --- a/pkg/kubelet/server/server.go +++ b/pkg/kubelet/server/server.go @@ -160,6 +160,7 @@ func (a *filteringContainer) Handle(path string, handler http.Handler) { a.HandleWithFilter(path, handler) a.registeredHandlePaths = append(a.registeredHandlePaths, path) } + func (a *filteringContainer) RegisteredHandlePaths() []string { return a.registeredHandlePaths } @@ -576,7 +577,7 @@ func (s *Server) InstallAuthRequiredHandlers() { if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentStatusz) { s.addMetricsBucketMatcher("statusz") - statusz.Install(s.restfulCont, ComponentKubelet, statusz.NewRegistry(compatibility.DefaultBuildEffectiveVersion())) + statusz.Install(s.restfulCont, ComponentKubelet, statusz.NewRegistry(compatibility.DefaultBuildEffectiveVersion(), statusz.WithListedPaths(s.restfulCont.RegisteredHandlePaths()))) } if utilfeature.DefaultFeatureGate.Enabled(zpagesfeatures.ComponentFlagz) { diff --git a/pkg/kubelet/server/server_test.go b/pkg/kubelet/server/server_test.go index 89c55f0e97b83..c7e0221e59702 100644 --- a/pkg/kubelet/server/server_test.go +++ b/pkg/kubelet/server/server_test.go @@ -28,6 +28,7 @@ import ( "net/http/httputil" "net/url" "reflect" + "regexp" "strconv" "strings" "testing" @@ -1832,6 +1833,35 @@ func TestTrimURLPath(t *testing.T) { } } +func TestComponentStatusz(t *testing.T) { + featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, zpagesfeatures.ComponentStatusz, true) + fw := newServerTest() + defer fw.testHTTPServer.Close() + + req, err := http.NewRequest(http.MethodGet, fw.testHTTPServer.URL+"/statusz", nil) + require.NoError(t, err) + req.Header.Set("Accept", "text/plain") + resp, err := http.DefaultClient.Do(req) + assert.NoError(t, err) + defer func() { + _ = resp.Body.Close() + }() + + respByte, err := io.ReadAll(resp.Body) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode) + respStr := string(respByte) + statuszPathOutput := regexp.MustCompile("Paths.*\n").FindString(respStr) + require.NotEqual(t, "", statuszPathOutput, "/statusz response should contain 'Paths' line") + listedPaths := regexp.MustCompile(`/\S+`).FindAllString(statuszPathOutput, -1) + require.NotEmpty(t, listedPaths, "/statusz response should contain listed paths when ComponentStatusz feature gate enabled") + for _, path := range listedPaths { + resp, err := http.Get(fw.testHTTPServer.URL + path) + require.NoError(t, err) + require.Equal(t, http.StatusOK, resp.StatusCode, "/statusz provided listed paths should return 200 status code") + } +} + func TestFineGrainedAuthz(t *testing.T) { // Enable features.ContainerCheckpoint during test featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.KubeletFineGrainedAuthz, true)