kubernetes/kops · error
cannot parse KubernetesVersion %q in cluster: %w
Error message
cannot parse KubernetesVersion %q in cluster: %w
What it means
RunCreateCluster parses cluster.Spec.KubernetesVersion with kopsutil.ParseKubernetesVersion to decide which well-known addons apply; an unparseable version fails with 'cannot parse KubernetesVersion %q in cluster'. This guards against channel/spec versions that don't match expected semver-like formats.
Source
Thrown at cmd/kops/create_cluster.go:746
if err != nil {
return fmt.Errorf("error populating configuration: %v", err)
}
strict := false
err = validation.DeepValidate(cluster, instanceGroups, strict, clientset.VFSContext(), nil)
if err != nil {
return err
}
assetBuilder := assets.NewAssetBuilder(clientset.VFSContext(), cluster.Spec.Assets, false)
fullCluster, err := cloudup.PopulateClusterSpec(ctx, clientset, cluster, instanceGroups, cloud, assetBuilder)
if err != nil {
return err
}
kubernetesVersion, err := kopsutil.ParseKubernetesVersion(clusterResult.Cluster.Spec.KubernetesVersion)
if err != nil {
return fmt.Errorf("cannot parse KubernetesVersion %q in cluster: %w", clusterResult.Cluster.Spec.KubernetesVersion, err)
}
addons, err := wellknownoperators.CreateAddons(clusterResult.Channel, kubernetesVersion, fullCluster)
if err != nil {
return err
}
for _, p := range c.AddonPaths {
addon, err := clusteraddons.LoadClusterAddon(clientset.VFSContext(), p)
if err != nil {
return fmt.Errorf("error loading cluster addon %s: %v", p, err)
}
addons = append(addons, addon.Objects...)
}
{
// Build full IG spec to ensure we end up with a valid IG
fullInstanceGroups := []*api.InstanceGroup{}View on GitHub (pinned to 4c8573c808)
Solutions
- Set KubernetesVersion to a valid plain version like 1.28.4 (no v prefix needed, no aliases)
- Run `kops replace -f` / `kops edit cluster` with the corrected version, then rerun create/update
- Check for typos (e.g. stray characters, whitespace) in the cluster manifest
- Upgrade kops if the version format is newer than the tool understands
Example fix
// before (cluster.yaml) kubernetesVersion: "v1.28 latest" // after kubernetesVersion: "1.28.4"
Defensive patterns
Strategy: validation
Validate before calling
func validK8sVersion(v string) error {
if v == "" { return fmt.Errorf("kubernetesVersion empty") }
v = strings.TrimPrefix(v, "v")
parts := strings.Split(v, ".")
if len(parts) < 2 { return fmt.Errorf("want major.minor[.patch]: %q", v) }
for _, p := range parts {
if _, err := strconv.Atoi(p); err != nil {
return fmt.Errorf("bad version %q: %w", v, err)
}
}
return nil
} Prevention
- Use plain semver strings (1.28.4) in cluster specs
- Avoid free-text versions or channel aliases in KubernetesVersion
- Validate manifests with a schema check before kops replace
- Keep kops current so new version formats parse
When it happens
Trigger: Creating a cluster whose spec has a KubernetesVersion that isn't a valid version string — e.g. a placeholder, a channel alias, an empty string, or a typo like '1.2x.3'.
Common situations: Manually editing the cluster spec with a bad version; using an alpha/dev version string format not accepted; copying a spec from another cluster with a custom version; newest kops rejecting a legacy version format.
Related errors
- failed to parse objects: %w
- unable to parse KubernetesVersion %q: %w
- invalid addon location: %q
- KubernetesVersion not set
- invalid Azure zone: %q
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/3446c4664cb8b656.
Report an issue: GitHub.