From dcfe86bbd50784a0bf75c49190da701772c8ea3c Mon Sep 17 00:00:00 2001 From: changluyi Date: Wed, 12 Jul 2023 10:57:01 +0800 Subject: [PATCH] refactor --- pkg/daemon/gateway.go | 42 +++++++++++++++++++++++++++++++++++++ pkg/daemon/gateway_linux.go | 41 +++--------------------------------- pkg/daemon/tproxy_linux.go | 28 ++----------------------- 3 files changed, 47 insertions(+), 64 deletions(-) diff --git a/pkg/daemon/gateway.go b/pkg/daemon/gateway.go index 9409c078cde..7ecca9ce755 100644 --- a/pkg/daemon/gateway.go +++ b/pkg/daemon/gateway.go @@ -3,6 +3,7 @@ package daemon import ( "fmt" "os/exec" + "sort" "strings" v1 "k8s.io/api/core/v1" @@ -246,3 +247,44 @@ func (c *Controller) getEgressNatIpByNode(nodeName string) (map[string]string, e } return subnetsNatIp, nil } + +func (c *Controller) getTProxyConditionPod(needSort bool) ([]*v1.Pod, error) { + + var filteredPods []*v1.Pod + pods, err := c.podsLister.List(labels.Everything()) + if err != nil { + klog.Errorf("list pods failed, %v", err) + return nil, err + } + + for _, pod := range pods { + if pod.Spec.NodeName != c.config.NodeName { + continue + } + + subnetName, ok := pod.Annotations[fmt.Sprintf(util.LogicalSwitchAnnotationTemplate, util.OvnProvider)] + if !ok { + continue + } + + subnet, err := c.subnetsLister.Get(subnetName) + if err != nil { + err = fmt.Errorf("failed to get subnet '%s', err: %v", subnetName, err) + return nil, err + } + + if subnet.Spec.Vpc == c.config.ClusterRouter { + continue + } + + filteredPods = append(filteredPods, pod) + } + + if needSort { + sort.Slice(filteredPods, func(i, j int) bool { + return filteredPods[i].Namespace+"/"+filteredPods[i].Name < filteredPods[j].Namespace+"/"+filteredPods[j].Name + }) + } + + return filteredPods, nil +} diff --git a/pkg/daemon/gateway_linux.go b/pkg/daemon/gateway_linux.go index 264607c6f72..5c73c09ae2d 100644 --- a/pkg/daemon/gateway_linux.go +++ b/pkg/daemon/gateway_linux.go @@ -775,50 +775,15 @@ func (c *Controller) reconcileTProxyIPTableRules(protocol string, isDual bool) e ipt := c.iptables[protocol] tproxyPreRoutingRules := make([]util.IPTableRule, 0) tproxyOutputRules := make([]util.IPTableRule, 0) - var probePorts, podNames []string + var probePorts []string - pods, err := c.podsLister.List(labels.Everything()) + pods, err := c.getTProxyConditionPod(true) if err != nil { - klog.Errorf("list pods failed, %v", err) return err } for _, pod := range pods { - podNames = append(podNames, pod.Namespace+"/"+pod.Name) - } - - sort.Strings(podNames) - - for _, podName := range podNames { - podIP := "" - items := strings.Split(podName, "/") - nsName := items[0] - name := items[1] - pod, err := c.podsLister.Pods(nsName).Get(name) - if err != nil { - klog.Errorf("get pod %s/%s failed, %v", nsName, name, err) - return err - } - - if pod.Spec.NodeName != c.config.NodeName { - continue - } - - subnetName, ok := pod.Annotations[fmt.Sprintf(util.LogicalSwitchAnnotationTemplate, util.OvnProvider)] - if !ok { - continue - } - - subnet, err := c.subnetsLister.Get(subnetName) - if err != nil { - err = fmt.Errorf("failed to get subnet '%s', err: %v", subnetName, err) - return err - } - - if subnet.Spec.Vpc == c.config.ClusterRouter { - continue - } - + var podIP string for _, ip := range pod.Status.PodIPs { if util.CheckProtocol(ip.IP) == protocol { podIP = ip.IP diff --git a/pkg/daemon/tproxy_linux.go b/pkg/daemon/tproxy_linux.go index ea60e3e4130..7894cc55bb5 100644 --- a/pkg/daemon/tproxy_linux.go +++ b/pkg/daemon/tproxy_linux.go @@ -13,7 +13,6 @@ import ( "github.com/containernetworking/plugins/pkg/ns" "github.com/vishvananda/netlink" "golang.org/x/sys/unix" - "k8s.io/apimachinery/pkg/labels" "k8s.io/klog/v2" kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1" @@ -64,36 +63,13 @@ func (c *Controller) StartTProxyForwarding() { func (c *Controller) StartTProxyTCPPortProbe() { probePorts := map[string]interface{}{} - pods, err := c.podsLister.List(labels.Everything()) - if err != nil { - klog.Errorf("failed to list pods: %v", err) - return - } - if len(pods) == 0 { + pods, err := c.getTProxyConditionPod(false) + if err != nil { return } for _, pod := range pods { - if pod.Spec.NodeName != c.config.NodeName { - continue - } - - subnetName, ok := pod.Annotations[fmt.Sprintf(util.LogicalSwitchAnnotationTemplate, util.OvnProvider)] - if !ok { - continue - } - - subnet, err := c.subnetsLister.Get(subnetName) - if err != nil { - klog.Errorf("failed to get subnet '%s', err: %v", subnetName, err) - continue - } - - if subnet.Spec.Vpc == c.config.ClusterRouter { - continue - } - iface := ovs.PodNameToPortName(pod.Name, pod.Namespace, util.OvnProvider) nsName, err := ovs.GetInterfacePodNs(iface) if err != nil || nsName == "" {