make DaemonSets have infinite toleration for Unreachable/NotReady NoExecute Taints

This commit is contained in:
Kevin 2017-02-22 01:06:45 +08:00
parent 1320021aaf
commit 53090e9867
2 changed files with 74 additions and 0 deletions

View File

@ -753,6 +753,32 @@ func (dsc *DaemonSetsController) nodeShouldRunDaemonPod(node *v1.Node, ds *exten
newPod.Namespace = ds.Namespace newPod.Namespace = ds.Namespace
newPod.Spec.NodeName = node.Name newPod.Spec.NodeName = node.Name
// DaemonSet pods shouldn't be deleted by NodeController in case of node problems.
// Add infinite toleration for taint notReady:NoExecute here
// to survive taint-based eviction enforced by NodeController
// when node turns not ready.
_, err = v1.AddOrUpdateTolerationInPod(newPod, &v1.Toleration{
Key: metav1.TaintNodeNotReady,
Operator: v1.TolerationOpExists,
Effect: v1.TaintEffectNoExecute,
})
if err != nil {
return false, false, false, err
}
// DaemonSet pods shouldn't be deleted by NodeController in case of node problems.
// Add infinite toleration for taint unreachable:NoExecute here
// to survive taint-based eviction enforced by NodeController
// when node turns unreachable.
_, err = v1.AddOrUpdateTolerationInPod(newPod, &v1.Toleration{
Key: metav1.TaintNodeUnreachable,
Operator: v1.TolerationOpExists,
Effect: v1.TaintEffectNoExecute,
})
if err != nil {
return false, false, false, err
}
pods := []*v1.Pod{} pods := []*v1.Pod{}
podList, err := dsc.podLister.List(labels.Everything()) podList, err := dsc.podLister.List(labels.Everything())

View File

@ -50,6 +50,20 @@ var (
noScheduleTaints = []v1.Taint{{Key: "dedicated", Value: "user1", Effect: "NoSchedule"}} noScheduleTaints = []v1.Taint{{Key: "dedicated", Value: "user1", Effect: "NoSchedule"}}
) )
var (
nodeNotReady = []v1.Taint{{
Key: metav1.TaintNodeNotReady,
Effect: v1.TaintEffectNoExecute,
TimeAdded: metav1.Now(),
}}
nodeUnreachable = []v1.Taint{{
Key: metav1.TaintNodeUnreachable,
Effect: v1.TaintEffectNoExecute,
TimeAdded: metav1.Now(),
}}
)
func getKey(ds *extensions.DaemonSet, t *testing.T) string { func getKey(ds *extensions.DaemonSet, t *testing.T) string {
if key, err := controller.KeyFunc(ds); err != nil { if key, err := controller.KeyFunc(ds); err != nil {
t.Errorf("Unexpected error getting key for ds %v: %v", ds.Name, err) t.Errorf("Unexpected error getting key for ds %v: %v", ds.Name, err)
@ -742,6 +756,40 @@ func TestTaintedNodeDaemonLaunchesToleratePod(t *testing.T) {
syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0) syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0)
} }
// DaemonSet should launch a pod on a not ready node with taint notReady:NoExecute.
func TestNotReadyNodeDaemonLaunchesPod(t *testing.T) {
manager, podControl, _ := newTestController()
node := newNode("tainted", nil)
setNodeTaint(node, nodeNotReady)
node.Status.Conditions = []v1.NodeCondition{
{Type: v1.NodeReady, Status: v1.ConditionFalse},
}
manager.nodeStore.Add(node)
ds := newDaemonSet("simple")
manager.dsStore.Add(ds)
syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0)
}
// DaemonSet should launch a pod on an unreachable node with taint unreachable:NoExecute.
func TestUnreachableNodeDaemonLaunchesPod(t *testing.T) {
manager, podControl, _ := newTestController()
node := newNode("tainted", nil)
setNodeTaint(node, nodeUnreachable)
node.Status.Conditions = []v1.NodeCondition{
{Type: v1.NodeReady, Status: v1.ConditionUnknown},
}
manager.nodeStore.Add(node)
ds := newDaemonSet("simple")
manager.dsStore.Add(ds)
syncAndValidateDaemonSets(t, manager, ds, podControl, 1, 0)
}
// DaemonSet should launch a pod on an untainted node when the pod has tolerations. // DaemonSet should launch a pod on an untainted node when the pod has tolerations.
func TestNodeDaemonLaunchesToleratePod(t *testing.T) { func TestNodeDaemonLaunchesToleratePod(t *testing.T) {
manager, podControl, _ := newTestController() manager, podControl, _ := newTestController()