@@ -58,6 +58,7 @@ import (
58
58
genericapiserver "k8s.io/apiserver/pkg/server"
59
59
serverstorage "k8s.io/apiserver/pkg/server/storage"
60
60
utilfeature "k8s.io/apiserver/pkg/util/feature"
61
+ clientdiscovery "k8s.io/client-go/discovery"
61
62
"k8s.io/client-go/kubernetes"
62
63
corev1client "k8s.io/client-go/kubernetes/typed/core/v1"
63
64
discoveryclient "k8s.io/client-go/kubernetes/typed/discovery/v1"
@@ -322,67 +323,11 @@ func (c CompletedConfig) New(delegationTarget genericapiserver.DelegationTarget)
322
323
return nil , err
323
324
}
324
325
325
- // TODO: update to a version that caches success but will recheck on failure, unlike memcache discovery
326
- discoveryClientForAdmissionRegistration := client .Discovery ()
327
-
328
- legacyRESTStorageProvider , err := corerest .New (corerest.Config {
329
- GenericConfig : corerest.GenericConfig {
330
- StorageFactory : c .ControlPlane .Extra .StorageFactory ,
331
- EventTTL : c .ControlPlane .Extra .EventTTL ,
332
- LoopbackClientConfig : c .ControlPlane .Generic .LoopbackClientConfig ,
333
- ServiceAccountIssuer : c .ControlPlane .Extra .ServiceAccountIssuer ,
334
- ExtendExpiration : c .ControlPlane .Extra .ExtendExpiration ,
335
- ServiceAccountMaxExpiration : c .ControlPlane .Extra .ServiceAccountMaxExpiration ,
336
- APIAudiences : c .ControlPlane .Generic .Authentication .APIAudiences ,
337
- Informers : c .ControlPlane .Extra .VersionedInformers ,
338
- },
339
- Proxy : corerest.ProxyConfig {
340
- Transport : c .ControlPlane .Extra .ProxyTransport ,
341
- KubeletClientConfig : c .Extra .KubeletClientConfig ,
342
- },
343
- Services : corerest.ServicesConfig {
344
- ClusterIPRange : c .Extra .ServiceIPRange ,
345
- SecondaryClusterIPRange : c .Extra .SecondaryServiceIPRange ,
346
- NodePortRange : c .Extra .ServiceNodePortRange ,
347
- IPRepairInterval : c .Extra .RepairServicesInterval ,
348
- },
349
- })
326
+ restStorageProviders , err := c .StorageProviders (client .Discovery ())
350
327
if err != nil {
351
328
return nil , err
352
329
}
353
330
354
- // The order here is preserved in discovery.
355
- // If resources with identical names exist in more than one of these groups (e.g. "deployments.apps"" and "deployments.extensions"),
356
- // the order of this list determines which group an unqualified resource name (e.g. "deployments") should prefer.
357
- // This priority order is used for local discovery, but it ends up aggregated in `k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go
358
- // with specific priorities.
359
- // TODO: describe the priority all the way down in the RESTStorageProviders and plumb it back through the various discovery
360
- // handlers that we have.
361
- restStorageProviders := []controlplaneapiserver.RESTStorageProvider {
362
- legacyRESTStorageProvider ,
363
- apiserverinternalrest.StorageProvider {},
364
- authenticationrest.RESTStorageProvider {Authenticator : c .ControlPlane .Generic .Authentication .Authenticator , APIAudiences : c .ControlPlane .Generic .Authentication .APIAudiences },
365
- authorizationrest.RESTStorageProvider {Authorizer : c .ControlPlane .Generic .Authorization .Authorizer , RuleResolver : c .ControlPlane .Generic .RuleResolver },
366
- autoscalingrest.RESTStorageProvider {},
367
- batchrest.RESTStorageProvider {},
368
- certificatesrest.RESTStorageProvider {},
369
- coordinationrest.RESTStorageProvider {},
370
- discoveryrest.StorageProvider {},
371
- networkingrest.RESTStorageProvider {},
372
- noderest.RESTStorageProvider {},
373
- policyrest.RESTStorageProvider {},
374
- rbacrest.RESTStorageProvider {Authorizer : c .ControlPlane .Generic .Authorization .Authorizer },
375
- schedulingrest.RESTStorageProvider {},
376
- storagerest.RESTStorageProvider {},
377
- svmrest.RESTStorageProvider {},
378
- flowcontrolrest.RESTStorageProvider {InformerFactory : c .ControlPlane .Generic .SharedInformerFactory },
379
- // keep apps after extensions so legacy clients resolve the extensions versions of shared resource names.
380
- // See https://github.com/kubernetes/kubernetes/issues/42392
381
- appsrest.StorageProvider {},
382
- admissionregistrationrest.RESTStorageProvider {Authorizer : c .ControlPlane .Generic .Authorization .Authorizer , DiscoveryClient : discoveryClientForAdmissionRegistration },
383
- eventsrest.RESTStorageProvider {TTL : c .ControlPlane .EventTTL },
384
- resourcerest.RESTStorageProvider {},
385
- }
386
331
if err := s .ControlPlane .InstallAPIs (restStorageProviders ... ); err != nil {
387
332
return nil , err
388
333
}
@@ -426,6 +371,59 @@ func (c CompletedConfig) New(delegationTarget genericapiserver.DelegationTarget)
426
371
}
427
372
428
373
return s , nil
374
+
375
+ }
376
+
377
+ func (c CompletedConfig ) StorageProviders (discovery clientdiscovery.DiscoveryInterface ) ([]controlplaneapiserver.RESTStorageProvider , error ) {
378
+ legacyRESTStorageProvider , err := corerest .New (corerest.Config {
379
+ GenericConfig : * c .ControlPlane .NewCoreGenericConfig (),
380
+ Proxy : corerest.ProxyConfig {
381
+ Transport : c .ControlPlane .Extra .ProxyTransport ,
382
+ KubeletClientConfig : c .Extra .KubeletClientConfig ,
383
+ },
384
+ Services : corerest.ServicesConfig {
385
+ ClusterIPRange : c .Extra .ServiceIPRange ,
386
+ SecondaryClusterIPRange : c .Extra .SecondaryServiceIPRange ,
387
+ NodePortRange : c .Extra .ServiceNodePortRange ,
388
+ IPRepairInterval : c .Extra .RepairServicesInterval ,
389
+ },
390
+ })
391
+ if err != nil {
392
+ return nil , err
393
+ }
394
+
395
+ // The order here is preserved in discovery.
396
+ // If resources with identical names exist in more than one of these groups (e.g. "deployments.apps"" and "deployments.extensions"),
397
+ // the order of this list determines which group an unqualified resource name (e.g. "deployments") should prefer.
398
+ // This priority order is used for local discovery, but it ends up aggregated in `k8s.io/kubernetes/cmd/kube-apiserver/app/aggregator.go
399
+ // with specific priorities.
400
+ // TODO: describe the priority all the way down in the RESTStorageProviders and plumb it back through the various discovery
401
+ // handlers that we have.
402
+ return []controlplaneapiserver.RESTStorageProvider {
403
+ legacyRESTStorageProvider ,
404
+ apiserverinternalrest.StorageProvider {},
405
+ authenticationrest.RESTStorageProvider {Authenticator : c .ControlPlane .Generic .Authentication .Authenticator , APIAudiences : c .ControlPlane .Generic .Authentication .APIAudiences },
406
+ authorizationrest.RESTStorageProvider {Authorizer : c .ControlPlane .Generic .Authorization .Authorizer , RuleResolver : c .ControlPlane .Generic .RuleResolver },
407
+ autoscalingrest.RESTStorageProvider {},
408
+ batchrest.RESTStorageProvider {},
409
+ certificatesrest.RESTStorageProvider {},
410
+ coordinationrest.RESTStorageProvider {},
411
+ discoveryrest.StorageProvider {},
412
+ networkingrest.RESTStorageProvider {},
413
+ noderest.RESTStorageProvider {},
414
+ policyrest.RESTStorageProvider {},
415
+ rbacrest.RESTStorageProvider {Authorizer : c .ControlPlane .Generic .Authorization .Authorizer },
416
+ schedulingrest.RESTStorageProvider {},
417
+ storagerest.RESTStorageProvider {},
418
+ svmrest.RESTStorageProvider {},
419
+ flowcontrolrest.RESTStorageProvider {InformerFactory : c .ControlPlane .Generic .SharedInformerFactory },
420
+ // keep apps after extensions so legacy clients resolve the extensions versions of shared resource names.
421
+ // See https://github.com/kubernetes/kubernetes/issues/42392
422
+ appsrest.StorageProvider {},
423
+ admissionregistrationrest.RESTStorageProvider {Authorizer : c .ControlPlane .Generic .Authorization .Authorizer , DiscoveryClient : discovery },
424
+ eventsrest.RESTStorageProvider {TTL : c .ControlPlane .EventTTL },
425
+ resourcerest.RESTStorageProvider {},
426
+ }, nil
429
427
}
430
428
431
429
var (
0 commit comments