6
6
"fmt"
7
7
"reflect"
8
8
"sort"
9
- "strconv"
10
9
"strings"
11
10
"time"
12
11
@@ -255,13 +254,6 @@ func (optr *Operator) syncDegradedStatus(co *configv1.ClusterOperator, ierr sync
255
254
cov1helpers .SetStatusCondition (& co .Status .Conditions , coDegradedCondition , clock.RealClock {})
256
255
}
257
256
258
- const (
259
- skewUnchecked = "KubeletSkewUnchecked"
260
- skewSupported = "KubeletSkewSupported"
261
- skewUnsupported = "KubeletSkewUnsupported"
262
- skewPresent = "KubeletSkewPresent"
263
- )
264
-
265
257
// syncUpgradeableStatus applies the new condition to the mco's ClusterOperator object.
266
258
func (optr * Operator ) syncUpgradeableStatus (co * configv1.ClusterOperator ) error {
267
259
@@ -289,13 +281,8 @@ func (optr *Operator) syncUpgradeableStatus(co *configv1.ClusterOperator) error
289
281
coStatusCondition .Reason = "ClusterOnCgroupV1"
290
282
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"
291
283
}
292
- var updating , degraded , interrupted bool
284
+ var degraded , interrupted bool
293
285
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
-
299
286
interrupted = isPoolStatusConditionTrue (pool , mcfgv1 .MachineConfigPoolBuildInterrupted )
300
287
301
288
degraded = isPoolStatusConditionTrue (pool , mcfgv1 .MachineConfigPoolDegraded )
@@ -315,39 +302,6 @@ func (optr *Operator) syncUpgradeableStatus(co *configv1.ClusterOperator) error
315
302
}
316
303
}
317
304
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
- }
351
305
cov1helpers .SetStatusCondition (& co .Status .Conditions , coStatusCondition , clock.RealClock {})
352
306
return nil
353
307
}
@@ -519,85 +473,6 @@ func (optr *Operator) cfeEvalCgroupsV1() (bool, error) {
519
473
return nodeClusterConfig .Spec .CgroupMode == configv1 .CgroupModeV1 , nil
520
474
}
521
475
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
-
601
476
// GetAllManagedNodes returns the nodes managed by MCO
602
477
func (optr * Operator ) GetAllManagedNodes (pools []* mcfgv1.MachineConfigPool ) ([]* corev1.Node , error ) {
603
478
nodes := []* corev1.Node {}
@@ -615,40 +490,6 @@ func (optr *Operator) GetAllManagedNodes(pools []*mcfgv1.MachineConfigPool) ([]*
615
490
return nodes , nil
616
491
}
617
492
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
-
652
493
func (optr * Operator ) fetchClusterOperator () (* configv1.ClusterOperator , error ) {
653
494
co , err := optr .clusterOperatorLister .Get (optr .name )
654
495
0 commit comments