Skip to content

Commit 2c9e7d6

Browse files
committed
pkg/operator/status: Drop kubelet skew guard
The kubelet skew guard is from 1471d2c (Bug 1986453: Check for API server and node versions skew, 2021-07-27, #2658). But the Kube API server also landed a similar guard in openshift/cluster-kube-apiserver-operator@9ce4f74775 (add KubeletVersionSkewController, 2021-08-26, openshift/cluster-kube-apiserver-operator#1199). openshift/enhancements@0ba744e750 (eus-upgrades-mvp: don't enforce skew check in MCO, 2021-04-29, openshift/enhancements#762) had shifted the proposal from MCO-guards to KAS-guards, so I'm not clear on why the MCO guard landed. This commit drops it, to consolidate around the KAS-side guard.
1 parent 9ece709 commit 2c9e7d6

File tree

2 files changed

+1
-510
lines changed

2 files changed

+1
-510
lines changed

pkg/operator/status.go

+1-160
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"fmt"
77
"reflect"
88
"sort"
9-
"strconv"
109
"strings"
1110
"time"
1211

@@ -255,13 +254,6 @@ func (optr *Operator) syncDegradedStatus(co *configv1.ClusterOperator, ierr sync
255254
cov1helpers.SetStatusCondition(&co.Status.Conditions, coDegradedCondition, clock.RealClock{})
256255
}
257256

258-
const (
259-
skewUnchecked = "KubeletSkewUnchecked"
260-
skewSupported = "KubeletSkewSupported"
261-
skewUnsupported = "KubeletSkewUnsupported"
262-
skewPresent = "KubeletSkewPresent"
263-
)
264-
265257
// syncUpgradeableStatus applies the new condition to the mco's ClusterOperator object.
266258
func (optr *Operator) syncUpgradeableStatus(co *configv1.ClusterOperator) error {
267259

@@ -289,13 +281,8 @@ func (optr *Operator) syncUpgradeableStatus(co *configv1.ClusterOperator) error
289281
coStatusCondition.Reason = "ClusterOnCgroupV1"
290282
coStatusCondition.Message = "Cluster is using deprecated cgroup v1 and is not upgradable. Please update the `CgroupMode` in the `nodes.config.openshift.io` object to 'v2'. Once upgraded, the cluster cannot be changed back to cgroup v1"
291283
}
292-
var updating, degraded, interrupted bool
284+
var degraded, interrupted bool
293285
for _, pool := range pools {
294-
// collect updating status but continue to check each pool to see if any pool is degraded
295-
if isPoolStatusConditionTrue(pool, mcfgv1.MachineConfigPoolUpdating) {
296-
updating = true
297-
}
298-
299286
interrupted = isPoolStatusConditionTrue(pool, mcfgv1.MachineConfigPoolBuildInterrupted)
300287

301288
degraded = isPoolStatusConditionTrue(pool, mcfgv1.MachineConfigPoolDegraded)
@@ -315,39 +302,6 @@ func (optr *Operator) syncUpgradeableStatus(co *configv1.ClusterOperator) error
315302
}
316303
}
317304

318-
// don't overwrite status if updating or degraded
319-
if !updating && !degraded && !interrupted {
320-
skewStatus, status, err := optr.isKubeletSkewSupported(pools)
321-
if err != nil {
322-
klog.Errorf("Error checking version skew: %v, kubelet skew status: %v, status reason: %v, status message: %v", err, skewStatus, status.Reason, status.Message)
323-
coStatusCondition.Reason = status.Reason
324-
coStatusCondition.Message = status.Message
325-
cov1helpers.SetStatusCondition(&co.Status.Conditions, coStatusCondition, clock.RealClock{})
326-
}
327-
switch skewStatus {
328-
case skewUnchecked:
329-
coStatusCondition.Reason = status.Reason
330-
coStatusCondition.Message = status.Message
331-
cov1helpers.SetStatusCondition(&co.Status.Conditions, coStatusCondition, clock.RealClock{})
332-
case skewUnsupported:
333-
coStatusCondition.Reason = status.Reason
334-
coStatusCondition.Message = status.Message
335-
mcoObjectRef := &corev1.ObjectReference{
336-
Kind: co.Kind,
337-
Name: co.Name,
338-
Namespace: co.Namespace,
339-
UID: co.GetUID(),
340-
}
341-
klog.Infof("kubelet skew status: %v, status reason: %v", skewStatus, status.Reason)
342-
optr.eventRecorder.Eventf(mcoObjectRef, corev1.EventTypeWarning, coStatusCondition.Reason, coStatusCondition.Message)
343-
cov1helpers.SetStatusCondition(&co.Status.Conditions, coStatusCondition, clock.RealClock{})
344-
case skewPresent:
345-
coStatusCondition.Reason = status.Reason
346-
coStatusCondition.Message = status.Message
347-
klog.Infof("kubelet skew status: %v, status reason: %v", skewStatus, status.Reason)
348-
cov1helpers.SetStatusCondition(&co.Status.Conditions, coStatusCondition, clock.RealClock{})
349-
}
350-
}
351305
cov1helpers.SetStatusCondition(&co.Status.Conditions, coStatusCondition, clock.RealClock{})
352306
return nil
353307
}
@@ -519,85 +473,6 @@ func (optr *Operator) cfeEvalCgroupsV1() (bool, error) {
519473
return nodeClusterConfig.Spec.CgroupMode == configv1.CgroupModeV1, nil
520474
}
521475

522-
// isKubeletSkewSupported checks the version skew of kube-apiserver and node kubelet version.
523-
// Returns the skew status. version skew > 2 is not supported.
524-
func (optr *Operator) isKubeletSkewSupported(pools []*mcfgv1.MachineConfigPool) (skewStatus string, coStatus configv1.ClusterOperatorStatusCondition, err error) {
525-
coStatus = configv1.ClusterOperatorStatusCondition{}
526-
kubeAPIServerStatus, err := optr.clusterOperatorLister.Get("kube-apiserver")
527-
if err != nil {
528-
coStatus.Reason = skewUnchecked
529-
coStatus.Message = fmt.Sprintf("An error occurred when checking kubelet version skew: %v", err)
530-
return skewUnchecked, coStatus, err
531-
}
532-
// looks like
533-
// - name: kube-apiserver
534-
// version: 1.21.0-rc.0
535-
kubeAPIServerVersion := ""
536-
for _, version := range kubeAPIServerStatus.Status.Versions {
537-
if version.Name != "kube-apiserver" {
538-
continue
539-
}
540-
kubeAPIServerVersion = version.Version
541-
break
542-
}
543-
if kubeAPIServerVersion == "" {
544-
err = fmt.Errorf("kube-apiserver does not yet have a version")
545-
coStatus.Reason = skewUnchecked
546-
coStatus.Message = fmt.Sprintf("An error occurred when checking kubelet version skew: %v", err.Error())
547-
return skewUnchecked, coStatus, err
548-
}
549-
kubeAPIServerMinorVersion, err := getMinorKubeletVersion(kubeAPIServerVersion)
550-
if err != nil {
551-
coStatus.Reason = skewUnchecked
552-
coStatus.Message = fmt.Sprintf("An error occurred when checking kubelet version skew: %v", err)
553-
return skewUnchecked, coStatus, err
554-
}
555-
var (
556-
lastError error
557-
kubeletVersion string
558-
)
559-
nodes, err := optr.GetAllManagedNodes(pools)
560-
if err != nil {
561-
err = fmt.Errorf("getting all managed nodes failed: %w", err)
562-
coStatus.Reason = skewUnchecked
563-
coStatus.Message = fmt.Sprintf("An error occurred when getting all the managed nodes: %v", err.Error())
564-
}
565-
for _, node := range nodes {
566-
// looks like kubeletVersion: v1.21.0-rc.0+6143dea
567-
kubeletVersion = node.Status.NodeInfo.KubeletVersion
568-
if kubeletVersion == "" {
569-
continue
570-
}
571-
nodeMinorVersion, err := getMinorKubeletVersion(kubeletVersion)
572-
if err != nil {
573-
lastError = err
574-
continue
575-
}
576-
if nodeMinorVersion+2 < kubeAPIServerMinorVersion {
577-
coStatus.Reason = skewUnsupported
578-
coStatus.Message = fmt.Sprintf("One or more nodes have an unsupported kubelet version skew. Please see `oc get nodes` for details and upgrade all nodes so that they have a kubelet version of at least %v.", getMinimalSkewSupportNodeVersion(kubeAPIServerVersion))
579-
return skewUnsupported, coStatus, nil
580-
}
581-
if nodeMinorVersion+2 == kubeAPIServerMinorVersion {
582-
coStatus.Reason = skewPresent
583-
coStatus.Message = fmt.Sprintf("Current kubelet version %v will not be supported by newer kube-apiserver. Please upgrade the kubelet first if plan to upgrade the kube-apiserver", kubeletVersion)
584-
return skewPresent, coStatus, nil
585-
}
586-
}
587-
if kubeletVersion == "" {
588-
err = fmt.Errorf("kubelet does not yet have a version")
589-
coStatus.Reason = skewUnchecked
590-
coStatus.Message = fmt.Sprintf("An error occurred when checking kubelet version skew: %v", err.Error())
591-
return skewUnchecked, coStatus, err
592-
}
593-
if lastError != nil {
594-
coStatus.Reason = skewUnchecked
595-
coStatus.Message = fmt.Sprintf("An error occurred when checking kubelet version skew: %v", err)
596-
return skewUnchecked, coStatus, lastError
597-
}
598-
return skewSupported, coStatus, nil
599-
}
600-
601476
// GetAllManagedNodes returns the nodes managed by MCO
602477
func (optr *Operator) GetAllManagedNodes(pools []*mcfgv1.MachineConfigPool) ([]*corev1.Node, error) {
603478
nodes := []*corev1.Node{}
@@ -615,40 +490,6 @@ func (optr *Operator) GetAllManagedNodes(pools []*mcfgv1.MachineConfigPool) ([]*
615490
return nodes, nil
616491
}
617492

618-
// getMinorKubeletVersion parses the minor version number of kubelet
619-
func getMinorKubeletVersion(version string) (int, error) {
620-
tokens := strings.Split(version, ".")
621-
if len(tokens) < 2 {
622-
return 0, fmt.Errorf("incorrect version syntax: %q", version)
623-
}
624-
minorVersion, err := strconv.ParseInt(tokens[1], 10, 32)
625-
if err != nil {
626-
return 0, err
627-
}
628-
return int(minorVersion), nil
629-
}
630-
631-
// getMinimalSkewSupportNodeVersion returns the minimal supported node kubelet version.
632-
func getMinimalSkewSupportNodeVersion(version string) string {
633-
// drop the pre-release and commit hash
634-
idx := strings.Index(version, "-")
635-
if idx >= 0 {
636-
version = version[:idx]
637-
}
638-
639-
idx = strings.Index(version, "+")
640-
if idx >= 0 {
641-
version = version[:idx]
642-
}
643-
644-
tokens := strings.Split(version, ".")
645-
if minorVersion, err := strconv.ParseInt(tokens[1], 10, 32); err == nil {
646-
tokens[1] = strconv.Itoa(int(minorVersion) - 2)
647-
return strings.Join(tokens, ".")
648-
}
649-
return version
650-
}
651-
652493
func (optr *Operator) fetchClusterOperator() (*configv1.ClusterOperator, error) {
653494
co, err := optr.clusterOperatorLister.Get(optr.name)
654495

0 commit comments

Comments
 (0)