Skip to content

Commit 8df788d

Browse files
authored
Merge pull request #11146 from sbueringer/pr-kcp-remove
🌱 KCP: remove code handling Kubernetes <= v1.21
2 parents 845c0ab + b63a4ab commit 8df788d

File tree

8 files changed

+33
-356
lines changed

8 files changed

+33
-356
lines changed

controlplane/kubeadm/internal/controllers/controller.go

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -802,12 +802,7 @@ func (r *KubeadmControlPlaneReconciler) reconcileEtcdMembers(ctx context.Context
802802
return errors.Wrap(err, "cannot get remote client to workload cluster")
803803
}
804804

805-
parsedVersion, err := semver.ParseTolerant(controlPlane.KCP.Spec.Version)
806-
if err != nil {
807-
return errors.Wrapf(err, "failed to parse kubernetes version %q", controlPlane.KCP.Spec.Version)
808-
}
809-
810-
removedMembers, err := workloadCluster.ReconcileEtcdMembers(ctx, nodeNames, parsedVersion)
805+
removedMembers, err := workloadCluster.ReconcileEtcdMembers(ctx, nodeNames)
811806
if err != nil {
812807
return errors.Wrap(err, "failed attempt to reconcile etcd members")
813808
}

controlplane/kubeadm/internal/controllers/fakes_test.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ func (f *fakeWorkloadCluster) ForwardEtcdLeadership(_ context.Context, _ *cluste
8484
return nil
8585
}
8686

87-
func (f *fakeWorkloadCluster) ReconcileEtcdMembers(_ context.Context, _ []string, _ semver.Version) ([]string, error) {
87+
func (f *fakeWorkloadCluster) ReconcileEtcdMembers(_ context.Context, _ []string) ([]string, error) {
8888
return nil, nil
8989
}
9090

@@ -129,10 +129,6 @@ func (f *fakeWorkloadCluster) RemoveEtcdMemberForMachine(_ context.Context, _ *c
129129
return nil
130130
}
131131

132-
func (f *fakeWorkloadCluster) RemoveMachineFromKubeadmConfigMap(_ context.Context, _ *clusterv1.Machine, _ semver.Version) error {
133-
return nil
134-
}
135-
136132
func (f *fakeWorkloadCluster) EtcdMembers(_ context.Context) ([]string, error) {
137133
return f.EtcdMembersResult, nil
138134
}

controlplane/kubeadm/internal/controllers/remediation.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222
"fmt"
2323
"time"
2424

25-
"github.com/blang/semver/v4"
2625
"github.com/go-logr/logr"
2726
"github.com/pkg/errors"
2827
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -227,16 +226,6 @@ func (r *KubeadmControlPlaneReconciler) reconcileUnhealthyMachines(ctx context.C
227226

228227
// NOTE: etcd member removal will be performed by the kcp-cleanup hook after machine completes drain & all volumes are detached.
229228
}
230-
231-
parsedVersion, err := semver.ParseTolerant(controlPlane.KCP.Spec.Version)
232-
if err != nil {
233-
return ctrl.Result{}, errors.Wrapf(err, "failed to parse kubernetes version %q", controlPlane.KCP.Spec.Version)
234-
}
235-
236-
if err := workloadCluster.RemoveMachineFromKubeadmConfigMap(ctx, machineToBeRemediated, parsedVersion); err != nil {
237-
log.Error(err, "Failed to remove machine from kubeadm ConfigMap")
238-
return ctrl.Result{}, err
239-
}
240229
}
241230

242231
// Delete the machine

controlplane/kubeadm/internal/controllers/scale.go

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"context"
2121
"strings"
2222

23-
"github.com/blang/semver/v4"
2423
"github.com/pkg/errors"
2524
corev1 "k8s.io/api/core/v1"
2625
apierrors "k8s.io/apimachinery/pkg/api/errors"
@@ -139,16 +138,6 @@ func (r *KubeadmControlPlaneReconciler) scaleDownControlPlane(
139138
// NOTE: etcd member removal will be performed by the kcp-cleanup hook after machine completes drain & all volumes are detached.
140139
}
141140

142-
parsedVersion, err := semver.ParseTolerant(controlPlane.KCP.Spec.Version)
143-
if err != nil {
144-
return ctrl.Result{}, errors.Wrapf(err, "failed to parse kubernetes version %q", controlPlane.KCP.Spec.Version)
145-
}
146-
147-
if err := workloadCluster.RemoveMachineFromKubeadmConfigMap(ctx, machineToDelete, parsedVersion); err != nil {
148-
logger.Error(err, "Failed to remove machine from kubeadm ConfigMap")
149-
return ctrl.Result{}, err
150-
}
151-
152141
logger = logger.WithValues("Machine", klog.KObj(machineToDelete))
153142
if err := r.Client.Delete(ctx, machineToDelete); err != nil && !apierrors.IsNotFound(err) {
154143
logger.Error(err, "Failed to delete control plane machine")

controlplane/kubeadm/internal/workload_cluster.go

Lines changed: 23 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ import (
5252
"sigs.k8s.io/cluster-api/util/certs"
5353
containerutil "sigs.k8s.io/cluster-api/util/container"
5454
"sigs.k8s.io/cluster-api/util/patch"
55-
"sigs.k8s.io/cluster-api/util/version"
5655
)
5756

5857
const (
@@ -68,18 +67,6 @@ const (
6867
)
6968

7069
var (
71-
// Starting from v1.22.0 kubeadm dropped the usage of the ClusterStatus entry from the kubeadm-config ConfigMap
72-
// so we're not anymore required to remove API endpoints for control plane nodes after deletion.
73-
//
74-
// NOTE: The following assumes that kubeadm version equals to Kubernetes version.
75-
minKubernetesVersionWithoutClusterStatus = semver.MustParse("1.22.0")
76-
77-
// Starting from v1.21.0 kubeadm defaults to systemdCGroup driver, as well as images built with ImageBuilder,
78-
// so it is necessary to mutate the kubelet-config-xx ConfigMap.
79-
//
80-
// NOTE: The following assumes that kubeadm version equals to Kubernetes version.
81-
minVerKubeletSystemdDriver = semver.MustParse("1.21.0")
82-
8370
// Starting from v1.24.0 kubeadm uses "kubelet-config" a ConfigMap name for KubeletConfiguration,
8471
// Dropping the X-Y suffix.
8572
//
@@ -124,15 +111,13 @@ type WorkloadCluster interface {
124111
UpdateKubeProxyImageInfo(ctx context.Context, kcp *controlplanev1.KubeadmControlPlane, version semver.Version) error
125112
UpdateCoreDNS(ctx context.Context, kcp *controlplanev1.KubeadmControlPlane, version semver.Version) error
126113
RemoveEtcdMemberForMachine(ctx context.Context, machine *clusterv1.Machine) error
127-
RemoveMachineFromKubeadmConfigMap(ctx context.Context, machine *clusterv1.Machine, version semver.Version) error
128-
RemoveNodeFromKubeadmConfigMap(ctx context.Context, nodeName string, version semver.Version) error
129114
ForwardEtcdLeadership(ctx context.Context, machine *clusterv1.Machine, leaderCandidate *clusterv1.Machine) error
130115
AllowBootstrapTokensToGetNodes(ctx context.Context) error
131116
AllowClusterAdminPermissions(ctx context.Context, version semver.Version) error
132117
UpdateClusterConfiguration(ctx context.Context, version semver.Version, mutators ...func(*bootstrapv1.ClusterConfiguration)) error
133118

134119
// State recovery tasks.
135-
ReconcileEtcdMembers(ctx context.Context, nodeNames []string, version semver.Version) ([]string, error)
120+
ReconcileEtcdMembers(ctx context.Context, nodeNames []string) ([]string, error)
136121
}
137122

138123
// Workload defines operations on workload clusters.
@@ -277,33 +262,31 @@ func (w *Workload) UpdateKubeletConfigMap(ctx context.Context, version semver.Ve
277262
// NOTE: It is considered safe to update the kubelet-config-1.21 ConfigMap
278263
// because only new nodes using v1.21 images will pick up the change during
279264
// kubeadm join.
280-
if version.GE(minVerKubeletSystemdDriver) {
281-
data, ok := cm.Data[kubeletConfigKey]
282-
if !ok {
283-
return errors.Errorf("unable to find %q key in %s", kubeletConfigKey, cm.Name)
284-
}
285-
kubeletConfig, err := yamlToUnstructured([]byte(data))
286-
if err != nil {
287-
return errors.Wrapf(err, "unable to decode kubelet ConfigMap's %q content to Unstructured object", kubeletConfigKey)
288-
}
289-
cgroupDriver, _, err := unstructured.NestedString(kubeletConfig.UnstructuredContent(), cgroupDriverKey)
290-
if err != nil {
291-
return errors.Wrapf(err, "unable to extract %q from Kubelet ConfigMap's %q", cgroupDriverKey, cm.Name)
292-
}
265+
data, ok := cm.Data[kubeletConfigKey]
266+
if !ok {
267+
return errors.Errorf("unable to find %q key in %s", kubeletConfigKey, cm.Name)
268+
}
269+
kubeletConfig, err := yamlToUnstructured([]byte(data))
270+
if err != nil {
271+
return errors.Wrapf(err, "unable to decode kubelet ConfigMap's %q content to Unstructured object", kubeletConfigKey)
272+
}
273+
cgroupDriver, _, err := unstructured.NestedString(kubeletConfig.UnstructuredContent(), cgroupDriverKey)
274+
if err != nil {
275+
return errors.Wrapf(err, "unable to extract %q from Kubelet ConfigMap's %q", cgroupDriverKey, cm.Name)
276+
}
293277

294-
// If the value is not already explicitly set by the user, change according to kubeadm/image builder new requirements.
295-
if cgroupDriver == "" {
296-
cgroupDriver = "systemd"
278+
// If the value is not already explicitly set by the user, change according to kubeadm/image builder new requirements.
279+
if cgroupDriver == "" {
280+
cgroupDriver = "systemd"
297281

298-
if err := unstructured.SetNestedField(kubeletConfig.UnstructuredContent(), cgroupDriver, cgroupDriverKey); err != nil {
299-
return errors.Wrapf(err, "unable to update %q on Kubelet ConfigMap's %q", cgroupDriverKey, cm.Name)
300-
}
301-
updated, err := yaml.Marshal(kubeletConfig)
302-
if err != nil {
303-
return errors.Wrapf(err, "unable to encode Kubelet ConfigMap's %q to YAML", cm.Name)
304-
}
305-
cm.Data[kubeletConfigKey] = string(updated)
282+
if err := unstructured.SetNestedField(kubeletConfig.UnstructuredContent(), cgroupDriver, cgroupDriverKey); err != nil {
283+
return errors.Wrapf(err, "unable to update %q on Kubelet ConfigMap's %q", cgroupDriverKey, cm.Name)
306284
}
285+
updated, err := yaml.Marshal(kubeletConfig)
286+
if err != nil {
287+
return errors.Wrapf(err, "unable to encode Kubelet ConfigMap's %q to YAML", cm.Name)
288+
}
289+
cm.Data[kubeletConfigKey] = string(updated)
307290
}
308291

309292
// Update the name to the new name
@@ -338,27 +321,6 @@ func (w *Workload) UpdateSchedulerInKubeadmConfigMap(scheduler bootstrapv1.Contr
338321
}
339322
}
340323

341-
// RemoveMachineFromKubeadmConfigMap removes the entry for the machine from the kubeadm configmap.
342-
func (w *Workload) RemoveMachineFromKubeadmConfigMap(ctx context.Context, machine *clusterv1.Machine, version semver.Version) error {
343-
if machine == nil || machine.Status.NodeRef == nil {
344-
// Nothing to do, no node for Machine
345-
return nil
346-
}
347-
348-
return w.RemoveNodeFromKubeadmConfigMap(ctx, machine.Status.NodeRef.Name, version)
349-
}
350-
351-
// RemoveNodeFromKubeadmConfigMap removes the entry for the node from the kubeadm configmap.
352-
func (w *Workload) RemoveNodeFromKubeadmConfigMap(ctx context.Context, name string, v semver.Version) error {
353-
if version.Compare(v, minKubernetesVersionWithoutClusterStatus, version.WithoutPreReleases()) >= 0 {
354-
return nil
355-
}
356-
357-
return w.updateClusterStatus(ctx, func(s *bootstrapv1.ClusterStatus) {
358-
delete(s.APIEndpoints, name)
359-
}, v)
360-
}
361-
362324
// updateClusterStatus gets the ClusterStatus kubeadm-config ConfigMap, converts it to the
363325
// Cluster API representation, and then applies a mutation func; if changes are detected, the
364326
// data are converted back into the Kubeadm API version in use for the target Kubernetes version and the

controlplane/kubeadm/internal/workload_cluster_etcd.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ package internal
1919
import (
2020
"context"
2121

22-
"github.com/blang/semver/v4"
2322
"github.com/pkg/errors"
2423
kerrors "k8s.io/apimachinery/pkg/util/errors"
2524

@@ -36,19 +35,19 @@ type etcdClientFor interface {
3635

3736
// ReconcileEtcdMembers iterates over all etcd members and finds members that do not have corresponding nodes.
3837
// If there are any such members, it deletes them from etcd and removes their nodes from the kubeadm configmap so that kubeadm does not run etcd health checks on them.
39-
func (w *Workload) ReconcileEtcdMembers(ctx context.Context, nodeNames []string, version semver.Version) ([]string, error) {
38+
func (w *Workload) ReconcileEtcdMembers(ctx context.Context, nodeNames []string) ([]string, error) {
4039
allRemovedMembers := []string{}
4140
allErrs := []error{}
4241
for _, nodeName := range nodeNames {
43-
removedMembers, errs := w.reconcileEtcdMember(ctx, nodeNames, nodeName, version)
42+
removedMembers, errs := w.reconcileEtcdMember(ctx, nodeNames, nodeName)
4443
allRemovedMembers = append(allRemovedMembers, removedMembers...)
4544
allErrs = append(allErrs, errs...)
4645
}
4746

4847
return allRemovedMembers, kerrors.NewAggregate(allErrs)
4948
}
5049

51-
func (w *Workload) reconcileEtcdMember(ctx context.Context, nodeNames []string, nodeName string, version semver.Version) ([]string, []error) {
50+
func (w *Workload) reconcileEtcdMember(ctx context.Context, nodeNames []string, nodeName string) ([]string, []error) {
5251
// Create the etcd Client for the etcd Pod scheduled on the Node
5352
etcdClient, err := w.etcdClientGenerator.forFirstAvailableNode(ctx, []string{nodeName})
5453
if err != nil {
@@ -84,10 +83,6 @@ loopmembers:
8483
if err := w.removeMemberForNode(ctx, member.Name); err != nil {
8584
errs = append(errs, err)
8685
}
87-
88-
if err := w.RemoveNodeFromKubeadmConfigMap(ctx, member.Name, version); err != nil {
89-
errs = append(errs, err)
90-
}
9186
}
9287
return removedMembers, errs
9388
}

0 commit comments

Comments
 (0)