Dépannage — NATS
Messages perdus (pas de JetStream)
Cause : JetStream n'est pas activé ou aucun stream n'est configuré pour capturer les messages. Sans JetStream, NATS fonctionne en mode fire-and-forget : les messages ne sont délivrés qu'aux abonnés connectés au moment de la publication.
Solution :
- Vérifiez que JetStream est activé dans votre manifeste :
nats.yaml
jetstream:
enabled: true
size: 10Gi - Réappliquez le manifeste si nécessaire :
kubectl apply -f nats.yaml - Créez un stream pour capturer les messages des subjects souhaités :
nats stream add --subjects "orders.>" --storage file --replicas 3 --retention limits orders-stream - Vérifiez que le stream est bien créé et capture les messages :
nats stream info orders-stream
Consumer ne reçoit pas les messages
Cause : le consumer est abonné à un subject qui ne correspond pas à celui utilisé par le producteur. Les erreurs courantes incluent une faute de frappe dans le nom du subject, un mauvais usage des wildcards, ou une configuration de queue group incorrecte.
Solution :
- Vérifiez le subject exact utilisé par le producteur et le consumer — les subjects sont sensibles à la casse
- Testez la réception avec un abonnement de diagnostic :
Cela permet de voir tous les messages publiés sur le serveur
nats sub ">" - Vérifiez les wildcards utilisés :
orders.*ne matche pasorders.new.urgent(utilisezorders.>pour les sous-niveaux)
- Si vous utilisez des queue groups, vérifiez que le consumer est bien membre du groupe attendu et que le group name est identique
Stockage JetStream plein
Cause : le volume JetStream a atteint sa capacité maximale (jetstream.size). Les nouveaux messages ne peuvent plus être persistés et les publications échouent.
Solution :
- Vérifiez l'utilisation du stockage JetStream :
nats account info - Identifiez les streams les plus volumineux :
nats stream list - Purgez les anciens messages des streams qui le permettent :
nats stream purge <nom-stream> - Vérifiez la politique de rétention des streams — utilisez
limitsavecmax-agepour supprimer automatiquement les anciens messages :nats stream edit <nom-stream> --max-age 72h - Si nécessaire, augmentez
jetstream.sizedans votre manifeste :nats.yamljetstream:
enabled: true
size: 50Gi
Mémoire insuffisante
Cause : le serveur NATS consomme plus de mémoire que la limite allouée, souvent à cause d'un nombre élevé de connexions, de messages volumineux (max_payload trop élevé), ou de streams JetStream en mémoire.
Solution :
- Vérifiez les événements du pod pour confirmer un OOMKill :
kubectl describe pod <pod-nats> | grep -A 5 "Last State" - Augmentez les ressources allouées à NATS :
nats.yaml
replicas: 3
resources:
cpu: 1
memory: 2Gi - Vérifiez la valeur de
max_payloaddansconfig.merge— réduisez-la si des messages très volumineux ne sont pas nécessaires - Réappliquez le manifeste :
kubectl apply -f nats.yaml
Connexion refusée
Cause : le client ne parvient pas à se connecter au serveur NATS. Cela peut être dû à des pods non démarrés, des identifiants incorrects, ou une tentative de connexion externe sans external: true.
Solution :
- Vérifiez que les pods NATS sont en état
Running:kubectl get pods -l app.kubernetes.io/component=nats - Consultez les logs du pod pour identifier les erreurs :
kubectl logs <pod-nats> - Vérifiez les identifiants utilisateur dans le Secret Kubernetes :
kubectl get tenantsecret <nom-nats>-credentials -o jsonpath='{.data}' | base64 -d - Si vous vous connectez depuis l'extérieur du cluster, assurez-vous que
external: trueest configuré :nats.yamlexternal: true - Testez la connectivité depuis un pod dans le cluster :
kubectl exec <pod-nats> -- nats-server --help 2>&1 | head -1