📁 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 :
- Connectivité NFS : Vérification port 2049
- Exports : Validation des exports NFS
- Montages : Test des montages clients
- Écriture : Test d'écriture sur chaque export
- 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