Skip to content

Commit

Permalink
add static route for active-standby centralized subnet when use old a…
Browse files Browse the repository at this point in the history
…ctive gateway node (#2699)
  • Loading branch information
hongzhen-ma committed Apr 25, 2023
1 parent bb41c58 commit 188a9aa
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 12 deletions.
6 changes: 3 additions & 3 deletions pkg/controller/node.go
Original file line number Diff line number Diff line change
Expand Up @@ -669,9 +669,9 @@ func (c *Controller) checkGatewayReady() error {
continue
}

exist, err := c.checkNodeEcmpRouteExist(ip, cidrBlock)
exist, err := c.checkNodeGwRouteExist(ip, cidrBlock)
if err != nil {
klog.Errorf("get ecmp static route for subnet %v, error %v", subnet.Name, err)
klog.Errorf("failed to get static route for subnet %v, error %v", subnet.Name, err)
break
}

Expand Down Expand Up @@ -732,7 +732,7 @@ func (c *Controller) checkGatewayReady() error {
return nil
}

func (c *Controller) checkNodeEcmpRouteExist(nodeIp, cidrBlock string) (bool, error) {
func (c *Controller) checkNodeGwRouteExist(nodeIp, cidrBlock string) (bool, error) {
routes, err := c.ovnClient.GetStaticRouteList(c.config.ClusterRouter)
if err != nil {
klog.Errorf("failed to list static route %v", err)
Expand Down
27 changes: 18 additions & 9 deletions pkg/controller/subnet.go
Original file line number Diff line number Diff line change
Expand Up @@ -936,24 +936,34 @@ func (c *Controller) reconcileGateway(subnet *kubeovnv1.Subnet) error {
}
}
} else {
if err := c.deleteEcmpRouteForNode(subnet); err != nil {
klog.Errorf("failed to delete ecmp route for subnet %s", subnet.Name)
if err := c.deleteInactiveGwRoute(subnet); err != nil {
klog.Errorf("failed to delete route for subnet %s", subnet.Name)
return err
}

var nodeTunlIPAddr []net.IP
// check if activateGateway still ready
if subnet.Status.ActivateGateway != "" && util.GatewayContains(subnet.Spec.GatewayNode, subnet.Status.ActivateGateway) {
node, err := c.nodesLister.Get(subnet.Status.ActivateGateway)
if err == nil && nodeReady(node) {
klog.Infof("subnet %s uses the old activate gw %s", subnet.Name, node.Name)
nodeTunlIPAddr, err = getNodeTunlIP(node)
if err != nil {
klog.Errorf("failed to get gatewayNode tunnel ip for subnet %s", subnet.Name)
return err
}
nextHop := getNextHopByTunnelIP(nodeTunlIPAddr)
if err := c.ovnClient.AddStaticRoute(ovs.PolicySrcIP, subnet.Spec.CIDRBlock, nextHop, c.config.ClusterRouter, util.NormalRouteType); err != nil {
klog.Errorf("failed to add static route, %v", err)
return err
}
return nil
}
}

klog.Info("find a new activate node")
// need a new activate gateway
newActivateNode := ""
var nodeTunlIPAddr []net.IP
for _, gw := range strings.Split(subnet.Spec.GatewayNode, ",") {
// the format of gatewayNodeStr can be like 'kube-ovn-worker:172.18.0.2, kube-ovn-control-plane:172.18.0.3', which consists of node name and designative egress ip
if strings.Contains(gw, ":") {
Expand Down Expand Up @@ -992,6 +1002,7 @@ func (c *Controller) reconcileGateway(subnet *kubeovnv1.Subnet) error {
}
subnet.Status.ActivateGateway = newActivateNode
}
c.patchSubnetStatus(subnet, "ReconcileCentralizedGatewaySuccess", "")

for _, pod := range pods {
if isPodAlive(pod) && pod.Annotations[util.IpAddressAnnotation] != "" && pod.Annotations[util.LogicalSwitchAnnotation] == subnet.Name && pod.Annotations[util.NorthGatewayAnnotation] == "" {
Expand All @@ -1000,8 +1011,6 @@ func (c *Controller) reconcileGateway(subnet *kubeovnv1.Subnet) error {
}
}
}

c.patchSubnetStatus(subnet, "ReconcileCentralizedGatewaySuccess", "")
}
}
return nil
Expand Down Expand Up @@ -1311,7 +1320,7 @@ func (c *Controller) checkGwNodeExists(gatewayNode string) bool {
return found
}

func (c *Controller) deleteEcmpRouteForNode(subnet *kubeovnv1.Subnet) error {
func (c *Controller) deleteInactiveGwRoute(subnet *kubeovnv1.Subnet) error {
for _, gw := range strings.Split(subnet.Spec.GatewayNode, ",") {
// the format of gatewayNodeStr can be like 'kube-ovn-worker:172.18.0.2, kube-ovn-control-plane:172.18.0.3', which consists of node name and designative egress ip
if strings.Contains(gw, ":") {
Expand All @@ -1332,9 +1341,9 @@ func (c *Controller) deleteEcmpRouteForNode(subnet *kubeovnv1.Subnet) error {
continue
}

exist, err := c.checkNodeEcmpRouteExist(ip, cidrBlock)
exist, err := c.checkNodeGwRouteExist(ip, cidrBlock)
if err != nil {
klog.Errorf("get ecmp static route for subnet %v, error %v", subnet.Name, err)
klog.Errorf("get static route for subnet %v, error %v", subnet.Name, err)
break
}

Expand All @@ -1343,7 +1352,7 @@ func (c *Controller) deleteEcmpRouteForNode(subnet *kubeovnv1.Subnet) error {
continue
}

klog.Infof("subnet %v changed to active-standby mode, delete ecmp route for node %s, ip %v", subnet.Name, node.Name, ip)
klog.Infof("subnet %v changed to active-standby mode, delete inactive gateway route for node %s, ip %v", subnet.Name, node.Name, ip)
if err := c.ovnClient.DeleteMatchedStaticRoute(cidrBlock, ip, c.config.ClusterRouter); err != nil {
klog.Errorf("failed to delete static route %s for node %s, %v", ip, node.Name, err)
return err
Expand Down

0 comments on commit 188a9aa

Please sign in to comment.