Dépannage — Redis
Perte de données après redémarrage
Cause : la storageClass utilisée est local, ce qui signifie que les données sont stockées uniquement sur le nœud physique où s'exécutait le pod. Si le pod est replanifié sur un autre nœud, les données précédentes sont perdues.
Solution :
- Vérifiez la
storageClassutilisée :kubectl get pvc -l app=redis-<name> - Si vous utilisez un seul réplica (
replicas= 1), passez àstorageClass: replicatedpour que le stockage compense l'absence de réplication applicative. Si vous avez plusieurs réplicas (replicas>= 3),storageClass: localest approprié car Redis Sentinel assure déjà la haute disponibilité :redis.yamlspec:
storageClass: replicated # Si replicas = 1
# storageClass: local # Si replicas >= 3 (Sentinel assure la HA) - Appliquez la modification. Notez qu'un changement de
storageClassnécessite généralement une recréation des PVC. - Assurez-vous également que
replicas>= 3 pour bénéficier de la réplication Redis Sentinel.
Redis Sentinel ne converge pas
Cause : le nombre de réplicas est pair ou inférieur à 3, ce qui empêche le quorum Sentinel de fonctionner correctement. Sentinel nécessite une majorité pour élire un nouveau primary.
Solution :
- Vérifiez le nombre de réplicas :
kubectl get pods -l app=redis-<name> - Assurez-vous d'utiliser un nombre impair >= 3 :
redis.yaml
spec:
replicas: 3 # Ou 5, jamais 2 ou 4 - Consultez les logs Sentinel pour identifier les problèmes de convergence :
kubectl logs -l app=rfs-redis-<name> - Vérifiez la connectivité réseau entre les pods Redis. Des problèmes de DNS ou de réseau peuvent empêcher la découverte des nœuds.
Mémoire saturée (OOMKilled)
Cause : le dataset Redis dépasse la mémoire allouée au conteneur. Kubernetes tue le pod lorsqu'il dépasse sa limite mémoire.
Solution :
- Vérifiez si le pod a été tué pour OOM :
kubectl describe pod rfr-redis-<name>-0 | grep -i oom - Augmentez la mémoire allouée via
resources.memoryou unresourcesPresetsupérieur :redis.yamlspec:
resources:
cpu: 1000m
memory: 2Gi # Augmenter la mémoire - Vérifiez la politique d'éviction Redis (
maxmemory-policy). Par défaut, Redis renvoie une erreur quand la mémoire est pleine. Envisagez d'utiliserallkeys-lrusi Redis sert de cache. - Surveillez la taille du dataset :
redis-cli -h rfr-redis-<name> -p 6379 -a <password> INFO memory
Connexion timeout
Cause : les pods Redis ne sont pas en cours d'exécution, les endpoints du service sont vides, ou la configuration d'authentification côté client ne correspond pas à celle du serveur.
Solution :
- Vérifiez que les pods sont en état
Running:kubectl get pods -l app=redis-<name> - Vérifiez que les services ont des endpoints :
kubectl get endpoints rfr-redis-<name>
kubectl get endpoints rfs-redis-<name> - Si
authEnabled: true, assurez-vous que votre client fournit le mot de passe correct. - Testez la connexion depuis un pod de debug :
kubectl run test-redis --rm -it --image=redis:7 -- redis-cli -h rfr-redis-<name> -p 6379 -a <password> PING
Authentification échoue
Cause : le mot de passe utilisé ne correspond pas à celui stocké dans le Secret Kubernetes, ou authEnabled n'est pas activé sur le serveur alors que le client envoie un mot de passe (ou inversement).
Solution :
- Récupérez le mot de passe correct depuis le Secret :
kubectl get tenantsecret redis-<name>-auth -o jsonpath='{.data.password}' | base64 -d - Vérifiez que
authEnabled: trueest configuré dans votre manifeste :redis.yamlspec:
authEnabled: true - Assurez-vous que votre client utilise exactement le mot de passe récupéré à l'étape 1.
- Si vous avez changé la configuration
authEnabled, les clients existants doivent être mis à jour pour refléter le changement.