mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	Replace node's alpha taint key with GA
This commit is contained in:
		@@ -454,25 +454,31 @@ func (nc *Controller) doFixDeprecatedTaintKeyPass(node *v1.Node) error {
 | 
			
		||||
 | 
			
		||||
	for _, taint := range node.Spec.Taints {
 | 
			
		||||
		if taint.Key == algorithm.DeprecatedTaintNodeNotReady {
 | 
			
		||||
			// delete old taint
 | 
			
		||||
			tDel := taint
 | 
			
		||||
			taintsToDel = append(taintsToDel, &tDel)
 | 
			
		||||
 | 
			
		||||
			// add right taint
 | 
			
		||||
			tAdd := taint
 | 
			
		||||
			tAdd.Key = algorithm.TaintNodeNotReady
 | 
			
		||||
			taintsToAdd = append(taintsToAdd, &tAdd)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
			glog.Warningf("Detected deprecated taint key: %v on node: %v, will substitute it with %v",
 | 
			
		||||
				algorithm.DeprecatedTaintNodeNotReady, node.GetName(), algorithm.TaintNodeNotReady)
 | 
			
		||||
		if taint.Key == algorithm.DeprecatedTaintNodeUnreachable {
 | 
			
		||||
			tDel := taint
 | 
			
		||||
			taintsToDel = append(taintsToDel, &tDel)
 | 
			
		||||
 | 
			
		||||
			break
 | 
			
		||||
			tAdd := taint
 | 
			
		||||
			tAdd.Key = algorithm.TaintNodeUnreachable
 | 
			
		||||
			taintsToAdd = append(taintsToAdd, &tAdd)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if len(taintsToAdd) == 0 && len(taintsToDel) == 0 {
 | 
			
		||||
		return nil
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	glog.Warningf("Detected deprecated taint keys: %v on node: %v, will substitute them with %v",
 | 
			
		||||
		taintsToDel, node.GetName(), taintsToAdd)
 | 
			
		||||
 | 
			
		||||
	if !util.SwapNodeControllerTaint(nc.kubeClient, taintsToAdd, taintsToDel, node) {
 | 
			
		||||
		return fmt.Errorf("failed to swap taints of node %+v", node)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
@@ -2185,3 +2185,160 @@ func TestNodeEventGeneration(t *testing.T) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// TestFixDeprecatedTaintKey verifies we have backwards compatibility after upgraded alpha taint key to GA taint key.
 | 
			
		||||
// TODO(resouer): this is introduced in 1.9 and should be removed in the future.
 | 
			
		||||
func TestFixDeprecatedTaintKey(t *testing.T) {
 | 
			
		||||
	fakeNow := metav1.Date(2017, 1, 1, 12, 0, 0, 0, time.UTC)
 | 
			
		||||
	evictionTimeout := 10 * time.Minute
 | 
			
		||||
 | 
			
		||||
	fakeNodeHandler := &testutil.FakeNodeHandler{
 | 
			
		||||
		Existing: []*v1.Node{
 | 
			
		||||
			{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:              "node0",
 | 
			
		||||
					CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
 | 
			
		||||
					Labels: map[string]string{
 | 
			
		||||
						kubeletapis.LabelZoneRegion:        "region1",
 | 
			
		||||
						kubeletapis.LabelZoneFailureDomain: "zone1",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
		},
 | 
			
		||||
		Clientset: fake.NewSimpleClientset(&v1.PodList{Items: []v1.Pod{*testutil.NewPod("pod0", "node0")}}),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nodeController, _ := newNodeControllerFromClient(nil, fakeNodeHandler, evictionTimeout,
 | 
			
		||||
		testRateLimiterQPS, testRateLimiterQPS, testLargeClusterThreshold, testUnhealthyThreshold, testNodeMonitorGracePeriod,
 | 
			
		||||
		testNodeStartupGracePeriod, testNodeMonitorPeriod, nil, nil, 0, false, true)
 | 
			
		||||
	nodeController.now = func() metav1.Time { return fakeNow }
 | 
			
		||||
	nodeController.recorder = testutil.NewFakeRecorder()
 | 
			
		||||
 | 
			
		||||
	deprecatedNotReadyTaint := &v1.Taint{
 | 
			
		||||
		Key:    algorithm.DeprecatedTaintNodeNotReady,
 | 
			
		||||
		Effect: v1.TaintEffectNoExecute,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nodeNotReadyTaint := &v1.Taint{
 | 
			
		||||
		Key:    algorithm.TaintNodeNotReady,
 | 
			
		||||
		Effect: v1.TaintEffectNoExecute,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	deprecatedUnreachableTaint := &v1.Taint{
 | 
			
		||||
		Key:    algorithm.DeprecatedTaintNodeUnreachable,
 | 
			
		||||
		Effect: v1.TaintEffectNoExecute,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	nodeUnreachableTaint := &v1.Taint{
 | 
			
		||||
		Key:    algorithm.TaintNodeUnreachable,
 | 
			
		||||
		Effect: v1.TaintEffectNoExecute,
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tests := []struct {
 | 
			
		||||
		Name           string
 | 
			
		||||
		Node           *v1.Node
 | 
			
		||||
		ExpectedTaints []*v1.Taint
 | 
			
		||||
	}{
 | 
			
		||||
		{
 | 
			
		||||
			Name: "Node with deprecated not-ready taint key",
 | 
			
		||||
			Node: &v1.Node{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:              "node0",
 | 
			
		||||
					CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
 | 
			
		||||
					Labels: map[string]string{
 | 
			
		||||
						kubeletapis.LabelZoneRegion:        "region1",
 | 
			
		||||
						kubeletapis.LabelZoneFailureDomain: "zone1",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Spec: v1.NodeSpec{
 | 
			
		||||
					Taints: []v1.Taint{
 | 
			
		||||
						*deprecatedNotReadyTaint,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			ExpectedTaints: []*v1.Taint{nodeNotReadyTaint},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Name: "Node with deprecated unreachable taint key",
 | 
			
		||||
			Node: &v1.Node{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:              "node0",
 | 
			
		||||
					CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
 | 
			
		||||
					Labels: map[string]string{
 | 
			
		||||
						kubeletapis.LabelZoneRegion:        "region1",
 | 
			
		||||
						kubeletapis.LabelZoneFailureDomain: "zone1",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Spec: v1.NodeSpec{
 | 
			
		||||
					Taints: []v1.Taint{
 | 
			
		||||
						*deprecatedUnreachableTaint,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			ExpectedTaints: []*v1.Taint{nodeUnreachableTaint},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Name: "Node with not-ready taint key",
 | 
			
		||||
			Node: &v1.Node{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:              "node0",
 | 
			
		||||
					CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
 | 
			
		||||
					Labels: map[string]string{
 | 
			
		||||
						kubeletapis.LabelZoneRegion:        "region1",
 | 
			
		||||
						kubeletapis.LabelZoneFailureDomain: "zone1",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Spec: v1.NodeSpec{
 | 
			
		||||
					Taints: []v1.Taint{
 | 
			
		||||
						*nodeNotReadyTaint,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			ExpectedTaints: []*v1.Taint{nodeNotReadyTaint},
 | 
			
		||||
		},
 | 
			
		||||
		{
 | 
			
		||||
			Name: "Node with unreachable taint key",
 | 
			
		||||
			Node: &v1.Node{
 | 
			
		||||
				ObjectMeta: metav1.ObjectMeta{
 | 
			
		||||
					Name:              "node0",
 | 
			
		||||
					CreationTimestamp: metav1.Date(2012, 1, 1, 0, 0, 0, 0, time.UTC),
 | 
			
		||||
					Labels: map[string]string{
 | 
			
		||||
						kubeletapis.LabelZoneRegion:        "region1",
 | 
			
		||||
						kubeletapis.LabelZoneFailureDomain: "zone1",
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
				Spec: v1.NodeSpec{
 | 
			
		||||
					Taints: []v1.Taint{
 | 
			
		||||
						*nodeUnreachableTaint,
 | 
			
		||||
					},
 | 
			
		||||
				},
 | 
			
		||||
			},
 | 
			
		||||
			ExpectedTaints: []*v1.Taint{nodeUnreachableTaint},
 | 
			
		||||
		},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, test := range tests {
 | 
			
		||||
		fakeNodeHandler.Update(test.Node)
 | 
			
		||||
		if err := syncNodeStore(nodeController, fakeNodeHandler); err != nil {
 | 
			
		||||
			t.Errorf("unexpected error: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		nodeController.doFixDeprecatedTaintKeyPass(test.Node)
 | 
			
		||||
		if err := syncNodeStore(nodeController, fakeNodeHandler); err != nil {
 | 
			
		||||
			t.Errorf("unexpected error: %v", err)
 | 
			
		||||
		}
 | 
			
		||||
		node, err := nodeController.nodeLister.Get(test.Node.GetName())
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			t.Errorf("Can't get current node...")
 | 
			
		||||
			return
 | 
			
		||||
		}
 | 
			
		||||
		if len(node.Spec.Taints) != len(test.ExpectedTaints) {
 | 
			
		||||
			t.Errorf("%s: Unexpected number of taints: expected %d, got %d",
 | 
			
		||||
				test.Name, len(test.ExpectedTaints), len(node.Spec.Taints))
 | 
			
		||||
		}
 | 
			
		||||
		for _, taint := range test.ExpectedTaints {
 | 
			
		||||
			if !taintutils.TaintExists(node.Spec.Taints, taint) {
 | 
			
		||||
				t.Errorf("%s: Can't find taint %v in %v", test.Name, taint, node.Spec.Taints)
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,11 @@ const (
 | 
			
		||||
	// TaintNodeUnreachable would be automatically added by node controller
 | 
			
		||||
	// when node becomes unreachable (corresponding to NodeReady status ConditionUnknown)
 | 
			
		||||
	// and removed when node becomes reachable (NodeReady status ConditionTrue).
 | 
			
		||||
	TaintNodeUnreachable = "node.alpha.kubernetes.io/unreachable"
 | 
			
		||||
	TaintNodeUnreachable = "node.kubernetes.io/unreachable"
 | 
			
		||||
 | 
			
		||||
	// DeprecatedTaintNodeUnreachable is the deprecated version of TaintNodeUnreachable.
 | 
			
		||||
	// It is deprecated since 1.9
 | 
			
		||||
	DeprecatedTaintNodeUnreachable = "node.alpha.kubernetes.io/unreachable"
 | 
			
		||||
 | 
			
		||||
	// When feature-gate for TaintBasedEvictions=true flag is enabled,
 | 
			
		||||
	// TaintNodeOutOfDisk would be automatically added by node controller
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user