From 00bcd6cf01b719d0fddc8331ffecd3de35e8896f Mon Sep 17 00:00:00 2001 From: David Ashpole Date: Tue, 11 Oct 2022 16:22:33 +0000 Subject: [PATCH] Fix bug in which APIServerTracing did not work with some egress selectors --- .../apiserver/pkg/server/options/tracing.go | 9 ++- .../apiserver/tracing/tracing_test.go | 75 ++++++++++++++++--- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/staging/src/k8s.io/apiserver/pkg/server/options/tracing.go b/staging/src/k8s.io/apiserver/pkg/server/options/tracing.go index 45976b3ea32..1a135e83d23 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/options/tracing.go +++ b/staging/src/k8s.io/apiserver/pkg/server/options/tracing.go @@ -101,11 +101,12 @@ func (o *TracingOptions) ApplyTo(es *egressselector.EgressSelector, c *server.Co if err != nil { return err } - - otelDialer := func(ctx context.Context, addr string) (net.Conn, error) { - return egressDialer(ctx, "tcp", addr) + if egressDialer != nil { + otelDialer := func(ctx context.Context, addr string) (net.Conn, error) { + return egressDialer(ctx, "tcp", addr) + } + opts = append(opts, otlptracegrpc.WithDialOption(grpc.WithContextDialer(otelDialer))) } - opts = append(opts, otlptracegrpc.WithDialOption(grpc.WithContextDialer(otelDialer))) } resourceOpts := []resource.Option{ diff --git a/test/integration/apiserver/tracing/tracing_test.go b/test/integration/apiserver/tracing/tracing_test.go index e6b38f72d02..3ec11d2b3cf 100644 --- a/test/integration/apiserver/tracing/tracing_test.go +++ b/test/integration/apiserver/tracing/tracing_test.go @@ -41,24 +41,56 @@ import ( ) func TestAPIServerTracing(t *testing.T) { - defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.APIServerTracing, true)() - // Listen for traces from the API Server before starting it, so the // API Server will successfully connect right away during the test. listener, err := net.Listen("tcp", "localhost:") if err != nil { t.Fatal(err) } + // Write the configuration for tracing to a file + tracingConfigFile, err := os.CreateTemp("", "tracing-config.yaml") + if err != nil { + t.Fatal(err) + } + defer os.Remove(tracingConfigFile.Name()) - traceFound := make(chan struct{}) - defer close(traceFound) - srv := grpc.NewServer() - traceservice.RegisterTraceServiceServer(srv, &traceServer{ - traceFound: traceFound, - filterFunc: containsNodeListSpan}) + if err := os.WriteFile(tracingConfigFile.Name(), []byte(fmt.Sprintf(` +apiVersion: apiserver.config.k8s.io/v1alpha1 +kind: TracingConfiguration +endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil { + t.Fatal(err) + } + testAPIServerTracing(t, + listener, + []string{"--tracing-config-file=" + tracingConfigFile.Name()}, + ) +} - go srv.Serve(listener) - defer srv.Stop() +func TestAPIServerTracingWithEgressSelector(t *testing.T) { + // Listen for traces from the API Server before starting it, so the + // API Server will successfully connect right away during the test. + listener, err := net.Listen("tcp", "localhost:") + if err != nil { + t.Fatal(err) + } + // Use an egress selector which doesn't have a controlplane config to ensure + // tracing works in that context. Write the egress selector configuration to a file. + egressSelectorConfigFile, err := os.CreateTemp("", "egress_selector_configuration.yaml") + if err != nil { + t.Fatal(err) + } + defer os.Remove(egressSelectorConfigFile.Name()) + + if err := os.WriteFile(egressSelectorConfigFile.Name(), []byte(` +apiVersion: apiserver.config.k8s.io/v1beta1 +kind: EgressSelectorConfiguration +egressSelections: +- name: cluster + connection: + proxyProtocol: Direct + transport:`), os.FileMode(0755)); err != nil { + t.Fatal(err) + } // Write the configuration for tracing to a file tracingConfigFile, err := os.CreateTemp("", "tracing-config.yaml") @@ -73,11 +105,32 @@ kind: TracingConfiguration endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil { t.Fatal(err) } + testAPIServerTracing(t, + listener, + []string{ + "--tracing-config-file=" + tracingConfigFile.Name(), + "--egress-selector-config-file=" + egressSelectorConfigFile.Name(), + }, + ) +} + +func testAPIServerTracing(t *testing.T, listener net.Listener, apiserverArgs []string) { + defer featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, genericfeatures.APIServerTracing, true)() + + traceFound := make(chan struct{}) + defer close(traceFound) + srv := grpc.NewServer() + traceservice.RegisterTraceServiceServer(srv, &traceServer{ + traceFound: traceFound, + filterFunc: containsNodeListSpan}) + + go srv.Serve(listener) + defer srv.Stop() // Start the API Server with our tracing configuration testServer := kubeapiservertesting.StartTestServerOrDie(t, kubeapiservertesting.NewDefaultTestServerOptions(), - []string{"--tracing-config-file=" + tracingConfigFile.Name()}, + apiserverArgs, framework.SharedEtcd(), ) defer testServer.TearDownFn()