kubernetes/kops · error

cannot merge ManagedFieldsEntry apiVersion %q with apiVersio

Error message

cannot merge ManagedFieldsEntry apiVersion %q with apiVersion %q

What it means

mergeManagedFields requires all ManagedFieldEntry values in a group to have the same apiVersion, since a single merged entry can only carry one. If a later entry's APIVersion differs from the first, merging would silently corrupt ownership, so it returns this error naming both apiVersions.

Source

Thrown at pkg/applylib/applyset/managedfields.go:173

// mergeManagedFields merges a set of ManagedFieldEntry managed fields, that are expected to have the same key.
func mergeManagedFields(managedFields []metav1.ManagedFieldsEntry) (*fieldpath.Set, error) {
	if len(managedFields) == 0 {
		return nil, fmt.Errorf("no managed fields supplied")
	}

	union, err := toFieldPathSet(&managedFields[0])
	if err != nil {
		return nil, err
	}

	for i := range managedFields {
		if i == 0 {
			continue
		}
		m := &managedFields[i]
		if managedFields[0].APIVersion != m.APIVersion {
			return nil, fmt.Errorf("cannot merge ManagedFieldsEntry apiVersion %q with apiVersion %q", managedFields[0].APIVersion, m.APIVersion)
		}

		set, err := toFieldPathSet(m)
		if err != nil {
			return nil, err
		}
		union = union.Union(set)
	}
	return union, nil
}

// toFieldPathSet converts an encoded ManagedFieldsEntry to a set of managed fields (a fieldpath.Set)
func toFieldPathSet(fields *metav1.ManagedFieldsEntry) (*fieldpath.Set, error) {
	// https://github.com/kubernetes/kubernetes/blob/v1.27.1/staging/src/k8s.io/client-go/util/csaupgrade/upgrade.go#L310-L315
	var fieldSet fieldpath.Set
	if err := fieldSet.FromJSON(bytes.NewReader(fields.FieldsV1.Raw)); err != nil {
		return nil, err
	}

View on GitHub (pinned to 4c8573c808)

Solutions

  1. Inspect managedFields with `kubectl get <obj> -o yaml --show-managed-fields` to find the mixed apiVersion entries.
  2. Remove the stale entry for the old apiVersion (apply the object once with server-side apply against the current version, or kubectl replace) and re-run migration.
  3. Update the grouping in mergeFieldManagers to key on apiVersion as well, so entries of differing apiVersions merge separately.

Example fix

// before: group key only by manager
key := entry.Manager
// after: include apiVersion so versions never mix
key := entry.Manager + "/" + entry.APIVersion
Defensive patterns

Strategy: validation

Validate before calling

versions := map[string]bool{}
for _, m := range entries {
    versions[m.APIVersion] = true
}
if len(versions) > 1 {
    return fmt.Errorf("mixed apiVersions in managedFields: %v", versions)
}

Try / catch

if err := migrate(ctx, obj); err != nil && strings.Contains(err.Error(), "cannot merge ManagedFieldsEntry apiVersion") {
    // drop stale old-version entries then retry
    return stripStaleManagedFieldsAndRetry(ctx, obj)
}

Prevention

When it happens

Trigger: An object's managedFields contain entries for the same manager key but recorded under different apiVersions — e.g. the object was applied both as v1beta1 and v1 (a CRD version bump), or a stored version changed after a CRD upgrade.

Common situations: CRD stored-version migration (v1beta1 -> v1) leaving mixed-version managedFields entries; tools applying the same object through different API versions over time.

Related errors


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