diff --git a/cmd/kubelet/app/server.go b/cmd/kubelet/app/server.go index b755d4e5bfc..fd4aa687e3b 100644 --- a/cmd/kubelet/app/server.go +++ b/cmd/kubelet/app/server.go @@ -1120,7 +1120,7 @@ func RunKubelet(kubeServer *options.KubeletServer, kubeDeps *kubelet.Dependencie // Setup event recorder if required. makeEventRecorder(kubeDeps, nodeName) - nodeIPs, err := nodeutil.ParseNodeIPArgument(kubeServer.NodeIP, kubeServer.CloudProvider) + nodeIPs, err := nodeutil.ParseNodeIPArgument(kubeServer.NodeIP, kubeServer.CloudProvider, false) if err != nil { return fmt.Errorf("bad --node-ip %q: %v", kubeServer.NodeIP, err) } diff --git a/staging/src/k8s.io/component-helpers/node/util/ips.go b/staging/src/k8s.io/component-helpers/node/util/ips.go index d0edd8c0532..60d3097cc88 100644 --- a/staging/src/k8s.io/component-helpers/node/util/ips.go +++ b/staging/src/k8s.io/component-helpers/node/util/ips.go @@ -63,10 +63,14 @@ func parseNodeIP(nodeIP string, allowDual, sloppy bool) ([]net.IP, error) { } // ParseNodeIPArgument parses kubelet's --node-ip argument. If nodeIP contains invalid -// values, they will be logged and ignored. Dual-stack node IPs are only supported if -// cloudProvider is unset. -func ParseNodeIPArgument(nodeIP, cloudProvider string) ([]net.IP, error) { - return parseNodeIP(nodeIP, cloudProvider == cloudProviderNone, true) +// values, they will be logged and ignored. Dual-stack node IPs are allowed if +// cloudProvider is unset, or if it is `"external"` and allowCloudDualStack is true. +func ParseNodeIPArgument(nodeIP, cloudProvider string, allowCloudDualStack bool) ([]net.IP, error) { + var allowDualStack bool + if (cloudProvider == cloudProviderNone) || (cloudProvider == cloudProviderExternal && allowCloudDualStack) { + allowDualStack = true + } + return parseNodeIP(nodeIP, allowDualStack, true) } // ParseNodeIPAnnotation parses the `alpha.kubernetes.io/provided-node-ip` annotation, diff --git a/staging/src/k8s.io/component-helpers/node/util/ips_test.go b/staging/src/k8s.io/component-helpers/node/util/ips_test.go index 250aae91c59..8afb03f5cf2 100644 --- a/staging/src/k8s.io/component-helpers/node/util/ips_test.go +++ b/staging/src/k8s.io/component-helpers/node/util/ips_test.go @@ -164,17 +164,29 @@ func TestParseNodeIPArgument(t *testing.T) { }, } + configurations := []struct { + cloudProvider string + allowCloudDualStack bool + dualStackSupported bool + }{ + {cloudProviderNone, false, true}, + {cloudProviderNone, true, true}, + {cloudProviderExternal, false, false}, + {cloudProviderExternal, true, true}, + {"gce", false, false}, + {"gce", true, false}, + } + for _, tc := range testCases { - for _, cloudProvider := range []string{cloudProviderNone, cloudProviderExternal, "gce"} { - desc := fmt.Sprintf("%s, cloudProvider=%q", tc.desc, cloudProvider) + for _, conf := range configurations { + desc := fmt.Sprintf("%s, cloudProvider=%q, allowCloudDualStack=%v", tc.desc, conf.cloudProvider, conf.allowCloudDualStack) t.Run(desc, func(t *testing.T) { - parsed, err := ParseNodeIPArgument(tc.in, cloudProvider) + parsed, err := ParseNodeIPArgument(tc.in, conf.cloudProvider, conf.allowCloudDualStack) expectedOut := tc.out expectedErr := tc.err - // Dual-stack is only supported with no cloudProvider - if cloudProvider != "" { + if !conf.dualStackSupported { if len(tc.out) == 2 { expectedOut = nil }