Skip to content

Commit 84a6ed4

Browse files
authored
Merge pull request kubernetes#124638 from sttts/sttts-kube-apiserver-config-split-up
kube-apiserver: split up config creation into generic and non-generic part
2 parents e342ab0 + d8c5f71 commit 84a6ed4

File tree

4 files changed

+191
-146
lines changed

4 files changed

+191
-146
lines changed

cmd/kube-apiserver/app/config.go

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,16 @@ package app
1818

1919
import (
2020
apiextensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
21+
"k8s.io/apimachinery/pkg/runtime"
2122
"k8s.io/apiserver/pkg/util/webhook"
2223
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
24+
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
25+
2326
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
27+
"k8s.io/kubernetes/pkg/api/legacyscheme"
2428
"k8s.io/kubernetes/pkg/controlplane"
25-
"k8s.io/kubernetes/pkg/controlplane/apiserver"
29+
controlplaneapiserver "k8s.io/kubernetes/pkg/controlplane/apiserver"
30+
generatedopenapi "k8s.io/kubernetes/pkg/generated/openapi"
2631
)
2732

2833
type Config struct {
@@ -71,13 +76,23 @@ func NewConfig(opts options.CompletedOptions) (*Config, error) {
7176
Options: opts,
7277
}
7378

74-
kubeAPIs, serviceResolver, pluginInitializer, err := CreateKubeAPIServerConfig(opts)
79+
genericConfig, versionedInformers, storageFactory, err := controlplaneapiserver.BuildGenericConfig(
80+
opts.CompletedOptions,
81+
[]*runtime.Scheme{legacyscheme.Scheme, apiextensionsapiserver.Scheme, aggregatorscheme.Scheme},
82+
controlplane.DefaultAPIResourceConfigSource(),
83+
generatedopenapi.GetOpenAPIDefinitions,
84+
)
85+
if err != nil {
86+
return nil, err
87+
}
88+
89+
kubeAPIs, serviceResolver, pluginInitializer, err := CreateKubeAPIServerConfig(opts, genericConfig, versionedInformers, storageFactory)
7590
if err != nil {
7691
return nil, err
7792
}
7893
c.KubeAPIs = kubeAPIs
7994

80-
apiExtensions, err := apiserver.CreateAPIExtensionsConfig(*kubeAPIs.ControlPlane.Generic, kubeAPIs.ControlPlane.VersionedInformers, pluginInitializer, opts.CompletedOptions, opts.MasterCount,
95+
apiExtensions, err := controlplaneapiserver.CreateAPIExtensionsConfig(*kubeAPIs.ControlPlane.Generic, kubeAPIs.ControlPlane.VersionedInformers, pluginInitializer, opts.CompletedOptions, opts.MasterCount,
8196
serviceResolver, webhook.NewDefaultAuthenticationInfoResolverWrapper(kubeAPIs.ControlPlane.ProxyTransport, kubeAPIs.ControlPlane.Generic.EgressSelector, kubeAPIs.ControlPlane.Generic.LoopbackClientConfig, kubeAPIs.ControlPlane.Generic.TracerProvider))
8297
if err != nil {
8398
return nil, err

cmd/kube-apiserver/app/server.go

Lines changed: 18 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,24 @@ package app
2121

2222
import (
2323
"context"
24-
"crypto/tls"
2524
"fmt"
26-
"net/http"
2725
"net/url"
2826
"os"
2927

3028
"github.com/spf13/cobra"
3129
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
32-
extensionsapiserver "k8s.io/apiextensions-apiserver/pkg/apiserver"
33-
"k8s.io/apimachinery/pkg/runtime"
3430
utilerrors "k8s.io/apimachinery/pkg/util/errors"
35-
utilnet "k8s.io/apimachinery/pkg/util/net"
3631
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
3732
"k8s.io/apiserver/pkg/admission"
3833
genericapifilters "k8s.io/apiserver/pkg/endpoints/filters"
3934
genericapiserver "k8s.io/apiserver/pkg/server"
4035
"k8s.io/apiserver/pkg/server/egressselector"
36+
serverstorage "k8s.io/apiserver/pkg/server/storage"
4137
utilfeature "k8s.io/apiserver/pkg/util/feature"
4238
"k8s.io/apiserver/pkg/util/notfoundhandler"
4339
"k8s.io/apiserver/pkg/util/webhook"
44-
"k8s.io/client-go/dynamic"
4540
clientgoinformers "k8s.io/client-go/informers"
46-
clientset "k8s.io/client-go/kubernetes"
4741
"k8s.io/client-go/rest"
48-
"k8s.io/client-go/util/keyutil"
4942
cliflag "k8s.io/component-base/cli/flag"
5043
"k8s.io/component-base/cli/globalflag"
5144
"k8s.io/component-base/logs"
@@ -56,19 +49,12 @@ import (
5649
"k8s.io/component-base/version/verflag"
5750
"k8s.io/klog/v2"
5851
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
59-
aggregatorscheme "k8s.io/kube-aggregator/pkg/apiserver/scheme"
60-
controlplaneadmission "k8s.io/kubernetes/pkg/controlplane/apiserver/admission"
61-
6252
"k8s.io/kubernetes/cmd/kube-apiserver/app/options"
63-
"k8s.io/kubernetes/pkg/api/legacyscheme"
6453
"k8s.io/kubernetes/pkg/capabilities"
6554
"k8s.io/kubernetes/pkg/controlplane"
6655
controlplaneapiserver "k8s.io/kubernetes/pkg/controlplane/apiserver"
6756
"k8s.io/kubernetes/pkg/controlplane/reconcilers"
68-
"k8s.io/kubernetes/pkg/features"
69-
generatedopenapi "k8s.io/kubernetes/pkg/generated/openapi"
7057
kubeapiserveradmission "k8s.io/kubernetes/pkg/kubeapiserver/admission"
71-
"k8s.io/kubernetes/pkg/serviceaccount"
7258
)
7359

7460
func init() {
@@ -196,81 +182,38 @@ func CreateServerChain(config CompletedConfig) (*aggregatorapiserver.APIAggregat
196182
return aggregatorServer, nil
197183
}
198184

199-
// CreateProxyTransport creates the dialer infrastructure to connect to the nodes.
200-
func CreateProxyTransport() *http.Transport {
201-
var proxyDialerFn utilnet.DialFunc
202-
// Proxying to pods and services is IP-based... don't expect to be able to verify the hostname
203-
proxyTLSClientConfig := &tls.Config{InsecureSkipVerify: true}
204-
proxyTransport := utilnet.SetTransportDefaults(&http.Transport{
205-
DialContext: proxyDialerFn,
206-
TLSClientConfig: proxyTLSClientConfig,
207-
})
208-
return proxyTransport
209-
}
210-
211185
// CreateKubeAPIServerConfig creates all the resources for running the API server, but runs none of them
212-
func CreateKubeAPIServerConfig(opts options.CompletedOptions) (
186+
func CreateKubeAPIServerConfig(
187+
opts options.CompletedOptions,
188+
genericConfig *genericapiserver.Config,
189+
versionedInformers clientgoinformers.SharedInformerFactory,
190+
storageFactory *serverstorage.DefaultStorageFactory,
191+
) (
213192
*controlplane.Config,
214193
aggregatorapiserver.ServiceResolver,
215194
[]admission.PluginInitializer,
216195
error,
217196
) {
218-
proxyTransport := CreateProxyTransport()
219-
220-
genericConfig, versionedInformers, storageFactory, err := controlplaneapiserver.BuildGenericConfig(
221-
opts.CompletedOptions,
222-
[]*runtime.Scheme{legacyscheme.Scheme, extensionsapiserver.Scheme, aggregatorscheme.Scheme},
223-
controlplane.DefaultAPIResourceConfigSource(),
224-
generatedopenapi.GetOpenAPIDefinitions,
225-
)
226-
if err != nil {
227-
return nil, nil, nil, fmt.Errorf("failed to create generic config: %w", err)
228-
}
229-
230-
// generic controlplane admission initializers
231-
controlPlaneAdmissionConfig := &controlplaneadmission.Config{
232-
ExternalInformers: versionedInformers,
233-
LoopbackClientConfig: genericConfig.LoopbackClientConfig,
234-
}
235-
serviceResolver := buildServiceResolver(opts.EnableAggregatorRouting, genericConfig.LoopbackClientConfig.Host, versionedInformers)
236-
pluginInitializers, err := controlPlaneAdmissionConfig.New(proxyTransport, genericConfig.EgressSelector, serviceResolver, genericConfig.TracerProvider)
237-
if err != nil {
238-
return nil, nil, nil, fmt.Errorf("failed to create admission plugin initializer: %w", err)
239-
}
197+
// global stuff
198+
capabilities.Setup(opts.AllowPrivileged, opts.MaxConnectionBytesPerSec)
240199

241-
// additional kube admission initializers
200+
// additional admission initializers
242201
kubeAdmissionConfig := &kubeapiserveradmission.Config{
243202
CloudConfigFile: opts.CloudProvider.CloudConfigFile,
244203
}
245204
kubeInitializers, err := kubeAdmissionConfig.New()
246205
if err != nil {
247206
return nil, nil, nil, fmt.Errorf("failed to create admission plugin initializer: %w", err)
248207
}
249-
pluginInitializers = append(pluginInitializers, kubeInitializers...)
250208

251-
capabilities.Setup(opts.AllowPrivileged, opts.MaxConnectionBytesPerSec)
252-
253-
opts.Metrics.Apply()
254-
serviceaccount.RegisterMetrics()
209+
serviceResolver := buildServiceResolver(opts.EnableAggregatorRouting, genericConfig.LoopbackClientConfig.Host, versionedInformers)
210+
controlplaneConfig, admissionInitializers, err := controlplaneapiserver.CreateConfig(opts.CompletedOptions, genericConfig, versionedInformers, storageFactory, serviceResolver, kubeInitializers)
211+
if err != nil {
212+
return nil, nil, nil, err
213+
}
255214

256215
config := &controlplane.Config{
257-
ControlPlane: controlplaneapiserver.Config{
258-
Generic: genericConfig,
259-
Extra: controlplaneapiserver.Extra{
260-
APIResourceConfigSource: storageFactory.APIResourceConfigSource,
261-
StorageFactory: storageFactory,
262-
EventTTL: opts.EventTTL,
263-
EnableLogsSupport: opts.EnableLogsHandler,
264-
ProxyTransport: proxyTransport,
265-
SystemNamespaces: opts.SystemNamespaces,
266-
267-
ServiceAccountIssuer: opts.ServiceAccountIssuer,
268-
ServiceAccountMaxExpiration: opts.ServiceAccountTokenMaxExpiration,
269-
ExtendExpiration: opts.Authentication.ServiceAccounts.ExtendExpiration,
270-
271-
VersionedInformers: versionedInformers,
272-
},
273-
},
216+
ControlPlane: *controlplaneConfig,
274217
Extra: controlplane.Extra{
275218
KubeletClientConfig: opts.KubeletConfig,
276219

@@ -288,59 +231,6 @@ func CreateKubeAPIServerConfig(opts options.CompletedOptions) (
288231
},
289232
}
290233

291-
if utilfeature.DefaultFeatureGate.Enabled(features.UnknownVersionInteroperabilityProxy) {
292-
config.ControlPlane.PeerEndpointLeaseReconciler, err = controlplaneapiserver.CreatePeerEndpointLeaseReconciler(*genericConfig, storageFactory)
293-
if err != nil {
294-
return nil, nil, nil, err
295-
}
296-
// build peer proxy config only if peer ca file exists
297-
if opts.PeerCAFile != "" {
298-
config.ControlPlane.PeerProxy, err = controlplaneapiserver.BuildPeerProxy(versionedInformers, genericConfig.StorageVersionManager, opts.ProxyClientCertFile,
299-
opts.ProxyClientKeyFile, opts.PeerCAFile, opts.PeerAdvertiseAddress, genericConfig.APIServerID, config.ControlPlane.Extra.PeerEndpointLeaseReconciler, config.ControlPlane.Generic.Serializer)
300-
if err != nil {
301-
return nil, nil, nil, err
302-
}
303-
}
304-
}
305-
306-
clientCAProvider, err := opts.Authentication.ClientCert.GetClientCAContentProvider()
307-
if err != nil {
308-
return nil, nil, nil, err
309-
}
310-
config.ControlPlane.ClusterAuthenticationInfo.ClientCA = clientCAProvider
311-
312-
requestHeaderConfig, err := opts.Authentication.RequestHeader.ToAuthenticationRequestHeaderConfig()
313-
if err != nil {
314-
return nil, nil, nil, err
315-
}
316-
if requestHeaderConfig != nil {
317-
config.ControlPlane.ClusterAuthenticationInfo.RequestHeaderCA = requestHeaderConfig.CAContentProvider
318-
config.ControlPlane.ClusterAuthenticationInfo.RequestHeaderAllowedNames = requestHeaderConfig.AllowedClientNames
319-
config.ControlPlane.ClusterAuthenticationInfo.RequestHeaderExtraHeaderPrefixes = requestHeaderConfig.ExtraHeaderPrefixes
320-
config.ControlPlane.ClusterAuthenticationInfo.RequestHeaderGroupHeaders = requestHeaderConfig.GroupHeaders
321-
config.ControlPlane.ClusterAuthenticationInfo.RequestHeaderUsernameHeaders = requestHeaderConfig.UsernameHeaders
322-
}
323-
324-
// setup admission
325-
clientgoExternalClient, err := clientset.NewForConfig(genericConfig.LoopbackClientConfig)
326-
if err != nil {
327-
return nil, nil, nil, fmt.Errorf("failed to create real client-go external client: %w", err)
328-
}
329-
dynamicExternalClient, err := dynamic.NewForConfig(genericConfig.LoopbackClientConfig)
330-
if err != nil {
331-
return nil, nil, nil, fmt.Errorf("failed to create real dynamic external client: %w", err)
332-
}
333-
err = opts.Admission.ApplyTo(
334-
genericConfig,
335-
versionedInformers,
336-
clientgoExternalClient,
337-
dynamicExternalClient,
338-
utilfeature.DefaultFeatureGate,
339-
pluginInitializers...)
340-
if err != nil {
341-
return nil, nil, nil, fmt.Errorf("failed to apply admission: %w", err)
342-
}
343-
344234
if config.ControlPlane.Generic.EgressSelector != nil {
345235
// Use the config.ControlPlane.Generic.EgressSelector lookup to find the dialer to connect to the kubelet
346236
config.Extra.KubeletClientConfig.Lookup = config.ControlPlane.Generic.EgressSelector.Lookup
@@ -351,25 +241,12 @@ func CreateKubeAPIServerConfig(opts options.CompletedOptions) (
351241
if err != nil {
352242
return nil, nil, nil, err
353243
}
354-
c := proxyTransport.Clone()
244+
c := config.ControlPlane.Extra.ProxyTransport.Clone()
355245
c.DialContext = dialer
356246
config.ControlPlane.ProxyTransport = c
357247
}
358248

359-
// Load and set the public keys.
360-
var pubKeys []interface{}
361-
for _, f := range opts.Authentication.ServiceAccounts.KeyFiles {
362-
keys, err := keyutil.PublicKeysFromFile(f)
363-
if err != nil {
364-
return nil, nil, nil, fmt.Errorf("failed to parse key file %q: %v", f, err)
365-
}
366-
pubKeys = append(pubKeys, keys...)
367-
}
368-
config.ControlPlane.ServiceAccountIssuerURL = opts.Authentication.ServiceAccounts.Issuers[0]
369-
config.ControlPlane.ServiceAccountJWKSURI = opts.Authentication.ServiceAccounts.JWKSURI
370-
config.ControlPlane.ServiceAccountPublicKeys = pubKeys
371-
372-
return config, serviceResolver, pluginInitializers, nil
249+
return config, serviceResolver, admissionInitializers, nil
373250
}
374251

375252
var testServiceResolver webhook.ServiceResolver

0 commit comments

Comments
 (0)