{"record":{"id":"ac6017cbc1691aac","repo":"derailed/k9s","slug":"crd-s-is-no-longer-served-by-the-api-server","errorCode":null,"errorMessage":"CRD %s is no longer served by the api server","messagePattern":"CRD (.+?) is no longer served by the api server","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/render/crd.go","lineNumber":121,"sourceCode":"\n\tvar (\n\t\tee     []error\n\t\tserved bool\n\t)\n\tfor _, v := range vv {\n\t\tif v.Served {\n\t\t\tserved = true\n\t\t}\n\t\tif v.Deprecated {\n\t\t\tif v.DeprecationWarning != nil {\n\t\t\t\tee = append(ee, fmt.Errorf(\"%s\", *v.DeprecationWarning))\n\t\t\t} else {\n\t\t\t\tee = append(ee, fmt.Errorf(\"%s[%s] is deprecated\", n, v.Name))\n\t\t\t}\n\t\t}\n\t}\n\tif !served {\n\t\tee = append(ee, fmt.Errorf(\"CRD %s is no longer served by the api server\", n))\n\t}\n\n\tif len(ee) == 0 {\n\t\treturn nil\n\t}\n\terrs := make([]string, 0, len(ee))\n\tfor _, e := range ee {\n\t\terrs = append(errs, e.Error())\n\t}\n\n\treturn errors.New(strings.Join(errs, \" - \"))\n}\n","sourceCodeStart":103,"sourceCodeEnd":134,"githubUrl":"https://github.com/derailed/k9s/blob/2d3ccc6ba2ce98c3781bfc441bb3e884f072774f/internal/render/crd.go#L103-L134","documentation":"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.","triggerScenarios":"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.","commonSituations":"Version migrations that un-serve old versions before the new one is marked served; manual YAML surgery on CRDs; interrupted operator upgrades.","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"],"exampleFix":"# before: all versions served:false\n# after\nversions:\n- name: v1\n  served: true\n  storage: true","handlingStrategy":"fallback","validationCode":"served := slices.ContainsFunc(crd.Spec.Versions, func(v v1.CustomResourceDefinitionVersion) bool {\n\treturn v.Served\n})\nif !served {\n\t// exclude CRD from automation; needs operator fix\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["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"],"tags":["crd","kubernetes-api","configuration"],"backgroundTag":null,"analyzedSha":"2d3ccc6ba2ce98c3781bfc441bb3e884f072774f","analyzedAt":"2026-08-15T16:09:14.432Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}