Fondamentaux et Installation de Kubernetes : Architecture et Déploiement

L'Évolution vers l'Orchestration Cloud-Native

Si les outils comme Docker ont standardisé la création d'environnements conteneurisés, ils ne suffisent pas à gérer le cycle de vie d'applications distribuées complexes sur plusieurs hétérogènes machines. Le besoin de coordination s'est fait sentir pour passer d'une architecture monolithique locale vers une infrastructure scalable et résiliente. C'est dans cette optique qu'a émergé Kubernetes, un moteur open-source orchestrant les déploiements de conteneurs.

Bénéficiant de l'héritage du système interne Google, Borg, Kubernetes orchestre des clusters d'hôtes en garantissant que l'état désiré de l'application est maintenu. Son écosystème massif repose entièrement sur le langage Go, offrant une API robuste et extensible. Contrairement à ECS ou d'autres solutions propriétaires isolées, Kubernetes offre une abstraction réseau unifiée et une gestion déclarative de l'état des ressources.

Modes Opératoires et Composants Clés

La plateforme fonctionne selon un modèle maître-esclave (Master-Worker) décentralisé. Voici les briques logiques essentielles :

  • Le Pod : Unité atomique déployable. Il encapsule un ou plusieurs conteneurs partageant le même espace réseau et stockage local. Chaque pod se voit attribuer une adresse IP unique au sein du cluster.
  • Nœuds (Nodes) : Ce sont les machines physiques ou virtuelles composant le cluster. Elles fournissent les ressources de calcul (CPU/RAM) nécessaires pour exécuter les pods et hébergent les agents (kubelet).
  • Sélecteurs et Annotations : Les labels permettent de regrouper objectivement des ressources par fonctionnalité (ex: tier=frontend). Les annotations servent quant à elles à stocker des métadonnées non indexables (ex: notes de version).
  • Découverte de Service (Service Discovery) : Le backend de configuration utilise etcd pour stocker l'état global. Le DNS interne (CoreDNS par défaut) permet à un service de communiquer avec un autre simplement par son nom de domaine sans connaître l'IP dynamique d'un pod spécifique.
  • Gestionnaires de Charge (Controllers) :
    • ReplicaSet : Assure la réplication constante des pods selon un nombre cible défini.
    • DaemonSet : Lance un pod sur chaque nœud disponible (utile pour les collecteurs de logs ou le monitoring).
    • StatefulSet : Gère les applications persistantes avec des identités de réseau stables (ex: base de données, zookeeper).
    • Job : Exécute un processus qui doit atteindre un état complet puis s'arrêter.
  • Déploiement (Deployment) : Abstraction de haut niveau facilitant les mises à jour progressives (rolling updates) et les rollbacks d'applications sans temps d'arrêt.
  • Configuration et Sécurité : Les ConfigMaps séparenet la configuraton binaire de l'image application. Les Secrets gèrent les données sensibles (token, mot de passe) via chiffrement au repos.

Prérequis Environnementaux

Pour construire un cluster fonctionnel avec kubeadm, l'environnement Linux (typiquement CentOS ou Ubuntu) doit satisfaire certaines contraintes de sécurité et de performance :

  1. Système d'exploitation récent (Kernel 4.x+ requis généralement).
  2. Communication interne entre hôtes autorisée sur tous les ports critiques.
  3. Accès Internet pour le téléchargement d'images et paquets binaires.
  4. Désactivation obligatoire du Swap mémoire pour garantir le respect des quotas.
  5. Gestionnaire de paquets compatible YUM/DNF.

Configuration du Système Hôte

Avant toute initialisation, il convient de préparer le système en modifiant les paramètres noyau et les règles de pare-feu.

# Identification des variables globales
OS_CONFIG=/etc/sysconfig/selinux
FIREWALL_CONF=/etc/firewalld/services.xml

# Désactiver la protection SELinux et le Pare-feu
setenforce 0
sed -i 's/^\(SELINUX=\).*$/\1disabled/' /etc/selinux/config

systemctl disable firewalld
systemctl stop firewalld

# Désactivation de la partition Swap pour éviter l'éviction mémoire indésirable
sed -i '/ swap / s/^\(.*\)/#\1/g' /etc/fstab
swapoff -a

# Configuration des paramètres réseau bridge
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system

Installation des Composants

L'installation repose sur trois binaires principaux : kubelet (agent), kubectl (CLI) et kubeadm (outil de bootstrap).

1. Gestion des Repositories Docker et K8s

Pour optimiser les performances, configurez un miroir accéléré avant les commandes.

DOCKER_MIRROR=https://docker-mirror.registry.example.com
cat > /etc/yum.repos.d/docker-ce.repo << EOF
[docker-ce-stable]
name=Docker CE Stable - \$basearch
baseurl=${DOCKER_MIRROR}
enabled=1
gpgcheck=1
EOF

# Ajout du repository officiel Kubernetes
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes Repository
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

yum install docker-ce kubernetes -y
systemctl enable --now docker.service
systemctl enable --now kubelet.service

2. Initialisation du Maître (Master Node)

Cette étape initie la control plane et génère les certificats TLS.

# Définition des variables d'installation
CONTROL_PLANE_IP="10.0.0.5"
K8S_VERSION="1.26.4"
SERVICE_CIDR="10.96.0.0/12"
POD_CIDR="10.244.0.0/16"

# Lancement de la commande init
kubeadm init \
  --control-plane-endpoint "${CONTROL_PLANE_IP}" \
  --pod-network-cidr "${POD_CIDR}" \
  --service-cidr "${SERVICE_CIDR}" \
  --kubernetes-version "${K8S_VERSION}" \
  --image-repository registry.k8s.io

# Configuration de l'accès administrateur local
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

# Vérification
kubectl get nodes

Pour ajouter des machines supplémentaires au cluster, exécutez la commande fournie par l'étape init précédemment ci-dessus sur les nouveaux nœuds.

# Sur chaque nouveau nœud worker
# La structure générale est : kubeadm join <master-ip>:<port> --token <token> --discovery-token-ca-cert-hash ...
kubeadm join ${CONTROL_PLANE_IP}:6443 --token jlkqem.qdj70owmdlpj0k2l \
  --discovery-token-ca-cert-hash sha256:341eb09042633a6818d9c594fc6e8d0337be4385fad7dd44689c1879f19e24dd
</token></port></master-ip>

Intégration du Réseau Overlay (CNI)

Les pods ne peuvent pas communiquer inter-pods sans plugin CNI (Container Network Interface). Flannel est souvent utilisé comme solution simple.

# Téléchargement du manifeste de configuration
URL_CONFIG="https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml"
FLANNEL_YAML="flannel-config.yaml"

curl -sL ${URL_CONFIG} | sed 's@image@registry.k8s.io/flannel@' > ${FLANNEL_YAML}

# Application du manifeste
kubectl apply -f ${FLANNEL_YAML}

# Surveillance de l'état des composants systèmes
kubectl get pods -n kube-system -w

Lorsque tous les Pods du namespace kube-system passent au statut Running, le cluster est opérationnel. La vérification finale implique de lancer un test de ping entre deux pods situés sur différents nœuds.

Étiquettes: kubernetes kubeadm container-orchestration cni Linux-Administration

Publié le 22 août à 02h40