2019-01-12 04:58:27 +00:00
/ *
Copyright 2017 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 app does all of the work necessary to create a Kubernetes
// APIServer by binding together the API, master and APIServer infrastructure.
// It can be configured and called directly or via the hyperkube framework.
package app
import (
2019-09-27 21:51:53 +00:00
v1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
2019-01-12 04:58:27 +00:00
"k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
apiextensionsoptions "k8s.io/apiextensions-apiserver/pkg/cmd/server/options"
2019-04-07 17:07:55 +00:00
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/runtime/schema"
2019-01-12 04:58:27 +00:00
"k8s.io/apiserver/pkg/admission"
"k8s.io/apiserver/pkg/features"
genericapiserver "k8s.io/apiserver/pkg/server"
genericoptions "k8s.io/apiserver/pkg/server/options"
2019-12-12 01:27:03 +00:00
"k8s.io/apiserver/pkg/util/feature"
2019-01-12 04:58:27 +00:00
utilfeature "k8s.io/apiserver/pkg/util/feature"
"k8s.io/apiserver/pkg/util/webhook"
kubeexternalinformers "k8s.io/client-go/informers"
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
)
func createAPIExtensionsConfig (
kubeAPIServerConfig genericapiserver . Config ,
externalInformers kubeexternalinformers . SharedInformerFactory ,
pluginInitializers [ ] admission . PluginInitializer ,
commandOptions * options . ServerRunOptions ,
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
2019-12-12 01:27:03 +00:00
genericConfig . PostStartHooks = map [ string ] genericapiserver . PostStartHookConfigEntry { }
genericConfig . RESTOptionsGetter = nil
2019-01-12 04:58:27 +00:00
// override genericConfig.AdmissionControl with apiextensions' scheme,
2021-07-02 08:43:15 +00:00
// because apiextensions apiserver should use its own scheme to convert resources.
2019-04-07 17:07:55 +00:00
err := commandOptions . Admission . ApplyTo (
2019-01-12 04:58:27 +00:00
& genericConfig ,
externalInformers ,
genericConfig . LoopbackClientConfig ,
2019-12-12 01:27:03 +00:00
feature . DefaultFeatureGate ,
2019-01-12 04:58:27 +00:00
pluginInitializers ... )
2019-04-07 17:07:55 +00:00
if err != nil {
return nil , err
}
2019-01-12 04:58:27 +00:00
// copy the etcd options so we don't mutate originals.
etcdOptions := * commandOptions . Etcd
etcdOptions . StorageConfig . Paging = utilfeature . DefaultFeatureGate . Enabled ( features . APIListChunking )
2021-03-18 22:40:29 +00:00
// this is where the true decodable levels come from.
2019-09-27 21:51:53 +00:00
etcdOptions . StorageConfig . Codec = apiextensionsapiserver . Codecs . LegacyCodec ( v1beta1 . SchemeGroupVersion , v1 . SchemeGroupVersion )
2021-03-18 22:40:29 +00:00
// prefer the more compact serialization (v1beta1) for storage until http://issue.k8s.io/82292 is resolved for objects whose v1 serialization is too big but whose v1beta1 serialization can be stored
2019-04-07 17:07:55 +00:00
etcdOptions . StorageConfig . EncodeVersioner = runtime . NewMultiGroupVersioner ( v1beta1 . SchemeGroupVersion , schema . GroupKind { Group : v1beta1 . GroupName } )
2019-01-12 04:58:27 +00:00
genericConfig . RESTOptionsGetter = & genericoptions . SimpleRestOptionsFactory { Options : etcdOptions }
// 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 : & genericapiserver . RecommendedConfig {
Config : genericConfig ,
SharedInformerFactory : externalInformers ,
} ,
ExtraConfig : apiextensionsapiserver . ExtraConfig {
CRDRESTOptionsGetter : apiextensionsoptions . NewCRDRESTOptionsGetter ( etcdOptions ) ,
MasterCount : masterCount ,
AuthResolverWrapper : authResolverWrapper ,
ServiceResolver : serviceResolver ,
} ,
}
2020-03-26 21:07:15 +00:00
// 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 ] genericapiserver . PostStartHookConfigEntry { }
2019-01-12 04:58:27 +00:00
return apiextensionsConfig , nil
}
func createAPIExtensionsServer ( apiextensionsConfig * apiextensionsapiserver . Config , delegateAPIServer genericapiserver . DelegationTarget ) ( * apiextensionsapiserver . CustomResourceDefinitions , error ) {
return apiextensionsConfig . Complete ( ) . New ( delegateAPIServer )
}