diff --git a/cmd/kubeadm/app/componentconfigs/validation_test.go b/cmd/kubeadm/app/componentconfigs/validation_test.go index 1a9caea6e78..3e15aca0ff6 100644 --- a/cmd/kubeadm/app/componentconfigs/validation_test.go +++ b/cmd/kubeadm/app/componentconfigs/validation_test.go @@ -196,7 +196,7 @@ func TestValidateKubeProxyConfiguration(t *testing.T) { }, }, }, - msg: "must be a valid CIDR block (e.g. 10.100.0.0/16)", + msg: "must be a valid CIDR block (e.g. 10.100.0.0/16 or FD02::0:0:0/96)", expectErr: true, }, { diff --git a/pkg/proxy/apis/config/validation/BUILD b/pkg/proxy/apis/config/validation/BUILD index 063de35c5c2..1cdbb0be574 100644 --- a/pkg/proxy/apis/config/validation/BUILD +++ b/pkg/proxy/apis/config/validation/BUILD @@ -12,6 +12,7 @@ go_library( importpath = "k8s.io/kubernetes/pkg/proxy/apis/config/validation", deps = [ "//pkg/apis/core/validation:go_default_library", + "//pkg/features:go_default_library", "//pkg/proxy/apis/config:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", diff --git a/pkg/proxy/apis/config/validation/validation.go b/pkg/proxy/apis/config/validation/validation.go index 61219f355de..ccd38d1b9f0 100644 --- a/pkg/proxy/apis/config/validation/validation.go +++ b/pkg/proxy/apis/config/validation/validation.go @@ -28,6 +28,7 @@ import ( "k8s.io/apimachinery/pkg/util/validation/field" componentbaseconfig "k8s.io/component-base/config" apivalidation "k8s.io/kubernetes/pkg/apis/core/validation" + kubefeatures "k8s.io/kubernetes/pkg/features" kubeproxyconfig "k8s.io/kubernetes/pkg/proxy/apis/config" ) @@ -67,8 +68,17 @@ func Validate(config *kubeproxyconfig.KubeProxyConfiguration) field.ErrorList { allErrs = append(allErrs, validateHostPort(config.MetricsBindAddress, newPath.Child("MetricsBindAddress"))...) if config.ClusterCIDR != "" { - if _, _, err := net.ParseCIDR(config.ClusterCIDR); err != nil { - allErrs = append(allErrs, field.Invalid(newPath.Child("ClusterCIDR"), config.ClusterCIDR, "must be a valid CIDR block (e.g. 10.100.0.0/16)")) + if config.FeatureGates[string(kubefeatures.IPv6DualStack)] { + cidrs := strings.Split(config.ClusterCIDR, ",") + for _, cidr := range cidrs { + if _, _, err := net.ParseCIDR(cidr); err != nil { + allErrs = append(allErrs, field.Invalid(newPath.Child("ClusterCIDR"), cidr, "must be a valid CIDR block (e.g. 10.100.0.0/16 or FD02::0:0:0/96)")) + } + } + } else { + if _, _, err := net.ParseCIDR(config.ClusterCIDR); err != nil { + allErrs = append(allErrs, field.Invalid(newPath.Child("ClusterCIDR"), config.ClusterCIDR, "must be a valid CIDR block (e.g. 10.100.0.0/16 or FD02::0:0:0/96)")) + } } } diff --git a/pkg/proxy/apis/config/validation/validation_test.go b/pkg/proxy/apis/config/validation/validation_test.go index e00979259d4..28da03dac00 100644 --- a/pkg/proxy/apis/config/validation/validation_test.go +++ b/pkg/proxy/apis/config/validation/validation_test.go @@ -202,7 +202,7 @@ func TestValidateKubeProxyConfiguration(t *testing.T) { TCPCloseWaitTimeout: &metav1.Duration{Duration: 5 * time.Second}, }, }, - msg: "must be a valid CIDR block (e.g. 10.100.0.0/16)", + msg: "must be a valid CIDR block (e.g. 10.100.0.0/16 or FD02::0:0:0/96)", }, { config: kubeproxyconfig.KubeProxyConfiguration{