diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index 84e5207da95..7e593de8949 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -1738,6 +1738,13 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po if err != nil { klog.V(4).InfoS("Cannot get host IPs", "err", err) } else { + if s.HostIP != "" { + if utilnet.IPFamilyOfString(s.HostIP) != utilnet.IPFamilyOf(hostIPs[0]) { + kl.recorder.Eventf(pod, v1.EventTypeWarning, "HostIPsIPFamilyMismatch", + "Kubelet detected an IPv%s node IP (%s), but the cloud provider selected an IPv%s node IP (%s); pass an explicit `--node-ip` to kubelet to fix this.", + utilnet.IPFamilyOfString(s.HostIP), s.HostIP, utilnet.IPFamilyOf(hostIPs[0]), hostIPs[0].String()) + } + } s.HostIP = hostIPs[0].String() // HostNetwork Pods inherit the node IPs as PodIPs. They are immutable once set, // other than that if the node becomes dual-stack, we add the secondary IP. @@ -1749,7 +1756,9 @@ func (kl *Kubelet) generateAPIPodStatus(pod *v1.Pod, podStatus *kubecontainer.Po } // Secondary IP is not set #105320 if len(hostIPs) == 2 && len(s.PodIPs) == 1 { - s.PodIPs = append(s.PodIPs, v1.PodIP{IP: hostIPs[1].String()}) + if utilnet.IPFamilyOfString(s.PodIPs[0].IP) != utilnet.IPFamilyOf(hostIPs[1]) { + s.PodIPs = append(s.PodIPs, v1.PodIP{IP: hostIPs[1].String()}) + } } } } diff --git a/pkg/kubelet/kubelet_pods_test.go b/pkg/kubelet/kubelet_pods_test.go index dd8e7a0ea06..420bc515de5 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -4087,6 +4087,17 @@ func TestNodeAddressUpdatesGenerateAPIPodStatusHostNetworkPodIPs(t *testing.T) { {IP: "2001:db8::2"}, }, }, + { + name: "Update secondary after new secondary address dual-stack - reverse order", + nodeIPs: []string{"2001:db8::2"}, + nodeAddresses: []v1.NodeAddress{ + {Type: v1.NodeInternalIP, Address: "10.0.0.1"}, + {Type: v1.NodeInternalIP, Address: "2001:db8::2"}, + }, + expectedPodIPs: []v1.PodIP{ + {IP: "2001:db8::2"}, + }, + }, } for _, tc := range testcases {