From af05a7eca32c0d63a0da521db64f53d685ea0ce0 Mon Sep 17 00:00:00 2001 From: Sri Saran Balaji Vellore Rajakumar Date: Wed, 27 Jan 2021 07:34:38 -0800 Subject: [PATCH] Refactor Kubelet Server to take kubeConfiguration instead of multiple fields --- cmd/kubelet/app/server.go | 4 +-- pkg/kubelet/kubelet.go | 14 ++++------ pkg/kubelet/server/BUILD | 2 ++ pkg/kubelet/server/server.go | 43 +++++++++++++------------------ pkg/kubelet/server/server_test.go | 36 +++++++++++++++++--------- 5 files changed, 50 insertions(+), 49 deletions(-) diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index ddba3464b38..6a60dc3206d 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -1187,9 +1187,7 @@ func startKubelet(k kubelet.Bootstrap, podCfg *config.PodConfig, kubeCfg *kubele // start the kubelet server if enableServer { - go k.ListenAndServe(net.ParseIP(kubeCfg.Address), uint(kubeCfg.Port), kubeDeps.TLSOptions, kubeDeps.Auth, - enableCAdvisorJSONEndpoints, kubeCfg.EnableDebuggingHandlers, kubeCfg.EnableContentionProfiling, - kubeCfg.EnableSystemLogHandler, kubeCfg.EnableProfilingHandler, kubeCfg.EnableDebugFlagsHandler) + go k.ListenAndServe(kubeCfg, kubeDeps.TLSOptions, kubeDeps.Auth, enableCAdvisorJSONEndpoints) } if kubeCfg.ReadOnlyPort > 0 { go k.ListenAndServeReadOnly(net.ParseIP(kubeCfg.Address), uint(kubeCfg.ReadOnlyPort), enableCAdvisorJSONEndpoints) diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 70b95b3cafa..6513882d8e1 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -195,9 +195,8 @@ type Bootstrap interface { GetConfiguration() kubeletconfiginternal.KubeletConfiguration BirthCry() StartGarbageCollection() - ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, - enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler, - enableProfilingHandler, enableDebugFlagsHandler bool) + ListenAndServe(kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *server.TLSOptions, auth server.AuthInterface, + enableCAdvisorJSONEndpoints bool) ListenAndServeReadOnly(address net.IP, port uint, enableCAdvisorJSONEndpoints bool) ListenAndServePodResources() Run(<-chan kubetypes.PodUpdate) @@ -2227,12 +2226,9 @@ func (kl *Kubelet) ResyncInterval() time.Duration { } // ListenAndServe runs the kubelet HTTP server. -func (kl *Kubelet) ListenAndServe(address net.IP, port uint, tlsOptions *server.TLSOptions, auth server.AuthInterface, - enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler, - enableProfilingHandler, enableDebugFlagsHandler bool) { - server.ListenAndServeKubeletServer(kl, kl.resourceAnalyzer, address, port, tlsOptions, auth, - enableCAdvisorJSONEndpoints, enableDebuggingHandlers, enableContentionProfiling, enableSystemLogHandler, - enableProfilingHandler, enableDebugFlagsHandler) +func (kl *Kubelet) ListenAndServe(kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *server.TLSOptions, + auth server.AuthInterface, enableCAdvisorJSONEndpoints bool) { + server.ListenAndServeKubeletServer(kl, kl.resourceAnalyzer, kubeCfg, tlsOptions, auth, enableCAdvisorJSONEndpoints) } // ListenAndServeReadOnly runs the kubelet HTTP server in read-only mode. diff --git a/pkg/kubelet/server/BUILD b/pkg/kubelet/server/BUILD index 2d6bf833237..187fcc37543 100644 --- a/pkg/kubelet/server/BUILD +++ b/pkg/kubelet/server/BUILD @@ -19,6 +19,7 @@ go_library( "//pkg/apis/core:go_default_library", "//pkg/apis/core/v1/validation:go_default_library", "//pkg/features:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/apis/podresources:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/cri/streaming:go_default_library", @@ -74,6 +75,7 @@ go_test( deps = [ "//pkg/apis/core:go_default_library", "//pkg/apis/core/install:go_default_library", + "//pkg/kubelet/apis/config:go_default_library", "//pkg/kubelet/cm:go_default_library", "//pkg/kubelet/container:go_default_library", "//pkg/kubelet/cri/streaming:go_default_library", diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go index 4484fb9dc63..8f183f02108 100644 --- a/pkg/kubelet/server/server.go +++ b/pkg/kubelet/server/server.go @@ -66,6 +66,7 @@ import ( api "k8s.io/kubernetes/pkg/apis/core" "k8s.io/kubernetes/pkg/apis/core/v1/validation" "k8s.io/kubernetes/pkg/features" + kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/config" "k8s.io/kubernetes/pkg/kubelet/apis/podresources" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/cri/streaming" @@ -139,19 +140,15 @@ func (a *filteringContainer) RegisteredHandlePaths() []string { func ListenAndServeKubeletServer( host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, - address net.IP, - port uint, + kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *TLSOptions, auth AuthInterface, - enableCAdvisorJSONEndpoints, - enableDebuggingHandlers, - enableContentionProfiling, - enableSystemLogHandler, - enableProfilingHandler, - enableDebugFlagsHandler bool) { - klog.Infof("Starting to listen on %s:%d", address, port) - handler := NewServer(host, resourceAnalyzer, auth, enableCAdvisorJSONEndpoints, enableDebuggingHandlers, - enableContentionProfiling, enableSystemLogHandler, enableProfilingHandler, enableDebugFlagsHandler) + enableCAdvisorJSONEndpoints bool) { + + address := net.ParseIP(kubeCfg.Address) + port := uint(kubeCfg.Port) + klog.InfoS("Starting to listen", "address", address, "port", port) + handler := NewServer(host, resourceAnalyzer, auth, enableCAdvisorJSONEndpoints, kubeCfg) s := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), Handler: &handler, @@ -172,8 +169,8 @@ func ListenAndServeKubeletServer( // ListenAndServeKubeletReadOnlyServer initializes a server to respond to HTTP network requests on the Kubelet. func ListenAndServeKubeletReadOnlyServer(host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, address net.IP, port uint, enableCAdvisorJSONEndpoints bool) { - klog.V(1).Infof("Starting to listen read-only on %s:%d", address, port) - s := NewServer(host, resourceAnalyzer, nil, enableCAdvisorJSONEndpoints, false, false, false, false, false) + klog.InfoS("Starting to listen read-only", "address", address, "port", port) + s := NewServer(host, resourceAnalyzer, nil, enableCAdvisorJSONEndpoints, nil) server := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), @@ -225,12 +222,8 @@ func NewServer( host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, auth AuthInterface, - enableCAdvisorJSONEndpoints, - enableDebuggingHandlers, - enableContentionProfiling, - enableSystemLogHandler, - enableProfilingHandler, - enableDebugFlagsHandler bool) Server { + enableCAdvisorJSONEndpoints bool, + kubeCfg *kubeletconfiginternal.KubeletConfiguration) Server { server := Server{ host: host, resourceAnalyzer: resourceAnalyzer, @@ -243,13 +236,13 @@ func NewServer( server.InstallAuthFilter() } server.InstallDefaultHandlers(enableCAdvisorJSONEndpoints) - if enableDebuggingHandlers { + if kubeCfg != nil && kubeCfg.EnableDebuggingHandlers { server.InstallDebuggingHandlers() // To maintain backward compatibility serve logs and pprof only when enableDebuggingHandlers is also enabled // see https://github.com/kubernetes/kubernetes/pull/87273 - server.InstallSystemLogHandler(enableSystemLogHandler) - server.InstallProfilingHandler(enableProfilingHandler, enableContentionProfiling) - server.InstallDebugFlagsHandler(enableDebugFlagsHandler) + server.InstallSystemLogHandler(kubeCfg.EnableSystemLogHandler) + server.InstallProfilingHandler(kubeCfg.EnableProfilingHandler, kubeCfg.EnableContentionProfiling) + server.InstallDebugFlagsHandler(kubeCfg.EnableDebugFlagsHandler) } else { server.InstallDebuggingDisabledHandlers() } @@ -563,9 +556,9 @@ func (s *Server) InstallDebugFlagsHandler(enableDebugFlagsHandler bool) { } // InstallProfilingHandler registers the HTTP request patterns for /debug/pprof endpoint. -func (s *Server) InstallProfilingHandler(enableSystemLogHandler bool, enableContentionProfiling bool) { +func (s *Server) InstallProfilingHandler(enableProfilingLogHandler bool, enableContentionProfiling bool) { s.addMetricsBucketMatcher("debug") - if !enableSystemLogHandler { + if !enableProfilingLogHandler { s.restfulCont.Handle(pprofBasePath, getHandlerForDisabledEndpoint("profiling endpoint is disabled.")) return } diff --git a/pkg/kubelet/server/server_test.go b/pkg/kubelet/server/server_test.go index 9072c6b4304..745ff5843c6 100644 --- a/pkg/kubelet/server/server_test.go +++ b/pkg/kubelet/server/server_test.go @@ -55,6 +55,7 @@ import ( // Do some initialization to decode the query parameters correctly. _ "k8s.io/kubernetes/pkg/apis/core/install" + kubeletconfiginternal "k8s.io/kubernetes/pkg/kubelet/apis/config" "k8s.io/kubernetes/pkg/kubelet/cm" kubecontainer "k8s.io/kubernetes/pkg/kubelet/container" "k8s.io/kubernetes/pkg/kubelet/cri/streaming" @@ -304,10 +305,17 @@ func newServerTest() *serverTestFramework { } func newServerTestWithDebug(enableDebugging bool, streamingServer streaming.Server) *serverTestFramework { - return newServerTestWithDebuggingHandlers(enableDebugging, enableDebugging, streamingServer) + kubeCfg := &kubeletconfiginternal.KubeletConfiguration{ + EnableDebuggingHandlers: enableDebugging, + EnableSystemLogHandler: enableDebugging, + EnableProfilingHandler: enableDebugging, + EnableDebugFlagsHandler: enableDebugging, + } + return newServerTestWithDebuggingHandlers(kubeCfg, streamingServer) } -func newServerTestWithDebuggingHandlers(enableDebugging, enableLogAndProfilingHandler bool, streamingServer streaming.Server) *serverTestFramework { +func newServerTestWithDebuggingHandlers(kubeCfg *kubeletconfiginternal.KubeletConfiguration, streamingServer streaming.Server) *serverTestFramework { + fw := &serverTestFramework{} fw.fakeKubelet = &fakeKubelet{ hostnameFunc: func() string { @@ -341,11 +349,7 @@ func newServerTestWithDebuggingHandlers(enableDebugging, enableLogAndProfilingHa stats.NewResourceAnalyzer(fw.fakeKubelet, time.Minute), fw.fakeAuth, true, - enableDebugging, - false, - enableLogAndProfilingHandler, - enableLogAndProfilingHandler, - enableLogAndProfilingHandler) + kubeCfg) fw.serverUnderTest = &server fw.testHTTPServer = httptest.NewServer(fw.serverUnderTest) return fw @@ -1506,9 +1510,15 @@ func TestMetricMethodBuckets(t *testing.T) { } func TestDebuggingDisabledHandlers(t *testing.T) { - // for backward compatibility even if enablesystemLogHandler is set but not enableDebuggingHandler then /logs - //shouldn't be served. - fw := newServerTestWithDebuggingHandlers(false, true, nil) + // for backward compatibility even if enablesystemLogHandler or enableProfilingHandler is set but not + // enableDebuggingHandler then /logs, /pprof and /flags shouldn't be served. + kubeCfg := &kubeletconfiginternal.KubeletConfiguration{ + EnableDebuggingHandlers: false, + EnableSystemLogHandler: true, + EnableDebugFlagsHandler: true, + EnableProfilingHandler: true, + } + fw := newServerTestWithDebuggingHandlers(kubeCfg, nil) defer fw.testHTTPServer.Close() paths := []string{ @@ -1548,11 +1558,13 @@ func TestDebuggingDisabledHandlers(t *testing.T) { resp, err = http.Get(fw.testHTTPServer.URL + "/spec") require.NoError(t, err) assert.Equal(t, http.StatusOK, resp.StatusCode) - } func TestDisablingLogAndProfilingHandler(t *testing.T) { - fw := newServerTestWithDebuggingHandlers(true, false, nil) + kubeCfg := &kubeletconfiginternal.KubeletConfiguration{ + EnableDebuggingHandlers: true, + } + fw := newServerTestWithDebuggingHandlers(kubeCfg, nil) defer fw.testHTTPServer.Close() // verify debug endpoints are disabled