Skip to content

Commit d85abe6

Browse files
committed
fix: regenerate kubeconfig on expiration
Fixes #126 Whenever kubeconfig reaches 50% of expiration, regenerate the secret. This secret is used my many other CAPI components, so it needs to be up to date. Signed-off-by: Andrey Smirnov <[email protected]> (cherry picked from commit 051fad9)
1 parent 5c5d9ba commit d85abe6

File tree

2 files changed

+22
-3
lines changed

2 files changed

+22
-3
lines changed

config/rbac/role.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ rules:
6060
- get
6161
- list
6262
- patch
63+
- update
6364
- watch
6465
---
6566
apiVersion: rbac.authorization.k8s.io/v1

controllers/taloscontrolplane_controller.go

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import (
3636
"sigs.k8s.io/cluster-api/controllers/remote"
3737
"sigs.k8s.io/cluster-api/util"
3838
"sigs.k8s.io/cluster-api/util/annotations"
39+
"sigs.k8s.io/cluster-api/util/certs"
3940
"sigs.k8s.io/cluster-api/util/collections"
4041
"sigs.k8s.io/cluster-api/util/conditions"
4142
"sigs.k8s.io/cluster-api/util/kubeconfig"
@@ -75,7 +76,7 @@ func (r *TalosControlPlaneReconciler) SetupWithManager(mgr ctrl.Manager, options
7576
}
7677

7778
// +kubebuilder:rbac:groups=core,resources=events,verbs=get;list;watch;create;patch
78-
// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;patch
79+
// +kubebuilder:rbac:groups=core,resources=secrets,verbs=get;list;watch;create;patch;update
7980
// +kubebuilder:rbac:groups=core,resources=configmaps,namespace=kube-system,verbs=get;list;watch;create
8081
// +kubebuilder:rbac:groups=rbac,resources=roles,namespace=kube-system,verbs=get;list;watch;create
8182
// +kubebuilder:rbac:groups=rbac,resources=rolebindings,namespace=kube-system,verbs=get;list;watch;create
@@ -624,7 +625,7 @@ func (r *TalosControlPlaneReconciler) reconcileKubeconfig(ctx context.Context, c
624625
}
625626

626627
clusterName := util.ObjectKey(cluster)
627-
_, err := secret.GetFromNamespacedName(ctx, r.Client, clusterName, secret.Kubeconfig)
628+
existingKubeconfig, err := secret.GetFromNamespacedName(ctx, r.Client, clusterName, secret.Kubeconfig)
628629
switch {
629630
case apierrors.IsNotFound(err):
630631
createErr := kubeconfig.CreateSecretWithOwner(
@@ -644,7 +645,24 @@ func (r *TalosControlPlaneReconciler) reconcileKubeconfig(ctx context.Context, c
644645
return ctrl.Result{}, createErr
645646
}
646647
case err != nil:
647-
return ctrl.Result{RequeueAfter: 20 * time.Second}, errors.Wrapf(err, "failed to retrieve kubeconfig Secret for Cluster %q in namespace %q", clusterName.Name, clusterName.Namespace)
648+
return ctrl.Result{RequeueAfter: 20 * time.Second}, fmt.Errorf("failed to retrieve kubeconfig Secret for Cluster %q in namespace %q: %w", clusterName.Name, clusterName.Namespace, err)
649+
default:
650+
// kubeconfig is already generated
651+
needsRotation, err := kubeconfig.NeedsClientCertRotation(existingKubeconfig, certs.ClientCertificateRenewalDuration)
652+
if err != nil {
653+
return ctrl.Result{}, fmt.Errorf("failed to figure out if we need to regenerate cluster client cert: %w", err)
654+
}
655+
656+
if !needsRotation {
657+
return ctrl.Result{}, nil
658+
}
659+
660+
r.Log.Info("kubeconfig certificate rotation", "secret", secret.Kubeconfig, "cluster", clusterName.Name, "namespace", clusterName.Namespace)
661+
662+
err = kubeconfig.RegenerateSecret(ctx, r.Client, existingKubeconfig)
663+
if err != nil {
664+
return ctrl.Result{}, fmt.Errorf("failed to regenerate kubeconfig: %w", err)
665+
}
648666
}
649667

650668
return ctrl.Result{}, nil

0 commit comments

Comments
 (0)