@@ -37,6 +37,7 @@ import (
37
37
kubeclient "k8s.io/client-go/kubernetes"
38
38
"k8s.io/client-go/rest"
39
39
"k8s.io/klog/v2"
40
+ "k8s.io/utils/pointer"
40
41
runtimeclient "sigs.k8s.io/controller-runtime/pkg/client"
41
42
42
43
fedv1b1 "sigs.k8s.io/kubefed/pkg/apis/core/v1beta1"
@@ -417,8 +418,8 @@ func createKubeFedNamespace(clusterClientset kubeclient.Interface, kubefedNamesp
417
418
return fedNamespace , nil
418
419
}
419
420
420
- // createAuthorizedServiceAccount creates a service account and grants
421
- // the privileges required by the KubeFed control plane to manage
421
+ // createAuthorizedServiceAccount creates a service account and service account token secret
422
+ // and grants the privileges required by the KubeFed control plane to manage
422
423
// resources in the joining cluster. The name of the created service
423
424
// account is returned on success.
424
425
func createAuthorizedServiceAccount (joiningClusterClientset kubeclient.Interface ,
@@ -436,6 +437,16 @@ func createAuthorizedServiceAccount(joiningClusterClientset kubeclient.Interface
436
437
437
438
klog .V (2 ).Infof ("Created service account: %s in joining cluster: %s" , saName , joiningClusterName )
438
439
440
+ secretName , err := createServiceAccountTokenSecret (saName , joiningClusterClientset , namespace ,
441
+ joiningClusterName , hostClusterName , dryRun , errorOnExisting )
442
+ if err != nil {
443
+ klog .V (2 ).Infof ("Error creating service account: %s in joining cluster: %s due to: %v" ,
444
+ saName , joiningClusterName , err )
445
+ return "" , err
446
+ }
447
+
448
+ klog .V (2 ).Infof ("Created service account token secret: %s in joining cluster: %s" , secretName , joiningClusterName )
449
+
439
450
if scope == apiextv1 .NamespaceScoped {
440
451
klog .V (2 ).Infof ("Creating role and binding for service account: %s in joining cluster: %s" , saName , joiningClusterName )
441
452
@@ -487,7 +498,11 @@ func createServiceAccount(clusterClientset kubeclient.Interface, namespace,
487
498
ObjectMeta : metav1.ObjectMeta {
488
499
Name : saName ,
489
500
Namespace : namespace ,
501
+ Annotations : map [string ]string {
502
+ "kubernetes.io/enforce-mountable-secrets" : "true" ,
503
+ },
490
504
},
505
+ AutomountServiceAccountToken : pointer .Bool (false ),
491
506
}
492
507
493
508
if dryRun {
@@ -508,6 +523,43 @@ func createServiceAccount(clusterClientset kubeclient.Interface, namespace,
508
523
default :
509
524
return saName , nil
510
525
}
526
+ } // createServiceAccount creates a service account in the cluster associated
527
+ // with clusterClientset with credentials that will be used by the host cluster
528
+ // to access its API server.
529
+ func createServiceAccountTokenSecret (saName string , clusterClientset kubeclient.Interface , namespace ,
530
+ joiningClusterName , hostClusterName string , dryRun , errorOnExisting bool ) (string , error ) {
531
+ saTokenSecretName := util .ClusterServiceAccountTokenSecretName (joiningClusterName , hostClusterName )
532
+ saTokenSecret := & corev1.Secret {
533
+ ObjectMeta : metav1.ObjectMeta {
534
+ Name : saTokenSecretName ,
535
+ Namespace : namespace ,
536
+ Annotations : map [string ]string {
537
+ "kubernetes.io/service-account.name" : saName ,
538
+ },
539
+ },
540
+ Type : corev1 .SecretTypeServiceAccountToken ,
541
+ }
542
+
543
+ if dryRun {
544
+ return saName , nil
545
+ }
546
+
547
+ // Create a new service account.
548
+ _ , err := clusterClientset .CoreV1 ().Secrets (namespace ).Create (
549
+ context .Background (), saTokenSecret , metav1.CreateOptions {},
550
+ )
551
+ switch {
552
+ case apierrors .IsAlreadyExists (err ) && errorOnExisting :
553
+ klog .V (2 ).Infof ("Service account token secret %s/%s already exists in target cluster %s" ,
554
+ namespace , saName , joiningClusterName )
555
+ return "" , err
556
+ case err != nil && ! apierrors .IsAlreadyExists (err ):
557
+ klog .V (2 ).Infof ("Could not create service account token secret %s/%s in target cluster %s due to: %v" ,
558
+ namespace , saName , joiningClusterName , err )
559
+ return "" , err
560
+ default :
561
+ return saTokenSecretName , nil
562
+ }
511
563
}
512
564
513
565
func bindingSubjects (saName , namespace string ) []rbacv1.Subject {
@@ -841,32 +893,20 @@ func populateSecretInHostCluster(clusterClientset, hostClientset kubeclient.Inte
841
893
// Get the secret from the joining cluster.
842
894
var secret * corev1.Secret
843
895
err := wait .PollImmediate (1 * time .Second , serviceAccountSecretTimeout , func () (bool , error ) {
844
- sa , err := clusterClientset .CoreV1 ().ServiceAccounts (joiningNamespace ).Get (
896
+ joiningClusterSASecret , err := clusterClientset .CoreV1 ().Secrets (joiningNamespace ).Get (
845
897
context .Background (), saName , metav1.GetOptions {},
846
898
)
847
899
if err != nil {
848
900
return false , nil
849
901
}
850
902
851
- for _ , objReference := range sa .Secrets {
852
- saSecretName := objReference .Name
853
- var err error
854
- secret , err = clusterClientset .CoreV1 ().Secrets (joiningNamespace ).Get (
855
- context .Background (), saSecretName , metav1.GetOptions {},
856
- )
857
- if err != nil {
858
- return false , nil
859
- }
860
- if secret .Type == corev1 .SecretTypeServiceAccountToken {
861
- klog .V (2 ).Infof ("Using secret named: %s" , secret .Name )
862
- return true , nil
863
- }
864
- }
865
- return false , nil
903
+ secret = joiningClusterSASecret
904
+
905
+ return true , nil
866
906
})
867
907
868
908
if err != nil {
869
- klog .V (2 ).Infof ("Could not get service account secret from joining cluster: %v" , err )
909
+ klog .V (2 ).Infof ("Could not get service account token secret from joining cluster: %v" , err )
870
910
return nil , nil , err
871
911
}
872
912
0 commit comments