kubernetes/kops · error

error parsing last kops version updated: %v

Error message

error parsing last kops version updated: %v

What it means

Unless --allow-kops-downgrade is set, Run() reads the kops-version-updated marker file from configBase and parses it as semver. If the marker file exists but its content cannot be parsed by go-semver, Run returns this error. The file is expected to hold a clean semver string like '1.29.2'.

Source

Thrown at upup/pkg/fi/cloudup/apply_cluster.go:283

	err = c.validateKubernetesVersion()
	if err != nil {
		return nil, err
	}

	cluster := c.Cluster

	configBase, err := c.Clientset.VFSContext().BuildVfsPath(cluster.Spec.ConfigStore.Base)
	if err != nil {
		return nil, fmt.Errorf("error parsing configStore.base %q: %v", cluster.Spec.ConfigStore.Base, err)
	}

	if !c.AllowKopsDowngrade {
		kopsVersionUpdatedBytes, err := configBase.Join(registry.PathKopsVersionUpdated).ReadFile(ctx)
		if err == nil {
			kopsVersionUpdated := strings.TrimSpace(string(kopsVersionUpdatedBytes))
			version, err := semver.Parse(kopsVersionUpdated)
			if err != nil {
				return nil, fmt.Errorf("error parsing last kops version updated: %v", err)
			}
			if version.GT(semver.MustParse(kopsbase.Version)) {
				fmt.Printf("\n")
				fmt.Printf("%s\n", starline)
				fmt.Printf("\n")
				fmt.Printf("The cluster was last updated by kops version %s\n", kopsVersionUpdated)
				fmt.Printf("To permit updating by the older version %s, run with the --allow-kops-downgrade flag\n", kopsbase.Version)
				fmt.Printf("\n")
				fmt.Printf("%s\n", starline)
				fmt.Printf("\n")
				return nil, fmt.Errorf("kops version older than last used to update the cluster")
			}
		} else if err != os.ErrNotExist {
			return nil, fmt.Errorf("error reading last kops version used to update: %v", err)
		}
	}

	cloud := c.Cloud

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Inspect and fix the marker object in the state store: read <configBase>/kops-version-updated and replace its content with a valid semver (e.g. the kops version that last updated, like 1.29.2).
  2. If the value is plausible but malformed, rewrite it with a supported semver via your cloud CLI (aws s3 cp, gcloud storage cp).
  3. As a last resort delete the marker so kops recreates it, after confirming no real downgrade will occur (with --allow-kops-downgrade for the next run).

Example fix

// marker file content
// before
"1.29.2-latest"
// after
"1.29.2"
Defensive patterns

Strategy: type-guard

Validate before calling

raw := strings.TrimSpace(string(markerBytes))
if _, err := semver.Parse(raw); err != nil {
    return fmt.Errorf("kops-version-updated marker malformed: %q", raw)
}

Type guard

func isValidKopsVersion(raw string) bool {
    _, err := semver.Parse(strings.TrimSpace(raw))
    return err == nil
}

Prevention

When it happens

Trigger: The file at <configBase>/kops-version-updated (registry.PathKopsVersionUpdated) contains garbage, extra non-semver text, an empty string, or a non-semver version (e.g. 'v1.2.3-alpha.0.615+cc55' variants with unsupported syntax, or truncation from a failed write).

Common situations: Corrupted state-store object from an interrupted upload; someone manually edited or echoed the marker; an object sync/backup tool mangled the file encoding (BOM, newlines+CRLF usually fine after TrimSpace, but embedded text breaks it).

Related errors


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