diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index d8d01b21e02..e3aaf264f6c 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -1275,7 +1275,7 @@ func startKubelet(k kubelet.Bootstrap, podCfg *config.PodConfig, kubeCfg *kubele go k.ListenAndServe(kubeCfg, kubeDeps.TLSOptions, kubeDeps.Auth, kubeDeps.TracerProvider) } if kubeCfg.ReadOnlyPort > 0 { - go k.ListenAndServeReadOnly(netutils.ParseIPSloppy(kubeCfg.Address), uint(kubeCfg.ReadOnlyPort)) + go k.ListenAndServeReadOnly(netutils.ParseIPSloppy(kubeCfg.Address), uint(kubeCfg.ReadOnlyPort), kubeDeps.TracerProvider) } go k.ListenAndServePodResources() } diff --git a/pkg/kubelet/kubelet.go b/pkg/kubelet/kubelet.go index 17179571de7..687c74511ec 100644 --- a/pkg/kubelet/kubelet.go +++ b/pkg/kubelet/kubelet.go @@ -237,7 +237,7 @@ type Bootstrap interface { BirthCry() StartGarbageCollection() ListenAndServe(kubeCfg *kubeletconfiginternal.KubeletConfiguration, tlsOptions *server.TLSOptions, auth server.AuthInterface, tp trace.TracerProvider) - ListenAndServeReadOnly(address net.IP, port uint) + ListenAndServeReadOnly(address net.IP, port uint, tp trace.TracerProvider) ListenAndServePodResources() Run(<-chan kubetypes.PodUpdate) RunOnce(<-chan kubetypes.PodUpdate) ([]RunPodResult, error) @@ -2941,8 +2941,8 @@ func (kl *Kubelet) ListenAndServe(kubeCfg *kubeletconfiginternal.KubeletConfigur } // ListenAndServeReadOnly runs the kubelet HTTP server in read-only mode. -func (kl *Kubelet) ListenAndServeReadOnly(address net.IP, port uint) { - server.ListenAndServeKubeletReadOnlyServer(kl, kl.resourceAnalyzer, address, port) +func (kl *Kubelet) ListenAndServeReadOnly(address net.IP, port uint, tp trace.TracerProvider) { + server.ListenAndServeKubeletReadOnlyServer(kl, kl.resourceAnalyzer, address, port, tp) } // ListenAndServePodResources runs the kubelet podresources grpc service diff --git a/pkg/kubelet/server/server.go b/pkg/kubelet/server/server.go index a630d8076b5..2e96ffb4cd8 100644 --- a/pkg/kubelet/server/server.go +++ b/pkg/kubelet/server/server.go @@ -161,7 +161,12 @@ func ListenAndServeKubeletServer( address := netutils.ParseIPSloppy(kubeCfg.Address) port := uint(kubeCfg.Port) klog.InfoS("Starting to listen", "address", address, "port", port) - handler := NewServer(host, resourceAnalyzer, auth, tp, kubeCfg) + handler := NewServer(host, resourceAnalyzer, auth, kubeCfg) + + if utilfeature.DefaultFeatureGate.Enabled(features.KubeletTracing) { + handler.InstallTracingFilter(tp) + } + s := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), Handler: &handler, @@ -191,10 +196,14 @@ func ListenAndServeKubeletReadOnlyServer( host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, address net.IP, - port uint) { + port uint, + tp oteltrace.TracerProvider) { klog.InfoS("Starting to listen read-only", "address", address, "port", port) - // TODO: https://github.com/kubernetes/kubernetes/issues/109829 tracer should use WithPublicEndpoint - s := NewServer(host, resourceAnalyzer, nil, oteltrace.NewNoopTracerProvider(), nil) + s := NewServer(host, resourceAnalyzer, nil, nil) + + if utilfeature.DefaultFeatureGate.Enabled(features.KubeletTracing) { + s.InstallTracingFilter(tp, otelrestful.WithPublicEndpoint()) + } server := &http.Server{ Addr: net.JoinHostPort(address.String(), strconv.FormatUint(uint64(port), 10)), @@ -264,7 +273,6 @@ func NewServer( host HostInterface, resourceAnalyzer stats.ResourceAnalyzer, auth AuthInterface, - tp oteltrace.TracerProvider, kubeCfg *kubeletconfiginternal.KubeletConfiguration) Server { server := Server{ @@ -278,9 +286,6 @@ func NewServer( if auth != nil { server.InstallAuthFilter() } - if utilfeature.DefaultFeatureGate.Enabled(features.KubeletTracing) { - server.InstallTracingFilter(tp) - } server.InstallDefaultHandlers() if kubeCfg != nil && kubeCfg.EnableDebuggingHandlers { server.InstallDebuggingHandlers() @@ -334,8 +339,8 @@ func (s *Server) InstallAuthFilter() { } // InstallTracingFilter installs OpenTelemetry tracing filter with the restful Container. -func (s *Server) InstallTracingFilter(tp oteltrace.TracerProvider) { - s.restfulCont.Filter(otelrestful.OTelFilter("kubelet", otelrestful.WithTracerProvider(tp))) +func (s *Server) InstallTracingFilter(tp oteltrace.TracerProvider, opts ...otelrestful.Option) { + s.restfulCont.Filter(otelrestful.OTelFilter("kubelet", append(opts, otelrestful.WithTracerProvider(tp))...)) } // addMetricsBucketMatcher adds a regexp matcher and the relevant bucket to use when diff --git a/pkg/kubelet/server/server_test.go b/pkg/kubelet/server/server_test.go index aa10aac83fd..b3999ae3d6d 100644 --- a/pkg/kubelet/server/server_test.go +++ b/pkg/kubelet/server/server_test.go @@ -37,7 +37,6 @@ import ( cadvisorapiv2 "github.com/google/cadvisor/info/v2" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - oteltrace "go.opentelemetry.io/otel/trace" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/types" @@ -361,7 +360,6 @@ func newServerTestWithDebuggingHandlers(kubeCfg *kubeletconfiginternal.KubeletCo fw.fakeKubelet, stats.NewResourceAnalyzer(fw.fakeKubelet, time.Minute, &record.FakeRecorder{}), fw.fakeAuth, - oteltrace.NewNoopTracerProvider(), kubeCfg, ) fw.serverUnderTest = &server