Skip to content

Commit f7db3eb

Browse files
committed
BUG/MINOR: fix k8s resync for all objects except endpoints, endpointslices.
Endpoint and endpointslices fix is done in a previous commit. With informers, resync are sent as Update, not Create. We were doing nothing on an Update on a resync. If an event was skipped for any reason, we were never resyncing.
1 parent 5862249 commit f7db3eb

File tree

5 files changed

+39
-60
lines changed

5 files changed

+39
-60
lines changed

pkg/annotations/service/maxconn.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@ func (a *Maxconn) Process(k store.K8s, annotations ...map[string]string) error {
3535
return err
3636
}
3737
// adjust backend maxconn when using multiple HAProxy Instances
38-
if k.NbrHAProxyInst != 0 {
39-
v /= k.NbrHAProxyInst
38+
if len(k.HaProxyPods) != 0 {
39+
v /= int64(len(k.HaProxyPods))
4040
}
4141
if a.backend.DefaultServer == nil {
4242
a.backend.DefaultServer = &models.DefaultServer{}

pkg/k8s/informers.go

Lines changed: 18 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func (k k8s) getNamespaceInfomer(eventChan chan SyncDataEvent, factory informers
7878
eventChan <- SyncDataEvent{SyncType: NAMESPACE, Namespace: item.Name, Data: item}
7979
},
8080
UpdateFunc: func(oldObj, newObj interface{}) {
81-
data1, ok := oldObj.(*corev1.Namespace)
81+
_, ok := oldObj.(*corev1.Namespace)
8282
if !ok {
8383
logger.Errorf("%s: Invalid data from k8s api, %s", NAMESPACE, oldObj)
8484
return
@@ -89,17 +89,11 @@ func (k k8s) getNamespaceInfomer(eventChan chan SyncDataEvent, factory informers
8989
return
9090
}
9191
status := store.MODIFIED
92-
item1 := &store.Namespace{
93-
Name: data1.GetName(),
94-
Status: status,
95-
}
92+
9693
item2 := &store.Namespace{
9794
Name: data2.GetName(),
9895
Status: status,
9996
}
100-
if item1.Name == item2.Name {
101-
return
102-
}
10397
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", NAMESPACE, item2.Status, item2.Name)
10498
eventChan <- SyncDataEvent{SyncType: NAMESPACE, Namespace: item2.Name, Data: item2}
10599
},
@@ -201,23 +195,6 @@ func (k k8s) getServiceInformer(eventChan chan SyncDataEvent, factory informers.
201195
}
202196

203197
status := store.MODIFIED
204-
item1 := &store.Service{
205-
Namespace: data1.GetNamespace(),
206-
Name: data1.GetName(),
207-
Annotations: store.CopyAnnotations(data1.ObjectMeta.Annotations),
208-
Ports: []store.ServicePort{},
209-
Status: status,
210-
}
211-
if data1.Spec.Type == corev1.ServiceTypeExternalName {
212-
item1.DNS = data1.Spec.ExternalName
213-
}
214-
for _, sp := range data1.Spec.Ports {
215-
item1.Ports = append(item1.Ports, store.ServicePort{
216-
Name: sp.Name,
217-
Protocol: string(sp.Protocol),
218-
Port: int64(sp.Port),
219-
})
220-
}
221198

222199
item2 := &store.Service{
223200
Namespace: data2.GetNamespace(),
@@ -236,9 +213,7 @@ func (k k8s) getServiceInformer(eventChan chan SyncDataEvent, factory informers.
236213
Port: int64(sp.Port),
237214
})
238215
}
239-
if item2.Equal(item1) {
240-
return
241-
}
216+
242217
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", SERVICE, item2.Status, item2.Name)
243218
eventChan <- SyncDataEvent{SyncType: SERVICE, Namespace: item2.Namespace, Data: item2}
244219

@@ -293,7 +268,7 @@ func (k k8s) getSecretInformer(eventChan chan SyncDataEvent, factory informers.S
293268
eventChan <- SyncDataEvent{SyncType: SECRET, Namespace: item.Namespace, Data: item}
294269
},
295270
UpdateFunc: func(oldObj, newObj interface{}) {
296-
data1, ok := oldObj.(*corev1.Secret)
271+
_, ok := oldObj.(*corev1.Secret)
297272
if !ok {
298273
logger.Errorf("%s: Invalid data from k8s api, %s", SECRET, oldObj)
299274
return
@@ -304,21 +279,14 @@ func (k k8s) getSecretInformer(eventChan chan SyncDataEvent, factory informers.S
304279
return
305280
}
306281
status := store.MODIFIED
307-
item1 := &store.Secret{
308-
Namespace: data1.GetNamespace(),
309-
Name: data1.GetName(),
310-
Data: data1.Data,
311-
Status: status,
312-
}
282+
313283
item2 := &store.Secret{
314284
Namespace: data2.GetNamespace(),
315285
Name: data2.GetName(),
316286
Data: data2.Data,
317287
Status: status,
318288
}
319-
if item2.Equal(item1) {
320-
return
321-
}
289+
322290
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", SECRET, item2.Status, item2.Name)
323291
eventChan <- SyncDataEvent{SyncType: SECRET, Namespace: item2.Namespace, Data: item2}
324292
},
@@ -368,7 +336,7 @@ func (k k8s) getConfigMapInformer(eventChan chan SyncDataEvent, factory informer
368336
eventChan <- SyncDataEvent{SyncType: CONFIGMAP, Namespace: item.Namespace, Data: item}
369337
},
370338
UpdateFunc: func(oldObj, newObj interface{}) {
371-
data1, ok := oldObj.(*corev1.ConfigMap)
339+
_, ok := oldObj.(*corev1.ConfigMap)
372340
if !ok {
373341
logger.Errorf("%s: Invalid data from k8s api, %s", CONFIGMAP, oldObj)
374342
return
@@ -379,21 +347,13 @@ func (k k8s) getConfigMapInformer(eventChan chan SyncDataEvent, factory informer
379347
return
380348
}
381349
status := store.MODIFIED
382-
item1 := &store.ConfigMap{
383-
Namespace: data1.GetNamespace(),
384-
Name: data1.GetName(),
385-
Annotations: store.CopyAnnotations(data1.Data),
386-
Status: status,
387-
}
388350
item2 := &store.ConfigMap{
389351
Namespace: data2.GetNamespace(),
390352
Name: data2.GetName(),
391353
Annotations: store.CopyAnnotations(data2.Data),
392354
Status: status,
393355
}
394-
if item2.Equal(item1) {
395-
return
396-
}
356+
397357
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", CONFIGMAP, item2.Status, item2.Name)
398358
eventChan <- SyncDataEvent{SyncType: CONFIGMAP, Namespace: item2.Namespace, Data: item2}
399359
},
@@ -513,15 +473,23 @@ func (k *k8s) getPodInformer(namespace, podPrefix string, resyncPeriod time.Dura
513473
if prefix != podPrefix {
514474
return
515475
}
516-
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Created: true}}
476+
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Status: store.ADDED, Name: meta.Name}}
517477
},
518478
DeleteFunc: func(obj interface{}) {
519479
meta := obj.(*corev1.Pod).ObjectMeta //nolint:forcetypeassert
520480
prefix, _ = utils.GetPodPrefix(meta.Name)
521481
if prefix != podPrefix {
522482
return
523483
}
524-
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{}}
484+
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Status: store.DELETED, Name: meta.Name}}
485+
},
486+
UpdateFunc: func(oldObj, newObj interface{}) {
487+
meta := newObj.(*corev1.Pod).ObjectMeta //nolint:forcetypeassert
488+
prefix, _ = utils.GetPodPrefix(meta.Name)
489+
if prefix != podPrefix {
490+
return
491+
}
492+
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Status: store.MODIFIED, Name: meta.Name}}
525493
},
526494
},
527495
)

pkg/store/events.go

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,8 @@ import (
2222
)
2323

2424
func (k *K8s) EventNamespace(ns *Namespace, data *Namespace) (updateRequired bool) {
25-
updateRequired = false
2625
switch data.Status {
27-
case ADDED:
26+
case ADDED, MODIFIED:
2827
_ = k.GetNamespace(data.Name)
2928
case DELETED:
3029
_, ok := k.Namespaces[data.Name]
@@ -193,6 +192,9 @@ func (k *K8s) EventConfigMap(ns *Namespace, data *ConfigMap) (updateRequired boo
193192
updateRequired = true
194193
logger.Debugf("configmap '%s/%s' processed", cm.Namespace, cm.Name)
195194
case MODIFIED:
195+
if cm.Equal(data) {
196+
return false
197+
}
196198
*cm = *data
197199
updateRequired = true
198200
logger.Infof("configmap '%s/%s' updated", cm.Namespace, cm.Name)
@@ -247,10 +249,17 @@ func (k *K8s) EventSecret(ns *Namespace, data *Secret) (updateRequired bool) {
247249
}
248250

249251
func (k *K8s) EventPod(podEvent PodEvent) (updateRequired bool) {
250-
if podEvent.Created {
251-
k.NbrHAProxyInst++
252-
} else {
253-
k.NbrHAProxyInst--
252+
switch podEvent.Status {
253+
case ADDED, MODIFIED:
254+
if _, ok := k.HaProxyPods[podEvent.Name]; ok {
255+
return false
256+
}
257+
k.HaProxyPods[podEvent.Name] = struct{}{}
258+
case DELETED:
259+
if _, ok := k.HaProxyPods[podEvent.Name]; !ok {
260+
return false
261+
}
262+
delete(k.HaProxyPods, podEvent.Name)
254263
}
255264

256265
return true

pkg/store/store.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import (
2424
const DefaultLocalBackend = "default-local-service"
2525

2626
type K8s struct {
27-
NbrHAProxyInst int64
27+
HaProxyPods map[string]struct{}
2828
Namespaces map[string]*Namespace
2929
IngressClasses map[string]*IngressClass
3030
NamespacesAccess NamespacesWatch
@@ -72,6 +72,7 @@ func NewK8sStore(args utils.OSArgs) K8s {
7272
},
7373
SecretsProcessed: map[string]struct{}{},
7474
BackendProcessed: map[string]struct{}{},
75+
HaProxyPods: map[string]struct{}{},
7576
}
7677
for _, namespace := range args.NamespaceWhitelist {
7778
store.NamespacesAccess.Whitelist[namespace] = struct{}{}

pkg/store/types.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,8 @@ type Endpoints struct {
5757

5858
// PodEvent carries creation/deletion pod event.
5959
type PodEvent struct {
60-
Created bool
60+
Status Status
61+
Name string
6162
}
6263

6364
// Service is useful data from k8s structures about service

0 commit comments

Comments
 (0)