mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 12:43:23 +00:00
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:
commit
859ada198f
@ -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(
|
||||||
|
@ -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()
|
||||||
|
Loading…
Reference in New Issue
Block a user