@@ -109,7 +109,7 @@ func (r *EgressWatcher) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.R
109109}
110110
111111func (r * EgressWatcher ) reconcileEgressClient (ctx context.Context , eg * coilv2.Egress , pod * corev1.Pod , logger * logr.Logger ) error {
112- hook , err := r .getHook (ctx , eg , logger )
112+ hooks , err := r .getHook (ctx , eg , logger )
113113 if err != nil {
114114 return fmt .Errorf ("failed to setup NAT hook: %w" , err )
115115 }
@@ -125,8 +125,11 @@ func (r *EgressWatcher) reconcileEgressClient(ctx context.Context, eg *coilv2.Eg
125125 ipv6 = ip .To16 ()
126126 }
127127 }
128- if err := r .PodNet .Update (ipv4 , ipv6 , hook , pod ); err != nil {
129- return fmt .Errorf ("failed to update NAT configuration: %w" , err )
128+
129+ for _ , hook := range hooks {
130+ if err := r .PodNet .Update (ipv4 , ipv6 , hook , pod ); err != nil {
131+ return fmt .Errorf ("failed to update NAT configuration: %w" , err )
132+ }
130133 }
131134
132135 return nil
@@ -138,49 +141,39 @@ type gwNets struct {
138141 sportAuto bool
139142}
140143
141- func (r * EgressWatcher ) getHook (ctx context.Context , eg * coilv2.Egress , logger * logr.Logger ) (nodenet.SetupHook , error ) {
144+ func (r * EgressWatcher ) getHook (ctx context.Context , eg * coilv2.Egress , logger * logr.Logger ) ([] nodenet.SetupHook , error ) {
142145 var gw gwNets
143146 svc := & corev1.Service {}
144147
145148 if err := r .Get (ctx , client.ObjectKey {Namespace : eg .Namespace , Name : eg .Name }, svc ); err != nil {
146149 return nil , err
147150 }
148151
149- // See getHook in coild_server.go
150- svcIP := net .ParseIP (svc .Spec .ClusterIP )
151- if svcIP == nil {
152- return nil , fmt .Errorf ("invalid ClusterIP in Service %s %s" , eg .Name , svc .Spec .ClusterIP )
153- }
154- var subnets []* net.IPNet
155- if ip4 := svcIP .To4 (); ip4 != nil {
156- svcIP = ip4
157- for _ , sn := range eg .Spec .Destinations {
158- _ , subnet , err := net .ParseCIDR (sn )
159- if err != nil {
160- return nil , fmt .Errorf ("invalid network in Egress %s" , eg .Name )
161- }
162- if subnet .IP .To4 () != nil {
163- subnets = append (subnets , subnet )
164- }
152+ hooks := []nodenet.SetupHook {}
153+ for _ , clusterIP := range svc .Spec .ClusterIPs {
154+ var subnets []* net.IPNet
155+ svcIP := net .ParseIP (clusterIP )
156+ if svcIP == nil {
157+ return nil , fmt .Errorf ("invalid ClusterIP in Service %s %s" , eg .Name , svc .Spec .ClusterIP )
165158 }
166- } else {
159+
167160 for _ , sn := range eg .Spec .Destinations {
168161 _ , subnet , err := net .ParseCIDR (sn )
169162 if err != nil {
170163 return nil , fmt .Errorf ("invalid network in Egress %s" , eg .Name )
171164 }
172- if subnet .IP .To4 () == nil {
165+ if ( svcIP . To4 () != nil ) == ( subnet .IP .To4 () != nil ) {
173166 subnets = append (subnets , subnet )
174167 }
175168 }
176- }
177169
178- if len (subnets ) > 0 {
179- gw = gwNets {gateway : svcIP , networks : subnets , sportAuto : eg .Spec .FouSourcePortAuto }
180- return r .hook (gw , logger ), nil
170+ if len (subnets ) > 0 {
171+ gw = gwNets {gateway : svcIP , networks : subnets , sportAuto : eg .Spec .FouSourcePortAuto }
172+ hooks = append (hooks , r .hook (gw , logger ))
173+ }
181174 }
182175
183- return nil , nil
176+ return hooks , nil
184177}
185178
186179func (r * EgressWatcher ) hook (gwn gwNets , log * logr.Logger ) func (ipv4 , ipv6 net.IP ) error {
0 commit comments