A health check that returns 200 while the process is not actually able to serve is one of the most reliably confusing failures in container land, precisely because every signal you would normally trust looks fine. The pattern that has saved me is separating liveness from readiness and making readiness assert something real - model loaded, dependency reachable - rather than just proving the web framework can answer. For model-serving containers there is a second trap in the same area: cold start often exceeds the default grace period, so the task gets killed mid-warmup and the platform reports it as unhealthy rather than as slow. It cycles forever and the logs never show anything wrong, which matches what you describe exactly.