Skip to content

Commit 67909dc

Browse files
committed
BUG/MINOR: fix k8s resync for all objects expect 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 f3313af commit 67909dc

File tree

5 files changed

+45
-60
lines changed

5 files changed

+45
-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 & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ func (k k8s) getNamespaceInfomer(eventChan chan SyncDataEvent, factory informers
9090
eventChan <- SyncDataEvent{SyncType: NAMESPACE, Namespace: item.Name, Data: item}
9191
},
9292
UpdateFunc: func(oldObj, newObj interface{}) {
93-
data1, ok := oldObj.(*corev1.Namespace)
93+
_, ok := oldObj.(*corev1.Namespace)
9494
if !ok {
9595
logger.Errorf("%s: Invalid data from k8s api, %s", NAMESPACE, oldObj)
9696
return
@@ -101,19 +101,12 @@ func (k k8s) getNamespaceInfomer(eventChan chan SyncDataEvent, factory informers
101101
return
102102
}
103103
status := store.MODIFIED
104-
item1 := &store.Namespace{
105-
Name: data1.GetName(),
106-
Labels: utils.CopyMap(data1.Labels),
107-
Status: status,
108-
}
104+
109105
item2 := &store.Namespace{
110106
Name: data2.GetName(),
111107
Status: status,
112108
Labels: utils.CopyMap(data2.Labels),
113109
}
114-
if item1.Equal(item2) {
115-
return
116-
}
117110
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", NAMESPACE, item2.Status, item2.Name)
118111
eventChan <- SyncDataEvent{SyncType: NAMESPACE, Namespace: item2.Name, Data: item2}
119112
},
@@ -216,23 +209,6 @@ func (k k8s) getServiceInformer(eventChan chan SyncDataEvent, factory informers.
216209
}
217210

218211
status := store.MODIFIED
219-
item1 := &store.Service{
220-
Namespace: data1.GetNamespace(),
221-
Name: data1.GetName(),
222-
Annotations: store.CopyAnnotations(data1.ObjectMeta.Annotations),
223-
Ports: []store.ServicePort{},
224-
Status: status,
225-
}
226-
if data1.Spec.Type == corev1.ServiceTypeExternalName {
227-
item1.DNS = data1.Spec.ExternalName
228-
}
229-
for _, sp := range data1.Spec.Ports {
230-
item1.Ports = append(item1.Ports, store.ServicePort{
231-
Name: sp.Name,
232-
Protocol: string(sp.Protocol),
233-
Port: int64(sp.Port),
234-
})
235-
}
236212

237213
item2 := &store.Service{
238214
Namespace: data2.GetNamespace(),
@@ -251,9 +227,7 @@ func (k k8s) getServiceInformer(eventChan chan SyncDataEvent, factory informers.
251227
Port: int64(sp.Port),
252228
})
253229
}
254-
if item2.Equal(item1) {
255-
return
256-
}
230+
257231
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", SERVICE, item2.Status, item2.Name)
258232
eventChan <- SyncDataEvent{SyncType: SERVICE, Namespace: item2.Namespace, Data: item2}
259233

@@ -309,7 +283,7 @@ func (k k8s) getSecretInformer(eventChan chan SyncDataEvent, factory informers.S
309283
eventChan <- SyncDataEvent{SyncType: SECRET, Namespace: item.Namespace, Data: item}
310284
},
311285
UpdateFunc: func(oldObj, newObj interface{}) {
312-
data1, ok := oldObj.(*corev1.Secret)
286+
_, ok := oldObj.(*corev1.Secret)
313287
if !ok {
314288
logger.Errorf("%s: Invalid data from k8s api, %s", SECRET, oldObj)
315289
return
@@ -320,21 +294,14 @@ func (k k8s) getSecretInformer(eventChan chan SyncDataEvent, factory informers.S
320294
return
321295
}
322296
status := store.MODIFIED
323-
item1 := &store.Secret{
324-
Namespace: data1.GetNamespace(),
325-
Name: data1.GetName(),
326-
Data: data1.Data,
327-
Status: status,
328-
}
297+
329298
item2 := &store.Secret{
330299
Namespace: data2.GetNamespace(),
331300
Name: data2.GetName(),
332301
Data: data2.Data,
333302
Status: status,
334303
}
335-
if item2.Equal(item1) {
336-
return
337-
}
304+
338305
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", SECRET, item2.Status, item2.Name)
339306
eventChan <- SyncDataEvent{SyncType: SECRET, Namespace: item2.Namespace, Data: item2}
340307
},
@@ -385,7 +352,7 @@ func (k k8s) getConfigMapInformer(eventChan chan SyncDataEvent, factory informer
385352
eventChan <- SyncDataEvent{SyncType: CONFIGMAP, Namespace: item.Namespace, Data: item}
386353
},
387354
UpdateFunc: func(oldObj, newObj interface{}) {
388-
data1, ok := oldObj.(*corev1.ConfigMap)
355+
_, ok := oldObj.(*corev1.ConfigMap)
389356
if !ok {
390357
logger.Errorf("%s: Invalid data from k8s api, %s", CONFIGMAP, oldObj)
391358
return
@@ -396,21 +363,13 @@ func (k k8s) getConfigMapInformer(eventChan chan SyncDataEvent, factory informer
396363
return
397364
}
398365
status := store.MODIFIED
399-
item1 := &store.ConfigMap{
400-
Namespace: data1.GetNamespace(),
401-
Name: data1.GetName(),
402-
Annotations: store.CopyAnnotations(data1.Data),
403-
Status: status,
404-
}
405366
item2 := &store.ConfigMap{
406367
Namespace: data2.GetNamespace(),
407368
Name: data2.GetName(),
408369
Annotations: store.CopyAnnotations(data2.Data),
409370
Status: status,
410371
}
411-
if item2.Equal(item1) {
412-
return
413-
}
372+
414373
logger.Tracef("[RUNTIME] [K8s] %s %s: %s", CONFIGMAP, item2.Status, item2.Name)
415374
eventChan <- SyncDataEvent{SyncType: CONFIGMAP, Namespace: item2.Namespace, Data: item2}
416375
},
@@ -520,15 +479,23 @@ func (k *k8s) getPodInformer(namespace, podPrefix string, resyncPeriod time.Dura
520479
if prefix != podPrefix {
521480
return
522481
}
523-
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Created: true}}
482+
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Status: store.ADDED, Name: meta.Name}}
524483
},
525484
DeleteFunc: func(obj interface{}) {
526485
meta := obj.(*corev1.Pod).ObjectMeta //nolint:forcetypeassert
527486
prefix, _ = utils.GetPodPrefix(meta.Name)
528487
if prefix != podPrefix {
529488
return
530489
}
531-
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{}}
490+
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Status: store.DELETED, Name: meta.Name}}
491+
},
492+
UpdateFunc: func(oldObj, newObj interface{}) {
493+
meta := newObj.(*corev1.Pod).ObjectMeta //nolint:forcetypeassert
494+
prefix, _ = utils.GetPodPrefix(meta.Name)
495+
if prefix != podPrefix {
496+
return
497+
}
498+
eventChan <- SyncDataEvent{SyncType: POD, Namespace: meta.Namespace, Data: store.PodEvent{Status: store.MODIFIED, Name: meta.Name}}
532499
},
533500
},
534501
)

pkg/store/events.go

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,16 @@ import (
2525
func (k *K8s) EventNamespace(ns *Namespace, data *Namespace) (updateRequired bool) {
2626
updateRequired = false
2727
switch data.Status {
28-
case ADDED, MODIFIED:
28+
case ADDED:
2929
nsStore := k.GetNamespace(data.Name)
3030
nsStore.Labels = utils.CopyMap(data.Labels)
3131
updateRequired = true
32+
case MODIFIED:
33+
nsStore := k.GetNamespace(data.Name)
34+
if updateRequired = nsStore.Equal(data); !updateRequired {
35+
return updateRequired
36+
}
37+
nsStore.Labels = utils.CopyMap(data.Labels)
3238
case DELETED:
3339
_, ok := k.Namespaces[data.Name]
3440
if ok {
@@ -207,6 +213,9 @@ func (k *K8s) EventConfigMap(ns *Namespace, data *ConfigMap) (updateRequired boo
207213
updateRequired = true
208214
logger.Debugf("configmap '%s/%s' processed", cm.Namespace, cm.Name)
209215
case MODIFIED:
216+
if cm.Equal(data) {
217+
return false
218+
}
210219
*cm = *data
211220
updateRequired = true
212221
logger.Infof("configmap '%s/%s' updated", cm.Namespace, cm.Name)
@@ -261,10 +270,17 @@ func (k *K8s) EventSecret(ns *Namespace, data *Secret) (updateRequired bool) {
261270
}
262271

263272
func (k *K8s) EventPod(podEvent PodEvent) (updateRequired bool) {
264-
if podEvent.Created {
265-
k.NbrHAProxyInst++
266-
} else {
267-
k.NbrHAProxyInst--
273+
switch podEvent.Status {
274+
case ADDED, MODIFIED:
275+
if _, ok := k.HaProxyPods[podEvent.Name]; ok {
276+
return false
277+
}
278+
k.HaProxyPods[podEvent.Name] = struct{}{}
279+
case DELETED:
280+
if _, ok := k.HaProxyPods[podEvent.Name]; !ok {
281+
return false
282+
}
283+
delete(k.HaProxyPods, podEvent.Name)
268284
}
269285

270286
return true

pkg/store/store.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ type K8s struct {
3333
GatewayClasses map[string]*GatewayClass
3434
GatewayControllerName string
3535
PublishServiceAddresses []string
36-
NbrHAProxyInst int64
36+
HaProxyPods map[string]struct{}
3737
UpdateAllIngresses bool
3838
}
3939

@@ -75,6 +75,7 @@ func NewK8sStore(args utils.OSArgs) K8s {
7575
SecretsProcessed: map[string]struct{}{},
7676
BackendProcessed: map[string]struct{}{},
7777
GatewayClasses: make(map[string]*GatewayClass),
78+
HaProxyPods: map[string]struct{}{},
7879
}
7980
for _, namespace := range args.NamespaceWhitelist {
8081
store.NamespacesAccess.Whitelist[namespace] = struct{}{}

pkg/store/types.go

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

5959
// PodEvent carries creation/deletion pod event.
6060
type PodEvent struct {
61-
Created bool
61+
Status Status
62+
Name string
6263
}
6364

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

0 commit comments

Comments
 (0)