Déploiement d'un cluster Kubernetes v1.30.3 en haute disponibilité

Composants essentiels du déploiement

La mise en place d'un cluster Kubernetes repose sur trois piliers fondamentaux que chaque administrateur système doit maîtriser :

  • kubeadm : L'outil de standardisation pour l'initialisation du cluster, la gestion des jetons (tokens) et les mises à jour de version.
  • kubelet : L'agent principal s'exécutant sur chaque nœud, garantissant que les conteneurs sont lancés dans des Pods conformément aux spécifications.
  • kubectl : L'interface en ligne de commande pour interagir avec l'API Server du cluster.

Architecture et planification du réseau

Cette infrastructure utilise une architecture à haute disponibilité avec un plan de contrôle redondé. La répartition des nœuds est la suivante :

Hôte Adresse IP Rôle Services clés
k8s-master-01 172.24.10.11 Control Plane etcd, API Server, Keepalived, HAProxy
k8s-master-02 172.24.10.12 Control Plane etcd, API Server, Keepalived, HAProxy
k8s-master-03 172.24.10.13 Control Plane etcd, API Server, Keepalived, HAProxy
k8s-worker-01 172.24.10.14 Worker Kubelet, Containerd, Calico
k8s-worker-02 172.24.10.15 Worker Kubelet, Containerd, Calico

Note : L'adresse IP virtuelle (VIP) pour l'accès au cluster est fixée à 172.24.10.100 sur le port 16443.

Iintialisation de l'environnement système

Avant d'installer Kubernetes, chaque nœud doit être préparé. Cela inclut la désactivation du swap, la configuration des modules du noyau et l'installation du moteur de conteneur containerd.

#!/bin/bash
# Configuration des modules pour Kubernetes
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# Paramètres sysctl requis
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ésactivation du swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

Configuration de la Haute Disponibilité (Keepalived & HAProxy)

Pour garantir que l'API Server reste accessible même en cas de panne d'un maître, nous utilisons Keepalived pour la gestion de la VIP et HAProxy pour l'équilibrage de charge vers les ports 6443 locaux.

Exemple de configuration haproxy.cfg pour la redirection du trafic :

frontend k8s-api-proxy
    bind *:16443
    mode tcp
    option tcplog
    default_backend k8s-masters

backend k8s-masters
    mode tcp
    option tcp-check
    balance roundrobin
    server master1 172.24.10.11:6443 check
    server master2 172.24.10.12:6443 check
    server master3 172.24.10.13:6443 check

Déploiement du Cluster avec Kubeadm

L'initialisation se fait via un ficheir de configuration YAML pour assurer la répétabilité et la précision des paramètres réseau.

apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.30.3
controlPlaneEndpoint: "172.24.10.100:16443"
networking:
  serviceSubnet: "10.20.0.0/16"
  podSubnet: "10.10.0.0/16"
apiServer:
  certSANs:
  - "172.24.10.100"
  - "k8s-master-01"
  - "k8s-master-02"
  - "k8s-master-03"
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs

Exécutez la commande suivante sur le premier nœud maître :

kubeadm init --config=kubeadm-config.yaml --upload-certs

Installation du plugin réseau (CNI) : Calico

Une fois le plan de contrôle actif, le déploiement de Calico permet la communication entre les Pods. Il est crucial de faire correspondre la variable CALICO_IPV4POOL_CIDR avec le podSubnet défini précédemment.

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

Gestion du stockage persistant avec Longhorn

Longhorn fournit une solution de stockage par blocs distribuée. Il nécessite l'installation d'iscsiadm sur tous les nœuds pour fonctionner correctement.

# Sur CentOS/RHEL
sudo yum install iscsi-initiator-utils -y
sudo systemctl enable --now iscsid

# Déploiement via kubectl
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v1.6.2/deploy/longhorn.yaml

Surveillance et Interface Graphique

Pour finaliser l'installation, nous déployons Metrics Server pour la collecte de statistiques de ressources et Kubernetes Dashboard pour une gestion visuele.

Metrics Server : Indispensable pour l'auto-scaling horizontal (HPA).

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

Helm : Pour simplifier la gestion des applications complexes.

curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Exposition des services avec Nginx Ingress

L'Ingress Controller agit comme la porte d'entrée pour le trafic HTTP/HTTPS externe vers vos services internes au cluster.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/baremetal/deploy.yaml

Étiquettes: kubernetes High Availability calico Longhorn HAProxy

Publié le 23 juillet à 05h34