@@ -19,11 +19,10 @@ package service
19
19
import (
20
20
"context"
21
21
"fmt"
22
+ "reflect"
22
23
"sync"
23
24
"time"
24
25
25
- "reflect"
26
-
27
26
v1 "k8s.io/api/core/v1"
28
27
"k8s.io/apimachinery/pkg/api/errors"
29
28
"k8s.io/apimachinery/pkg/labels"
@@ -96,6 +95,7 @@ type serviceCache struct {
96
95
type Controller struct {
97
96
cloud cloudprovider.Interface
98
97
knownHosts []* v1.Node
98
+ knownHostsLock sync.Mutex
99
99
servicesToUpdate []* v1.Service
100
100
kubeClient clientset.Interface
101
101
clusterName string
@@ -170,6 +170,21 @@ func New(
170
170
s .serviceLister = serviceInformer .Lister ()
171
171
s .serviceListerSynced = serviceInformer .Informer ().HasSynced
172
172
173
+ nodeInformer .Informer ().AddEventHandlerWithResyncPeriod (
174
+ cache.ResourceEventHandlerFuncs {
175
+ AddFunc : func (cur interface {}) {
176
+ s .nodeSyncLoop ()
177
+ },
178
+ UpdateFunc : func (old , cur interface {}) {
179
+ s .nodeSyncLoop ()
180
+ },
181
+ DeleteFunc : func (old interface {}) {
182
+ s .nodeSyncLoop ()
183
+ },
184
+ },
185
+ time .Duration (0 ),
186
+ )
187
+
173
188
if err := s .init (); err != nil {
174
189
return nil , err
175
190
}
@@ -637,6 +652,8 @@ func getNodeConditionPredicate() NodeConditionPredicate {
637
652
// nodeSyncLoop handles updating the hosts pointed to by all load
638
653
// balancers whenever the set of nodes in the cluster changes.
639
654
func (s * Controller ) nodeSyncLoop () {
655
+ s .knownHostsLock .Lock ()
656
+ defer s .knownHostsLock .Unlock ()
640
657
newHosts , err := listWithPredicate (s .nodeLister , getNodeConditionPredicate ())
641
658
if err != nil {
642
659
runtime .HandleError (fmt .Errorf ("Failed to retrieve current set of nodes from node lister: %v" , err ))
0 commit comments