diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index ea829014121..9903dd988e9 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -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 } } diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index 4fdf947485b..69579c669af 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -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 {