@@ -23,7 +23,9 @@ import (
23
23
"context"
24
24
"fmt"
25
25
26
+ certificatesv1alpha1 "k8s.io/api/certificates/v1alpha1"
26
27
certificatesv1beta1 "k8s.io/api/certificates/v1beta1"
28
+ "k8s.io/apimachinery/pkg/runtime/schema"
27
29
"k8s.io/apiserver/pkg/server/dynamiccertificates"
28
30
utilfeature "k8s.io/apiserver/pkg/util/feature"
29
31
"k8s.io/client-go/kubernetes"
@@ -233,6 +235,8 @@ func newKubeAPIServerSignerClusterTrustBundledPublisherDescriptor() *ControllerD
233
235
}
234
236
}
235
237
238
+ type controllerConstructor func (string , dynamiccertificates.CAContentProvider , kubernetes.Interface ) (ctbpublisher.PublisherRunner , error )
239
+
236
240
func newKubeAPIServerSignerClusterTrustBundledPublisherController (ctx context.Context , controllerContext ControllerContext , controllerName string ) (controller.Interface , bool , error ) {
237
241
rootCA , err := getKubeAPIServerCAFileContents (controllerContext )
238
242
if err != nil {
@@ -243,36 +247,50 @@ func newKubeAPIServerSignerClusterTrustBundledPublisherController(ctx context.Co
243
247
return nil , false , nil
244
248
}
245
249
246
- apiserverSignerClient := controllerContext .ClientBuilder .ClientOrDie ("kube-apiserver-serving-clustertrustbundle-publisher" )
247
- ctbAvailable , err := clusterTrustBundlesAvailable (apiserverSignerClient )
250
+ servingSigners , err := dynamiccertificates .NewStaticCAContent ("kube-apiserver-serving" , rootCA )
248
251
if err != nil {
249
- return nil , false , fmt .Errorf ("discovery failed for ClusterTrustBundle : %w" , err )
252
+ return nil , false , fmt .Errorf ("failed to create a static CA content provider for the kube-apiserver-serving signer : %w" , err )
250
253
}
251
254
252
- if ! ctbAvailable {
253
- return nil , false , nil
255
+ schemaControllerMapping := map [schema.GroupVersion ]controllerConstructor {
256
+ certificatesv1alpha1 .SchemeGroupVersion : ctbpublisher .NewAlphaClusterTrustBundlePublisher ,
257
+ certificatesv1beta1 .SchemeGroupVersion : ctbpublisher .NewBetaClusterTrustBundlePublisher ,
254
258
}
255
259
256
- servingSigners , err := dynamiccertificates .NewStaticCAContent ("kube-apiserver-serving" , rootCA )
257
- if err != nil {
258
- return nil , false , fmt .Errorf ("failed to create a static CA content provider for the kube-apiserver-serving signer: %w" , err )
260
+ apiserverSignerClient := controllerContext .ClientBuilder .ClientOrDie ("kube-apiserver-serving-clustertrustbundle-publisher" )
261
+ var runner ctbpublisher.PublisherRunner
262
+ for _ , gv := range []schema.GroupVersion {certificatesv1beta1 .SchemeGroupVersion , certificatesv1alpha1 .SchemeGroupVersion } {
263
+ ctbAvailable , err := clusterTrustBundlesAvailable (apiserverSignerClient , gv )
264
+ if err != nil {
265
+ return nil , false , fmt .Errorf ("discovery failed for ClusterTrustBundle: %w" , err )
266
+ }
267
+
268
+ if ! ctbAvailable {
269
+ continue
270
+ }
271
+
272
+ runner , err = schemaControllerMapping [gv ](
273
+ "kubernetes.io/kube-apiserver-serving" ,
274
+ servingSigners ,
275
+ apiserverSignerClient ,
276
+ )
277
+ if err != nil {
278
+ return nil , false , fmt .Errorf ("error creating kube-apiserver-serving signer certificates publisher: %w" , err )
279
+ }
280
+ break
259
281
}
260
282
261
- ctbPublisher , err := ctbpublisher .NewClusterTrustBundlePublisher (
262
- "kubernetes.io/kube-apiserver-serving" ,
263
- servingSigners ,
264
- apiserverSignerClient ,
265
- )
266
- if err != nil {
267
- return nil , false , fmt .Errorf ("error creating kube-apiserver-serving signer certificates publisher: %w" , err )
283
+ if runner == nil {
284
+ klog .Info ("no known scheme version was found for clustertrustbundles, cannot start kube-apiserver-serving-clustertrustbundle-publisher-controller" )
285
+ return nil , false , nil
268
286
}
269
287
270
- go ctbPublisher .Run (ctx )
288
+ go runner .Run (ctx )
271
289
return nil , true , nil
272
290
}
273
291
274
- func clusterTrustBundlesAvailable (client kubernetes.Interface ) (bool , error ) {
275
- resList , err := client .Discovery ().ServerResourcesForGroupVersion (certificatesv1beta1 . SchemeGroupVersion .String ())
292
+ func clusterTrustBundlesAvailable (client kubernetes.Interface , schemaVersion schema. GroupVersion ) (bool , error ) {
293
+ resList , err := client .Discovery ().ServerResourcesForGroupVersion (schemaVersion .String ())
276
294
277
295
if resList != nil {
278
296
// even in case of an error above there might be a partial list for APIs that
0 commit comments