derailed/k9s · warning
CRD %s is no longer served by the api server
Error message
CRD %s is no longer served by the api server
What it means
CRD diagnose message when no entry in spec.versions has served: true. A CRD in this state cannot be served at all — every version is disabled — so all its custom resources are unreachable even though the CRD object remains.
Source
Thrown at internal/render/crd.go:121
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
- Patch the CRD so the current version has served: true and exactly one storage: true
- Check the managing operator's logs/status for a stalled upgrade
- If the CRD is obsolete, delete it instead of leaving an unservable shell
Example fix
# before: all versions served:false # after versions: - name: v1 served: true storage: true
Defensive patterns
Strategy: fallback
Validate before calling
served := slices.ContainsFunc(crd.Spec.Versions, func(v v1.CustomResourceDefinitionVersion) bool {
return v.Served
})
if !served {
// exclude CRD from automation; needs operator fix
} Prevention
- Ensure exactly one served+storage version before disabling old ones in migrations
- Let operators own CRD version flips; avoid manual served toggles
- Post-upgrade, verify CRDs with kubectl get crd -o custom-columns=NAME:.metadata.name,SERVED:.spec.versions[*].served
When it happens
Trigger: Flipping served: false on every version (e.g. staged migration gone wrong); an operator reconciliation that disabled versions before enabling replacements; CRDs left mid-edit.
Common situations: Version migrations that un-serve old versions before the new one is marked served; manual YAML surgery on CRDs; interrupted operator upgrades.
Related errors
- unable to assert CRD servers versions for %s
- %s
- %s[%s] is deprecated
- strings.Join(errs, " - ")
- unable to marshal resource %w
AI-assisted analysis of derailed/k9s@2d3ccc6ba2 (2026-08-15).
Data as JSON: /api/errors/ac6017cbc1691aac.
Report an issue: GitHub.