Skip to content

Commit b118643

Browse files
authored
Merge pull request kubernetes#75080 from draveness/feature/get-nodelists-sync-daemonset
fix: list nodes in sync daemonset
2 parents 4e397d9 + 36c535c commit b118643

File tree

4 files changed

+21
-25
lines changed

4 files changed

+21
-25
lines changed

pkg/controller/daemon/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ go_test(
7676
"//staging/src/k8s.io/api/core/v1:go_default_library",
7777
"//staging/src/k8s.io/apimachinery/pkg/api/resource:go_default_library",
7878
"//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
79+
"//staging/src/k8s.io/apimachinery/pkg/labels:go_default_library",
7980
"//staging/src/k8s.io/apimachinery/pkg/runtime:go_default_library",
8081
"//staging/src/k8s.io/apimachinery/pkg/util/clock:go_default_library",
8182
"//staging/src/k8s.io/apimachinery/pkg/util/intstr:go_default_library",

pkg/controller/daemon/daemon_controller.go

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -936,7 +936,7 @@ func (dsc *DaemonSetsController) podsShouldBeOnNode(
936936
// After figuring out which nodes should run a Pod of ds but not yet running one and
937937
// which nodes should not run a Pod of ds but currently running one, it calls function
938938
// syncNodes with a list of pods to remove and a list of nodes to run a Pod of ds.
939-
func (dsc *DaemonSetsController) manage(ds *apps.DaemonSet, hash string) error {
939+
func (dsc *DaemonSetsController) manage(ds *apps.DaemonSet, nodeList []*v1.Node, hash string) error {
940940
// Find out the pods which are created for the nodes by DaemonSet.
941941
nodeToDaemonPods, err := dsc.getNodesToDaemonPods(ds)
942942
if err != nil {
@@ -945,10 +945,6 @@ func (dsc *DaemonSetsController) manage(ds *apps.DaemonSet, hash string) error {
945945

946946
// For each node, if the node is running the daemon pod but isn't supposed to, kill the daemon
947947
// pod. If the node is supposed to run the daemon pod, but isn't, create the daemon pod on the node.
948-
nodeList, err := dsc.nodeLister.List(labels.Everything())
949-
if err != nil {
950-
return fmt.Errorf("couldn't get list of nodes when syncing daemon set %#v: %v", ds, err)
951-
}
952948
var nodesNeedingDaemonPods, podsToDelete []string
953949
var failedPodsObserved int
954950
for _, node := range nodeList {
@@ -1149,18 +1145,13 @@ func storeDaemonSetStatus(dsClient unversionedapps.DaemonSetInterface, ds *apps.
11491145
return updateErr
11501146
}
11511147

1152-
func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *apps.DaemonSet, hash string, updateObservedGen bool) error {
1148+
func (dsc *DaemonSetsController) updateDaemonSetStatus(ds *apps.DaemonSet, nodeList []*v1.Node, hash string, updateObservedGen bool) error {
11531149
klog.V(4).Infof("Updating daemon set status")
11541150
nodeToDaemonPods, err := dsc.getNodesToDaemonPods(ds)
11551151
if err != nil {
11561152
return fmt.Errorf("couldn't get node to daemon pod mapping for daemon set %q: %v", ds.Name, err)
11571153
}
11581154

1159-
nodeList, err := dsc.nodeLister.List(labels.Everything())
1160-
if err != nil {
1161-
return fmt.Errorf("couldn't get list of nodes when updating daemon set %#v: %v", ds, err)
1162-
}
1163-
11641155
var desiredNumberScheduled, currentNumberScheduled, numberMisscheduled, numberReady, updatedNumberScheduled, numberAvailable int
11651156
for _, node := range nodeList {
11661157
wantToRun, _, _, err := dsc.nodeShouldRunDaemonPod(node, ds)
@@ -1230,6 +1221,11 @@ func (dsc *DaemonSetsController) syncDaemonSet(key string) error {
12301221
return fmt.Errorf("unable to retrieve ds %v from store: %v", key, err)
12311222
}
12321223

1224+
nodeList, err := dsc.nodeLister.List(labels.Everything())
1225+
if err != nil {
1226+
return fmt.Errorf("couldn't get list of nodes when syncing daemon set %#v: %v", ds, err)
1227+
}
1228+
12331229
everything := metav1.LabelSelector{}
12341230
if reflect.DeepEqual(ds.Spec.Selector, &everything) {
12351231
dsc.eventRecorder.Eventf(ds, v1.EventTypeWarning, SelectingAllReason, "This daemon set is selecting all pods. A non-empty selector is required.")
@@ -1265,10 +1261,10 @@ func (dsc *DaemonSetsController) syncDaemonSet(key string) error {
12651261

12661262
if !dsc.expectations.SatisfiedExpectations(dsKey) {
12671263
// Only update status. Don't raise observedGeneration since controller didn't process object of that generation.
1268-
return dsc.updateDaemonSetStatus(ds, hash, false)
1264+
return dsc.updateDaemonSetStatus(ds, nodeList, hash, false)
12691265
}
12701266

1271-
err = dsc.manage(ds, hash)
1267+
err = dsc.manage(ds, nodeList, hash)
12721268
if err != nil {
12731269
return err
12741270
}
@@ -1278,7 +1274,7 @@ func (dsc *DaemonSetsController) syncDaemonSet(key string) error {
12781274
switch ds.Spec.UpdateStrategy.Type {
12791275
case apps.OnDeleteDaemonSetStrategyType:
12801276
case apps.RollingUpdateDaemonSetStrategyType:
1281-
err = dsc.rollingUpdate(ds, hash)
1277+
err = dsc.rollingUpdate(ds, nodeList, hash)
12821278
}
12831279
if err != nil {
12841280
return err
@@ -1290,7 +1286,7 @@ func (dsc *DaemonSetsController) syncDaemonSet(key string) error {
12901286
return fmt.Errorf("failed to clean up revisions of DaemonSet: %v", err)
12911287
}
12921288

1293-
return dsc.updateDaemonSetStatus(ds, hash, true)
1289+
return dsc.updateDaemonSetStatus(ds, nodeList, hash, true)
12941290
}
12951291

12961292
func (dsc *DaemonSetsController) simulate(newPod *v1.Pod, node *v1.Node, ds *apps.DaemonSet) ([]predicates.PredicateFailureReason, *schedulernodeinfo.NodeInfo, error) {

pkg/controller/daemon/update.go

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,14 +40,14 @@ import (
4040

4141
// rollingUpdate deletes old daemon set pods making sure that no more than
4242
// ds.Spec.UpdateStrategy.RollingUpdate.MaxUnavailable pods are unavailable
43-
func (dsc *DaemonSetsController) rollingUpdate(ds *apps.DaemonSet, hash string) error {
43+
func (dsc *DaemonSetsController) rollingUpdate(ds *apps.DaemonSet, nodeList []*v1.Node, hash string) error {
4444
nodeToDaemonPods, err := dsc.getNodesToDaemonPods(ds)
4545
if err != nil {
4646
return fmt.Errorf("couldn't get node to daemon pod mapping for daemon set %q: %v", ds.Name, err)
4747
}
4848

4949
_, oldPods := dsc.getAllDaemonSetPods(ds, nodeToDaemonPods, hash)
50-
maxUnavailable, numUnavailable, err := dsc.getUnavailableNumbers(ds, nodeToDaemonPods)
50+
maxUnavailable, numUnavailable, err := dsc.getUnavailableNumbers(ds, nodeList, nodeToDaemonPods)
5151
if err != nil {
5252
return fmt.Errorf("Couldn't get unavailable numbers: %v", err)
5353
}
@@ -392,14 +392,8 @@ func (dsc *DaemonSetsController) getAllDaemonSetPods(ds *apps.DaemonSet, nodeToD
392392
return newPods, oldPods
393393
}
394394

395-
func (dsc *DaemonSetsController) getUnavailableNumbers(ds *apps.DaemonSet, nodeToDaemonPods map[string][]*v1.Pod) (int, int, error) {
395+
func (dsc *DaemonSetsController) getUnavailableNumbers(ds *apps.DaemonSet, nodeList []*v1.Node, nodeToDaemonPods map[string][]*v1.Pod) (int, int, error) {
396396
klog.V(4).Infof("Getting unavailable numbers")
397-
// TODO: get nodeList once in syncDaemonSet and pass it to other functions
398-
nodeList, err := dsc.nodeLister.List(labels.Everything())
399-
if err != nil {
400-
return -1, -1, fmt.Errorf("couldn't get list of nodes during rolling update of daemon set %#v: %v", ds, err)
401-
}
402-
403397
var numUnavailable, desiredNumberScheduled int
404398
for i := range nodeList {
405399
node := nodeList[i]

pkg/controller/daemon/update_test.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
apps "k8s.io/api/apps/v1"
2323
"k8s.io/api/core/v1"
2424
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25+
"k8s.io/apimachinery/pkg/labels"
2526
"k8s.io/apimachinery/pkg/util/intstr"
2627
)
2728

@@ -293,7 +294,11 @@ func TestGetUnavailableNumbers(t *testing.T) {
293294

294295
for _, c := range cases {
295296
c.Manager.dsStore.Add(c.ds)
296-
maxUnavailable, numUnavailable, err := c.Manager.getUnavailableNumbers(c.ds, c.nodeToPods)
297+
nodeList, err := c.Manager.nodeLister.List(labels.Everything())
298+
if err != nil {
299+
t.Fatalf("error listing nodes: %v", err)
300+
}
301+
maxUnavailable, numUnavailable, err := c.Manager.getUnavailableNumbers(c.ds, nodeList, c.nodeToPods)
297302
if err != nil && c.Err != nil {
298303
if c.Err != err {
299304
t.Errorf("Test case: %s. Expected error: %v but got: %v", c.name, c.Err, err)

0 commit comments

Comments
 (0)