90 lines
4.0 KiB
Go
90 lines
4.0 KiB
Go
/*
|
|
Copyright 2023 The Kubernetes Authors.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
*/
|
|
|
|
package apiserver
|
|
|
|
import (
|
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
|
|
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
|
|
apiextensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
|
|
apiextensionsoptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
"k8s.io/apiserver/pkg/admission"
|
|
"k8s.io/apiserver/pkg/features"
|
|
"k8s.io/apiserver/pkg/server"
|
|
"k8s.io/apiserver/pkg/util/feature"
|
|
"k8s.io/apiserver/pkg/util/webhook"
|
|
"k8s.io/client-go/informers"
|
|
|
|
controlplaneapiserver "k8s.io/kubernetes/pkg/controlplane/apiserver/options"
|
|
)
|
|
|
|
func CreateAPIExtensionsConfig(
|
|
kubeAPIServerConfig server.Config,
|
|
kubeInformers informers.SharedInformerFactory,
|
|
pluginInitializers []admission.PluginInitializer,
|
|
commandOptions controlplaneapiserver.CompletedOptions,
|
|
masterCount int,
|
|
serviceResolver webhook.ServiceResolver,
|
|
authResolverWrapper webhook.AuthenticationInfoResolverWrapper,
|
|
) (*apiextensionsapiserver.Config, error) {
|
|
// make a shallow copy to let us twiddle a few things
|
|
// most of the config actually remains the same. We only need to mess with a couple items related to the particulars of the apiextensions
|
|
genericConfig := kubeAPIServerConfig
|
|
genericConfig.PostStartHooks = map[string]server.PostStartHookConfigEntry{}
|
|
genericConfig.RESTOptionsGetter = nil
|
|
|
|
// copy the etcd options so we don't mutate originals.
|
|
// we assume that the etcd options have been completed already. avoid messing with anything outside
|
|
// of changes to StorageConfig as that may lead to unexpected behavior when the options are applied.
|
|
etcdOptions := *commandOptions.Etcd
|
|
etcdOptions.StorageConfig.Paging = feature.DefaultFeatureGate.Enabled(features.APIListChunking)
|
|
// this is where the true decodable levels come from.
|
|
etcdOptions.StorageConfig.Codec = apiextensionsapiserver.Codecs.LegacyCodec(v1beta1.SchemeGroupVersion, v1.SchemeGroupVersion)
|
|
// prefer the more compact serialization (v1beta1) for storage until https://issue.k8s.io/82292 is resolved for objects whose v1 serialization is too big but whose v1beta1 serialization can be stored
|
|
etcdOptions.StorageConfig.EncodeVersioner = runtime.NewMultiGroupVersioner(v1beta1.SchemeGroupVersion, schema.GroupKind{Group: v1beta1.GroupName})
|
|
etcdOptions.SkipHealthEndpoints = true // avoid double wiring of health checks
|
|
if err := etcdOptions.ApplyTo(&genericConfig); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// override MergedResourceConfig with apiextensions defaults and registry
|
|
if err := commandOptions.APIEnablement.ApplyTo(
|
|
&genericConfig,
|
|
apiextensionsapiserver.DefaultAPIResourceConfigSource(),
|
|
apiextensionsapiserver.Scheme); err != nil {
|
|
return nil, err
|
|
}
|
|
apiextensionsConfig := &apiextensionsapiserver.Config{
|
|
GenericConfig: &server.RecommendedConfig{
|
|
Config: genericConfig,
|
|
SharedInformerFactory: kubeInformers,
|
|
},
|
|
ExtraConfig: apiextensionsapiserver.ExtraConfig{
|
|
CRDRESTOptionsGetter: apiextensionsoptions.NewCRDRESTOptionsGetter(etcdOptions, genericConfig.ResourceTransformers, genericConfig.StorageObjectCountTracker),
|
|
MasterCount: masterCount,
|
|
AuthResolverWrapper: authResolverWrapper,
|
|
ServiceResolver: serviceResolver,
|
|
},
|
|
}
|
|
|
|
// we need to clear the poststarthooks so we don't add them multiple times to all the servers (that fails)
|
|
apiextensionsConfig.GenericConfig.PostStartHooks = map[string]server.PostStartHookConfigEntry{}
|
|
|
|
return apiextensionsConfig, nil
|
|
}
|