From 5760eab56a3bb60331891b53446ebc1fbbf5a9e6 Mon Sep 17 00:00:00 2001 From: Louis Labeyrie Date: Mon, 27 Apr 2026 15:17:01 +0200 Subject: [PATCH] first commit --- partie-01-installation/01-prereqs.sh | 178 ++++++++++++++++++ .../02-init-control-plane.sh | 29 +++ partie-01-installation/03-join-workers.sh | 22 +++ partie-01-installation/04-install-flannel.sh | 24 +++ partie-01-installation/05-verify-cluster.sh | 37 ++++ 5 files changed, 290 insertions(+) create mode 100755 partie-01-installation/01-prereqs.sh create mode 100755 partie-01-installation/02-init-control-plane.sh create mode 100755 partie-01-installation/03-join-workers.sh create mode 100755 partie-01-installation/04-install-flannel.sh create mode 100755 partie-01-installation/05-verify-cluster.sh diff --git a/partie-01-installation/01-prereqs.sh b/partie-01-installation/01-prereqs.sh new file mode 100755 index 0000000..dcd6775 --- /dev/null +++ b/partie-01-installation/01-prereqs.sh @@ -0,0 +1,178 @@ +#!/bin/bash +# Partie 1 - Pré-requis et installation des composants Kubernetes +# À exécuter sur TOUS les nœuds (master + workers) +# Compatible CentOS Stream 10 + +set -e + +# --- Détermination du rôle du nœud --- +# Priorité : option --role > argument positionnel > autodetect via hostname +NODE_ROLE="" + +usage() { + echo "Usage: $0 [--role master|worker] | [master|worker]" + echo " --role master|worker : forcer le rôle explicitement" + echo " master|worker : argument positionnel (compatibilité)" + echo " (aucun argument) : autodetect via hostname (*master*, *control* → master)" + exit 1 +} + +# Parsing des arguments +while [[ $# -gt 0 ]]; do + case "$1" in + --role) + shift + case "$1" in + master|worker) NODE_ROLE="$1" ;; + *) echo "Erreur: --role attend 'master' ou 'worker', reçu '$1'"; usage ;; + esac + shift + ;; + master|worker) + NODE_ROLE="$1" + shift + ;; + -h|--help) usage ;; + *) echo "Argument inconnu: $1"; usage ;; + esac +done + +# Autodetect si aucun rôle fourni +if [[ -z "$NODE_ROLE" ]]; then + if [[ "$(hostname)" == *"master"* ]] || [[ "$(hostname)" == *"control"* ]]; then + NODE_ROLE="master" + echo "Autodetect: rôle 'master' détecté via hostname ($(hostname))" + else + NODE_ROLE="worker" + echo "Autodetect: rôle 'worker' (hostname: $(hostname) ne contient pas 'master'/'control')" + fi +else + echo "Rôle: '$NODE_ROLE' (explicite)" +fi + +echo "=== Installation des pré-requis Kubernetes sur CentOS 10 [rôle: $NODE_ROLE] ===" + +# Désactiver le swap (requis par Kubernetes) +# POURQUOI: Kubernetes doit connaître la RAM réelle disponible pour le scheduling. +# Le swap introduit des latences imprévisibles et fausse les limites mémoire des pods. +echo "Désactivation du swap..." +sudo swapoff -a +sudo sed -i '/ swap / s/^/#/' /etc/fstab + +# Désactiver SELinux (mode permissive pour le TD) +# POURQUOI: Simplifie le troubleshooting. En production, utiliser SELinux enforcing +# avec les policies container-selinux appropriées. +echo "Configuration de SELinux en mode permissive..." +sudo setenforce 0 || true +sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config + +# Charger les modules kernel nécessaires +# POURQUOI: +# - overlay: Système de fichiers pour les layers des containers (utilisé par containerd) +# - br_netfilter: Permet à iptables/nftables de voir le trafic bridgé (nécessaire pour CNI) +echo "Configuration des modules kernel..." +cat </dev/null || true +sudo systemctl disable firewalld 2>/dev/null || true +echo " ✓ firewalld désactivé" + +# Installation de containerd depuis le repo Docker +# POURQUOI: containerd.io du repo Docker est plus récent et mieux maintenu que celui des repos CentOS +echo "Ajout du repo Docker pour containerd..." +sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo + +echo "Installation de containerd..." +sudo dnf install -y containerd.io + +# Configuration de containerd +sudo mkdir -p /etc/containerd +containerd config default | sudo tee /etc/containerd/config.toml > /dev/null + +# Activer systemd cgroup driver (OBLIGATOIRE pour kubeadm) +# POURQUOI: CentOS 10 utilise systemd comme init system et gestionnaire de cgroups v2. +# Le kubelet utilise aussi systemd cgroup driver par défaut depuis K8s 1.22+. +# Si containerd et kubelet utilisent des drivers différents (cgroupfs vs systemd): +# - Conflits de gestion mémoire +# - Pods qui ne démarrent pas ou crashent +# - Métriques incorrectes +# - Comportement OOM imprévisible +echo "Activation du driver cgroup systemd pour containerd..." +sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml + +sudo systemctl restart containerd +sudo systemctl enable containerd + +# Installation des paquets Kubernetes +echo "Configuration du repo Kubernetes..." +cat </dev/null || true +if [[ "$NODE_ROLE" == "master" ]]; then + sudo dnf versionlock add kubelet kubeadm kubectl 2>/dev/null || echo "Note: versionlock non disponible, pensez à surveiller les mises à jour" +else + sudo dnf versionlock add kubelet kubeadm 2>/dev/null || echo "Note: versionlock non disponible, pensez à surveiller les mises à jour" +fi + +# Activer kubelet +sudo systemctl enable kubelet + +echo "" +echo "=== Vérifications ===" +echo "Swap désactivé: $(free -h | grep Swap | awk '{print $2}') (doit être 0)" +echo "SELinux: $(getenforce)" +echo "Modules kernel: $(lsmod | grep -E 'overlay|br_netfilter' | wc -l)/2 chargés" +echo "containerd: $(systemctl is-active containerd)" +echo "SystemdCgroup: $(grep 'SystemdCgroup = true' /etc/containerd/config.toml > /dev/null && echo 'activé' || echo 'ATTENTION: non activé!')" +echo "" +echo "✓ Pré-requis installés avec succès!" +echo "Version kubeadm: $(kubeadm version -o short)" +echo "Version kubelet: $(kubelet --version)" +if command -v kubectl &>/dev/null; then + echo "Version kubectl: $(kubectl version --client -o yaml | grep gitVersion)" +fi diff --git a/partie-01-installation/02-init-control-plane.sh b/partie-01-installation/02-init-control-plane.sh new file mode 100755 index 0000000..eb8fa4d --- /dev/null +++ b/partie-01-installation/02-init-control-plane.sh @@ -0,0 +1,29 @@ +#!/bin/bash +# Partie 1 - Initialisation du control plane +# À exécuter UNIQUEMENT sur le nœud MASTER + +set -e + +echo "=== Initialisation du Control Plane Kubernetes ===" + +# Définir le réseau pod (utilisé par Flannel) +POD_NETWORK_CIDR="10.244.0.0/16" + +echo "Initialisation de kubeadm avec le réseau pod $POD_NETWORK_CIDR..." +sudo kubeadm init --pod-network-cidr=$POD_NETWORK_CIDR --apiserver-advertise-address=$(hostname -I | awk '{print $1}') + +echo "" +echo "Configuration de kubectl pour l'utilisateur courant..." +mkdir -p $HOME/.kube +sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config +sudo chown $(id -u):$(id -g) $HOME/.kube/config + +echo "" +echo "✓ Control plane initialisé avec succès!" +echo "" +echo "Pour joindre des workers au cluster, récupérez la commande 'kubeadm join' ci-dessus" +echo "ou régénérez-la avec: kubeadm token create --print-join-command" +echo "" +echo "Statut des composants du control plane:" +kubectl get nodes +kubectl get pods -n kube-system diff --git a/partie-01-installation/03-join-workers.sh b/partie-01-installation/03-join-workers.sh new file mode 100755 index 0000000..c934013 --- /dev/null +++ b/partie-01-installation/03-join-workers.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Partie 1 - Jonction des workers au cluster +# À exécuter sur chaque nœud WORKER + +set -e + +echo "=== Jonction d'un worker au cluster Kubernetes ===" +echo "" +echo "ATTENTION: Ce script nécessite la commande 'kubeadm join' générée par le master" +echo "" +echo "Si vous n'avez pas la commande, exécutez sur le master:" +echo " kubeadm token create --print-join-command" +echo "" +read -p "Entrez la commande kubeadm join complète: " JOIN_COMMAND + +echo "" +echo "Exécution de: $JOIN_COMMAND" +sudo $JOIN_COMMAND + +echo "" +echo "✓ Worker joint au cluster avec succès!" +echo "Retournez sur le master et vérifiez avec: kubectl get nodes" diff --git a/partie-01-installation/04-install-flannel.sh b/partie-01-installation/04-install-flannel.sh new file mode 100755 index 0000000..8d67409 --- /dev/null +++ b/partie-01-installation/04-install-flannel.sh @@ -0,0 +1,24 @@ +#!/bin/bash +# Partie 1 - Installation du CNI Flannel +# À exécuter sur le nœud MASTER + +set -e + +echo "=== Installation du CNI Flannel ===" + +# Télécharger et appliquer le manifest Flannel +echo "Application du manifest Flannel..." +kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml + +echo "" +echo "Attente du déploiement de Flannel..." +kubectl wait --for=condition=ready pod -l app=flannel -n kube-flannel --timeout=180s + +echo "" +echo "✓ Flannel installé avec succès!" +echo "" +echo "Vérification des pods réseau:" +kubectl get pods -n kube-flannel +echo "" +echo "Vérification des nœuds (tous doivent être Ready):" +kubectl get nodes diff --git a/partie-01-installation/05-verify-cluster.sh b/partie-01-installation/05-verify-cluster.sh new file mode 100755 index 0000000..acf4557 --- /dev/null +++ b/partie-01-installation/05-verify-cluster.sh @@ -0,0 +1,37 @@ +#!/bin/bash +# Partie 1 - Vérification du cluster +# À exécuter sur le nœud MASTER + +set -e + +echo "=== Vérification du cluster Kubernetes ===" +echo "" + +echo "1. Vérification des nœuds:" +kubectl get nodes -o wide +echo "" + +echo "2. Vérification des composants du control plane:" +kubectl get pods -n kube-system +echo "" + +echo "3. Vérification du CNI Flannel:" +kubectl get pods -n kube-flannel +echo "" + +echo "4. Test de déploiement d'un pod simple:" +kubectl run test-pod --image=nginx --restart=Never --rm -i --tty -- echo "✓ Connectivité pod fonctionnelle" +echo "" + +echo "5. Vérification de la communication inter-pods:" +kubectl create deployment nginx-test --image=nginx --replicas=3 +kubectl wait --for=condition=available deployment/nginx-test --timeout=60s +echo "✓ Déploiement réussi" +kubectl get pods -o wide -l app=nginx-test +echo "" + +echo "Nettoyage du test..." +kubectl delete deployment nginx-test + +echo "" +echo "=== Cluster vérifié avec succès! ==="