mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-09 20:17:41 +00:00
Replace node's alpha taint key with GA
This commit is contained in:
parent
a82460d772
commit
df8c92ac12
@ -454,25 +454,31 @@ func (nc *Controller) doFixDeprecatedTaintKeyPass(node *v1.Node) error {
|
|||||||
|
|
||||||
for _, taint := range node.Spec.Taints {
|
for _, taint := range node.Spec.Taints {
|
||||||
if taint.Key == algorithm.DeprecatedTaintNodeNotReady {
|
if taint.Key == algorithm.DeprecatedTaintNodeNotReady {
|
||||||
// delete old taint
|
|
||||||
tDel := taint
|
tDel := taint
|
||||||
taintsToDel = append(taintsToDel, &tDel)
|
taintsToDel = append(taintsToDel, &tDel)
|
||||||
|
|
||||||
// add right taint
|
|
||||||
tAdd := taint
|
tAdd := taint
|
||||||
tAdd.Key = algorithm.TaintNodeNotReady
|
tAdd.Key = algorithm.TaintNodeNotReady
|
||||||
taintsToAdd = append(taintsToAdd, &tAdd)
|
taintsToAdd = append(taintsToAdd, &tAdd)
|
||||||
|
}
|
||||||
|
|
||||||
glog.Warningf("Detected deprecated taint key: %v on node: %v, will substitute it with %v",
|
if taint.Key == algorithm.DeprecatedTaintNodeUnreachable {
|
||||||
algorithm.DeprecatedTaintNodeNotReady, node.GetName(), algorithm.TaintNodeNotReady)
|
tDel := taint
|
||||||
|
taintsToDel = append(taintsToDel, &tDel)
|
||||||
|
|
||||||
break
|
tAdd := taint
|
||||||
|
tAdd.Key = algorithm.TaintNodeUnreachable
|
||||||
|
taintsToAdd = append(taintsToAdd, &tAdd)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(taintsToAdd) == 0 && len(taintsToDel) == 0 {
|
if len(taintsToAdd) == 0 && len(taintsToDel) == 0 {
|
||||||
return nil
|
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) {
|
if !util.SwapNodeControllerTaint(nc.kubeClient, taintsToAdd, taintsToDel, node) {
|
||||||
return fmt.Errorf("failed to swap taints of node %+v", 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
|
// TaintNodeUnreachable would be automatically added by node controller
|
||||||
// when node becomes unreachable (corresponding to NodeReady status ConditionUnknown)
|
// when node becomes unreachable (corresponding to NodeReady status ConditionUnknown)
|
||||||
// and removed when node becomes reachable (NodeReady status ConditionTrue).
|
// 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,
|
// When feature-gate for TaintBasedEvictions=true flag is enabled,
|
||||||
// TaintNodeOutOfDisk would be automatically added by node controller
|
// TaintNodeOutOfDisk would be automatically added by node controller
|
||||||
|
Loading…
Reference in New Issue
Block a user