From 985cf718a43a579a73c812af37af831003a4d1fe Mon Sep 17 00:00:00 2001 From: Zhecheng Li Date: Wed, 22 Mar 2023 12:35:03 +0000 Subject: [PATCH] [Dual-stack] Fix generateAPIPodStatus() of kubelet handling Secondary IP hostIPs order may not be be consistent. If secondary IP is before primary one, current logic adds primary IP twice into PodIPs, which leads to error: "may specify no more than one IP for each IP family". In this case, the second IP shouldn't be added. Co-authored-by: Antonio Ojea --- pkg/kubelet/kubelet_pods.go | 11 ++++++++++- pkg/kubelet/kubelet_pods_test.go | 11 +++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index fbc9104c428..e281915f867 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -1624,6 +1624,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. @@ -1635,7 +1642,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 6d8b622d21d..20786877194 100644 --- a/pkg/kubelet/kubelet_pods_test.go +++ b/pkg/kubelet/kubelet_pods_test.go @@ -3880,6 +3880,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 {