@@ -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