mirror of https://github.com/k3s-io/k3s
Merge pull request #73001 from shivnagarajan/remove_deprecated_taints
remove remaining deprecated taints from 1.9pull/564/head
commit
4cd759dbe0
|
@ -370,17 +370,6 @@ func NewNodeLifecycleController(
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE(resouer): nodeInformer to substitute deprecated taint key (notReady -> not-ready).
|
|
||||||
// Remove this logic when we don't need this backwards compatibility
|
|
||||||
nodeInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
|
|
||||||
AddFunc: nodeutil.CreateAddNodeHandler(func(node *v1.Node) error {
|
|
||||||
return nc.doFixDeprecatedTaintKeyPass(node)
|
|
||||||
}),
|
|
||||||
UpdateFunc: nodeutil.CreateUpdateNodeHandler(func(_, newNode *v1.Node) error {
|
|
||||||
return nc.doFixDeprecatedTaintKeyPass(newNode)
|
|
||||||
}),
|
|
||||||
})
|
|
||||||
|
|
||||||
nc.leaseLister = leaseInformer.Lister()
|
nc.leaseLister = leaseInformer.Lister()
|
||||||
if utilfeature.DefaultFeatureGate.Enabled(features.NodeLease) {
|
if utilfeature.DefaultFeatureGate.Enabled(features.NodeLease) {
|
||||||
nc.leaseInformerSynced = leaseInformer.Informer().HasSynced
|
nc.leaseInformerSynced = leaseInformer.Informer().HasSynced
|
||||||
|
@ -448,44 +437,6 @@ func (nc *Controller) Run(stopCh <-chan struct{}) {
|
||||||
<-stopCh
|
<-stopCh
|
||||||
}
|
}
|
||||||
|
|
||||||
// doFixDeprecatedTaintKeyPass checks and replaces deprecated taint key with proper key name if needed.
|
|
||||||
func (nc *Controller) doFixDeprecatedTaintKeyPass(node *v1.Node) error {
|
|
||||||
taintsToAdd := []*v1.Taint{}
|
|
||||||
taintsToDel := []*v1.Taint{}
|
|
||||||
|
|
||||||
for _, taint := range node.Spec.Taints {
|
|
||||||
if taint.Key == schedulerapi.DeprecatedTaintNodeNotReady {
|
|
||||||
tDel := taint
|
|
||||||
taintsToDel = append(taintsToDel, &tDel)
|
|
||||||
|
|
||||||
tAdd := taint
|
|
||||||
tAdd.Key = schedulerapi.TaintNodeNotReady
|
|
||||||
taintsToAdd = append(taintsToAdd, &tAdd)
|
|
||||||
}
|
|
||||||
|
|
||||||
if taint.Key == schedulerapi.DeprecatedTaintNodeUnreachable {
|
|
||||||
tDel := taint
|
|
||||||
taintsToDel = append(taintsToDel, &tDel)
|
|
||||||
|
|
||||||
tAdd := taint
|
|
||||||
tAdd.Key = schedulerapi.TaintNodeUnreachable
|
|
||||||
taintsToAdd = append(taintsToAdd, &tAdd)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(taintsToAdd) == 0 && len(taintsToDel) == 0 {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
klog.Warningf("Detected deprecated taint keys: %v on node: %v, will substitute them with %v",
|
|
||||||
taintsToDel, node.GetName(), taintsToAdd)
|
|
||||||
|
|
||||||
if !nodeutil.SwapNodeControllerTaint(nc.kubeClient, taintsToAdd, taintsToDel, node) {
|
|
||||||
return fmt.Errorf("failed to swap taints of node %+v", node)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (nc *Controller) doNoScheduleTaintingPassWorker() {
|
func (nc *Controller) doNoScheduleTaintingPassWorker() {
|
||||||
for {
|
for {
|
||||||
obj, shutdown := nc.nodeUpdateQueue.Get()
|
obj, shutdown := nc.nodeUpdateQueue.Get()
|
||||||
|
|
|
@ -2911,168 +2911,3 @@ 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, _ := newNodeLifecycleControllerFromClient(
|
|
||||||
fakeNodeHandler,
|
|
||||||
evictionTimeout,
|
|
||||||
testRateLimiterQPS,
|
|
||||||
testRateLimiterQPS,
|
|
||||||
testLargeClusterThreshold,
|
|
||||||
testUnhealthyThreshold,
|
|
||||||
testNodeMonitorGracePeriod,
|
|
||||||
testNodeStartupGracePeriod,
|
|
||||||
testNodeMonitorPeriod,
|
|
||||||
true)
|
|
||||||
nodeController.now = func() metav1.Time { return fakeNow }
|
|
||||||
nodeController.recorder = testutil.NewFakeRecorder()
|
|
||||||
|
|
||||||
deprecatedNotReadyTaint := &v1.Taint{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeNotReady,
|
|
||||||
Effect: v1.TaintEffectNoExecute,
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeNotReadyTaint := &v1.Taint{
|
|
||||||
Key: schedulerapi.TaintNodeNotReady,
|
|
||||||
Effect: v1.TaintEffectNoExecute,
|
|
||||||
}
|
|
||||||
|
|
||||||
deprecatedUnreachableTaint := &v1.Taint{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeUnreachable,
|
|
||||||
Effect: v1.TaintEffectNoExecute,
|
|
||||||
}
|
|
||||||
|
|
||||||
nodeUnreachableTaint := &v1.Taint{
|
|
||||||
Key: schedulerapi.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 := nodeController.syncNodeStore(fakeNodeHandler); err != nil {
|
|
||||||
t.Errorf("unexpected error: %v", err)
|
|
||||||
}
|
|
||||||
nodeController.doFixDeprecatedTaintKeyPass(test.Node)
|
|
||||||
if err := nodeController.syncNodeStore(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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
@ -26,20 +26,12 @@ const (
|
||||||
// and removed when node becomes ready.
|
// and removed when node becomes ready.
|
||||||
TaintNodeNotReady = "node.kubernetes.io/not-ready"
|
TaintNodeNotReady = "node.kubernetes.io/not-ready"
|
||||||
|
|
||||||
// DeprecatedTaintNodeNotReady is the deprecated version of TaintNodeNotReady.
|
|
||||||
// It is deprecated since 1.9
|
|
||||||
DeprecatedTaintNodeNotReady = "node.alpha.kubernetes.io/notReady"
|
|
||||||
|
|
||||||
// TaintNodeUnreachable will be added when node becomes unreachable
|
// TaintNodeUnreachable will be added when node becomes unreachable
|
||||||
// (corresponding to NodeReady status ConditionUnknown)
|
// (corresponding to NodeReady status ConditionUnknown)
|
||||||
// and feature-gate for TaintBasedEvictions flag is enabled,
|
// and feature-gate for TaintBasedEvictions flag is enabled,
|
||||||
// and removed when node becomes reachable (NodeReady status ConditionTrue).
|
// and removed when node becomes reachable (NodeReady status ConditionTrue).
|
||||||
TaintNodeUnreachable = "node.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"
|
|
||||||
|
|
||||||
// TaintNodeUnschedulable will be added when node becomes unschedulable
|
// TaintNodeUnschedulable will be added when node becomes unschedulable
|
||||||
// and feature-gate for TaintNodesByCondition flag is enabled,
|
// and feature-gate for TaintNodesByCondition flag is enabled,
|
||||||
// and removed when node becomes scheduable.
|
// and removed when node becomes scheduable.
|
||||||
|
|
|
@ -63,138 +63,6 @@ func TestForgivenessAdmission(t *testing.T) {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
|
||||||
description: "pod has alpha tolerations, expect add tolerations for `not-ready:NoExecute` and `unreachable:NoExecute`" +
|
|
||||||
", the alpha tolerations will not be touched",
|
|
||||||
requestedPod: api.Pod{
|
|
||||||
Spec: api.PodSpec{
|
|
||||||
Tolerations: []api.Toleration{
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeNotReady,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeUnreachable,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedPod: api.Pod{
|
|
||||||
Spec: api.PodSpec{
|
|
||||||
Tolerations: []api.Toleration{
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeNotReady,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeUnreachable,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.TaintNodeNotReady,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.TaintNodeUnreachable,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "pod has alpha not-ready toleration, expect add tolerations for `not-ready:NoExecute` and `unreachable:NoExecute`" +
|
|
||||||
", the alpha tolerations will not be touched",
|
|
||||||
requestedPod: api.Pod{
|
|
||||||
Spec: api.PodSpec{
|
|
||||||
Tolerations: []api.Toleration{
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeNotReady,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedPod: api.Pod{
|
|
||||||
Spec: api.PodSpec{
|
|
||||||
Tolerations: []api.Toleration{
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeNotReady,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.TaintNodeNotReady,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.TaintNodeUnreachable,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "pod has alpha unreachable toleration, expect add tolerations for `not-ready:NoExecute` and `unreachable:NoExecute`" +
|
|
||||||
", the alpha tolerations will not be touched",
|
|
||||||
requestedPod: api.Pod{
|
|
||||||
Spec: api.PodSpec{
|
|
||||||
Tolerations: []api.Toleration{
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeUnreachable,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedPod: api.Pod{
|
|
||||||
Spec: api.PodSpec{
|
|
||||||
Tolerations: []api.Toleration{
|
|
||||||
{
|
|
||||||
Key: schedulerapi.DeprecatedTaintNodeUnreachable,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.TaintNodeNotReady,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
Key: schedulerapi.TaintNodeUnreachable,
|
|
||||||
Operator: api.TolerationOpExists,
|
|
||||||
Effect: api.TaintEffectNoExecute,
|
|
||||||
TolerationSeconds: &defaultTolerationSeconds,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
description: "pod has tolerations, but none is for taint `not-ready:NoExecute` or `unreachable:NoExecute`, expect add tolerations for `not-ready:NoExecute` and `unreachable:NoExecute`",
|
description: "pod has tolerations, but none is for taint `not-ready:NoExecute` or `unreachable:NoExecute`, expect add tolerations for `not-ready:NoExecute` and `unreachable:NoExecute`",
|
||||||
requestedPod: api.Pod{
|
requestedPod: api.Pod{
|
||||||
|
|
Loading…
Reference in New Issue