@@ -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"
@@ -101,6 +100,7 @@ type serviceCache struct {
101
100
type Controller struct {
102
101
cloud cloudprovider.Interface
103
102
knownHosts []* v1.Node
103
+ knownHostsLock sync.Mutex
104
104
servicesToUpdate []* v1.Service
105
105
kubeClient clientset.Interface
106
106
clusterName string
@@ -175,6 +175,21 @@ func New(
175
175
s .serviceLister = serviceInformer .Lister ()
176
176
s .serviceListerSynced = serviceInformer .Informer ().HasSynced
177
177
178
+ nodeInformer .Informer ().AddEventHandlerWithResyncPeriod (
179
+ cache.ResourceEventHandlerFuncs {
180
+ AddFunc : func (cur interface {}) {
181
+ s .nodeSyncLoop ()
182
+ },
183
+ UpdateFunc : func (old , cur interface {}) {
184
+ s .nodeSyncLoop ()
185
+ },
186
+ DeleteFunc : func (old interface {}) {
187
+ s .nodeSyncLoop ()
188
+ },
189
+ },
190
+ time .Duration (0 ),
191
+ )
192
+
178
193
if err := s .init (); err != nil {
179
194
return nil , err
180
195
}
@@ -646,6 +661,8 @@ func getNodeConditionPredicate() NodeConditionPredicate {
646
661
// nodeSyncLoop handles updating the hosts pointed to by all load
647
662
// balancers whenever the set of nodes in the cluster changes.
648
663
func (s * Controller ) nodeSyncLoop () {
664
+ s .knownHostsLock .Lock ()
665
+ defer s .knownHostsLock .Unlock ()
649
666
newHosts , err := listWithPredicate (s .nodeLister , getNodeConditionPredicate ())
650
667
if err != nil {
651
668
runtime .HandleError (fmt .Errorf ("Failed to retrieve current set of nodes from node lister: %v" , err ))
0 commit comments