Skip to content

Commit f8764fe

Browse files
authored
Merge pull request #9222 from chrischdi/pr-ms-preflight-1.28-skew
✨ machineset: adjust preflight check to allow kubelet version skew of 3 for clusters running v1.28 and above
2 parents ca3ad4d + 7394084 commit f8764fe

File tree

2 files changed

+69
-5
lines changed

2 files changed

+69
-5
lines changed

internal/controllers/machineset/machineset_preflight.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@ type preflightCheckErrorMessage *string
4545
// the preflight checks fail.
4646
const preflightFailedRequeueAfter = 15 * time.Second
4747

48+
var minVerKubernetesKubeletVersionSkewThree = semver.MustParse("1.28.0")
49+
4850
func (r *Reconciler) runPreflightChecks(ctx context.Context, cluster *clusterv1.Cluster, ms *clusterv1.MachineSet, action string) (_ ctrl.Result, message string, retErr error) {
4951
log := ctrl.LoggerFrom(ctx)
5052
// If the MachineSetPreflightChecks feature gate is disabled return early.
@@ -168,13 +170,18 @@ func (r *Reconciler) controlPlaneStablePreflightCheck(controlPlane *unstructured
168170
func (r *Reconciler) kubernetesVersionPreflightCheck(cpSemver, msSemver semver.Version) preflightCheckErrorMessage {
169171
// Check the Kubernetes version skew policy.
170172
// => MS minor version cannot be greater than the Control Plane minor version.
171-
// => MS minor version cannot be older than 2 minor versions of Control Plane.
173+
// => MS minor version cannot be outside of the supported skew.
172174
// Kubernetes skew policy: https://kubernetes.io/releases/version-skew-policy/#kubelet
173175
if msSemver.Minor > cpSemver.Minor {
174176
return pointer.String(fmt.Sprintf("MachineSet version (%s) and ControlPlane version (%s) do not conform to the kubernetes version skew policy as MachineSet version is higher than ControlPlane version (%q preflight failed)", msSemver.String(), cpSemver.String(), clusterv1.MachineSetPreflightCheckKubernetesVersionSkew))
175177
}
176-
if msSemver.Minor < cpSemver.Minor-2 {
177-
return pointer.String(fmt.Sprintf("MachineSet version (%s) and ControlPlane version (%s) do not conform to the kubernetes version skew policy as MachineSet version is more than 2 minor versions older than the ControlPlane version (%q preflight failed)", msSemver.String(), cpSemver.String(), clusterv1.MachineSetPreflightCheckKubernetesVersionSkew))
178+
minorSkew := uint64(3)
179+
// For Control Planes running Kubernetes < v1.28, the version skew policy for kubelets is two.
180+
if cpSemver.LT(minVerKubernetesKubeletVersionSkewThree) {
181+
minorSkew = 2
182+
}
183+
if msSemver.Minor < cpSemver.Minor-minorSkew {
184+
return pointer.String(fmt.Sprintf("MachineSet version (%s) and ControlPlane version (%s) do not conform to the kubernetes version skew policy as MachineSet version is more than %d minor versions older than the ControlPlane version (%q preflight failed)", msSemver.String(), cpSemver.String(), minorSkew, clusterv1.MachineSetPreflightCheckKubernetesVersionSkew))
178185
}
179186

180187
return nil

internal/controllers/machineset/machineset_preflight_test.go

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,13 @@ func TestMachineSetReconciler_runPreflightChecks(t *testing.T) {
6060
}).
6161
Build()
6262

63+
controlPlaneStable128 := builder.ControlPlane(ns, "cp1").
64+
WithVersion("v1.28.0").
65+
WithStatusFields(map[string]interface{}{
66+
"status.version": "v1.28.0",
67+
}).
68+
Build()
69+
6370
t.Run("should run preflight checks if the feature gate is enabled", func(t *testing.T) {
6471
defer utilfeature.SetFeatureGateDuringTest(t, feature.Gates, feature.MachineSetPreflightChecks, true)()
6572

@@ -267,7 +274,32 @@ func TestMachineSetReconciler_runPreflightChecks(t *testing.T) {
267274
wantPass: false,
268275
},
269276
{
270-
name: "kubernetes version preflight check: should fail if the machine set minor version is 2 older than control plane minor version",
277+
name: "kubernetes version preflight check: should fail if the machine set minor version is 4 older than control plane minor version for >= v1.28",
278+
cluster: &clusterv1.Cluster{
279+
ObjectMeta: metav1.ObjectMeta{
280+
Namespace: ns,
281+
},
282+
Spec: clusterv1.ClusterSpec{
283+
ControlPlaneRef: contract.ObjToRef(controlPlaneStable128),
284+
},
285+
},
286+
controlPlane: controlPlaneStable128,
287+
machineSet: &clusterv1.MachineSet{
288+
ObjectMeta: metav1.ObjectMeta{
289+
Namespace: ns,
290+
},
291+
Spec: clusterv1.MachineSetSpec{
292+
Template: clusterv1.MachineTemplateSpec{
293+
Spec: clusterv1.MachineSpec{
294+
Version: pointer.String("v1.24.0"),
295+
},
296+
},
297+
},
298+
},
299+
wantPass: false,
300+
},
301+
{
302+
name: "kubernetes version preflight check: should fail if the machine set minor version is 3 older than control plane minor version for < v1.28",
271303
cluster: &clusterv1.Cluster{
272304
ObjectMeta: metav1.ObjectMeta{
273305
Namespace: ns,
@@ -320,7 +352,32 @@ func TestMachineSetReconciler_runPreflightChecks(t *testing.T) {
320352
wantPass: true,
321353
},
322354
{
323-
name: "kubernetes version preflight check: should pass if the machine set minor version and control plane version conform to kubernetes version skew policy",
355+
name: "kubernetes version preflight check: should pass if the machine set minor version and control plane version conform to kubernetes version skew policy >= v1.28",
356+
cluster: &clusterv1.Cluster{
357+
ObjectMeta: metav1.ObjectMeta{
358+
Namespace: ns,
359+
},
360+
Spec: clusterv1.ClusterSpec{
361+
ControlPlaneRef: contract.ObjToRef(controlPlaneStable128),
362+
},
363+
},
364+
controlPlane: controlPlaneStable128,
365+
machineSet: &clusterv1.MachineSet{
366+
ObjectMeta: metav1.ObjectMeta{
367+
Namespace: ns,
368+
},
369+
Spec: clusterv1.MachineSetSpec{
370+
Template: clusterv1.MachineTemplateSpec{
371+
Spec: clusterv1.MachineSpec{
372+
Version: pointer.String("v1.25.0"),
373+
},
374+
},
375+
},
376+
},
377+
wantPass: true,
378+
},
379+
{
380+
name: "kubernetes version preflight check: should pass if the machine set minor version and control plane version conform to kubernetes version skew policy < v1.28",
324381
cluster: &clusterv1.Cluster{
325382
ObjectMeta: metav1.ObjectMeta{
326383
Namespace: ns,

0 commit comments

Comments
 (0)