diff --git a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go index ad8b0a90857..7e3ab4c4f38 100644 --- a/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go +++ b/cmd/kubeadm/app/apis/kubeadm/fuzzer/fuzzer.go @@ -77,10 +77,11 @@ func fuzzClusterConfiguration(obj *kubeadm.ClusterConfiguration, c fuzz.Continue // Pinning values for fields that get defaults if fuzz value is empty string or nil (thus making the round trip test fail) obj.CertificatesDir = "foo" - obj.CIImageRepository = "" //This fields doesn't exists in public API >> using default to get the roundtrip test pass obj.ClusterName = "bar" obj.ImageRepository = "baz" + obj.CIImageRepository = "" // This fields doesn't exists in public API >> using default to get the roundtrip test pass obj.KubernetesVersion = "qux" + obj.CIKubernetesVersion = "" // This fields doesn't exists in public API >> using default to get the roundtrip test pass obj.APIServer.TimeoutForControlPlane = &metav1.Duration{ Duration: constants.DefaultControlPlaneTimeout, } diff --git a/cmd/kubeadm/app/apis/kubeadm/types.go b/cmd/kubeadm/app/apis/kubeadm/types.go index 94ed5399be5..e48431f1e6d 100644 --- a/cmd/kubeadm/app/apis/kubeadm/types.go +++ b/cmd/kubeadm/app/apis/kubeadm/types.go @@ -84,9 +84,15 @@ type ClusterConfiguration struct { // Networking holds configuration for the networking topology of the cluster. Networking Networking + // KubernetesVersion is the target version of the control plane. KubernetesVersion string + // CIKubernetesVersion is the target CI version of the control plane. + // Useful for running kubeadm with CI Kubernetes version. + // +k8s:conversion-gen=false + CIKubernetesVersion string + // ControlPlaneEndpoint sets a stable IP address or DNS name for the control plane; it // can be a valid IP address or a RFC-1123 DNS subdomain, both with optional TCP port. // In case the ControlPlaneEndpoint is not specified, the AdvertiseAddress + BindPort diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go index 1b4d9ff0401..6353a90a04f 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta2/zz_generated.conversion.go @@ -346,6 +346,7 @@ func autoConvert_kubeadm_ClusterConfiguration_To_v1beta2_ClusterConfiguration(in return err } out.KubernetesVersion = in.KubernetesVersion + // INFO: in.CIKubernetesVersion opted out of conversion generation out.ControlPlaneEndpoint = in.ControlPlaneEndpoint if err := Convert_kubeadm_APIServer_To_v1beta2_APIServer(&in.APIServer, &out.APIServer, s); err != nil { return err diff --git a/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go b/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go index 32e96343217..032f86ca3ca 100644 --- a/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go +++ b/cmd/kubeadm/app/apis/kubeadm/v1beta3/zz_generated.conversion.go @@ -345,6 +345,7 @@ func autoConvert_kubeadm_ClusterConfiguration_To_v1beta3_ClusterConfiguration(in return err } out.KubernetesVersion = in.KubernetesVersion + // INFO: in.CIKubernetesVersion opted out of conversion generation out.ControlPlaneEndpoint = in.ControlPlaneEndpoint if err := Convert_kubeadm_APIServer_To_v1beta3_APIServer(&in.APIServer, &out.APIServer, s); err != nil { return err diff --git a/cmd/kubeadm/app/phases/uploadconfig/uploadconfig.go b/cmd/kubeadm/app/phases/uploadconfig/uploadconfig.go index 98ca93190a3..46c776e114b 100644 --- a/cmd/kubeadm/app/phases/uploadconfig/uploadconfig.go +++ b/cmd/kubeadm/app/phases/uploadconfig/uploadconfig.go @@ -49,6 +49,11 @@ func UploadConfiguration(cfg *kubeadmapi.InitConfiguration, client clientset.Int clusterConfigurationToUpload := cfg.ClusterConfiguration.DeepCopy() clusterConfigurationToUpload.ComponentConfigs = kubeadmapi.ComponentConfigMap{} + // restore the resolved Kubernetes version as CI Kubernetes version if needed + if len(clusterConfigurationToUpload.CIKubernetesVersion) > 0 { + clusterConfigurationToUpload.KubernetesVersion = clusterConfigurationToUpload.CIKubernetesVersion + } + // Marshal the ClusterConfiguration into YAML clusterConfigurationYaml, err := configutil.MarshalKubeadmConfigObject(clusterConfigurationToUpload) if err != nil { diff --git a/cmd/kubeadm/app/util/config/common.go b/cmd/kubeadm/app/util/config/common.go index 3b978ddd515..c8aba7e48e5 100644 --- a/cmd/kubeadm/app/util/config/common.go +++ b/cmd/kubeadm/app/util/config/common.go @@ -18,6 +18,7 @@ package config import ( "bytes" + "fmt" "net" "reflect" "strings" @@ -90,8 +91,10 @@ func validateSupportedVersion(gv schema.GroupVersion, allowDeprecated bool) erro // image registry if requested for CI builds, and validates minimal // version that kubeadm SetInitDynamicDefaultssupports. func NormalizeKubernetesVersion(cfg *kubeadmapi.ClusterConfiguration) error { + isCIVersion := kubeadmutil.KubernetesIsCIVersion(cfg.KubernetesVersion) + // Requested version is automatic CI build, thus use KubernetesCI Image Repository for core images - if kubeadmutil.KubernetesIsCIVersion(cfg.KubernetesVersion) { + if isCIVersion { cfg.CIImageRepository = constants.DefaultCIImageRepository } @@ -100,6 +103,12 @@ func NormalizeKubernetesVersion(cfg *kubeadmapi.ClusterConfiguration) error { if err != nil { return err } + + // Requested version is automatic CI build, thus mark CIKubernetesVersion as `ci/` + if isCIVersion { + cfg.CIKubernetesVersion = fmt.Sprintf("ci/%s", ver) + } + cfg.KubernetesVersion = ver // Parse the given kubernetes version and make sure it's higher than the lowest supported