Mein Service wird deployt, wird aber nie healthy
Der Build ist erfolgreich und ein neuer Pod startet, aber der Deploy wird als fehlgeschlagen markiert oder die neue Version erhält nie Traffic.
Was das bedeutet
Der Health-Check der Plattform — eine TCP-Probe auf den Port deiner App — schlägt nie an, daher wird der Traffic nie auf den neuen Pod umgeschaltet. Lizard wartet etwa 30 Sekunden und markiert den Deploy dann als fehlgeschlagen. Ein Service, der bereits lief, liefert weiterhin seine vorherige Version aus, außer er hat ein angehängtes Volume: Dann stoppt zuerst sein alter Pod, und der Service ist nicht erreichbar, bis ein Deploy gelingt. Ein erster Deploy wird als abgestürzt angezeigt.
Warum das passieren kann
- Deine App lauscht nicht auf dem erwarteten Port. Lizard setzt eine
PORT-Umgebungsvariable (Standard-Container-Port3000) und prüft, ob deine App dort erreichbar ist. Wenn deine App fest auf einen anderen Port eingestellt ist oder nie einen Port bindet, schlägt der Health-Checks nie an. Ein Python-App ist der übliche Fall:gunicornunduvicornbinden an127.0.0.1, sofern du nichts anderes angibst, und die Probe kommt von außerhalb des Prozesses. Python-App-Hosting enthält die Zeile--bind 0.0.0.0:$PORT, die jedes Framework braucht. - Der Service-Port passt nicht zum Image. Wenn
lizard upeinen Service aus einem Dockerfile ohneEXPOSE-Zeile anlegt, setzt es den Port3000, auch wenn das Basis-Image auf einem anderen Port lauscht, etwanginxauf 80. Eine VariablePORTändert diesen Port nicht. Führelizard port <n>aus und deploye neu, oder füge eineEXPOSE-Zeile hinzu. Siehe An welchen Port Lizard weiterleitet. - Der Service ist versehentlich im Worker-Modus. Das Setzen von
containerPort=0versetzt einen Service in den Worker-Modus, wodurch der Health-Checks und die Registrierung beim Load Balancer vollständig übersprungen werden. Ein Service, der eigentlich HTTP bereitstellen soll, aber aufcontainerPort=0umgestellt wurde, wird “erfolgreich” deployt und liefert dann einfach nie etwas aus — der Worker-Modus verdeckt das zugrunde liegende Startproblem, statt es sichtbar zu machen.
Mögliche Lösungen
Den aktuellen Port prüfen
lizard port --service apiWenn hier worker mode ausgegeben wird, hat der Service containerPort=0. Setze ihn wieder auf einen echten Port zurück, wenn dieser Service HTTP bereitstellen soll:
lizard port 3000 --service api
lizard redeploy --service apiBestätigen, dass deine App dort lauscht, wo Lizard es erwartet
Prüfe die Runtime-Logs auf Startfehler und auf die Adresse, auf der die App laut Log lauscht. Vergleiche sie mit dem Service-Port, den Lizard der App als PORT übergibt:
lizard logs --service api
lizard port --service apiSiehe auch
- Background Workers — wann
containerPort=0sinnvoll ist (und wann nicht). - Bereitstellungen → lifecycle — wo der Health-Checks innerhalb eines Deploys stattfindet.
Aktualisiert