@@ -40,6 +40,7 @@ import (
40
40
"k8s.io/kubernetes/cmd/kubeadm/app/features"
41
41
kubeadmutil "k8s.io/kubernetes/cmd/kubeadm/app/util"
42
42
"k8s.io/kubernetes/pkg/registry/core/service/ipallocator"
43
+ utilnet "k8s.io/utils/net"
43
44
)
44
45
45
46
// ValidateInitConfiguration validates an InitConfiguration object and collects all encountered errors
@@ -48,6 +49,7 @@ func ValidateInitConfiguration(c *kubeadm.InitConfiguration) field.ErrorList {
48
49
allErrs = append (allErrs , ValidateNodeRegistrationOptions (& c .NodeRegistration , field .NewPath ("nodeRegistration" ))... )
49
50
allErrs = append (allErrs , ValidateBootstrapTokens (c .BootstrapTokens , field .NewPath ("bootstrapTokens" ))... )
50
51
allErrs = append (allErrs , ValidateClusterConfiguration (& c .ClusterConfiguration )... )
52
+ // TODO(Arvinderpal): update advertiseAddress validation for dual-stack once it's implemented.
51
53
allErrs = append (allErrs , ValidateAPIEndpoint (& c .LocalAPIEndpoint , field .NewPath ("localAPIEndpoint" ))... )
52
54
// TODO: Maybe validate that .CertificateKey is a valid hex encoded AES key
53
55
return allErrs
@@ -56,7 +58,7 @@ func ValidateInitConfiguration(c *kubeadm.InitConfiguration) field.ErrorList {
56
58
// ValidateClusterConfiguration validates an ClusterConfiguration object and collects all encountered errors
57
59
func ValidateClusterConfiguration (c * kubeadm.ClusterConfiguration ) field.ErrorList {
58
60
allErrs := field.ErrorList {}
59
- allErrs = append (allErrs , ValidateNetworking (& c . Networking , field .NewPath ("networking" ))... )
61
+ allErrs = append (allErrs , ValidateNetworking (c , field .NewPath ("networking" ))... )
60
62
allErrs = append (allErrs , ValidateAPIServer (& c .APIServer , field .NewPath ("apiServer" ))... )
61
63
allErrs = append (allErrs , ValidateAbsolutePath (c .CertificatesDir , field .NewPath ("certificatesDir" ))... )
62
64
allErrs = append (allErrs , ValidateFeatureGates (c .FeatureGates , field .NewPath ("featureGates" ))... )
@@ -369,30 +371,53 @@ func ValidateHostPort(endpoint string, fldPath *field.Path) field.ErrorList {
369
371
}
370
372
371
373
// ValidateIPNetFromString validates network portion of ip address
372
- func ValidateIPNetFromString (subnet string , minAddrs int64 , fldPath * field.Path ) field.ErrorList {
374
+ func ValidateIPNetFromString (subnetStr string , minAddrs int64 , isDualStack bool , fldPath * field.Path ) field.ErrorList {
373
375
allErrs := field.ErrorList {}
374
- _ , svcSubnet , err := net .ParseCIDR (subnet )
375
- if err != nil {
376
- allErrs = append (allErrs , field .Invalid (fldPath , subnet , "couldn't parse subnet" ))
377
- return allErrs
378
- }
379
- numAddresses := ipallocator .RangeSize (svcSubnet )
380
- if numAddresses < minAddrs {
381
- allErrs = append (allErrs , field .Invalid (fldPath , subnet , "subnet is too small" ))
376
+ if isDualStack {
377
+ subnets , err := utilnet .ParseCIDRs (strings .Split (subnetStr , "," ))
378
+ if err != nil {
379
+ allErrs = append (allErrs , field .Invalid (fldPath , subnetStr , err .Error ()))
380
+ } else {
381
+ areDualStackCIDRs , err := utilnet .IsDualStackCIDRs (subnets )
382
+ if err != nil {
383
+ allErrs = append (allErrs , field .Invalid (fldPath , subnets , err .Error ()))
384
+ } else if ! areDualStackCIDRs {
385
+ allErrs = append (allErrs , field .Invalid (fldPath , subnetStr , "expected at least one IP from each family (v4 or v6) for dual-stack networking" ))
386
+ }
387
+ for _ , s := range subnets {
388
+ numAddresses := ipallocator .RangeSize (s )
389
+ if numAddresses < minAddrs {
390
+ allErrs = append (allErrs , field .Invalid (fldPath , s , "subnet is too small" ))
391
+ }
392
+ }
393
+ }
394
+ } else {
395
+ _ , svcSubnet , err := net .ParseCIDR (subnetStr )
396
+ if err != nil {
397
+ allErrs = append (allErrs , field .Invalid (fldPath , subnetStr , "couldn't parse subnet" ))
398
+ return allErrs
399
+ }
400
+ numAddresses := ipallocator .RangeSize (svcSubnet )
401
+ if numAddresses < minAddrs {
402
+ allErrs = append (allErrs , field .Invalid (fldPath , subnetStr , "subnet is too small" ))
403
+ }
382
404
}
383
405
return allErrs
384
406
}
385
407
386
408
// ValidateNetworking validates networking configuration
387
- func ValidateNetworking (c * kubeadm.Networking , fldPath * field.Path ) field.ErrorList {
409
+ func ValidateNetworking (c * kubeadm.ClusterConfiguration , fldPath * field.Path ) field.ErrorList {
388
410
allErrs := field.ErrorList {}
389
411
dnsDomainFldPath := field .NewPath ("dnsDomain" )
390
- for _ , err := range validation .IsDNS1123Subdomain (c .DNSDomain ) {
391
- allErrs = append (allErrs , field .Invalid (dnsDomainFldPath , c .DNSDomain , err ))
412
+ for _ , err := range validation .IsDNS1123Subdomain (c .Networking . DNSDomain ) {
413
+ allErrs = append (allErrs , field .Invalid (dnsDomainFldPath , c .Networking . DNSDomain , err ))
392
414
}
393
- allErrs = append (allErrs , ValidateIPNetFromString (c .ServiceSubnet , constants .MinimumAddressesInServiceSubnet , field .NewPath ("serviceSubnet" ))... )
394
- if len (c .PodSubnet ) != 0 {
395
- allErrs = append (allErrs , ValidateIPNetFromString (c .PodSubnet , constants .MinimumAddressesInServiceSubnet , field .NewPath ("podSubnet" ))... )
415
+ // check if dual-stack feature-gate is enabled
416
+ isDualStack := features .Enabled (c .FeatureGates , features .IPv6DualStack )
417
+ // TODO(Arvinderpal): use isDualStack flag once list of service CIDRs is supported (PR: #79386)
418
+ allErrs = append (allErrs , ValidateIPNetFromString (c .Networking .ServiceSubnet , constants .MinimumAddressesInServiceSubnet , false /*isDualStack*/ , field .NewPath ("serviceSubnet" ))... )
419
+ if len (c .Networking .PodSubnet ) != 0 {
420
+ allErrs = append (allErrs , ValidateIPNetFromString (c .Networking .PodSubnet , constants .MinimumAddressesInServiceSubnet , isDualStack , field .NewPath ("podSubnet" ))... )
396
421
}
397
422
return allErrs
398
423
}
@@ -455,7 +480,6 @@ func ValidateFeatureGates(featureGates map[string]bool, fldPath *field.Path) fie
455
480
fmt .Sprintf ("%s is not a valid feature name." , k )))
456
481
}
457
482
}
458
-
459
483
return allErrs
460
484
}
461
485
0 commit comments