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

  1. Set KubernetesVersion to a valid plain version like 1.28.4 (no v prefix needed, no aliases)
  2. Run `kops replace -f` / `kops edit cluster` with the corrected version, then rerun create/update
  3. Check for typos (e.g. stray characters, whitespace) in the cluster manifest
  4. 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

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


AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05). Data as JSON: /api/errors/3446c4664cb8b656. Report an issue: GitHub.