From be099f9b3ea57f9b7e90566acd8378f3064f84b2 Mon Sep 17 00:00:00 2001 From: Pulkit Jain Date: Mon, 25 Nov 2024 15:21:47 +0530 Subject: [PATCH] Allow Node SNAT for Static Egress case Implemented best effort scenario, where in case of static Egress also, if there is no egress node then the packets will be sent using normal Node SNAT, as in case of dynamic Egress. Signed-off-by: Pulkit Jain --- .../controller/egress/egress_controller.go | 67 +++++++++++-------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/pkg/agent/controller/egress/egress_controller.go b/pkg/agent/controller/egress/egress_controller.go index bdc91c8b414..9bb1d7f3d1e 100644 --- a/pkg/agent/controller/egress/egress_controller.go +++ b/pkg/agent/controller/egress/egress_controller.go @@ -1098,7 +1098,15 @@ func (c *EgressController) syncEgress(egressName string) error { eState.mark = mark } - if err := c.updateEgressStatus(egress, desiredEgressIP, nil); err != nil { + err = wait.PollUntilContextTimeout(context.TODO(), 200*time.Millisecond, 5*time.Second, true, + func(ctx context.Context) (done bool, err error) { + if err := c.updateEgressStatus(egress, desiredEgressIP, nil); err != nil { + return false, nil + } + return true, nil + }) + + if err != nil { return fmt.Errorf("update Egress %s status error: %v", egressName, err) } @@ -1118,39 +1126,42 @@ func (c *EgressController) syncEgress(egressName string) error { }() egressIP := net.ParseIP(eState.egressIP) - // Install SNAT flows for desired Pods. - for pod := range pods { - eState.pods.Insert(pod) - stalePods.Delete(pod) + egress, _ = c.egressLister.Get(egressName) + if egress.Status.EgressNode != "" { + // Install SNAT flows for desired Pods. + for pod := range pods { + eState.pods.Insert(pod) + stalePods.Delete(pod) + + // If the Egress is not the effective one for the Pod, do nothing. + if !c.bindPodEgress(pod, egressName) { + continue + } - // If the Egress is not the effective one for the Pod, do nothing. - if !c.bindPodEgress(pod, egressName) { - continue - } + // Get the Pod's openflow port. + parts := strings.Split(pod, "/") + podNamespace, podName := parts[0], parts[1] + ifaces := c.ifaceStore.GetContainerInterfacesByPod(podName, podNamespace) + if len(ifaces) == 0 { + klog.Infof("Interfaces of Pod %s/%s not found", podNamespace, podName) + continue + } - // Get the Pod's openflow port. - parts := strings.Split(pod, "/") - podNamespace, podName := parts[0], parts[1] - ifaces := c.ifaceStore.GetContainerInterfacesByPod(podName, podNamespace) - if len(ifaces) == 0 { - klog.Infof("Interfaces of Pod %s/%s not found", podNamespace, podName) - continue + ofPort := ifaces[0].OFPort + if eState.ofPorts.Has(ofPort) { + staleOFPorts.Delete(ofPort) + continue + } + if err := c.ofClient.InstallPodSNATFlows(uint32(ofPort), egressIP, mark); err != nil { + return err + } + eState.ofPorts.Insert(ofPort) } - ofPort := ifaces[0].OFPort - if eState.ofPorts.Has(ofPort) { - staleOFPorts.Delete(ofPort) - continue - } - if err := c.ofClient.InstallPodSNATFlows(uint32(ofPort), egressIP, mark); err != nil { + // Uninstall SNAT flows for stale Pods. + if err := c.uninstallPodFlows(egressName, eState, staleOFPorts, stalePods); err != nil { return err } - eState.ofPorts.Insert(ofPort) - } - - // Uninstall SNAT flows for stale Pods. - if err := c.uninstallPodFlows(egressName, eState, staleOFPorts, stalePods); err != nil { - return err } return nil }