{"record":{"id":"0e3105cc3327c667","repo":"derailed/k9s","slug":"pod-condition-ready-is-false","errorCode":null,"errorMessage":"pod condition ready is false","messagePattern":"pod condition ready is false","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/render/pod.go","lineNumber":253,"sourceCode":"\n\tready := hasPodReadyCondition(st.Conditions)\n\trgr, rgt := p.readinessGateStats(spec, &st)\n\n\treturn p.diagnose(phase, cr, ct, ready, rgr, rgt)\n}\n\nfunc (*Pod) diagnose(phase string, cr, ct int, ready bool, rgr, rgt int) error {\n\tif phase == Completed {\n\t\treturn nil\n\t}\n\tif cr != ct || ct == 0 {\n\t\treturn fmt.Errorf(\"container ready check failed: %d of %d\", cr, ct)\n\t}\n\tif rgt > 0 && rgr != rgt {\n\t\treturn fmt.Errorf(\"readiness gate check failed: %d of %d\", rgr, rgt)\n\t}\n\tif !ready {\n\t\treturn fmt.Errorf(\"pod condition ready is false\")\n\t}\n\tif phase == Terminating {\n\t\treturn fmt.Errorf(\"pod is terminating\")\n\t}\n\n\treturn nil\n}\n\n// ----------------------------------------------------------------------------\n// Helpers...\n\nfunc asNominated(n string) string {\n\tif n == \"\" {\n\t\treturn MissingValue\n\t}\n\treturn n\n}\n","sourceCodeStart":235,"sourceCodeEnd":271,"githubUrl":"https://github.com/derailed/k9s/blob/2d3ccc6ba2ce98c3781bfc441bb3e884f072774f/internal/render/pod.go#L235-L271","documentation":"Pod.diagnose third gate: containers are all ready and gates satisfied, but the pod's aggregated Ready condition is still False. The kubelet derives Ready from readiness probes of every container plus gates, so this fires in the gap where the condition has not flipped (or a gate/probe oscillation set it false).","triggerScenarios":"Viewing a pod in the seconds between last-probe success and kubelet updating the Ready condition; a container probe just failed and restarted; conditions flapping under load.","commonSituations":"Probes with tight timeouts under CPU-throttled pods; momentary 503s from the app's health endpoint; node-level kubelet lag on very busy nodes.","solutions":["Re-check after a few seconds — usually a transient window","kubectl describe pod <name> and inspect the Ready condition's message/reason","Loosen probe thresholds (periodSeconds/failureThreshold) if the app is slow to stabilize","Stabilize the app's /health endpoint (remove external-call dependencies from probes)"],"exampleFix":"# before: probe fails on slow dependency\nreadinessProbe:\n  httpGet: {path: /health, port: 8080}\n  timeoutSeconds: 1\n# after\nreadinessProbe:\n  httpGet: {path: /health, port: 8080}\n  timeoutSeconds: 3\n  failureThreshold: 3","handlingStrategy":"fallback","validationCode":"for _, c := range pod.Status.Conditions {\n\tif c.Type == v1.PodReady && c.Status == v1.ConditionTrue {\n\t\t// Ready-condition gate passes\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Keep probe timeouts generous relative to app startup and GC pauses","Keep external dependencies out of readiness endpoints","Re-check after one probe period before treating this state as a fault"],"tags":["pod","readiness","conditions","kubernetes"],"backgroundTag":null,"analyzedSha":"2d3ccc6ba2ce98c3781bfc441bb3e884f072774f","analyzedAt":"2026-08-15T16:09:14.432Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}