gorse-worker-health-probe-fix

Par divinevideo · divine-mobile

Résolution des pods gorse-worker bloqués à l'état not-ready en raison de sondes de santé défaillantes. À utiliser quand : (1) les pods gorse-worker affichent le statut 0/1 Ready mais Running, (2) la readiness probe utilisant `pgrep` échoue silencieusement, (3) les logs du worker indiquent un fonctionnement normal mais le pod ne passe jamais à l'état ready, (4) l'image `zhenghaoz/gorse-worker` est utilisée. Le conteneur gorse-worker est une image minimale sans commandes `pgrep` ni `ps`, ce qui fait échouer les sondes exec reposant sur ces commandes.

npx skills add https://github.com/divinevideo/divine-mobile --skill gorse-worker-health-probe-fix

Correction de la sonde de santé du worker Gorse

Problème

Les pods gorse-worker restent dans un état non-ready (0/1 Ready) même si le processus worker fonctionne correctement et traite les jobs. Cela casse la mise à l'échelle HPA et la santé du service.

Contexte / Conditions déclenchantes

  • Les pods gorse-worker affichent 0/1 Ready mais le statut Running
  • Les logs du worker affichent un fonctionnement normal : "msg":"complete ranking recommendation"
  • Le pod ne passe jamais à l'état Ready
  • Le déploiement utilise une sonde de readiness basée sur exec avec pgrep -f gorse-worker
  • Utilisation de l'image Docker officielle zhenghaoz/gorse-worker

Cause racine

L'image zhenghaoz/gorse-worker est une image minimale/distroless qui ne contient pas les utilitaires courants comme pgrep, ps ou procps. La sonde exec échoue silencieusement car la commande n'existe pas.

# Cette sonde ÉCHOUE silencieusement - pgrep n'existe pas dans le conteneur
readinessProbe:
  exec:
    command: ["pgrep", "-f", "gorse-worker"]

Solution

Remplacer la sonde basée sur pgrep par une vérification de processus utilisant les built-ins shell qui existent dans l'image minimale :

# Utiliser kill -0 pour vérifier si le PID 1 (processus principal) est actif
livenessProbe:
  exec:
    command: ["sh", "-c", "kill -0 1"]
  initialDelaySeconds: 30
  periodSeconds: 10
readinessProbe:
  exec:
    command: ["sh", "-c", "kill -0 1"]
  initialDelaySeconds: 10
  periodSeconds: 5

La commande kill -0 <pid> vérifie si un processus existe sans envoyer aucun signal. Le PID 1 est le processus principal du conteneur (gorse-worker).

Vérification

Après application de la correction :

kubectl get pods -n gorse | grep worker
# Doit afficher 1/1 Ready

kubectl describe pod <worker-pod> -n gorse | grep -A5 "Readiness:"
# Doit afficher les vérifications de readiness en succès

Exemple

Patch Kustomize pour corriger les sondes du worker :

patches:
  - target:
      kind: Deployment
      name: gorse-worker
    patch: |-
      - op: replace
        path: /spec/template/spec/containers/0/livenessProbe
        value:
          exec:
            command: ["sh", "-c", "kill -0 1"]
          initialDelaySeconds: 30
          periodSeconds: 10
      - op: replace
        path: /spec/template/spec/containers/0/readinessProbe
        value:
          exec:
            command: ["sh", "-c", "kill -0 1"]
          initialDelaySeconds: 10
          periodSeconds: 5

Notes

  • Ce problème affecte uniquement gorse-worker ; gorse-master et gorse-server disposent d'endpoints HTTP pour les sondes
  • Le worker n'expose aucun endpoint HTTP, les sondes exec sont donc obligatoires
  • Alternative : utiliser une sonde TCP sur le port gRPC si le worker en expose un
  • Ce pattern s'applique à tout conteneur minimal/distroless sans utilitaires procps

Skills similaires