Kubernetes • Architecture • Case Study

Architecting and Validating a High-Availability Redis Cluster on Kubernetes

When you first learn Kubernetes, you spend most of your time dealing with stateless applications (like a Node.js API or a React frontend). If a stateless pod dies, Kubernetes spins up a new one, and nobody notices.

But what happens when you need to deploy a Stateful application, like a Database or a Cache?

Recently, my development team needed a robust caching layer. Instead of spinning up a standard, single-pod Redis instance, I architected a High-Availability (HA) Redis Master-Replica Cluster on our Kubernetes environment.

Unlike standard Deployments, running a distributed database requires strict pod ordering, persistent storage, and sticky network identities. Here is a breakdown of how I designed the architecture, deployed the infrastructure, and rigorously validated the replication network.

Redis Architecture Diagram

High-Level Architecture of the Redis HA Cluster on Kubernetes

Phase 1: The Architecture & Deployment

To build a true HA database in Kubernetes, you cannot use a standard Deployment. I structured my manifest using industry best practices, relying heavily on StatefulSets.

Here are the core components I engineered for this stack:

1. The Compute Layer (StatefulSets):

I deployed two separate StatefulSets: one for the redis-master (1 replica) and one for the redis-slave (2 replicas). By using StatefulSets, Kubernetes guarantees strict ordering: redis-slave-0 will not boot until redis-master-0 is fully running and ready.

2. The Storage Layer (Dynamic PVCs):

If a Redis pod crashes, we cannot lose the data. Instead of using dangerous manual hostPath volumes, I implemented volumeClaimTemplates linked to our local-path StorageClass. This tells Kubernetes to dynamically provision 8GB Persistent Volumes and tightly bind them to specific pods.

YAML
volumeClaimTemplates:
  - metadata:
      name: redis-data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "local-path"
      resources:
        requests:
          storage: "8Gi"

3. The Network Identity (Headless Services):

Replicas need to know exactly how to find the Master. I provisioned a Headless Service (ClusterIP: None). This bypasses the standard Kubernetes load balancer and generates a permanent DNS record for the master pod (redis-master-0.redis-headless), ensuring the slaves never lose their connection to the primary database.

The Deployment:

With the architecture codified in a unified YAML manifest, provisioning the entire database infrastructure took a single command:

Bash
kubectl apply -f redis-ha-cluster.yaml -n redis

Phase 2: The Validation Runbook

In the DevOps world, deploying infrastructure is only 50% of the job. The other 50% is mathematically proving that it works. You cannot just trust that kubectl get pods says Running. You have to dive into the database engine itself.

Here is my 4-step testing runbook to certify a Redis cluster for production.

Test 1: The Replication Status Check

First, we need to ask the Redis Master if it actually sees its worker nodes. I execute directly into the Master pod and query the internal Redis metrics:

Bash
kubectl exec -it redis-master-0 -n redis -- redis-cli info replication

What I look for:

  • role:master
  • connected_slaves:2 (This confirms both replica pods successfully registered with the master).

Next, I reverse the test. I check the Replica pod to ensure it has an active, healthy handshake with the Master:

Bash
kubectl exec -it redis-slave-0 -n redis -- redis-cli info replication
Redis Master Pod Replication Status

Verifying the Master node's replication statistics and registered slaves.

What I look for:

  • role:slave
  • master_link_status:up (Critical: If this says "down", the pods are running, but the network replication is broken!)
Redis Slave Node Link Status

Confirming the Slave node has successfully linked and synced with the Master.

Test 2: The Data Propagation Test (The Ultimate Proof)

Status checks are great, but the ultimate proof of a working cluster is testing the actual data flow. I simulate a backend application by writing data to the Master, and immediately querying the Slave to see if the data replicated across the Kubernetes network.

Step A: Write to the Master

Bash
kubectl exec -it redis-master-0 -n redis -- redis-cli set mytest "Hello-Redis"

Step B: Read from the Slave

Bash
kubectl exec -it redis-slave-0 -n redis -- redis-cli get mytest

Result: The slave instantly returns "Hello-Redis". The async replication is working flawlessly.

Test 3: Analyzing the Boot Logs

Even if the cluster is replicating data, there might be hidden warnings (like permission issues or memory fragmentation warnings). I always audit the boot sequence of the Master:

Bash
kubectl logs redis-master-0 -n redis

What I look for:

  • * Ready to accept connections
  • * Replica redis-slave-0... identity confirmed
  • * Synchronization with replica succeeded

Test 4: The External Network Test (NodePort)

Finally, because my developers need to access this cache from outside the cluster during their local development phase, I exposed the Master via a specific NodePort (30903).

To prove the routing works from an external machine, I ran a ping test from my local Windows terminal directly to the Kubernetes Worker Node IP:

YAML
redis-cli -h 192.168.1.81 -p 30903 ping

Result: It returns PONG. The Kubernetes Kube-Proxy is successfully routing external TCP traffic directly into the StatefulSet.

Conclusion

By combining Kubernetes StatefulSets with a rigorous testing runbook, you can deploy enterprise-grade databases with absolute confidence.

Never assume an infrastructure deployment is successful just because the pods have a green status. Always verify the application-level logic—check the replication links, test the data propagation, and audit the logs. That is how you build unbreakable platforms.

Kubernetes • Architecture • Étude de Cas

Architecturer et Valider un Cluster Redis à Haute Disponibilité sur Kubernetes

Lorsque vous apprenez Kubernetes pour la première fois, vous passez la majeure partie de votre temps à gérer des applications sans état (comme une API Node.js ou un frontend React). Si un pod sans état meurt, Kubernetes en lance un nouveau, et personne ne le remarque.

Mais que se passe-t-il lorsque vous devez déployer une application avec État (Stateful), comme une Base de données ou un Cache ?

Récemment, mon équipe de développement avait besoin d'une couche de mise en cache robuste. Au lieu de lancer une instance Redis standard à pod unique, j'ai architecturé un Cluster Redis Maître-Réplica à Haute Disponibilité (HA) sur notre environnement Kubernetes.

Contrairement aux Déploiements standards, l'exécution d'une base de données distribuée nécessite un ordre strict des pods, un stockage persistant, et des identités réseau fixes. Voici une analyse de la manière dont j'ai conçu l'architecture, déployé l'infrastructure, et rigoureusement validé le réseau de réplication.

Schéma de l'Architecture Redis

Architecture de Haut Niveau du Cluster Redis HA sur Kubernetes

Phase 1: L'Architecture & Déploiement

Pour construire une véritable base de données HA dans Kubernetes, vous ne pouvez pas utiliser un Déploiement standard. J'ai structuré mon manifeste en utilisant les meilleures pratiques de l'industrie, m'appuyant fortement sur les StatefulSets.

Voici les composants de base que j'ai conçus pour cette pile (stack) :

1. La Couche de Calcul (StatefulSets) :

J'ai déployé deux StatefulSets séparés : un pour le redis-master (1 réplica) et un pour le redis-slave (2 réplicas). L'utilisation de StatefulSets permet à Kubernetes de garantir un ordre strict : redis-slave-0 ne démarrera pas tant que redis-master-0 ne sera pas complètement en cours d'exécution et prêt (ready).

2. La Couche de Stockage (PVC Dynamiques) :

Dans l'éventualité où un pod Redis se crashe, nous ne pouvons pas perdre les données. Au lieu d'utiliser des volumes manuels dangereux comme hostPath, j'ai implémenté des volumeClaimTemplates liés à notre StorageClass local-path. Cela indique à Kubernetes de provisionner dynamiquement des Volumes Persistants de 8 Go et de les lier étroitement à des pods spécifiques.

YAML
volumeClaimTemplates:
  - metadata:
      name: redis-data
    spec:
      accessModes: ["ReadWriteOnce"]
      storageClassName: "local-path"
      resources:
        requests:
          storage: "8Gi"

3. L'Identité Réseau (Services Headless) :

Les réplicas doivent savoir exactement comment trouver le Maître. J'ai provisionné un Service Headless (ClusterIP: None). Cela contourne l'équilibreur de charge standard de Kubernetes et génère un enregistrement DNS permanent pour le pod maître (redis-master-0.redis-headless), garantissant que les esclaves ne perdent jamais leur connexion à la base de données principale.

Le Déploiement :

L'architecture étant codifiée dans un manifeste YAML unifié, le provisionnement de l'ensemble de l'infrastructure de la base de données a nécessité une seule commande :

Bash
kubectl apply -f redis-ha-cluster.yaml -n redis

Phase 2: Le Plan de Validation (Runbook)

Dans le monde DevOps, déployer une infrastructure ne représente que 50 % du travail. Les autres 50 % consistent à prouver mathématiquement que cela fonctionne. Vous ne pouvez pas vous contenter de croire que kubectl get pods indique Running. Vous devez plonger dans le moteur de la base de données lui-même.

Voici mon plan de test en 4 étapes pour certifier un cluster Redis pour la production.

Test 1 : La Vérification du Statut de Réplication

Tout d'abord, nous devons demander au Maître Redis s'il voit réellement ses nœuds de travail. Je m'exécute directement dans le pod Maître et interroge les métriques internes de Redis :

Bash
kubectl exec -it redis-master-0 -n redis -- redis-cli info replication

Ce que je recherche :

  • role:master
  • connected_slaves:2 (Ceci confirme que les deux pods réplicas se sont correctement enregistrés auprès du maître).

Ensuite, j'inverse le test. Je vérifie le pod Réplica pour m'assurer qu'il dispose d'une connexion (handshake) active et saine avec le Maître :

Bash
kubectl exec -it redis-slave-0 -n redis -- redis-cli info replication
Statut de Réplication du Pod Maître Redis

Vérification des statistiques de réplication du nœud Maître et des esclaves enregistrés.

Ce que je recherche :

  • role:slave
  • master_link_status:up (Critique : Si cela dit "down", les pods sont en cours d'exécution, mais la réplication réseau est rompue !)
Statut du Lien du Nœud Esclave Redis

Confirmation que le nœud Esclave s'est lié et synchronisé avec succès avec le Maître.

Test 2 : Le Test de Propagation des Données (La Preuve Ultime)

Les vérifications de statut sont formidables, mais la preuve ultime d'un cluster fonctionnel réside dans le test du flux de données réel. Je simule une application backend en écrivant des données sur le Maître, et en interrogeant immédiatement l'Esclave pour m'assurer que les données ont bien été répliquées à travers le réseau Kubernetes.

Étape A : Écrire sur le Maître

Bash
kubectl exec -it redis-master-0 -n redis -- redis-cli set mytest "Hello-Redis"

Étape B : Lire depuis l'Esclave

Bash
kubectl exec -it redis-slave-0 -n redis -- redis-cli get mytest

Résultat : L'esclave renvoie instantanément "Hello-Redis". La réplication asynchrone fonctionne parfaitement.

Test 3 : L'Analyse des Journaux de Démarrage (Boot Logs)

Même si le cluster réplique des données, il peut y avoir des avertissements cachés (comme des problèmes d'autorisation ou des alertes de fragmentation de mémoire). J'audit toujours la séquence de démarrage du Maître :

Bash
kubectl logs redis-master-0 -n redis

Ce que je recherche :

  • * Ready to accept connections
  • * Replica redis-slave-0... identity confirmed
  • * Synchronization with replica succeeded

Test 4 : Le Test du Réseau Externe (NodePort)

Enfin, comme mes développeurs ont besoin d'accéder à ce cache depuis l'extérieur du cluster pendant leur phase de développement local, j'ai exposé le Maître via un NodePort spécifique (30903).

Pour prouver que le routage fonctionne depuis une machine externe, j'ai effectué un test de ping depuis mon terminal Windows local directement vers l'IP du nœud de travail (Worker Node) Kubernetes :

YAML
redis-cli -h 192.168.1.81 -p 30903 ping

Résultat : Il retourne PONG. Le Kubernetes Kube-Proxy achemine avec succès le trafic TCP externe directement dans le StatefulSet.

Conclusion

En combinant les StatefulSets de Kubernetes avec un runbook de test rigoureux, vous pouvez déployer des bases de données de qualité entreprise avec une confiance absolue.

Ne présumez jamais qu'un déploiement d'infrastructure est un succès sous prétexte que les pods affichent un statut au vert. Vérifiez toujours la logique au niveau de l'application : examinez les liens de réplication, testez la propagation des données, et analysez les journaux (logs). C'est ainsi que l'on construit des plateformes incassables.