Skip to content

Commit 6384395

Browse files
authored
Merge pull request kubernetes-sigs#9682 from killianmuldoon/pr-kubeadm-rbac
🌱 Support admin config for Kubeadm v1.29
2 parents bd9abfc + 67c222e commit 6384395

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

controlplane/kubeadm/internal/controllers/fakes_test.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,10 @@ func (f fakeWorkloadCluster) AllowBootstrapTokensToGetNodes(_ context.Context) e
9696
return nil
9797
}
9898

99+
func (f fakeWorkloadCluster) AllowClusterAdminPermissions(_ context.Context, _ semver.Version) error {
100+
return nil
101+
}
102+
99103
func (f fakeWorkloadCluster) ReconcileKubeletRBACRole(_ context.Context, _ semver.Version) error {
100104
return nil
101105
}

controlplane/kubeadm/internal/controllers/upgrade.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ func (r *KubeadmControlPlaneReconciler) upgradeControlPlane(
6868
return ctrl.Result{}, errors.Wrap(err, "failed to set role and role binding for kubeadm")
6969
}
7070

71+
// Ensure kubeadm clusterRoleBinding for v1.29+ as per https://github.com/kubernetes/kubernetes/pull/121305
72+
if err := workloadCluster.AllowClusterAdminPermissions(ctx, parsedVersion); err != nil {
73+
return ctrl.Result{}, errors.Wrap(err, "failed to set cluster-admin ClusterRoleBinding for kubeadm")
74+
}
75+
7176
if err := workloadCluster.UpdateKubernetesVersionInKubeadmConfigMap(ctx, parsedVersion); err != nil {
7277
return ctrl.Result{}, errors.Wrap(err, "failed to update the kubernetes version in the kubeadm config map")
7378
}

controlplane/kubeadm/internal/workload_cluster.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ type WorkloadCluster interface {
120120
RemoveNodeFromKubeadmConfigMap(ctx context.Context, nodeName string, version semver.Version) error
121121
ForwardEtcdLeadership(ctx context.Context, machine *clusterv1.Machine, leaderCandidate *clusterv1.Machine) error
122122
AllowBootstrapTokensToGetNodes(ctx context.Context) error
123+
AllowClusterAdminPermissions(ctx context.Context, version semver.Version) error
123124

124125
// State recovery tasks.
125126
ReconcileEtcdMembers(ctx context.Context, nodeNames []string, version semver.Version) ([]string, error)

controlplane/kubeadm/internal/workload_cluster_rbac.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ import (
2626
apierrors "k8s.io/apimachinery/pkg/api/errors"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2828
"sigs.k8s.io/controller-runtime/pkg/client"
29+
30+
"sigs.k8s.io/cluster-api/util/version"
2931
)
3032

3133
const (
@@ -35,6 +37,11 @@ const (
3537
// GetNodesClusterRoleName defines the name of the ClusterRole and ClusterRoleBinding to get nodes.
3638
GetNodesClusterRoleName = "kubeadm:get-nodes"
3739

40+
// ClusterAdminsGroupAndClusterRoleBinding is the name of the Group used for kubeadm generated cluster
41+
// admin credentials and the name of the ClusterRoleBinding that binds the same Group to the "cluster-admin"
42+
// built-in ClusterRole.
43+
ClusterAdminsGroupAndClusterRoleBinding = "kubeadm:cluster-admins"
44+
3845
// NodesGroup defines the well-known group for all nodes.
3946
NodesGroup = "system:nodes"
4047

@@ -66,6 +73,33 @@ func (w *Workload) EnsureResource(ctx context.Context, obj client.Object) error
6673
return nil
6774
}
6875

76+
// AllowClusterAdminPermissions creates ClusterRoleBinding rules to use the kubeadm:cluster-admins Cluster Role created in Kubeadm v1.29.
77+
func (w *Workload) AllowClusterAdminPermissions(ctx context.Context, targetVersion semver.Version) error {
78+
// We intentionally only parse major/minor/patch so that the subsequent code
79+
// also already applies to pre-release versions of new releases.
80+
// Do nothing for Kubernetes < 1.29.
81+
if version.Compare(targetVersion, semver.Version{Major: 1, Minor: 29, Patch: 0}, version.WithoutPreReleases()) < 0 {
82+
return nil
83+
}
84+
return w.EnsureResource(ctx, &rbacv1.ClusterRoleBinding{
85+
ObjectMeta: metav1.ObjectMeta{
86+
Name: ClusterAdminsGroupAndClusterRoleBinding,
87+
},
88+
RoleRef: rbacv1.RoleRef{
89+
APIGroup: rbacv1.GroupName,
90+
Kind: "ClusterRole",
91+
Name: "cluster-admin",
92+
},
93+
Subjects: []rbacv1.Subject{
94+
{
95+
Kind: rbacv1.GroupKind,
96+
Name: ClusterAdminsGroupAndClusterRoleBinding,
97+
},
98+
},
99+
},
100+
)
101+
}
102+
69103
// AllowBootstrapTokensToGetNodes creates RBAC rules to allow Node Bootstrap Tokens to list nodes.
70104
func (w *Workload) AllowBootstrapTokensToGetNodes(ctx context.Context) error {
71105
if err := w.EnsureResource(ctx, &rbacv1.ClusterRole{

0 commit comments

Comments
 (0)