TP Kubernetes installé à la main - intégration multiprovider
Ce TP déploie un cluster Kubernetes multi-nœuds sur Scaleway en utilisant OpenTofu (fork open-source de Terraform). L’infrastructure inclut un réseau VPN sécurisé avec WireGuard, un cluster etcd séparé, et la configuration automatique de Kubernetes avec Cilium comme CNI.
Vue d’ensemble de l’architecture
Section titled “Vue d’ensemble de l’architecture”Schéma de l’infrastructure
Section titled “Schéma de l’infrastructure”
Note : Le diagramme source est disponible dans le fichier
images/architecture.mmdet peut être modifié puis recompilé avec la commande :
mmdc -i images/architecture.mmd -o images/architecture.png -t dark -b transparent -s 2 -w 1200
Structure des modules
Section titled “Structure des modules”Le projet utilise une organisation modulaire simplifiée où tous les modules sont regroupés dans un dossier modules/ unique. Cette approche facilite la navigation et la maintenance :
270_tp_kube_tofu/├── tp_kube_tofu.md # Ce document├── main.tf # Configuration principale├── variables.tf # Variables globales├── versions.tf # Versions des providers├── images/ # Diagrammes d'architecture│ ├── architecture.mmd # Source Mermaid│ └── architecture.png # Diagramme compilé└── modules/ # Tous les modules Terraform ├── scaleway/ # Provider Scaleway Cloud ├── digitalocean/ # Configuration DNS ├── wireguard/ # VPN WireGuard ├── ufw/ # Pare-feu UFW ├── etcd/ # Cluster etcd ├── kubernetes/ # Installation Kubernetes ├── swap/ # Configuration du swap ├── nginx/ # Déploiement nginx └── file_output/ # Génération de fichiersOrdre de déploiement
Section titled “Ordre de déploiement”Les modules sont déployés dans cet ordre précis pour respecter les dépendances :
- scaleway : Création des serveurs virtuels sur Scaleway
- swap : Configuration du swap (compatible avec Kubernetes)
- digitalocean : Configuration des enregistrements DNS
- wireguard : Établissement du réseau VPN sécurisé
- ufw : Configuration des règles de pare-feu
- etcd : Déploiement du cluster etcd
- kubernetes : Installation et configuration du cluster
- file_output : Génération des fichiers de configuration
- nginx : Déploiement de l’application nginx sur Kubernetes
Configuration requise
Section titled “Configuration requise”Prérequis
Section titled “Prérequis”- OpenTofu ou Terraform >= 1.0
- CLI Scaleway configuré avec un profil
- Compte DigitalOcean avec un token API (pour DNS)
- Clés SSH configurées dans Scaleway
- Domaine avec DNS géré par DigitalOcean
Variables principales
Section titled “Variables principales”# Nombre de nœuds du clusternode_count = 3
# Nombre de nœuds etcd (doit être impair)etcd_node_count = 3
# Domaine et sous-domainedomain = "example.com"subdomain = "stagiaire1"
# Format des noms d'hôteshostname_format = "kube-stagiaire1%d"
# Réseauxoverlay_cidr = "10.96.0.0/16" # Réseau pods Kubernetes
# Configuration Scalewayscaleway_zone = "fr-par-1" # Paris, Francescaleway_type = "DEV1-M" # Type d'instance (2 vCPU, 4GB RAM)scaleway_image = "ubuntu_jammy" # Image Ubuntu 22.04 (Jammy)scaleway_profile = "default" # Profil CLI ScalewayDéploiement
Section titled “Déploiement”0. Configuration préalable de Scaleway CLI
Section titled “0. Configuration préalable de Scaleway CLI”Avant de déployer, configurez la CLI Scaleway :
# Installer la CLI Scalewaycurl -s https://raw.githubusercontent.com/scaleway/scaleway-cli/master/scripts/get.sh | sh
# Configurer le profil (nécessite un token API Scaleway)scw init
# Vérifier la configurationscw config list
# Créer et configurer une clé SSHscw account ssh-key create name=id_stagiaire public-key="$(cat ~/.ssh/id_rsa.pub)"1. Configuration des variables
Section titled “1. Configuration des variables”Créez un fichier terraform.tfvars :
# Configuration Scaleway (authentification via CLI profile)scaleway_profile = "default"scaleway_ssh_keys = ["nom-de-votre-cle-ssh"]
# Configuration DNSdigitalocean_token = "votre-token-digitalocean"domain = "votre-domaine.com"subdomain = "votre-sous-domaine"2. Initialisation et déploiement
Section titled “2. Initialisation et déploiement”# Initialiser OpenTofu/Terraformtofu init
# Vérifier le plantofu plan
# Déployer l'infrastructuretofu apply
# Récupérer la configuration kubectlscp root@<IP-MASTER>:/etc/kubernetes/admin.conf ~/.kube/config-scalewayexport KUBECONFIG=~/.kube/config-scaleway
# Vérifier le clusterkubectl get nodeskubectl get pods -A3. Déploiement d’applications
Section titled “3. Déploiement d’applications”Le module nginx déploie automatiquement un exemple nginx :
# Vérifier le déploiement nginxkubectl get deployment nginx-deploymentkubectl get service nginx-servicekubectl get pods -l app=nginxComposants déployés
Section titled “Composants déployés”Infrastructure
Section titled “Infrastructure”- 3 serveurs Ubuntu 22.04 (Jammy) sur Scaleway
- Instances DEV1-M (2 vCPU, 4GB RAM) pour tous les nœuds
- VPN WireGuard pour sécuriser les communications
- Pare-feu UFW avec règles restrictives
Kubernetes
Section titled “Kubernetes”- Kubernetes dernière version stable
- etcd cluster à 3 nœuds pour la haute disponibilité
- Cilium comme CNI (Container Network Interface)
- CoreDNS pour la résolution DNS interne
- Metrics Server pour les métriques
Sécurité
Section titled “Sécurité”- Communication chiffrée via WireGuard
- Pare-feu UFW restrictif
- API Kubernetes accessible uniquement via VPN
- etcd sécurisé avec TLS
Module de déploiement nginx
Section titled “Module de déploiement nginx”Le module nginx utilise le provider Kubernetes pour déployer :
- Déploiement standard : nginx avec 3 réplicas et configuration de ressources
- Déploiement personnalisé : nginx avec page d’accueil custom via ConfigMap
- Services : ClusterIP pour accès interne et LoadBalancer pour accès externe
- Sondes de santé : liveness et readiness probes
- Namespace : namespace dédié (optionnel)
Ce module démontre l’utilisation du provider Kubernetes pour gérer des ressources directement depuis OpenTofu/Terraform.
Nettoyage
Section titled “Nettoyage”Pour détruire l’infrastructure :
# Détruire toutes les ressourcestofu destroy
# Nettoyer les fichiers générésrm -f hosts kubeconfig.yamlPoints d’attention
Section titled “Points d’attention”- Coûts : Les serveurs Scaleway sont facturés à l’heure
- Authentification : Le provider Scaleway utilise le profil CLI configuré
- DNS : La propagation DNS peut prendre quelques minutes
- Firewall : Seuls les ports nécessaires sont ouverts
- Swap : Le swap est maintenant supporté par Kubernetes (configuré via kubelet)
- Backups : Pensez à sauvegarder les données etcd pour la production
Dépannage
Section titled “Dépannage”Problèmes courants
Section titled “Problèmes courants”- Connexion SSH impossible : Vérifiez que votre clé SSH est bien configurée dans Scaleway
- Authentification Scaleway : Vérifiez la configuration de votre CLI avec
scw config list - DNS non résolu : Attendez la propagation DNS (jusqu’à 5 minutes)
- Kubernetes non accessible : Vérifiez que WireGuard est actif sur tous les nœuds
- Pods en erreur : Vérifiez les logs avec
kubectl logs
Commandes utiles
Section titled “Commandes utiles”# Vérifier l'état du clusterkubectl cluster-infokubectl get nodes -o wide
# Vérifier WireGuardssh root@<NODE-IP> "wg show"
# Vérifier etcdssh root@<NODE-IP> "etcdctl member list"
# Logs Kuberneteskubectl logs -n kube-system <pod-name>