diff --git a/pkg/controller/daemon/controller.go b/pkg/controller/daemon/controller.go index 18a4e32add1..f174b1c2b1d 100644 --- a/pkg/controller/daemon/controller.go +++ b/pkg/controller/daemon/controller.go @@ -364,6 +364,11 @@ func (dsc *DaemonSetsController) manage(ds *extensions.DaemonSet) { // TODO(mikedanese): remove this once daemonpods forgive nodes shouldRun = shouldRun && api.IsNodeReady(&node) + // If the node is unschedulable, don't run it + // TODO(mikedanese): remove this once we have the right node admitance levels. + // See https://github.com/kubernetes/kubernetes/issues/17297#issuecomment-156857375. + shouldRun = shouldRun && !node.Spec.Unschedulable + daemonPods, isRunning := nodeToDaemonPods[nodeName] if shouldRun && !isRunning { // If daemon pod is supposed to be running on node, but isn't, create daemon pod. diff --git a/pkg/controller/daemon/controller_test.go b/pkg/controller/daemon/controller_test.go index bd91bd2b2f3..eb5647679a8 100644 --- a/pkg/controller/daemon/controller_test.go +++ b/pkg/controller/daemon/controller_test.go @@ -197,6 +197,17 @@ func TestNotReadNodeDaemonDoesNotLaunchPod(t *testing.T) { syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) } +// DaemonSets should not place onto Unschedulable nodes +func TestUnschedulableNodeDaemonDoesNotLaunchPod(t *testing.T) { + manager, podControl := newTestController() + node := newNode("not-ready", nil) + node.Spec.Unschedulable = true + manager.nodeStore.Add(node) + ds := newDaemonSet("foo") + manager.dsStore.Add(ds) + syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0) +} + // Controller should not create pods on nodes which have daemon pods, and should remove excess pods from nodes that have extra pods. func TestDealsWithExistingPods(t *testing.T) { manager, podControl := newTestController()