diff --git a/pkg/controller/daemon/daemon_controller.go b/pkg/controller/daemon/daemon_controller.go index 4a2dd7a1e95..e70fa087d36 100644 --- a/pkg/controller/daemon/daemon_controller.go +++ b/pkg/controller/daemon/daemon_controller.go @@ -964,8 +964,11 @@ func (dsc *DaemonSetsController) manage(ds *apps.DaemonSet, hash string) error { failedPodsObserved += failedPodsObservedOnNode } - // Remove pods assigned to not existing nodes. - podsToDelete = append(podsToDelete, getPodsWithoutNode(nodeList, nodeToDaemonPods)...) + // Remove pods assigned to not existing nodes when daemonset pods are scheduled by default scheduler. + // If node doesn't exist then pods are never scheduled and can't be deleted by PodGCController. + if utilfeature.DefaultFeatureGate.Enabled(features.ScheduleDaemonSetPods) { + podsToDelete = append(podsToDelete, getPodsWithoutNode(nodeList, nodeToDaemonPods)...) + } // Label new pods using the hash label value of the current history when creating them if err = dsc.syncNodes(ds, podsToDelete, nodesNeedingDaemonPods, hash); err != nil { @@ -1529,8 +1532,7 @@ func failedPodsBackoffKey(ds *apps.DaemonSet, nodeName string) string { } // getPodsWithoutNode returns list of pods assigned to not existing nodes. -func getPodsWithoutNode( - runningNodesList []*v1.Node, nodeToDaemonPods map[string][]*v1.Pod) []string { +func getPodsWithoutNode(runningNodesList []*v1.Node, nodeToDaemonPods map[string][]*v1.Pod) []string { var results []string isNodeRunning := make(map[string]bool) for _, node := range runningNodesList { diff --git a/pkg/controller/daemon/daemon_controller_test.go b/pkg/controller/daemon/daemon_controller_test.go index a2b43dfd197..8eee1b161c2 100644 --- a/pkg/controller/daemon/daemon_controller_test.go +++ b/pkg/controller/daemon/daemon_controller_test.go @@ -2461,7 +2461,11 @@ func TestDeletePodForNotExistingNode(t *testing.T) { addNodes(manager.nodeStore, 0, 1, nil) addPods(manager.podStore, "node-0", simpleDaemonSetLabel, ds, 1) addPods(manager.podStore, "node-1", simpleDaemonSetLabel, ds, 1) - syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 1, 0) + if f { + syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 1, 0) + } else { + syncAndValidateDaemonSets(t, manager, ds, podControl, 0, 0, 0) + } } } }