Files
k8sec/partie-01-installation/01-prereqs.sh
2026-04-27 15:17:01 +02:00

179 lines
7.0 KiB
Bash
Executable File

#!/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 <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# Configuration sysctl pour le réseau
# POURQUOI:
# - bridge-nf-call-iptables: Le trafic bridgé passe par iptables (requis par kube-proxy)
# - ip_forward: Active le routage IP entre interfaces (requis par CNI pour pod-to-pod)
echo "Configuration sysctl..."
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# Désactiver firewalld
# POURQUOI: Sur Exoscale (et la plupart des cloud providers), le filtrage réseau est
# géré par les security groups au niveau hyperviseur. firewalld actif en doublon
# bloque le trafic inter-pods (VXLAN UDP 4789, BGP TCP 179, etc.) localement
# sur le nœud, même si le security group l'autorise.
echo "Désactivation de firewalld (géré par le security group Exoscale)..."
sudo systemctl stop firewalld 2>/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 <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF
if [[ "$NODE_ROLE" == "master" ]]; then
echo "Installation de kubeadm, kubelet, kubectl (control plane)..."
sudo dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
else
echo "Installation de kubeadm, kubelet (worker — kubectl non requis)..."
sudo dnf install -y kubelet kubeadm --disableexcludes=kubernetes
fi
# Verrouiller les versions pour éviter les mises à jour accidentelles
# POURQUOI: Une mise à jour non planifiée de kubelet peut casser le cluster.
# L'upgrade doit être fait de manière contrôlée via kubeadm upgrade.
echo "Verrouillage des versions..."
sudo dnf install -y 'dnf-command(versionlock)' 2>/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