Risoluzione dei problemi globale Hikube
Questa guida copre i problemi più comuni riscontrati su Hikube e le loro soluzioni.
1. Diagnostica generale
Prima di cercare una soluzione specifica, iniziate con questi comandi di diagnostica:
# Stato delle risorse nel vostro namespace
kubectl get all
# Eventi recenti (ordinati per data)
kubectl get events --sort-by=.metadata.creationTimestamp
# Descrizione dettagliata di una risorsa
kubectl describe <type> <nom>
# Log di un pod
kubectl logs <nom-du-pod>
# Log del contenitore precedente (in caso di crash)
kubectl logs <nom-du-pod> --previous
2. Pod in errore
CrashLoopBackOff
Sintomo: Il pod si riavvia in loop, lo stato mostra CrashLoopBackOff.
Diagnostica:
kubectl describe pod <nom-du-pod>
kubectl logs <nom-du-pod> --previous
Soluzioni:
- Memoria insufficiente: aumentate
resources.memoryo utilizzate unresourcesPresetpiù elevato - Errore di configurazione: verificate le variabili d'ambiente e i file di configurazione nei log
- Dipendenza mancante: verificate che i servizi richiesti (database, secret) siano disponibili
Pending
Sintomo: Il pod resta in stato Pending senza avviarsi.
Diagnostica:
kubectl describe pod <nom-du-pod>
# Cercate la sezione "Events" in fondo all'output
Soluzioni:
- Risorse insufficienti: il cluster non ha abbastanza CPU/memoria. Verificate i nodi disponibili con
kubectl get nodesekubectl top nodes - PVC non collegato: il volume persistente richiesto non è disponibile (vedi sezione Archiviazione)
- NodeSelector/Affinity: il pod ha vincoli di posizionamento che non corrispondono a nessun nodo
ImagePullBackOff
Sintomo: Il pod non si avvia, lo stato mostra ImagePullBackOff o ErrImagePull.
Diagnostica:
kubectl describe pod <nom-du-pod>
# Cercate "Failed to pull image" negli eventi
Soluzioni:
- Immagine non trovata: verificate il nome e il tag dell'immagine nel vostro manifesto
- Registry privato: assicuratevi che un
imagePullSecretsia configurato - Problema di rete: verificate la connettività verso il registry
OOMKilled
Sintomo: Il pod viene terminato con il codice di uscita 137 e il motivo OOMKilled.
Diagnostica:
kubectl describe pod <nom-du-pod>
# Cercate "Last State: Terminated - Reason: OOMKilled"
Soluzioni:
- Aumentate il limite di memoria in
resources.memoryo passate a unresourcesPresetsuperiore - Verificate se l'applicazione ha una perdita di memoria osservando il consumo con
kubectl top pod
3. Accesso al cluster
Kubeconfig non valido
Sintomo: error: You must be logged in to the server (Unauthorized)
Diagnostica:
# Verificare il file kubeconfig utilizzato
echo $KUBECONFIG
kubectl config current-context
Soluzioni:
- Rigenerate il kubeconfig dal vostro cluster Hikube:
kubectl get secret <nom-cluster>-admin-kubeconfig \
-o go-template='{{ printf "%s\n" (index .data "super-admin.conf" | base64decode) }}' \
> my-cluster-kubeconfig.yaml
export KUBECONFIG=my-cluster-kubeconfig.yaml - Verificate che la variabile
KUBECONFIGpunti al file corretto
Certificato scaduto
Sintomo: Unable to connect to the server: x509: certificate has expired
Diagnostica:
kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}' | base64 -d | openssl x509 -text -noout | grep -A2 Validity
Soluzione: Recuperate un nuovo kubeconfig aggiornato dal Secret del cluster (vedi sopra).
Connessione rifiutata
Sintomo: The connection to the server was refused
Diagnostica:
# Testare la connettività
kubectl cluster-info
Soluzioni:
- Verificate che il cluster sia in stato
Ready:kubectl get kubernetes <nom-cluster> - Verificate che il control plane sia accessibile dalla vostra rete
- Se utilizzate una VPN, assicuratevi che sia attiva
4. Archiviazione
PVC in stato Pending
Sintomo: Il PVC resta in Pending e i pod dipendenti non si avviano.
Diagnostica:
kubectl get pvc
kubectl describe pvc <nom-du-pvc>
Soluzioni:
- StorageClass non valida: verificate che la
storageClassspecificata esista conkubectl get storageclass - Capacità insufficiente: riducete la dimensione richiesta o contattate il supporto per aumentare le quote
- StorageClass vuota: se
storageClass: "", viene utilizzata la classe predefinita. ProvatestorageClass: replicatedesplicitamente
Spazio disco insufficiente
Sintomo: I pod si bloccano con errori di tipo No space left on device.
Diagnostica:
# Verificare l'utilizzo dei PVC
kubectl exec -it <nom-du-pod> -- df -h
Soluzioni:
- Aumentate il valore di
sizenel manifesto e riapplicate - Eliminate i dati inutili (log, file temporanei)
5. Rete
Servizio non accessibile
Sintomo: Impossibile connettersi al servizio dall'esterno o tra pod.
Diagnostica:
# Verificare che il servizio esista e abbia un endpoint
kubectl get svc
kubectl get endpoints <nom-du-service>
# Testare la connettività da un pod
kubectl run test-net --image=busybox --rm -it -- wget -qO- http://<nom-du-service>:<port>
Soluzioni:
- Nessun endpoint: le label del
selectordel servizio non corrispondono a nessun pod - External non attivato: aggiungete
external: truenel manifesto per creare un LoadBalancer - Porta errata: verificate che la porta del servizio corrisponda alla porta esposta dall'applicazione
DNS non risolto
Sintomo: Could not resolve host durante l'accesso a un servizio tramite il suo nome.
Diagnostica:
# Verificare il DNS del cluster
kubectl run test-dns --image=busybox --rm -it -- nslookup <nom-du-service>
# Verificare i pod CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns
Soluzioni:
- Utilizzate il nome DNS completo:
<service>.<namespace>.svc.cluster.local - Verificate che i pod CoreDNS siano in stato
Running
Ingress restituisce 404 o 502
Sintomo: L'URL dell'Ingress restituisce un errore 404 (Not Found) o 502 (Bad Gateway).
Diagnostica:
kubectl describe ingress <nom-de-lingress>
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller
Soluzioni:
- 404: verificate che il
pathe l'hostdell'Ingress corrispondano alla vostra configurazione - 502: il servizio backend non risponde. Verificate che i pod del backend siano in stato
Runninge che la porta sia corretta - IngressClass mancante: aggiungete
ingressClassName: nginxnella spec dell'Ingress
6. Database
Connessione rifiutata
Sintomo: Connection refused durante il tentativo di connessione al database.
Diagnostica:
# Verificare lo stato dei pod del database
kubectl get pods | grep <nom-de-la-base>
# Verificare i servizi
kubectl get svc | grep <nom-de-la-base>
Soluzioni:
- Verificate che i pod del database siano in stato
Running - Verificate le credenziali:
kubectl get secret <nom>-auth -o json | jq -r '.data | to_entries[] | "\(.key): \(.value|@base64d)"' - Se
external: false, utilizzatekubectl port-forwardper connettervi localmente
Replica in ritardo
Sintomo: Le repliche hanno un ritardo di replica significativo rispetto al master.
Diagnostica:
# Redis - Verificare la replica
kubectl exec -it rfr-redis-<nom>-0 -- redis-cli -a "$REDIS_PASSWORD" INFO replication
# PostgreSQL - Verificare il ritardo
kubectl exec -it <nom>-1 -- psql -c "SELECT * FROM pg_stat_replication;"
Soluzioni:
- Aumentate le risorse (CPU/memoria) delle repliche
- Verificate il carico di rete tra i datacenter
- Riducete il carico in scrittura se il ritardo persiste
Failover non attivato
Sintomo: Il master è in panne ma nessuna replica viene promossa.
Diagnostica:
# Redis - Verificare Sentinel
kubectl exec -it rfs-redis-<nom>-<id> -- redis-cli -p 26379 SENTINEL masters
# Verificare gli eventi
kubectl get events --sort-by=.metadata.creationTimestamp | grep <nom-de-la-base>
Soluzioni:
- Verificate che
replicas > 1nel manifesto (il failover richiede almeno una replica) - Verificate che i pod Sentinel (Redis) o l'operatore siano in stato
Running - Consultate i log dell'operatore per eventuali errori
7. Messaggistica (NATS, RabbitMQ)
Produttore/consumatore disconnesso
Sintomo: I client perdono la connessione al broker di messaggi.
Diagnostica:
# Verificare lo stato dei pod del broker
kubectl get pods | grep <nats|rabbitmq>
# Verificare i log
kubectl logs <nom-du-pod-broker>
Soluzioni:
- Verificate che i pod del broker siano in stato
Running - Implementate una logica di riconnessione automatica lato client
- Verificate i limiti di connessione configurati
Messaggi persi
Sintomo: Messaggi inviati non vengono mai ricevuti dai consumatori.
Diagnostica:
# RabbitMQ - Verificare le code
kubectl exec -it <pod-rabbitmq> -- rabbitmqctl list_queues name messages consumers
# NATS - Verificare gli stream JetStream
kubectl exec -it <pod-nats> -- nats stream ls
Soluzioni:
- RabbitMQ: utilizzate le Quorum Queues per garantire la durabilità dei messaggi
- NATS: attivate JetStream per la persistenza dei messaggi
- Verificate che i consumatori siano connessi e attivi
- Assicuratevi che le code/subject esistano prima di inviare messaggi