graduate API Server tracing to beta
This commit is contained in:
		| @@ -19,6 +19,7 @@ package apiserver | ||||
| import ( | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/apimachinery/pkg/runtime" | ||||
| 	tracingapi "k8s.io/component-base/tracing/api/v1" | ||||
| ) | ||||
|  | ||||
| // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object | ||||
| @@ -153,16 +154,6 @@ type TLSConfig struct { | ||||
| type TracingConfiguration struct { | ||||
| 	metav1.TypeMeta | ||||
|  | ||||
| 	// +optional | ||||
| 	// Endpoint of the collector that's running on the control-plane node. | ||||
| 	// The APIServer uses the egressType ControlPlane when sending data to the collector. | ||||
| 	// The syntax is defined in https://github.com/grpc/grpc/blob/master/doc/naming.md. | ||||
| 	// Defaults to the otlp grpc default, localhost:4317 | ||||
| 	// The connection is insecure, and does not currently support TLS. | ||||
| 	Endpoint *string | ||||
|  | ||||
| 	// +optional | ||||
| 	// SamplingRatePerMillion is the number of samples to collect per million spans. | ||||
| 	// Defaults to 0. | ||||
| 	SamplingRatePerMillion *int32 | ||||
| 	// Embed the component config tracing configuration struct | ||||
| 	tracingapi.TracingConfiguration | ||||
| } | ||||
|   | ||||
| @@ -19,6 +19,7 @@ package v1alpha1 | ||||
| import ( | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/apimachinery/pkg/runtime" | ||||
| 	tracingapi "k8s.io/component-base/tracing/api/v1" | ||||
| ) | ||||
|  | ||||
| // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object | ||||
| @@ -154,16 +155,6 @@ type TLSConfig struct { | ||||
| type TracingConfiguration struct { | ||||
| 	metav1.TypeMeta `json:",inline"` | ||||
|  | ||||
| 	// +optional | ||||
| 	// Endpoint of the collector that's running on the control-plane node. | ||||
| 	// The APIServer uses the egressType ControlPlane when sending data to the collector. | ||||
| 	// The syntax is defined in https://github.com/grpc/grpc/blob/master/doc/naming.md. | ||||
| 	// Defaults to the otlpgrpc default, localhost:4317 | ||||
| 	// The connection is insecure, and does not support TLS. | ||||
| 	Endpoint *string `json:"endpoint,omitempty" protobuf:"bytes,1,opt,name=endpoint"` | ||||
|  | ||||
| 	// +optional | ||||
| 	// SamplingRatePerMillion is the number of samples to collect per million spans. | ||||
| 	// Defaults to 0. | ||||
| 	SamplingRatePerMillion *int32 `json:"samplingRatePerMillion,omitempty" protobuf:"varint,2,opt,name=samplingRatePerMillion"` | ||||
| 	// Embed the component config tracing configuration struct | ||||
| 	tracingapi.TracingConfiguration `json:",inline"` | ||||
| } | ||||
|   | ||||
| @@ -313,8 +313,7 @@ func Convert_apiserver_TLSConfig_To_v1alpha1_TLSConfig(in *apiserver.TLSConfig, | ||||
| } | ||||
|  | ||||
| func autoConvert_v1alpha1_TracingConfiguration_To_apiserver_TracingConfiguration(in *TracingConfiguration, out *apiserver.TracingConfiguration, s conversion.Scope) error { | ||||
| 	out.Endpoint = (*string)(unsafe.Pointer(in.Endpoint)) | ||||
| 	out.SamplingRatePerMillion = (*int32)(unsafe.Pointer(in.SamplingRatePerMillion)) | ||||
| 	out.TracingConfiguration = in.TracingConfiguration | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -324,8 +323,7 @@ func Convert_v1alpha1_TracingConfiguration_To_apiserver_TracingConfiguration(in | ||||
| } | ||||
|  | ||||
| func autoConvert_apiserver_TracingConfiguration_To_v1alpha1_TracingConfiguration(in *apiserver.TracingConfiguration, out *TracingConfiguration, s conversion.Scope) error { | ||||
| 	out.Endpoint = (*string)(unsafe.Pointer(in.Endpoint)) | ||||
| 	out.SamplingRatePerMillion = (*int32)(unsafe.Pointer(in.SamplingRatePerMillion)) | ||||
| 	out.TracingConfiguration = in.TracingConfiguration | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -189,16 +189,7 @@ func (in *TLSConfig) DeepCopy() *TLSConfig { | ||||
| func (in *TracingConfiguration) DeepCopyInto(out *TracingConfiguration) { | ||||
| 	*out = *in | ||||
| 	out.TypeMeta = in.TypeMeta | ||||
| 	if in.Endpoint != nil { | ||||
| 		in, out := &in.Endpoint, &out.Endpoint | ||||
| 		*out = new(string) | ||||
| 		**out = **in | ||||
| 	} | ||||
| 	if in.SamplingRatePerMillion != nil { | ||||
| 		in, out := &in.SamplingRatePerMillion, &out.SamplingRatePerMillion | ||||
| 		*out = new(int32) | ||||
| 		**out = **in | ||||
| 	} | ||||
| 	in.TracingConfiguration.DeepCopyInto(&out.TracingConfiguration) | ||||
| 	return | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -23,10 +23,14 @@ import ( | ||||
| ) | ||||
|  | ||||
| const GroupName = "apiserver.k8s.io" | ||||
| const ConfigGroupName = "apiserver.config.k8s.io" | ||||
|  | ||||
| // SchemeGroupVersion is group version used to register these objects | ||||
| var SchemeGroupVersion = schema.GroupVersion{Group: GroupName, Version: "v1beta1"} | ||||
|  | ||||
| // ConfigSchemeGroupVersion is group version used to register these objects | ||||
| var ConfigSchemeGroupVersion = schema.GroupVersion{Group: ConfigGroupName, Version: "v1beta1"} | ||||
|  | ||||
| var ( | ||||
| 	// TODO: move SchemeBuilder with zz_generated.deepcopy.go to k8s.io/api. | ||||
| 	// localSchemeBuilder and AddToScheme will stay in k8s.io/kubernetes. | ||||
| @@ -47,6 +51,9 @@ func addKnownTypes(scheme *runtime.Scheme) error { | ||||
| 	scheme.AddKnownTypes(SchemeGroupVersion, | ||||
| 		&EgressSelectorConfiguration{}, | ||||
| 	) | ||||
| 	scheme.AddKnownTypes(ConfigSchemeGroupVersion, | ||||
| 		&TracingConfiguration{}, | ||||
| 	) | ||||
| 	metav1.AddToGroupVersion(scheme, SchemeGroupVersion) | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -18,6 +18,7 @@ package v1beta1 | ||||
|  | ||||
| import ( | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	tracingapi "k8s.io/component-base/tracing/api/v1" | ||||
| ) | ||||
|  | ||||
| // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object | ||||
| @@ -118,3 +119,13 @@ type TLSConfig struct { | ||||
| 	// +optional | ||||
| 	ClientCert string `json:"clientCert,omitempty"` | ||||
| } | ||||
|  | ||||
| // +k8s:deepcopy-gen:interfaces=k8s.io/apimachinery/pkg/runtime.Object | ||||
|  | ||||
| // TracingConfiguration provides versioned configuration for tracing clients. | ||||
| type TracingConfiguration struct { | ||||
| 	metav1.TypeMeta `json:",inline"` | ||||
|  | ||||
| 	// Embed the component config tracing configuration struct | ||||
| 	tracingapi.TracingConfiguration `json:",inline"` | ||||
| } | ||||
|   | ||||
| @@ -81,6 +81,16 @@ func RegisterConversions(s *runtime.Scheme) error { | ||||
| 	}); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := s.AddGeneratedConversionFunc((*TracingConfiguration)(nil), (*apiserver.TracingConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { | ||||
| 		return Convert_v1beta1_TracingConfiguration_To_apiserver_TracingConfiguration(a.(*TracingConfiguration), b.(*apiserver.TracingConfiguration), scope) | ||||
| 	}); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := s.AddGeneratedConversionFunc((*apiserver.TracingConfiguration)(nil), (*TracingConfiguration)(nil), func(a, b interface{}, scope conversion.Scope) error { | ||||
| 		return Convert_apiserver_TracingConfiguration_To_v1beta1_TracingConfiguration(a.(*apiserver.TracingConfiguration), b.(*TracingConfiguration), scope) | ||||
| 	}); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := s.AddGeneratedConversionFunc((*Transport)(nil), (*apiserver.Transport)(nil), func(a, b interface{}, scope conversion.Scope) error { | ||||
| 		return Convert_v1beta1_Transport_To_apiserver_Transport(a.(*Transport), b.(*apiserver.Transport), scope) | ||||
| 	}); err != nil { | ||||
| @@ -238,6 +248,26 @@ func Convert_apiserver_TLSConfig_To_v1beta1_TLSConfig(in *apiserver.TLSConfig, o | ||||
| 	return autoConvert_apiserver_TLSConfig_To_v1beta1_TLSConfig(in, out, s) | ||||
| } | ||||
|  | ||||
| func autoConvert_v1beta1_TracingConfiguration_To_apiserver_TracingConfiguration(in *TracingConfiguration, out *apiserver.TracingConfiguration, s conversion.Scope) error { | ||||
| 	out.TracingConfiguration = in.TracingConfiguration | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Convert_v1beta1_TracingConfiguration_To_apiserver_TracingConfiguration is an autogenerated conversion function. | ||||
| func Convert_v1beta1_TracingConfiguration_To_apiserver_TracingConfiguration(in *TracingConfiguration, out *apiserver.TracingConfiguration, s conversion.Scope) error { | ||||
| 	return autoConvert_v1beta1_TracingConfiguration_To_apiserver_TracingConfiguration(in, out, s) | ||||
| } | ||||
|  | ||||
| func autoConvert_apiserver_TracingConfiguration_To_v1beta1_TracingConfiguration(in *apiserver.TracingConfiguration, out *TracingConfiguration, s conversion.Scope) error { | ||||
| 	out.TracingConfiguration = in.TracingConfiguration | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // Convert_apiserver_TracingConfiguration_To_v1beta1_TracingConfiguration is an autogenerated conversion function. | ||||
| func Convert_apiserver_TracingConfiguration_To_v1beta1_TracingConfiguration(in *apiserver.TracingConfiguration, out *TracingConfiguration, s conversion.Scope) error { | ||||
| 	return autoConvert_apiserver_TracingConfiguration_To_v1beta1_TracingConfiguration(in, out, s) | ||||
| } | ||||
|  | ||||
| func autoConvert_v1beta1_Transport_To_apiserver_Transport(in *Transport, out *apiserver.Transport, s conversion.Scope) error { | ||||
| 	out.TCP = (*apiserver.TCPTransport)(unsafe.Pointer(in.TCP)) | ||||
| 	out.UDS = (*apiserver.UDSTransport)(unsafe.Pointer(in.UDS)) | ||||
|   | ||||
| @@ -132,6 +132,32 @@ func (in *TLSConfig) DeepCopy() *TLSConfig { | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. | ||||
| func (in *TracingConfiguration) DeepCopyInto(out *TracingConfiguration) { | ||||
| 	*out = *in | ||||
| 	out.TypeMeta = in.TypeMeta | ||||
| 	in.TracingConfiguration.DeepCopyInto(&out.TracingConfiguration) | ||||
| 	return | ||||
| } | ||||
|  | ||||
| // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new TracingConfiguration. | ||||
| func (in *TracingConfiguration) DeepCopy() *TracingConfiguration { | ||||
| 	if in == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	out := new(TracingConfiguration) | ||||
| 	in.DeepCopyInto(out) | ||||
| 	return out | ||||
| } | ||||
|  | ||||
| // DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object. | ||||
| func (in *TracingConfiguration) DeepCopyObject() runtime.Object { | ||||
| 	if c := in.DeepCopy(); c != nil { | ||||
| 		return c | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil. | ||||
| func (in *Transport) DeepCopyInto(out *Transport) { | ||||
| 	*out = *in | ||||
|   | ||||
| @@ -189,16 +189,7 @@ func (in *TLSConfig) DeepCopy() *TLSConfig { | ||||
| func (in *TracingConfiguration) DeepCopyInto(out *TracingConfiguration) { | ||||
| 	*out = *in | ||||
| 	out.TypeMeta = in.TypeMeta | ||||
| 	if in.Endpoint != nil { | ||||
| 		in, out := &in.Endpoint, &out.Endpoint | ||||
| 		*out = new(string) | ||||
| 		**out = **in | ||||
| 	} | ||||
| 	if in.SamplingRatePerMillion != nil { | ||||
| 		in, out := &in.SamplingRatePerMillion, &out.SamplingRatePerMillion | ||||
| 		*out = new(int32) | ||||
| 		**out = **in | ||||
| 	} | ||||
| 	in.TracingConfiguration.DeepCopyInto(&out.TracingConfiguration) | ||||
| 	return | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -74,6 +74,7 @@ const ( | ||||
|  | ||||
| 	// owner: @dashpole | ||||
| 	// alpha: v1.22 | ||||
| 	// beta: v1.27 | ||||
| 	// | ||||
| 	// Add support for distributed tracing in the API Server | ||||
| 	APIServerTracing featuregate.Feature = "APIServerTracing" | ||||
| @@ -231,7 +232,7 @@ var defaultKubernetesFeatureGates = map[featuregate.Feature]featuregate.FeatureS | ||||
|  | ||||
| 	APIServerIdentity: {Default: true, PreRelease: featuregate.Beta}, | ||||
|  | ||||
| 	APIServerTracing: {Default: false, PreRelease: featuregate.Alpha}, | ||||
| 	APIServerTracing: {Default: true, PreRelease: featuregate.Beta}, | ||||
|  | ||||
| 	AdvancedAuditing: {Default: true, PreRelease: featuregate.GA, LockToDefault: true}, // remove in 1.28 | ||||
|  | ||||
|   | ||||
| @@ -154,9 +154,5 @@ func ReadTracingConfiguration(configFilePath string) (*tracingapi.TracingConfigu | ||||
| 	if err := runtime.DecodeInto(codecs.UniversalDecoder(), data, internalConfig); err != nil { | ||||
| 		return nil, fmt.Errorf("unable to decode tracing configuration data: %v", err) | ||||
| 	} | ||||
| 	tc := &tracingapi.TracingConfiguration{ | ||||
| 		Endpoint:               internalConfig.Endpoint, | ||||
| 		SamplingRatePerMillion: internalConfig.SamplingRatePerMillion, | ||||
| 	} | ||||
| 	return tc, nil | ||||
| 	return &internalConfig.TracingConfiguration, nil | ||||
| } | ||||
|   | ||||
| @@ -37,10 +37,7 @@ import ( | ||||
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||
| 	"k8s.io/apimachinery/pkg/types" | ||||
| 	"k8s.io/apimachinery/pkg/util/strategicpatch" | ||||
| 	genericfeatures "k8s.io/apiserver/pkg/features" | ||||
| 	utilfeature "k8s.io/apiserver/pkg/util/feature" | ||||
| 	client "k8s.io/client-go/kubernetes" | ||||
| 	featuregatetesting "k8s.io/component-base/featuregate/testing" | ||||
| 	kubeapiservertesting "k8s.io/kubernetes/cmd/kube-apiserver/app/testing" | ||||
| 	"k8s.io/kubernetes/test/integration/framework" | ||||
| ) | ||||
| @@ -79,7 +76,7 @@ egressSelections: | ||||
| 	defer os.Remove(tracingConfigFile.Name()) | ||||
|  | ||||
| 	if err := os.WriteFile(tracingConfigFile.Name(), []byte(fmt.Sprintf(` | ||||
| apiVersion: apiserver.config.k8s.io/v1alpha1 | ||||
| apiVersion: apiserver.config.k8s.io/v1beta1 | ||||
| kind: TracingConfiguration | ||||
| endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil { | ||||
| 		t.Fatal(err) | ||||
| @@ -107,7 +104,6 @@ endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil { | ||||
| } | ||||
|  | ||||
| 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:") | ||||
| @@ -122,7 +118,7 @@ func TestAPIServerTracing(t *testing.T) { | ||||
| 	defer os.Remove(tracingConfigFile.Name()) | ||||
|  | ||||
| 	if err := os.WriteFile(tracingConfigFile.Name(), []byte(fmt.Sprintf(` | ||||
| apiVersion: apiserver.config.k8s.io/v1alpha1 | ||||
| apiVersion: apiserver.config.k8s.io/v1beta1 | ||||
| kind: TracingConfiguration | ||||
| samplingRatePerMillion: 1000000 | ||||
| endpoint: %s`, listener.Addr().String())), os.FileMode(0755)); err != nil { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 David Ashpole
					David Ashpole