{"record":{"id":"1d183e88d336c6ee","repo":"kubernetes/kops","slug":"unable-to-parse-kubernetes-version-q-1d183e","errorCode":null,"errorMessage":"unable to parse kubernetes version %q","messagePattern":"unable to parse kubernetes version %q","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"upup/pkg/fi/cloudup/new_cluster.go","lineNumber":1710,"sourceCode":"\treturn etcd\n}\n\nfunc addCiliumNetwork(cluster *api.Cluster) {\n\tcilium := &api.CiliumNetworkingSpec{}\n\tcluster.Spec.Networking.Cilium = cilium\n\tcilium.EnableNodePort = true\n\tif cluster.Spec.KubeProxy == nil {\n\t\tcluster.Spec.KubeProxy = &api.KubeProxyConfig{}\n\t}\n\tenabled := false\n\tcluster.Spec.KubeProxy.Enabled = &enabled\n}\n\n// defaultImage returns the default Image, based on the cloudprovider\nfunc defaultImage(cluster *api.Cluster, channel *api.Channel, architecture architectures.Architecture) (string, error) {\n\tkubernetesVersion, err := util.ParseKubernetesVersion(cluster.Spec.KubernetesVersion)\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"unable to parse kubernetes version %q\", cluster.Spec.KubernetesVersion)\n\t}\n\n\tif channel != nil {\n\t\timage := channel.FindImage(cluster.GetCloudProvider(), *kubernetesVersion, architecture)\n\t\tif image != nil {\n\t\t\treturn image.Name, nil\n\t\t}\n\t}\n\n\tswitch cluster.GetCloudProvider() {\n\tcase api.CloudProviderDO:\n\t\treturn defaultDOImageNoble, nil\n\tcase api.CloudProviderHetzner:\n\t\treturn defaultHetznerImageNoble, nil\n\tcase api.CloudProviderScaleway:\n\t\treturn defaultScalewayImageNoble, nil\n\tcase api.CloudProviderLinode:\n\t\treturn defaultLinodeImageNoble, nil","sourceCodeStart":1692,"sourceCodeEnd":1728,"githubUrl":"https://github.com/kubernetes/kops/blob/4c8573c808a73d578c5eadc86d410646ea0b0d73/upup/pkg/fi/cloudup/new_cluster.go#L1692-L1728","documentation":"defaultImage in new_cluster.go parses cluster.Spec.KubernetesVersion with util.ParseKubernetesVersion; when that fails it wraps the failure as 'unable to parse kubernetes version'. It indicates the cluster's kubernetesVersion string is not a valid semantic version.","triggerScenarios":"Setting spec.kubernetesVersion to a non-semver string such as a channel alias, a branch name like \"master\", a value with a prefix like \"v1.29.4\" when the parser requires bare semver, or an empty/garbage value before defaultImage runs.","commonSituations":"Hand-edited cluster.yaml with a typo; using a placeholder version in templates; specifying a dev version like \"1.30.0-alpha.1\" with unexpected formatting; environment substitution leaving a literal variable in the manifest.","solutions":["Set kubernetesVersion to a valid semver, e.g. 1.29.4 (try v-prefixed only if your kops version supports it)","Validate the version locally: `kops get cluster -o yaml` and inspect spec.kubernetesVersion","If using latestStable/alias resolution, resolve it to an explicit version first"],"exampleFix":"// before\nkubernetesVersion: master\n// after\nkubernetesVersion: 1.29.4","handlingStrategy":"validation","validationCode":"if _, err := semver.Parse(strings.TrimPrefix(ver, \"v\")); err != nil {\n    return fmt.Errorf(\"kubernetesVersion %q is not valid semver\", ver)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always use full semver versions (e.g. 1.29.4)","Validate manifests with kops before applying","Avoid templated versions without substitution checks"],"tags":["kubernetes-version","semver","configuration"],"backgroundTag":"version-parse-failed","analyzedSha":"4c8573c808a73d578c5eadc86d410646ea0b0d73","analyzedAt":"2026-09-05T04:13:19.212Z","contentChangedAt":"2026-09-05T04:13:19.212Z","schemaVersion":2},"datasetVersion":"2026-09-12T07:17:12.445Z"}