@@ -131,6 +131,7 @@ type DefaultNetworkController struct {
131131 syncZoneICFailed sync.Map
132132 syncHostNetAddrSetFailed sync.Map
133133 syncEIPNodeRerouteFailed sync.Map
134+ syncEIPNodeFailed sync.Map
134135
135136 // variable to determine if all pods present on the node during startup have been processed
136137 // updated atomically
@@ -843,8 +844,10 @@ func (h *defaultNetworkControllerEventHandler) AddResource(obj interface{}, from
843844 h .oc .eIPC .nodeZoneState .UnlockKey (node .Name )
844845
845846 shouldSyncReroute := true
847+ shouldSyncEIPNode := true
846848 if fromRetryLoop {
847849 _ , shouldSyncReroute = h .oc .syncEIPNodeRerouteFailed .Load (node .Name )
850+ _ , shouldSyncEIPNode = h .oc .syncEIPNodeFailed .Load (node .Name )
848851 }
849852
850853 if shouldSyncReroute {
@@ -862,10 +865,19 @@ func (h *defaultNetworkControllerEventHandler) AddResource(obj interface{}, from
862865 h .oc .syncEIPNodeRerouteFailed .Store (node .Name , true )
863866 return err
864867 }
868+ h .oc .syncEIPNodeRerouteFailed .Delete (node .Name )
865869 }
866- // Add routing specific to Egress IP NOTE: GARP configuration that
867- // Egress IP depends on is added from the gateway reconciliation logic
868- return h .oc .eIPC .addEgressNode (node )
870+ if shouldSyncEIPNode {
871+ // Add routing specific to Egress IP NOTE: GARP configuration that
872+ // Egress IP depends on is added from the gateway reconciliation logic
873+ err := h .oc .eIPC .addEgressNode (node )
874+ if err != nil {
875+ h .oc .syncEIPNodeFailed .Store (node .Name , true )
876+ return err
877+ }
878+ h .oc .syncEIPNodeFailed .Delete (node .Name )
879+ }
880+ return nil
869881
870882 case factory .NamespaceType :
871883 ns , ok := obj .(* corev1.Namespace )
@@ -1038,24 +1050,36 @@ func (h *defaultNetworkControllerEventHandler) UpdateResource(oldObj, newObj int
10381050 h .oc .eIPC .nodeZoneState .Store (newNode .Name , h .oc .isLocalZoneNode (newNode ))
10391051 h .oc .eIPC .nodeZoneState .UnlockKey (newNode .Name )
10401052
1041- _ , failed := h .oc .syncEIPNodeRerouteFailed .Load (newNode .Name )
1053+ _ , syncEIPNodeRerouteFailed := h .oc .syncEIPNodeRerouteFailed .Load (newNode .Name )
10421054
10431055 // node moved from remote -> local or previously failed reroute config
1044- if (! h .oc .isLocalZoneNode (oldNode ) || failed ) && h .oc .isLocalZoneNode (newNode ) {
1056+ if (! h .oc .isLocalZoneNode (oldNode ) || syncEIPNodeRerouteFailed ) && h .oc .isLocalZoneNode (newNode ) {
10451057 if err := h .oc .eIPC .ensureDefaultNoRerouteQoSRules (newNode .Name ); err != nil {
10461058 return err
10471059 }
10481060 }
10491061 // update the nodeIP in the default-reRoute (102 priority) destination address-set
1050- if failed || util .NodeHostCIDRsAnnotationChanged (oldNode , newNode ) {
1062+ if syncEIPNodeRerouteFailed || util .NodeHostCIDRsAnnotationChanged (oldNode , newNode ) {
10511063 klog .Infof ("Egress IP detected IP address change for node %s. Updating no re-route policies" , newNode .Name )
10521064 err := h .oc .eIPC .ensureDefaultNoRerouteNodePolicies ()
10531065 if err != nil {
1066+ h .oc .syncEIPNodeRerouteFailed .Store (newNode .Name , true )
10541067 return err
10551068 }
1069+ h .oc .syncEIPNodeRerouteFailed .Delete (newNode .Name )
10561070 }
1057- h .oc .syncEIPNodeRerouteFailed .Delete (newNode .Name )
1058- return h .oc .eIPC .addEgressNode (newNode )
1071+
1072+ _ , syncEIPNodeFailed := h .oc .syncEIPNodeFailed .Load (newNode .Name )
1073+ // update only if the GR join IP changed for default network
1074+ if syncEIPNodeFailed || joinCIDRChanged (oldNode , newNode , h .oc .GetNetworkName ()) {
1075+ err := h .oc .eIPC .addEgressNode (newNode )
1076+ if err != nil {
1077+ h .oc .syncEIPNodeFailed .Store (newNode .Name , true )
1078+ return err
1079+ }
1080+ h .oc .syncEIPNodeFailed .Delete (newNode .Name )
1081+ }
1082+ return nil
10591083
10601084 case factory .NamespaceType :
10611085 oldNs , newNs := oldObj .(* corev1.Namespace ), newObj .(* corev1.Namespace )
@@ -1118,6 +1142,7 @@ func (h *defaultNetworkControllerEventHandler) DeleteResource(obj, cachedObj int
11181142 h .oc .eIPC .nodeZoneState .Delete (node .Name )
11191143 h .oc .eIPC .nodeZoneState .UnlockKey (node .Name )
11201144 h .oc .syncEIPNodeRerouteFailed .Delete (node .Name )
1145+ h .oc .syncEIPNodeFailed .Delete (node .Name )
11211146 return nil
11221147
11231148 case factory .NamespaceType :
0 commit comments