Risoluzione dei problemi — RabbitMQ
Coda bloccata (flow control)
Causa: RabbitMQ ha attivato un allarme memoria o allarme disco, bloccando le pubblicazioni per proteggere il sistema. Questo si verifica quando il consumo di memoria supera la soglia (high watermark) o lo spazio su disco è insufficiente.
Soluzione:
- Verificate lo stato del cluster e gli allarmi attivi:
kubectl exec <pod-rabbitmq> -- rabbitmqctl status | grep -A 10 "alarms" - Identificate la risorsa in causa (memoria o disco):
kubectl exec <pod-rabbitmq> -- rabbitmqctl status | grep -E "mem_|disk_" - Aumentate le risorse allocate nel vostro manifesto:
rabbitmq.yaml
replicas: 3
resources:
cpu: 1
memory: 2Gi
size: 20Gi - Eliminate le code inutilizzate se necessario:
kubectl exec <pod-rabbitmq> -- rabbitmqctl purge_queue <nome-coda>
Nodo RabbitMQ non unito al cluster
Causa: un nodo RabbitMQ non riesce a unirsi al cluster, spesso a causa di un problema di risoluzione DNS, di incoerenza del cookie Erlang, o di policy di rete restrittive.
Soluzione:
- Verificate lo stato del cluster da un nodo funzionante:
kubectl exec <pod-rabbitmq> -- rabbitmqctl cluster_status - Consultate i log del pod in errore:
kubectl logs <pod-rabbitmq-problematico> - Verificate che la risoluzione DNS funzioni tra i pod:
kubectl exec <pod-rabbitmq> -- nslookup <pod-rabbitmq-problematico>.<servizio-headless> - Se il problema persiste, eliminate il pod in errore per forzarne la ricreazione:
kubectl delete pod <pod-rabbitmq-problematico>
Messaggi non instradati (exchange mal configurato)
Causa: i messaggi pubblicati non raggiungono le code, generalmente a causa di un tipo di exchange errato, di una routing key non corretta, o di un binding mancante tra l'exchange e la coda.
Soluzione:
- Elencate i binding esistenti per identificare le rotte configurate:
kubectl exec <pod-rabbitmq> -- rabbitmqctl list_bindings -p <vhost> - Verificate il tipo di exchange e la routing key attesa:
kubectl exec <pod-rabbitmq> -- rabbitmqctl list_exchanges -p <vhost> - Configurate un dead letter exchange per catturare i messaggi non instradati e facilitare la diagnostica:
kubectl exec <pod-rabbitmq> -- rabbitmqctl set_policy DLX ".*" '{"dead-letter-exchange":"dlx"}' -p <vhost> - Verificate che il produttore utilizzi l'exchange e la routing key corretti nella sua configurazione
Memoria satura (memory alarm)
Causa: RabbitMQ ha raggiunto la soglia di memoria (high watermark, per impostazione predefinita il 40% della memoria disponibile). Tutte le pubblicazioni sono bloccate fino a quando la memoria non scende sotto la soglia.
Soluzione:
- Verificate il consumo di memoria:
kubectl exec <pod-rabbitmq> -- rabbitmqctl status | grep "mem_used" - Identificate le code più voluminose:
kubectl exec <pod-rabbitmq> -- rabbitmqctl list_queues name messages memory -p <vhost> --formatter table - Aumentate la memoria allocata a RabbitMQ:
rabbitmq.yaml
resources:
cpu: 1
memory: 4Gi - Eliminate le code inutilizzate o le code contenenti un gran numero di messaggi non consumati
Connessione AMQP rifiutata
Causa: il client non riesce a connettersi al broker RabbitMQ. Questo può essere dovuto a credenziali errate, permessi vhost mancanti, o un problema di accessibilità di rete.
Soluzione:
- Verificate le credenziali di connessione nel Secret Kubernetes:
kubectl get tenantsecret <nome-rabbitmq>-credentials -o jsonpath='{.data}' | base64 -d - Verificate che l'utente abbia i permessi necessari sul vhost:
kubectl exec <pod-rabbitmq> -- rabbitmqctl list_permissions -p <vhost> - Testate la connettività alla porta AMQP (5672):
kubectl exec <pod-rabbitmq> -- rabbitmq-diagnostics check_port_connectivity - Se vi connettete dall'esterno del cluster, assicuratevi che
external: truesia configurato nel vostro manifesto