#!/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 --- 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 } 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 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))" 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) echo "Désactivation du swap..." sudo swapoff -a sudo sed -i '/ swap / s/^/#/' /etc/fstab # Installer container-selinux AVANT containerd pour que les labels SELinux soient corrects # POURQUOI: container-selinux fournit la policy qui confine chaque container dans le label # container_t — un container compromis ne peut pas lire /etc/passwd ni écrire # dans les répertoires système de l'hôte, même en root dans le container. echo "Installation de container-selinux..." sudo dnf install -y container-selinux # Maintenir SELinux en mode enforcing # POURQUOI: Le mode permissive ne fait que logger les violations sans les bloquer — # c'est une fausse sécurité. En enforcing + container-selinux, les appels # système non autorisés depuis les containers sont bloqués au niveau kernel. echo "Vérification SELinux en mode enforcing..." sudo setenforce 1 || true SELINUX_CURRENT=$(getenforce 2>/dev/null || echo "Unknown") if [[ "$SELINUX_CURRENT" != "Enforcing" ]]; then echo "ATTENTION: SELinux n'est pas en mode Enforcing (actuel: $SELINUX_CURRENT)" echo "Vérifier /etc/selinux/config — SELINUX doit être 'enforcing'" fi # Charger les modules kernel nécessaires # overlay, br_netfilter : requis par containerd et le CNI # ip_vs, ip_vs_rr/rr/wrr/sh : requis par Cilium en mode kube-proxy replacement (IPVS) # nf_conntrack : suivi des connexions réseau (requis par iptables/eBPF) echo "Configuration des modules kernel..." cat </dev/null || sudo modprobe nf_conntrack_ipv4 2>/dev/null || true # Configuration sysctl # bridge-nf-call-iptables/ip6tables : trafic bridgé traité par iptables (requis CNI) # ip_forward : routage IP entre interfaces (requis pod-to-pod) # rp_filter=0 : Cilium eBPF requiert que le reverse path filtering soit désactivé # inotify params : requis par Cilium pour surveiller les changements de configuration echo "Configuration sysctl..." cat < /dev/null # Activer systemd cgroup driver (OBLIGATOIRE pour kubeadm) 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" else sudo dnf versionlock add kubelet kubeadm 2>/dev/null || echo "Note: versionlock non disponible" fi # Installer Helm sur le master (requis pour Cilium, KubeArmor, Kyverno) if [[ "$NODE_ROLE" == "master" ]]; then if ! command -v helm &>/dev/null; then echo "Installation de Helm..." HELM_VERSION="v3.17.3" curl -L "https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz" -o /tmp/helm.tar.gz tar -xzf /tmp/helm.tar.gz -C /tmp sudo mv /tmp/linux-amd64/helm /usr/local/bin/helm rm -rf /tmp/linux-amd64 /tmp/helm.tar.gz echo " ✓ Helm ${HELM_VERSION} installé" else echo " ✓ Helm déjà installé: $(helm version --short)" fi fi sudo systemctl enable kubelet echo "" echo "=== Vérifications ===" echo "Swap désactivé: $(free -h | grep Swap | awk '{print $2}') (doit être 0)" SELINUX_STATUS=$(getenforce 2>/dev/null || echo "Unknown") if [[ "$SELINUX_STATUS" == "Enforcing" ]]; then echo "SELinux: $SELINUX_STATUS ✓" else echo "SELinux: $SELINUX_STATUS ⚠ ATTENTION: doit être Enforcing" fi echo "Modules kernel: $(lsmod | grep -E 'overlay|br_netfilter|ip_vs|nf_conntrack' | wc -l)/7 chargés" echo "firewalld: $(systemctl is-active firewalld)" 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 if command -v helm &>/dev/null; then echo "Version helm: $(helm version --short)" fi