first commit
This commit is contained in:
178
partie-01-installation/01-prereqs.sh
Executable file
178
partie-01-installation/01-prereqs.sh
Executable file
@@ -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 <<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
|
||||||
29
partie-01-installation/02-init-control-plane.sh
Executable file
29
partie-01-installation/02-init-control-plane.sh
Executable file
@@ -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
|
||||||
22
partie-01-installation/03-join-workers.sh
Executable file
22
partie-01-installation/03-join-workers.sh
Executable file
@@ -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"
|
||||||
24
partie-01-installation/04-install-flannel.sh
Executable file
24
partie-01-installation/04-install-flannel.sh
Executable file
@@ -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
|
||||||
37
partie-01-installation/05-verify-cluster.sh
Executable file
37
partie-01-installation/05-verify-cluster.sh
Executable file
@@ -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! ==="
|
||||||
Reference in New Issue
Block a user