@@ -16,6 +16,7 @@ package controller
1616
1717import (
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.
203232func (c * HAProxyController ) auxCfgManager () (restart , reload bool ) {
204233 info , errStat := os .Stat (c .Cfg .Env .AuxCFGFile )
0 commit comments