Skip to content

Commit 6325c83

Browse files
committed
cni-server: reconcile ovn0 routes periodically (kubeovn#2963)
1 parent 6ea123a commit 6325c83

File tree

3 files changed

+54
-47
lines changed

3 files changed

+54
-47
lines changed

pkg/daemon/controller.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ func (c *Controller) processNextSubnetWorkItem() bool {
440440
utilruntime.HandleError(fmt.Errorf("expected subnetEvent in workqueue but got %#v", obj))
441441
return nil
442442
}
443-
if err := c.reconcileRouters(event); err != nil {
443+
if err := c.reconcileRouters(&event); err != nil {
444444
c.subnetQueue.AddRateLimited(event)
445445
return fmt.Errorf("error syncing '%s': %s, requeuing", event, err.Error())
446446
}
@@ -591,6 +591,11 @@ func (c *Controller) Run(stopCh <-chan struct{}) {
591591
go wait.Until(c.runPodWorker, time.Second, stopCh)
592592
go wait.Until(c.runGateway, 3*time.Second, stopCh)
593593
go wait.Until(c.loopEncapIpCheck, 3*time.Second, stopCh)
594+
go wait.Until(func() {
595+
if err := c.reconcileRouters(nil); err != nil {
596+
klog.Errorf("failed to reconcile ovn0 routes: %v", err)
597+
}
598+
}, 3*time.Second, stopCh)
594599
go wait.Until(func() {
595600
if err := c.markAndCleanInternalPort(); err != nil {
596601
klog.Errorf("gc ovs port error: %v", err)

pkg/daemon/controller_linux.go

+47-45
Original file line numberDiff line numberDiff line change
@@ -111,66 +111,68 @@ func (c *Controller) initRuntime() error {
111111
return nil
112112
}
113113

114-
func (c *Controller) reconcileRouters(event subnetEvent) error {
114+
func (c *Controller) reconcileRouters(event *subnetEvent) error {
115115
subnets, err := c.subnetsLister.List(labels.Everything())
116116
if err != nil {
117117
klog.Errorf("failed to list subnets %v", err)
118118
return err
119119
}
120120

121-
var ok bool
122-
var oldSubnet, newSubnet *kubeovnv1.Subnet
123-
if event.old != nil {
124-
if oldSubnet, ok = event.old.(*kubeovnv1.Subnet); !ok {
125-
klog.Errorf("expected old subnet in subnetEvent but got %#v", event.old)
126-
return nil
121+
if event != nil {
122+
var ok bool
123+
var oldSubnet, newSubnet *kubeovnv1.Subnet
124+
if event.old != nil {
125+
if oldSubnet, ok = event.old.(*kubeovnv1.Subnet); !ok {
126+
klog.Errorf("expected old subnet in subnetEvent but got %#v", event.old)
127+
return nil
128+
}
127129
}
128-
}
129-
if event.new != nil {
130-
if newSubnet, ok = event.new.(*kubeovnv1.Subnet); !ok {
131-
klog.Errorf("expected new subnet in subnetEvent but got %#v", event.new)
132-
return nil
130+
if event.new != nil {
131+
if newSubnet, ok = event.new.(*kubeovnv1.Subnet); !ok {
132+
klog.Errorf("expected new subnet in subnetEvent but got %#v", event.new)
133+
return nil
134+
}
133135
}
134-
}
135136

136-
// handle policy routing
137-
rulesToAdd, rulesToDel, routesToAdd, routesToDel, err := c.diffPolicyRouting(oldSubnet, newSubnet)
138-
if err != nil {
139-
klog.Errorf("failed to get policy routing difference: %v", err)
140-
return err
141-
}
142-
// add new routes first
143-
for _, r := range routesToAdd {
144-
if err = netlink.RouteReplace(&r); err != nil && !errors.Is(err, syscall.EEXIST) {
145-
klog.Errorf("failed to replace route for subnet %s: %v", newSubnet.Name, err)
137+
// handle policy routing
138+
rulesToAdd, rulesToDel, routesToAdd, routesToDel, err := c.diffPolicyRouting(oldSubnet, newSubnet)
139+
if err != nil {
140+
klog.Errorf("failed to get policy routing difference: %v", err)
146141
return err
147142
}
148-
}
149-
// next, add new rules
150-
for _, r := range rulesToAdd {
151-
if err = netlink.RuleAdd(&r); err != nil && !errors.Is(err, syscall.EEXIST) {
152-
klog.Errorf("failed to add network rule for subnet %s: %v", newSubnet.Name, err)
153-
return err
143+
// add new routes first
144+
for _, r := range routesToAdd {
145+
if err = netlink.RouteReplace(&r); err != nil && !errors.Is(err, syscall.EEXIST) {
146+
klog.Errorf("failed to replace route for subnet %s: %v", newSubnet.Name, err)
147+
return err
148+
}
154149
}
155-
}
156-
// then delete old network rules
157-
for _, r := range rulesToDel {
158-
// loop to delete all matched rules
159-
for {
160-
if err = netlink.RuleDel(&r); err != nil {
161-
if !errors.Is(err, syscall.ENOENT) {
162-
klog.Errorf("failed to delete network rule for subnet %s: %v", oldSubnet.Name, err)
163-
return err
150+
// next, add new rules
151+
for _, r := range rulesToAdd {
152+
if err = netlink.RuleAdd(&r); err != nil && !errors.Is(err, syscall.EEXIST) {
153+
klog.Errorf("failed to add network rule for subnet %s: %v", newSubnet.Name, err)
154+
return err
155+
}
156+
}
157+
// then delete old network rules
158+
for _, r := range rulesToDel {
159+
// loop to delete all matched rules
160+
for {
161+
if err = netlink.RuleDel(&r); err != nil {
162+
if !errors.Is(err, syscall.ENOENT) {
163+
klog.Errorf("failed to delete network rule for subnet %s: %v", oldSubnet.Name, err)
164+
return err
165+
}
166+
break
164167
}
165-
break
166168
}
167169
}
168-
}
169-
// last, delete old network routes
170-
for _, r := range routesToDel {
171-
if err = netlink.RouteDel(&r); err != nil && !errors.Is(err, syscall.ENOENT) {
172-
klog.Errorf("failed to delete route for subnet %s: %v", oldSubnet.Name, err)
173-
return err
170+
// last, delete old network routes
171+
for _, r := range routesToDel {
172+
if err = netlink.RouteDel(&r); err != nil && !errors.Is(err, syscall.ENOENT) {
173+
klog.Errorf("failed to delete route for subnet %s: %v", oldSubnet.Name, err)
174+
return err
175+
}
174176
}
175177
}
176178

pkg/daemon/controller_windows.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func (c *Controller) initRuntime() error {
2424
return nil
2525
}
2626

27-
func (c *Controller) reconcileRouters(_ subnetEvent) error {
27+
func (c *Controller) reconcileRouters(_ *subnetEvent) error {
2828
klog.Info("reconcile routes")
2929
node, err := c.nodesLister.Get(c.config.NodeName)
3030
if err != nil {

0 commit comments

Comments
 (0)