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
- Migrate custom resources off the deprecated version
- Set a deprecationWarning in your own CRDs so consumers get actionable text
- 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
- Gate CR manifests on the newest served version in CI
- Set deprecationWarning on deprecated versions so tooling shows actionable text
- Un-serve old versions once migration completes
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
- %s
- strings.Join(errs, " - ")
- unable to assert CRD servers versions for %s
- CRD %s is no longer served by the api server
- unable to marshal resource %w
AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15).
Data as JSON: /api/errors/138019513d8ff158.
Report an issue: GitHub.