Fix ServiceLB dual-stack ingress IP listing

Signed-off-by: Brad Davidson <brad.davidson@rancher.com>
pull/7010/head
Brad Davidson 2023-02-17 00:53:37 +00:00 committed by Brad Davidson
parent 97100de8d0
commit 0a2bdfdd7a
1 changed files with 9 additions and 37 deletions

View File

@ -2,7 +2,6 @@ package cloudprovider
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"sort" "sort"
"strconv" "strconv"
@ -375,11 +374,11 @@ func (k *k3s) podIPs(pods []*core.Pod, svc *core.Service, readyNodes map[string]
return ips, nil return ips, nil
} }
// filterByIPFamily filters ips based on dual-stack parameters of the service // filterByIPFamily filters node IPs based on dual-stack parameters of the service
func filterByIPFamily(ips []string, svc *core.Service) ([]string, error) { func filterByIPFamily(ips []string, svc *core.Service) ([]string, error) {
var ipFamilyPolicy core.IPFamilyPolicyType
var ipv4Addresses []string var ipv4Addresses []string
var ipv6Addresses []string var ipv6Addresses []string
var allAddresses []string
for _, ip := range ips { for _, ip := range ips {
if utilsnet.IsIPv4String(ip) { if utilsnet.IsIPv4String(ip) {
@ -390,42 +389,15 @@ func filterByIPFamily(ips []string, svc *core.Service) ([]string, error) {
} }
} }
if svc.Spec.IPFamilyPolicy != nil { for _, ipFamily := range svc.Spec.IPFamilies {
ipFamilyPolicy = *svc.Spec.IPFamilyPolicy switch ipFamily {
} case core.IPv4Protocol:
allAddresses = append(allAddresses, ipv4Addresses...)
switch ipFamilyPolicy { case core.IPv6Protocol:
case core.IPFamilyPolicySingleStack: allAddresses = append(allAddresses, ipv6Addresses...)
if svc.Spec.IPFamilies[0] == core.IPv4Protocol {
return ipv4Addresses, nil
}
if svc.Spec.IPFamilies[0] == core.IPv6Protocol {
return ipv6Addresses, nil
}
case core.IPFamilyPolicyPreferDualStack:
if svc.Spec.IPFamilies[0] == core.IPv4Protocol {
ipAddresses := append(ipv4Addresses, ipv6Addresses...)
return ipAddresses, nil
}
if svc.Spec.IPFamilies[0] == core.IPv6Protocol {
ipAddresses := append(ipv6Addresses, ipv4Addresses...)
return ipAddresses, nil
}
case core.IPFamilyPolicyRequireDualStack:
if (len(ipv4Addresses) == 0) || (len(ipv6Addresses) == 0) {
return nil, errors.New("one or more IP families did not have addresses available for service with ipFamilyPolicy=RequireDualStack")
}
if svc.Spec.IPFamilies[0] == core.IPv4Protocol {
ipAddresses := append(ipv4Addresses, ipv6Addresses...)
return ipAddresses, nil
}
if svc.Spec.IPFamilies[0] == core.IPv6Protocol {
ipAddresses := append(ipv6Addresses, ipv4Addresses...)
return ipAddresses, nil
} }
} }
return allAddresses, nil
return nil, errors.New("unhandled ipFamilyPolicy")
} }
// deployDaemonSet ensures that there is a DaemonSet for the service. // deployDaemonSet ensures that there is a DaemonSet for the service.