#!/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