Skip to content

Commit e2a8379

Browse files
committed
fix sts/vm lsp in incorrect port groups after rescheduled to another node
Signed-off-by: zhangzujian <zhangzujian.7@gmail.com>
1 parent 189ce75 commit e2a8379

8 files changed

Lines changed: 335 additions & 93 deletions

File tree

mocks/pkg/ovs/interface.go

Lines changed: 106 additions & 68 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/controller/node.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,7 @@ func (c *Controller) checkAndUpdateNodePortGroup() error {
971971
}
972972

973973
if err = c.OVNNbClient.PortGroupSetPorts(pgName, nodePorts); err != nil {
974-
klog.Errorf("add ports to port group %s: %v", pgName, err)
974+
klog.Errorf("failed to set ports of port group %s: %v", pgName, err)
975975
return err
976976
}
977977

pkg/controller/pod.go

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -774,14 +774,27 @@ func (c *Controller) reconcileRouteSubnets(pod *v1.Pod, needRoutePodNets []*kube
774774
podIP = pod.Annotations[fmt.Sprintf(util.IPAddressAnnotationTemplate, podNet.ProviderName)]
775775
subnet = podNet.Subnet
776776

777+
pgName := getOverlaySubnetsPortGroupName(subnet.Name, pod.Spec.NodeName)
778+
portName := ovs.PodNameToPortName(podName, pod.Namespace, podNet.ProviderName)
779+
portGroups, err := c.OVNNbClient.ListPortGroups(map[string]string{"subnet": subnet.Name, "node": "", networkPolicyKey: ""})
780+
if err != nil {
781+
klog.Errorf("failed to list port groups: %v", err)
782+
return err
783+
}
784+
pgNames := make([]string, 0, len(portGroups))
785+
for _, pg := range portGroups {
786+
if pg.Name != pgName {
787+
pgNames = append(pgNames, pg.Name)
788+
}
789+
}
790+
777791
if podIP != "" && (subnet.Spec.Vlan == "" || subnet.Spec.LogicalGateway) && subnet.Spec.Vpc == c.config.ClusterRouter {
778792
node, err := c.nodesLister.Get(pod.Spec.NodeName)
779793
if err != nil {
780794
klog.Errorf("failed to get node %s: %v", pod.Spec.NodeName, err)
781795
return err
782796
}
783797

784-
pgName := getOverlaySubnetsPortGroupName(subnet.Name, node.Name)
785798
if c.config.EnableEipSnat && (pod.Annotations[util.EipAnnotation] != "" || pod.Annotations[util.SnatAnnotation] != "") {
786799
cm, err := c.configMapsLister.ConfigMaps(c.config.ExternalGatewayConfigNS).Get(util.ExternalGatewayConfig)
787800
if err != nil {
@@ -839,9 +852,14 @@ func (c *Controller) reconcileRouteSubnets(pod *v1.Pod, needRoutePodNets []*kube
839852
continue
840853
}
841854

842-
portName := ovs.PodNameToPortName(podName, pod.Namespace, podNet.ProviderName)
855+
// remove lsp from other port groups
856+
// we need to do this because the pod, e.g. a sts/vm, can be rescheduled to another node
857+
if err = c.OVNNbClient.RemovePortFromPortGroups(portName, pgNames...); err != nil {
858+
klog.Errorf("failed to remove port %s from port groups %v: %v", portName, pgNames, err)
859+
return err
860+
}
843861
if err := c.OVNNbClient.PortGroupAddPorts(pgName, portName); err != nil {
844-
klog.Errorf("add port to port group %s: %v", pgName, err)
862+
klog.Errorf("failed to add port %s to port group %s: %v", portName, pgName, err)
845863
return err
846864
}
847865

@@ -998,13 +1016,21 @@ func (c *Controller) handleDeletePod(key string) error {
9981016
if err != nil {
9991017
klog.Errorf("failed to get pod nets %v", err)
10001018
}
1001-
if !keepIPCR {
1002-
ports, err := c.OVNNbClient.ListNormalLogicalSwitchPorts(true, map[string]string{"pod": podKey})
1003-
if err != nil {
1004-
klog.Errorf("failed to list lsps of pod '%s', %v", pod.Name, err)
1005-
return err
1019+
ports, err := c.OVNNbClient.ListNormalLogicalSwitchPorts(true, map[string]string{"pod": podKey})
1020+
if err != nil {
1021+
klog.Errorf("failed to list lsps of pod %s: %v", podKey, err)
1022+
return err
1023+
}
1024+
if keepIPCR {
1025+
// always remove lsp from port groups
1026+
for _, port := range ports {
1027+
klog.Infof("remove lsp %s from all port groups", port.Name)
1028+
if err = c.OVNNbClient.RemovePortFromPortGroups(port.Name); err != nil {
1029+
klog.Errorf("failed to remove lsp %s from all port groups: %v", port.Name, err)
1030+
return err
1031+
}
10061032
}
1007-
1033+
} else {
10081034
if len(ports) != 0 {
10091035
addresses := c.ipam.GetPodAddress(podKey)
10101036
for _, address := range addresses {

0 commit comments

Comments
 (0)