derailed/k9s · warning

%s[%s] is deprecated

Error message

%s[%s] is deprecated

What it means

CRD diagnose message synthesized when a served version has deprecated: true but no deprecationWarning text was set; k9s builds '<crdName>[<version>] is deprecated' from the object so users still see that the version is on its way out.

Source

Thrown at internal/render/crd.go:116

func (CustomResourceDefinition) diagnose(n string, vv []v1.CustomResourceDefinitionVersion) error {
	if len(vv) == 0 {
		return fmt.Errorf("unable to assert CRD servers versions for %s", n)
	}

	var (
		ee     []error
		served bool
	)
	for _, v := range vv {
		if v.Served {
			served = true
		}
		if v.Deprecated {
			if v.DeprecationWarning != nil {
				ee = append(ee, fmt.Errorf("%s", *v.DeprecationWarning))
			} else {
				ee = append(ee, fmt.Errorf("%s[%s] is deprecated", n, v.Name))
			}
		}
	}
	if !served {
		ee = append(ee, fmt.Errorf("CRD %s is no longer served by the api server", n))
	}

	if len(ee) == 0 {
		return nil
	}
	errs := make([]string, 0, len(ee))
	for _, e := range ee {
		errs = append(errs, e.Error())
	}

	return errors.New(strings.Join(errs, " - "))
}

View on GitHub (pinned to 2d3ccc6ba2)

Solutions

  1. Migrate custom resources off the deprecated version
  2. Set a deprecationWarning in your own CRDs so consumers get actionable text
  3. Remove or un-serve the deprecated version once migration completes

Example fix

# before
- name: v1beta1
  served: true
  storage: false
  deprecated: true
# after: guide users explicitly
- name: v1beta1
  served: true
  storage: false
  deprecated: true
  deprecationWarning: "example.com/v1beta1 is deprecated; use v1"
Defensive patterns

Strategy: fallback

Validate before calling

deprecated := slices.ContainsFunc(crd.Spec.Versions, func(v v1.CustomResourceDefinitionVersion) bool {
	return v.Deprecated
})

Prevention

When it happens

Trigger: Listing CRDs whose versions[].deprecated is true and deprecationWarning is nil — common for CRDs written before deprecationWarning existed or authors who omitted it.

Common situations: Older operators flagging deprecation without guidance text; homegrown CRDs copied from templates that set deprecated but no warning.

Related errors


AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15). Data as JSON: /api/errors/138019513d8ff158. Report an issue: GitHub.