Skip to content

Commit 98a3b1e

Browse files
authored
fix localnet port should not be static "patch-localnet." (#6244)
* fix localnet port Signed-off-by: clyi <clyi@alauda.io>
1 parent 7cd3789 commit 98a3b1e

File tree

2 files changed

+27
-19
lines changed

2 files changed

+27
-19
lines changed

pkg/daemon/controller_linux.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ type LbServiceRules struct {
6363
BridgeName string
6464
DstMac string
6565
UnderlayNic string
66+
SubnetName string
6667
}
6768

6869
func evalCommandSymlinks(cmd string) (string, error) {
@@ -412,7 +413,7 @@ func (c *Controller) reconcileRouters(event *subnetEvent) error {
412413
return nil
413414
}
414415

415-
func genLBServiceRules(service *v1.Service, bridgeName, underlayNic, dstMac string) []LbServiceRules {
416+
func genLBServiceRules(service *v1.Service, bridgeName, underlayNic, dstMac, subnetName string) []LbServiceRules {
416417
var lbServiceRules []LbServiceRules
417418
for _, ingress := range service.Status.LoadBalancer.Ingress {
418419
for _, port := range service.Spec.Ports {
@@ -423,6 +424,7 @@ func genLBServiceRules(service *v1.Service, bridgeName, underlayNic, dstMac stri
423424
DstMac: dstMac,
424425
UnderlayNic: underlayNic,
425426
BridgeName: bridgeName,
427+
SubnetName: subnetName,
426428
})
427429
}
428430
}
@@ -433,22 +435,24 @@ func (c *Controller) diffExternalLBServiceRules(oldService, newService *v1.Servi
433435
var oldlbServiceRules, newlbServiceRules []LbServiceRules
434436

435437
if oldService != nil && oldService.Annotations[util.ServiceExternalIPFromSubnetAnnotation] != "" {
436-
oldBridgeName, underlayNic, dstMac, err := c.getExtInfoBySubnet(oldService.Annotations[util.ServiceExternalIPFromSubnetAnnotation])
438+
oldSubnetName := oldService.Annotations[util.ServiceExternalIPFromSubnetAnnotation]
439+
oldBridgeName, underlayNic, dstMac, err := c.getExtInfoBySubnet(oldSubnetName)
437440
if err != nil {
438-
klog.Errorf("failed to get provider network by subnet %s: %v", oldService.Annotations[util.ServiceExternalIPFromSubnetAnnotation], err)
441+
klog.Errorf("failed to get provider network by subnet %s: %v", oldSubnetName, err)
439442
return nil, nil, err
440443
}
441444

442-
oldlbServiceRules = genLBServiceRules(oldService, oldBridgeName, underlayNic, dstMac)
445+
oldlbServiceRules = genLBServiceRules(oldService, oldBridgeName, underlayNic, dstMac, oldSubnetName)
443446
}
444447

445448
if isSubnetExternalLBEnabled && newService != nil && newService.Annotations[util.ServiceExternalIPFromSubnetAnnotation] != "" {
446-
newBridgeName, underlayNic, dstMac, err := c.getExtInfoBySubnet(newService.Annotations[util.ServiceExternalIPFromSubnetAnnotation])
449+
newSubnetName := newService.Annotations[util.ServiceExternalIPFromSubnetAnnotation]
450+
newBridgeName, underlayNic, dstMac, err := c.getExtInfoBySubnet(newSubnetName)
447451
if err != nil {
448-
klog.Errorf("failed to get provider network by subnet %s: %v", newService.Annotations[util.ServiceExternalIPFromSubnetAnnotation], err)
452+
klog.Errorf("failed to get provider network by subnet %s: %v", newSubnetName, err)
449453
return nil, nil, err
450454
}
451-
newlbServiceRules = genLBServiceRules(newService, newBridgeName, underlayNic, dstMac)
455+
newlbServiceRules = genLBServiceRules(newService, newBridgeName, underlayNic, dstMac, newSubnetName)
452456
}
453457

454458
for _, oldRule := range oldlbServiceRules {
@@ -557,7 +561,7 @@ func (c *Controller) reconcileServices(event *serviceEvent) error {
557561
if len(lbServiceRulesToAdd) > 0 {
558562
for _, rule := range lbServiceRulesToAdd {
559563
klog.Infof("Adding LB service rule: %+v", rule)
560-
if err := c.AddOrUpdateUnderlaySubnetSvcLocalFlowCache(rule.IP, rule.Port, rule.Protocol, rule.DstMac, rule.UnderlayNic, rule.BridgeName); err != nil {
564+
if err := c.AddOrUpdateUnderlaySubnetSvcLocalFlowCache(rule.IP, rule.Port, rule.Protocol, rule.DstMac, rule.UnderlayNic, rule.BridgeName, rule.SubnetName); err != nil {
561565
klog.Errorf("failed to update underlay subnet svc local openflow cache: %v", err)
562566
return err
563567
}

pkg/daemon/flow_rules_linux.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
package daemon
22

33
import (
4-
"errors"
54
"fmt"
5+
"strconv"
66
"strings"
77

88
"k8s.io/klog/v2"
99

1010
kubeovnv1 "github.com/kubeovn/kube-ovn/pkg/apis/kubeovn/v1"
11+
"github.com/kubeovn/kube-ovn/pkg/ovs"
1112
"github.com/kubeovn/kube-ovn/pkg/util"
1213
)
1314

1415
const flowKindUnderlayService = "usvc"
1516

16-
func (c *Controller) AddOrUpdateUnderlaySubnetSvcLocalFlowCache(serviceIP string, port uint16, protocol, dstMac, underlayNic, bridgeName string) error {
17-
inPort, err := c.getPortID(bridgeName, underlayNic)
17+
func (c *Controller) AddOrUpdateUnderlaySubnetSvcLocalFlowCache(serviceIP string, port uint16, protocol, dstMac, underlayNic, bridgeName, subnetName string) error {
18+
inPort, err := c.getPortID(underlayNic)
1819
if err != nil {
1920
return err
2021
}
2122

22-
outPort, err := c.getPortID(bridgeName, "patch-localnet.")
23+
patchPortName := fmt.Sprintf("patch-localnet.%s-to-br-int", subnetName)
24+
outPort, err := c.getPortID(patchPortName)
2325
if err != nil {
24-
klog.V(5).Infof("patch-localnet port not found on bridge %s, skipping underlay service flow for %s:%d (no pods on this node yet)", bridgeName, serviceIP, port)
26+
klog.V(5).Infof("patch-localnet port %s not found on bridge %s, skipping underlay service flow for %s:%d (subnet %s may not have pods on this node yet)", patchPortName, bridgeName, serviceIP, port, subnetName)
2527
return nil
2628
}
2729

@@ -77,14 +79,16 @@ func buildFlowKey(kind, ip string, port uint16, protocol, extra string) string {
7779
return fmt.Sprintf("%s-%s-%s-%d-%s", kind, ip, protocol, port, extra)
7880
}
7981

80-
func (c *Controller) getPortID(bridgeName, portName string) (int, error) {
81-
if c.ovsClient == nil {
82-
return 0, errors.New("ovs client not initialized")
82+
func (c *Controller) getPortID(portName string) (int, error) {
83+
ofportStr, err := ovs.Get("Interface", portName, "ofport", "", true)
84+
if err != nil {
85+
return 0, fmt.Errorf("failed to get ofport for interface %s: %w", portName, err)
8386
}
8487

85-
portInfo, err := c.ovsClient.OpenFlow.DumpPort(bridgeName, portName)
88+
portID, err := strconv.Atoi(strings.TrimSpace(ofportStr))
8689
if err != nil {
87-
return 0, fmt.Errorf("failed to dump port %s on bridge %s: %w", portName, bridgeName, err)
90+
return 0, fmt.Errorf("failed to parse ofport %q: %w", ofportStr, err)
8891
}
89-
return portInfo.PortID, nil
92+
93+
return portID, nil
9094
}

0 commit comments

Comments
 (0)