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
- Inspect managedFields with `kubectl get <obj> -o yaml --show-managed-fields` to find the mixed apiVersion entries.
- 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.
- 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
- Complete CRD stored-version migrations before migrating managed fields.
- Group managedFields by (manager, apiVersion), not manager alone.
- Audit managedFields with --show-managed-fields after CRD version bumps.
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
- failed to create managed-fields patch: %w
- failed to patch object managed-fields for %q: %w
- failed to marsal %q into json: %w
- no managed fields supplied
- failed to parse apiVersion %q
AI-assisted analysis of kubernetes/kops@4c8573c808 (2026-09-05).
Data as JSON: /api/errors/8a64fde4fd43b190.
Report an issue: GitHub.