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 Readymais le statutRunning - 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