Skip to content

📁 Cluster NFS Haute Disponibilité - Infrastructure Codincloud

Copyright (c) 2024 Codincloud - Aymen CHAIEB (CEO & Developer)

🎯 Objectif

Ce playbook Ansible déploie un cluster NFS hautement disponible pour l'infrastructure Docker Swarm de Codincloud, avec trois chemins de stockage partagé spécifiques :

  • /var/lib/docker/volumes → Volumes Docker persistants
  • /d/attx-shared → Données partagées des applications
  • /backup → Stockage de sauvegarde

🏗️ Architecture

┌─────────────────────────────────────────────────────────────┐
│                    CLUSTER NFS HA                          │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│  ┌─────────────────┐  ┌─────────────────┐                  │
│  │  NFS MASTER 1   │  │  NFS MASTER 2   │                  │
│  │    (PRIMARY)    │  │   (SECONDARY)   │                  │
│  │                 │  │                 │                  │
│  │ • NFS Server    │  │ • NFS Server    │                  │
│  │ • Keepalived    │  │ • Keepalived    │                  │
│  │ • Priority 110  │  │ • Priority 100  │                  │
│  └─────────────────┘  └─────────────────┘                  │
│           │                     │                          │
│           └──────────┬──────────┘                          │
│                      │                                     │
│              ┌───────▼───────┐                             │
│              │ VIP FLOATING  │                             │
│              │ 10.0.1.100    │                             │
│              └───────────────┘                             │
│                      │                                     │
│         ┌────────────┼────────────┐                        │
│         │            │            │                        │
│  ┌──────▼──────┐ ┌───▼────┐ ┌─────▼─────┐                 │
│  │SWARM MANAGER│ │ WORKER │ │  WORKER   │                 │
│  │             │ │        │ │           │                 │
│  │ NFS Client  │ │ Client │ │  Client   │                 │
│  │ Auto-mount  │ │ Mount  │ │  Mount    │                 │
│  └─────────────┘ └────────┘ └───────────┘                 │
│                                                             │
└─────────────────────────────────────────────────────────────┘

🚀 Déploiement Rapide

1. Prérequis

# Installation des dépendances
make install

# Configuration des credentials Hetzner
export HETZNER_API_TOKEN="your-token-here"
export ANSIBLE_VAULT_PASSWORD="your-vault-password"

2. Déploiement du Cluster NFS

# Déploiement complet du cluster NFS
make nfs-deploy

# Ou avec un environnement spécifique
make nfs-deploy ENVIRONMENT=staging
make nfs-deploy ENVIRONMENT=production

3. Validation

# Tester le cluster NFS
make nfs-test

# Vérifier l'état
make nfs-status

# Valider la configuration
make nfs-validate

📋 Commandes Disponibles

Déploiement

make nfs-deploy          # Déployer le cluster NFS
make staging            # Déployer en staging
make production         # Déployer en production

Tests et Validation

make nfs-test           # Tests de connectivité NFS
make nfs-status         # État du cluster
make nfs-validate       # Validation configuration
make dry-run            # Simulation (dry-run)

Maintenance

make backup             # Sauvegarder les données
make restore            # Restaurer depuis sauvegarde
make failover           # Tester le failover HA

Développement

make check-nfs          # Vérifier syntaxe
make lint               # Lancer ansible-lint
make clean              # Nettoyer fichiers temporaires

🔧 Configuration

Variables Principales (group_vars/all.yml)

# Configuration NFS Cluster
nfs_cluster:
  virtual_ip: "10.0.1.100"
  masters_count: 2

  exports:
    docker_volumes:
      path: "/export/docker-volumes"
      mount_point: "/var/lib/docker/volumes"
      backup_enabled: true

    attx_shared:
      path: "/export/attx-shared"
      mount_point: "/d/attx-shared"
      backup_enabled: true

    backup_storage:
      path: "/export/backup"
      mount_point: "/backup"
      backup_enabled: false

Labels Hetzner Cloud Requis

# Pour les serveurs NFS Masters
role: "nfs-master"
type: "storage-master"
tier: "storage"
environment: "production"  # ou "staging"
project: "codincloud"

# Pour les clients (Swarm nodes)
role: "manager"  # ou "worker"
type: "swarm-manager"  # ou "swarm-worker"
tier: "control"  # ou "compute"
environment: "production"
project: "codincloud"

📁 Chemins de Stockage Partagé

1. Docker Volumes (/var/lib/docker/volumes)

  • Usage : Stockage persistant des volumes Docker
  • Montage : Automatique sur tous les nodes Swarm
  • Backup : Quotidien à 2h00
  • Permissions : RW pour tous les nodes

2. ATTX Shared (/d/attx-shared)

  • Usage : Données partagées entre applications
  • Montage : Automatique sur tous les nodes Swarm
  • Backup : Toutes les 6 heures
  • Permissions : RW pour tous les nodes

3. Backup Storage (/backup)

  • Usage : Stockage des sauvegardes
  • Montage : Uniquement sur les Swarm Managers
  • Backup : Pas de backup (source des backups)
  • Permissions : RW pour managers, pas de montage sur workers

🔄 Haute Disponibilité

Keepalived Configuration

  • VIP : 10.0.1.100 (configurable)
  • Protocol : VRRP
  • Check : Vérification NFS toutes les 2 secondes
  • Failover : Automatique en cas de panne

Scripts de Monitoring

  • Health Check : /usr/local/bin/nfs-health-check.sh (toutes les 5 min)
  • Client Monitor : /usr/local/bin/nfs-client-health.sh (toutes les 2 min)
  • HA Status : /usr/local/bin/ha-status.sh

🧪 Tests et Validation

Tests Automatiques

Le playbook inclut des tests automatiques :

  1. Connectivité NFS : Vérification port 2049
  2. Exports : Validation des exports NFS
  3. Montages : Test des montages clients
  4. Écriture : Test d'écriture sur chaque export
  5. HA : Vérification Keepalived et VIP

Tests Manuels

# Tester la connectivité vers la VIP
ping 10.0.1.100

# Vérifier les exports depuis un client
showmount -e 10.0.1.100

# Tester l'écriture
echo "test" > /var/lib/docker/volumes/test.txt
echo "test" > /d/attx-shared/test.txt

# Vérifier les montages
findmnt -t nfs4

🔒 Sécurité

Firewall

  • Ports NFS : 111, 2049, 4000-4002
  • VRRP : Protocol 112
  • SSH : Port 22 (management)

Permissions

  • NFSv4 avec authentification
  • no_root_squash pour compatibilité Docker
  • Réseau privé uniquement

📊 Monitoring

Métriques Prometheus

  • Node Exporter : Métriques système
  • NFS Stats : Statistiques NFS
  • Keepalived : État HA

Dashboards Grafana

  • NFS Performance : Latence, throughput
  • HA Status : État du cluster
  • Storage Usage : Utilisation disque

🚨 Dépannage

Problèmes Courants

NFS Master ne démarre pas

# Vérifier les logs
journalctl -u nfs-kernel-server -f

# Vérifier les exports
exportfs -v

# Redémarrer les services
systemctl restart nfs-kernel-server
systemctl restart rpcbind

Failover ne fonctionne pas

# Vérifier Keepalived
systemctl status keepalived
journalctl -u keepalived -f

# Vérifier la VIP
ip addr show eth0

# Test manuel de failover
/usr/local/bin/manual-failover.sh

Montages clients échouent

# Vérifier la connectivité
telnet 10.0.1.100 2049

# Tester le montage manuel
mount -t nfs4 10.0.1.100:/export/docker-volumes /mnt/test

# Vérifier les logs client
journalctl -u rpcbind -f

Logs Importants

  • NFS Server : /var/log/syslog
  • Keepalived : journalctl -u keepalived
  • Client NFS : journalctl -u rpcbind

📈 Performance

Optimisations Incluses

  • TCP : Optimisation des buffers réseau
  • NFS Options : rsize/wsize 1MB
  • Threads : 8 threads NFS par défaut
  • Cache : Optimisation du cache client

Monitoring Performance

# Statistiques NFS
nfsstat -c  # Client
nfsstat -s  # Server

# IOstat pour les disques
iostat -x 1

# Network stats
iftop -i eth0

🔄 Maintenance

Sauvegardes

# Sauvegarde manuelle
make backup

# Vérifier les sauvegardes
ls -la /backup/

# Restaurer
make restore

Mise à jour

# Mise à jour de la configuration
make nfs-deploy

# Redémarrage rolling
ansible nfs_masters -i inventory.yml -m systemd -a "name=nfs-kernel-server state=restarted" --serial 1

🆘 Support

Contacts

  • Admin : admin@codincloud.com
  • CEO & Developer : aymen@codincloud.com

Documentation

  • Architecture : ARCHITECTURE_CIBLE_CODINCLOUD.md
  • Hetzner Setup : HETZNER_DYNAMIC_INVENTORY_GUIDE.md
  • Utilisation : UTILISATION_IDEALE_HETZNER.md

Infrastructure Codincloud - Shared Storage NFS Cluster
Haute disponibilité, performance et intégration Docker Swarm


Commentaires