Make kubelet always canonicalize the PodIPs

This commit is contained in:
Dan Winship 2025-02-11 17:43:17 -05:00
parent 6512de76ce
commit e31a3989fc
2 changed files with 20 additions and 9 deletions

View File

@ -22,6 +22,7 @@ import (
goerrors "errors"
"fmt"
"io"
"net"
"net/http"
"net/url"
"os"
@ -1988,23 +1989,27 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po
// and use them for the Pod.Status.PodIPs and the Downward API environment variables
func (kl *Kubelet) sortPodIPs(podIPs []string) []string {
ips := make([]string, 0, 2)
var validPrimaryIP, validSecondaryIP func(ip string) bool
var validPrimaryIP, validSecondaryIP func(ip net.IP) bool
if len(kl.nodeIPs) == 0 || utilnet.IsIPv4(kl.nodeIPs[0]) {
validPrimaryIP = utilnet.IsIPv4String
validSecondaryIP = utilnet.IsIPv6String
validPrimaryIP = utilnet.IsIPv4
validSecondaryIP = utilnet.IsIPv6
} else {
validPrimaryIP = utilnet.IsIPv6String
validSecondaryIP = utilnet.IsIPv4String
validPrimaryIP = utilnet.IsIPv6
validSecondaryIP = utilnet.IsIPv4
}
for _, ip := range podIPs {
// We parse and re-stringify the IPs in case the values from CRI use an irregular format.
for _, ipStr := range podIPs {
ip := utilnet.ParseIPSloppy(ipStr)
if validPrimaryIP(ip) {
ips = append(ips, ip)
ips = append(ips, ip.String())
break
}
}
for _, ip := range podIPs {
for _, ipStr := range podIPs {
ip := utilnet.ParseIPSloppy(ipStr)
if validSecondaryIP(ip) {
ips = append(ips, ip)
ips = append(ips, ip.String())
break
}
}

View File

@ -4580,6 +4580,12 @@ func TestSortPodIPs(t *testing.T) {
podIPs: []string{"10.0.0.1", "10.0.0.2", "fd01::1234", "10.0.0.3", "fd01::5678"},
expectedIPs: []string{"10.0.0.1", "fd01::1234"},
},
{
name: "Badly-formatted IPs from CRI",
nodeIP: "",
podIPs: []string{"010.000.000.001", "fd01:0:0:0:0:0:0:1234"},
expectedIPs: []string{"10.0.0.1", "fd01::1234"},
},
}
for _, tc := range testcases {