Skip to content

Commit 74febae

Browse files
committed
BUG/MINOR: Check for EndpointSlicesMirroring before ignoring Endpoints.
In 8d9e683 support for EndpointSlices was added where they will be used by default when available. So ignoring Endpoints resources is safe as long as EndpointSlicesMirroring is enabled (mirroring Endpoints into EndpointSlices) which is not always the case. This fix checks if EndpointSlicesMirroring is enabled (k8s version > 1.19) before ignoring Endpoints resources.
1 parent fff8338 commit 74febae

File tree

1 file changed

+38
-9
lines changed

1 file changed

+38
-9
lines changed

controller/monitor.go

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package controller
1616

1717
import (
1818
"os"
19+
"strconv"
1920
"time"
2021

2122
"k8s.io/client-go/informers"
@@ -31,20 +32,13 @@ func (c *HAProxyController) monitorChanges() {
3132
stop := make(chan struct{})
3233
crManager := NewCRManager(&c.Store, c.k8s.RestConfig, c.OSArgs.CacheResyncPeriod, c.eventChan, stop)
3334
c.crManager = crManager
35+
epMirror := c.endpointsMirroring()
3436

3537
c.k8s.EventPods(c.PodNamespace, c.PodPrefix, c.OSArgs.CacheResyncPeriod, c.eventChan)
3638

3739
for _, namespace := range c.getWhitelistedNamespaces() {
3840
factory := informers.NewSharedInformerFactoryWithOptions(c.k8s.API, c.OSArgs.CacheResyncPeriod, informers.WithNamespace(namespace))
3941

40-
pi := c.getEndpointSlicesSharedInformer(factory)
41-
if pi != nil {
42-
c.k8s.EventsEndpointSlices(c.eventChan, stop, pi)
43-
} else {
44-
pi = factory.Core().V1().Endpoints().Informer()
45-
c.k8s.EventsEndpoints(c.eventChan, stop, pi)
46-
}
47-
4842
svci := factory.Core().V1().Services().Informer()
4943
c.k8s.EventsServices(c.eventChan, c.ingressChan, stop, svci, c.PublishService)
5044

@@ -59,18 +53,30 @@ func (c *HAProxyController) monitorChanges() {
5953

6054
var ii, ici cache.SharedIndexInformer
6155
ii, ici = c.getIngressSharedInformers(factory)
56+
6257
if ii == nil {
6358
logger.Panic("ingress resources not supported in this cluster")
6459
}
6560
c.k8s.EventsIngresses(c.eventChan, stop, ii)
6661

67-
informersSynced = []cache.InformerSynced{pi.HasSynced, svci.HasSynced, nsi.HasSynced, ii.HasSynced, si.HasSynced, ci.HasSynced}
62+
informersSynced = []cache.InformerSynced{svci.HasSynced, nsi.HasSynced, ii.HasSynced, si.HasSynced, ci.HasSynced}
6863
informersSynced = append(informersSynced, crManager.RunInformers(namespace)...)
6964

7065
if ici != nil {
7166
c.k8s.EventsIngressClass(c.eventChan, stop, ici)
7267
informersSynced = append(informersSynced, ici.HasSynced)
7368
}
69+
70+
epsi := c.getEndpointSlicesSharedInformer(factory)
71+
if epsi != nil {
72+
c.k8s.EventsEndpointSlices(c.eventChan, stop, epsi)
73+
informersSynced = append(informersSynced, epsi.HasSynced)
74+
}
75+
if epsi == nil || !epMirror {
76+
epi := factory.Core().V1().Endpoints().Informer()
77+
c.k8s.EventsEndpoints(c.eventChan, stop, epi)
78+
informersSynced = append(informersSynced, epi.HasSynced)
79+
}
7480
}
7581

7682
if !cache.WaitForCacheSync(stop, informersSynced...) {
@@ -199,6 +205,29 @@ func (c *HAProxyController) getWhitelistedNamespaces() []string {
199205
return namespaces
200206
}
201207

208+
// if EndpointSliceMirroring is supported we can just watch endpointSlices
209+
// Ref: https://github.com/kubernetes/enhancements/tree/master/keps/sig-network/0752-endpointslices#endpointslicemirroring-controller
210+
func (c *HAProxyController) endpointsMirroring() bool {
211+
var major, minor int
212+
var err error
213+
version, _ := c.k8s.API.ServerVersion()
214+
if version == nil {
215+
return false
216+
}
217+
major, err = strconv.Atoi(version.Major)
218+
if err != nil {
219+
return false
220+
}
221+
minor, err = strconv.Atoi(version.Minor)
222+
if err != nil {
223+
return false
224+
}
225+
if major == 1 && minor < 19 {
226+
return false
227+
}
228+
return true
229+
}
230+
202231
// auxCfgManager returns restart or reload requirement based on state and transition of auxiliary configuration file.
203232
func (c *HAProxyController) auxCfgManager() (restart, reload bool) {
204233
info, errStat := os.Stat(c.Cfg.Env.AuxCFGFile)

0 commit comments

Comments
 (0)