@@ -20,19 +20,18 @@ package controllers
20
20
import (
21
21
"bytes"
22
22
"context"
23
+ "encoding/base64"
23
24
"fmt"
24
25
"os"
25
26
"time"
26
27
27
- "github.com/aws/aws-sdk-go/aws"
28
- "github.com/aws/aws-sdk-go/aws/session"
29
- "github.com/aws/aws-sdk-go/service/eks"
30
28
"github.com/pkg/errors"
31
29
corev1 "k8s.io/api/core/v1"
32
30
apierrors "k8s.io/apimachinery/pkg/api/errors"
33
31
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
34
32
"k8s.io/apimachinery/pkg/runtime"
35
33
"k8s.io/apimachinery/pkg/types"
34
+ "k8s.io/client-go/tools/clientcmd"
36
35
"k8s.io/klog/v2"
37
36
"k8s.io/utils/ptr"
38
37
ctrl "sigs.k8s.io/controller-runtime"
@@ -45,14 +44,15 @@ import (
45
44
"sigs.k8s.io/cluster-api-provider-aws/v2/bootstrap/eks/internal/userdata"
46
45
ekscontrolplanev1 "sigs.k8s.io/cluster-api-provider-aws/v2/controlplane/eks/api/v1beta2"
47
46
expinfrav1 "sigs.k8s.io/cluster-api-provider-aws/v2/exp/api/v1beta2"
47
+ "sigs.k8s.io/cluster-api-provider-aws/v2/feature"
48
48
"sigs.k8s.io/cluster-api-provider-aws/v2/pkg/logger"
49
49
"sigs.k8s.io/cluster-api-provider-aws/v2/util/paused"
50
50
clusterv1 "sigs.k8s.io/cluster-api/api/v1beta1"
51
51
bsutil "sigs.k8s.io/cluster-api/bootstrap/util"
52
52
expclusterv1 "sigs.k8s.io/cluster-api/exp/api/v1beta1"
53
- "sigs.k8s.io/cluster-api/feature"
54
53
"sigs.k8s.io/cluster-api/util"
55
54
"sigs.k8s.io/cluster-api/util/conditions"
55
+ kubeconfigutil "sigs.k8s.io/cluster-api/util/kubeconfig"
56
56
"sigs.k8s.io/cluster-api/util/patch"
57
57
"sigs.k8s.io/cluster-api/util/predicates"
58
58
)
@@ -323,36 +323,22 @@ func (r *EKSConfigReconciler) joinWorker(ctx context.Context, cluster *clusterv1
323
323
log .Info ("Using mock CA certificate for test environment" )
324
324
nodeInput .CACert = "mock-ca-certificate-for-testing"
325
325
} else {
326
- // Fetch CA cert from EKS API
327
- sess , err := session .NewSession (& aws.Config {Region : aws .String (controlPlane .Spec .Region )})
328
- if err != nil {
329
- log .Error (err , "Failed to create AWS session for EKS API" )
330
- conditions .MarkFalse (config , eksbootstrapv1 .DataSecretAvailableCondition ,
331
- eksbootstrapv1 .DataSecretGenerationFailedReason ,
332
- clusterv1 .ConditionSeverityWarning ,
333
- "Failed to create AWS session: %v" , err )
334
- return ctrl.Result {}, err
326
+ // Fetch CA cert from KubeConfig secret
327
+ // We already have the cluster object passed to this function
328
+ obj := client.ObjectKey {
329
+ Namespace : cluster .Namespace ,
330
+ Name : cluster .Name ,
335
331
}
336
- eksClient := eks .New (sess )
337
- describeInput := & eks.DescribeClusterInput {Name : aws .String (controlPlane .Spec .EKSClusterName )}
338
- clusterOut , err := eksClient .DescribeCluster (describeInput )
332
+ ca , err := extractCAFromSecret (ctx , r .Client , obj )
339
333
if err != nil {
340
- log .Error (err , "Failed to describe EKS cluster for CA cert fetch " )
334
+ log .Error (err , "Failed to extract CA from kubeconfig secret " )
341
335
conditions .MarkFalse (config , eksbootstrapv1 .DataSecretAvailableCondition ,
342
336
eksbootstrapv1 .DataSecretGenerationFailedReason ,
343
337
clusterv1 .ConditionSeverityWarning ,
344
- "Failed to describe EKS cluster : %v" , err )
338
+ "Failed to extract CA from kubeconfig secret : %v" , err )
345
339
return ctrl.Result {}, err
346
- } else if clusterOut .Cluster != nil && clusterOut .Cluster .CertificateAuthority != nil && clusterOut .Cluster .CertificateAuthority .Data != nil {
347
- nodeInput .CACert = * clusterOut .Cluster .CertificateAuthority .Data
348
- } else {
349
- log .Error (nil , "CA certificate not found in EKS cluster response" )
350
- conditions .MarkFalse (config , eksbootstrapv1 .DataSecretAvailableCondition ,
351
- eksbootstrapv1 .DataSecretGenerationFailedReason ,
352
- clusterv1 .ConditionSeverityWarning ,
353
- "CA certificate not found in EKS cluster response" )
354
- return ctrl.Result {}, fmt .Errorf ("CA certificate not found in EKS cluster response" )
355
340
}
341
+ nodeInput .CACert = ca
356
342
}
357
343
358
344
// Get AMI ID from AWSManagedMachinePool's launch template if specified
@@ -581,3 +567,23 @@ func (r *EKSConfigReconciler) updateBootstrapSecret(ctx context.Context, secret
581
567
}
582
568
return false , nil
583
569
}
570
+
571
+ func extractCAFromSecret (ctx context.Context , c client.Client , obj client.ObjectKey ) (string , error ) {
572
+ data , err := kubeconfigutil .FromSecret (ctx , c , obj )
573
+ if err != nil {
574
+ return "" , errors .Wrapf (err , "failed to get kubeconfig secret %s" , obj .Name )
575
+ }
576
+ config , err := clientcmd .Load (data )
577
+ if err != nil {
578
+ return "" , errors .Wrapf (err , "failed to parse kubeconfig data from secret %s" , obj .Name )
579
+ }
580
+
581
+ // Iterate through all clusters in the kubeconfig and use the first one with CA data
582
+ for _ , cluster := range config .Clusters {
583
+ if cluster .CertificateAuthorityData != nil && len (cluster .CertificateAuthorityData ) > 0 {
584
+ return base64 .StdEncoding .EncodeToString (cluster .CertificateAuthorityData ), nil
585
+ }
586
+ }
587
+
588
+ return "" , fmt .Errorf ("no cluster with CA data found in kubeconfig" )
589
+ }
0 commit comments