@@ -1932,6 +1932,8 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st
19321932 macPointer = ptr .To ("" )
19331933 }
19341934
1935+ var err error
1936+ var nsNets []* kubeovnNet
19351937 ippoolStr := pod .Annotations [fmt .Sprintf (util .IPPoolAnnotationTemplate , podNet .ProviderName )]
19361938 if ippoolStr == "" {
19371939 ns , err := c .namespacesLister .Get (pod .Namespace )
@@ -1942,6 +1944,15 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st
19421944
19431945 if len (ns .Annotations ) != 0 {
19441946 if ipPoolList , ok := ns .Annotations [util .IPPoolAnnotation ]; ok {
1947+ if nsNets , err = c .getNsAvailableSubnets (pod , podNet ); err != nil {
1948+ klog .Errorf ("failed to get available subnets for pod %s/%s, %v" , pod .Namespace , pod .Name , err )
1949+ return "" , "" , "" , podNet .Subnet , err
1950+ }
1951+ subnetNames := make ([]string , 0 , len (nsNets ))
1952+ for _ , net := range nsNets {
1953+ subnetNames = append (subnetNames , net .Subnet .Name )
1954+ }
1955+
19451956 for ipPoolName := range strings .SplitSeq (ipPoolList , "," ) {
19461957 ippool , err := c .ippoolLister .Get (ipPoolName )
19471958 if err != nil {
@@ -1965,10 +1976,18 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st
19651976 }
19661977 }
19671978
1968- if ippool .Spec .Subnet == podNet .Subnet .Name {
1969- ippoolStr = ippool .Name
1970- break
1979+ for _ , net := range nsNets {
1980+ if net .Subnet .Name == ippool .Spec .Subnet {
1981+ ippoolStr = ippool .Name
1982+ podNet .Subnet = net .Subnet
1983+ break
1984+ }
19711985 }
1986+ break
1987+ }
1988+ if ippoolStr == "" {
1989+ klog .Infof ("no available ippool in subnets %s for pod %s/%s" , strings .Join (subnetNames , "," ), pod .Namespace , pod .Name )
1990+ return "" , "" , "" , podNet .Subnet , ipam .ErrNoAvailable
19721991 }
19731992 }
19741993 }
@@ -2007,9 +2026,14 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st
20072026 portName := ovs .PodNameToPortName (podName , pod .Namespace , podNet .ProviderName )
20082027
20092028 // The static ip can be assigned from any subnet after ns supports multi subnets
2010- nsNets , _ := c .getNsAvailableSubnets (pod , podNet )
2029+ if nsNets == nil {
2030+ if nsNets , err = c .getNsAvailableSubnets (pod , podNet ); err != nil {
2031+ klog .Errorf ("failed to get available subnets for pod %s/%s, %v" , pod .Namespace , pod .Name , err )
2032+ return "" , "" , "" , podNet .Subnet , err
2033+ }
2034+ }
2035+
20112036 var v4IP , v6IP , mac string
2012- var err error
20132037
20142038 // Static allocate
20152039 if pod .Annotations [fmt .Sprintf (util .IPAddressAnnotationTemplate , podNet .ProviderName )] != "" {
@@ -2041,9 +2065,13 @@ func (c *Controller) acquireAddress(pod *v1.Pod, podNet *kubeovnNet) (string, st
20412065
20422066 if len (ipPool ) == 1 && (! strings .ContainsRune (ipPool [0 ], ',' ) && net .ParseIP (ipPool [0 ]) == nil ) {
20432067 var skippedAddrs []string
2068+ pool , err := c .ippoolLister .Get (ipPool [0 ])
2069+ if err != nil {
2070+ klog .Errorf ("failed to get ippool %s: %v" , ipPool [0 ], err )
2071+ return "" , "" , "" , podNet .Subnet , err
2072+ }
20442073 for {
2045- portName := ovs .PodNameToPortName (podName , pod .Namespace , podNet .ProviderName )
2046- ipv4 , ipv6 , mac , err := c .ipam .GetRandomAddress (key , portName , macPointer , podNet .Subnet .Name , ipPool [0 ], skippedAddrs , ! podNet .AllowLiveMigration )
2074+ ipv4 , ipv6 , mac , err := c .ipam .GetRandomAddress (key , portName , macPointer , pool .Spec .Subnet , ipPool [0 ], skippedAddrs , ! podNet .AllowLiveMigration )
20472075 if err != nil {
20482076 klog .Error (err )
20492077 return "" , "" , "" , podNet .Subnet , err
@@ -2293,17 +2321,16 @@ func (c *Controller) getNameByPod(pod *v1.Pod) string {
22932321
22942322// When subnet's v4availableIPs is 0 but still there's available ip in exclude-ips, the static ip in exclude-ips can be allocated normal.
22952323func (c * Controller ) getNsAvailableSubnets (pod * v1.Pod , podNet * kubeovnNet ) ([]* kubeovnNet , error ) {
2296- var result []* kubeovnNet
22972324 // keep the annotation subnet of the pod in first position
2298- result = append ( result , podNet )
2325+ result := [] * kubeovnNet { podNet }
22992326
23002327 ns , err := c .namespacesLister .Get (pod .Namespace )
23012328 if err != nil {
23022329 klog .Errorf ("failed to get namespace %s, %v" , pod .Namespace , err )
23032330 return nil , err
23042331 }
23052332 if ns .Annotations == nil {
2306- return nil , nil
2333+ return [] * kubeovnNet {} , nil
23072334 }
23082335
23092336 subnetNames := ns .Annotations [util .LogicalSwitchAnnotation ]
0 commit comments