Merge pull request #112979 from dashpole/fix_tracing_crash

Fix bug in which APIServerTracing did not work with some egress selectors
This commit is contained in:
Kubernetes Prow Robot 2022-10-18 15:07:12 -07:00 committed by GitHub
commit 859ada198f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 15 deletions

View File

@ -101,12 +101,13 @@ func (o *TracingOptions) ApplyTo(es *egressselector.EgressSelector, c *server.Co
if err != nil { if err != nil {
return err return err
} }
if egressDialer != nil {
otelDialer := func(ctx context.Context, addr string) (net.Conn, error) { otelDialer := func(ctx context.Context, addr string) (net.Conn, error) {
return egressDialer(ctx, "tcp", addr) return egressDialer(ctx, "tcp", addr)
} }
opts = append(opts, otlptracegrpc.WithDialOption(grpc.WithContextDialer(otelDialer))) opts = append(opts, otlptracegrpc.WithDialOption(grpc.WithContextDialer(otelDialer)))
} }
}
resourceOpts := []resource.Option{ resourceOpts := []resource.Option{
resource.WithAttributes( resource.WithAttributes(

View File

@ -41,24 +41,56 @@ import (
) )
func TestAPIServerTracing(t *testing.T) { 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 // Listen for traces from the API Server before starting it, so the
// API Server will successfully connect right away during the test. // API Server will successfully connect right away during the test.
listener, err := net.Listen("tcp", "localhost:") listener, err := net.Listen("tcp", "localhost:")
if err != nil { if err != nil {
t.Fatal(err) 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{}) if err := os.WriteFile(tracingConfigFile.Name(), []byte(fmt.Sprintf(`
defer close(traceFound) apiVersion: apiserver.config.k8s.io/v1alpha1
srv := grpc.NewServer() kind: TracingConfiguration
traceservice.RegisterTraceServiceServer(srv, &traceServer{ endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil {
traceFound: traceFound, t.Fatal(err)
filterFunc: containsNodeListSpan}) }
testAPIServerTracing(t,
listener,
[]string{"--tracing-config-file=" + tracingConfigFile.Name()},
)
}
go srv.Serve(listener) func TestAPIServerTracingWithEgressSelector(t *testing.T) {
defer srv.Stop() // 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 // Write the configuration for tracing to a file
tracingConfigFile, err := os.CreateTemp("", "tracing-config.yaml") tracingConfigFile, err := os.CreateTemp("", "tracing-config.yaml")
@ -73,11 +105,32 @@ kind: TracingConfiguration
endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil { endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil {
t.Fatal(err) 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 // Start the API Server with our tracing configuration
testServer := kubeapiservertesting.StartTestServerOrDie(t, testServer := kubeapiservertesting.StartTestServerOrDie(t,
kubeapiservertesting.NewDefaultTestServerOptions(), kubeapiservertesting.NewDefaultTestServerOptions(),
[]string{"--tracing-config-file=" + tracingConfigFile.Name()}, apiserverArgs,
framework.SharedEtcd(), framework.SharedEtcd(),
) )
defer testServer.TearDownFn() defer testServer.TearDownFn()