Provisionner un Cluster avec kubeadm pour une Expérience Pratique
coolibra613 vues
Pour garantir une immersion pratique, nous provisionnerons ensemble un cluster Kubernetes. Cette étape essentielle permettra de se familiariser avec l’infrastructure Kubernetes, ses composants principaux, et d’avoir une première expérience de l’interaction avec le cluster.
- L’installation et la configuration de kubeadm, kubelet et kubectl pour créer un cluster.
- La configuration du réseau des pods en utilisant des plugins CNI comme Calico ou Flannel.
- L’ajout de nœuds au cluster pour simuler un environnement distribué.
Prérequis
- Système d'exploitation: Ubuntu 22.04 ou une distribution Linux similaire.
- Matériel: Au moins 2 Go de RAM, 2 CPUs et 20Go de stockage pour chaque node; pour être à l'aise, prendre 4Go, 2 vCPU et 20Go de stockage.
- Logiciels:
- containerd
- Kubeadm, Kubelet, et kubectl
- Droits admin sur les nodes
- Definir un hostname unique et ajouter le dns dans /etc/hosts et /etc/hostname


Étape 1: Installation des pérequis
- Installer vim, pgp, curl, wget et git
sudo apt install -y vim gpg curl wget git
sudo apt update && sudo apt -y full-upgrade
sudo apt update && sudo apt install -y apt-transport-https ca-certificates
- Installer containerd
sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab
cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo apt install -y containerd && sudo systemctl start containerd.service
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd
- Installer kubectl, kubeadm et kubelet
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
apt list -a kubelet
KUBE_VERSION=1.29.0-1.1
sudo apt -y install kubelet=$KUBE_VERSION kubeadm=$KUBE_VERSION kubectl=$KUBE_VERSION
sudo modprobe overlay
sudo modprobe br_netfilter && echo "br_netfilter" | sudo tee -a /etc/modules
sudo sysctl --system
- kubeadm config à ajoutéer sur le node leader: vim kubeadm.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
clusterName: kubeadm-cluster-dev
networking:
podSubnet: "10.11.0.0/16"
dnsDomain: cluster.local
serviceSubnet: "10.12.0.0/16"
kubernetesVersion: 1.29.0
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
nodeRegistration:
criSocket: unix:///run/containerd/containerd.sock
Étape 2: Instier le leader et joindre les workers
- A executer sur le node leader uniquement. kubeadm-leader-01
sudo kubeadm init --config=kubeadm.yaml --upload-certs

Pour verifier l'état du node:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get nodes
sudo crictl --runtime-endpoint unix:///run/containerd/containerd.sock ps -a

- Copier le commande kubeadm join pour l'executer sur les workers
sudo kubeadm join 10.10.10.178:6443 --token zzl6wi.cbq8cpuquvv3a9mt \
--discovery-token-ca-cert-hash sha256:9e35d361fbe7cbc2214c600ecc9889ce53aede3e525d373adc26a22e92a37962
Étape 3: Installer le réseau (CNI plugin) par exemple calico
Le status des nodes est Not Ready car le reseau n'est pas installé. Sur le leader uniquement executer:
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/tigera-operator.yaml
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.29.0/manifests/custom-resources.yaml
kubectl create -f tigera-operator.yaml
sed -ie 's/192.168.0.0/10.11.0.0/g' custom-resources.yaml
kubectl create -f custom-resources.yaml
kubectl get pods -A
kubectl get pods --all-namespaces -w

Les nodes sont maintenant ready. Le cluster est prêt.
- Comme on a que 2 workers, on va donner le role worker à leader en plus de son role leader pour avoir 3 workers. Le leader aura donc tous les roles (leader et worker)
- Le leader a en plus le role etcd, il faut afficher le label etcd
- La colonne roles est none pour les worker. if aut ajouter le label worker:
kubectl get no -o wide
# donner le role worker au leader
kubectl taint nodes kubeadm-leader-01 node-role.kubernetes.io/control-plane-
# ajouter le label worker à tous les nodes
kubectl label nodes kubeadm-leader-01 kubeadm-worker-01 kubeadm-worker-02 node-role.kubernetes.io/worker=worker
# ajouter le label etcd au leader
kubectl label nodes kubeadm-leader-01 node-role.kubernetes.io/etcd=etcd
kubectl get no -o wide

- Copier le kubeconfig depuis le leader
cat /etc/kubernetes/admin.conf
- Sur votre laptop
mkdir -p $HOME/.kube
# copier le contenu de cat /etc/kubernetes/admin.conf depuis le leader
vim $HOME/.kube/config
# accorder les bons droit au fichier config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get no

Explorer le cluster:
- Namespaces par defaut:
- default : namespace pour les objects par defaut. Si on ne renseigne de namespace dans un objet, il est créé ici par defaut.
- kube-public: Namespace des object dont tous le monde (y compris ceux non authentifiés) a accès ou doit avoir accès.
- kube-system: Namespace très important. C'est est créé les composant du cluster. L'accès doit être restreint.
- kube-node-lease: Cet espace de noms contient les objets Lease(baux) associés à chaque nœud. Les baux de nœuds permettent au kubelet d'envoyer des heartbeats afin que le control-plane puisse détecter une défaillance du nœud.
-
- Les namespaces calico-apiserver, calico-system et tigera-operator ne sont pas des namespace par defaut de kubernetes. Il sont créé par le CNI plugin calico
kubectl get ns

- Les composants du cluster:
kubectl get po -n kube-system -o wide

Comme on a un seul node, les composants kube-scheduler, etcd, kube-apiserver, kube-controller-manager sont en un seul replica.
- 1 et 2: coredns est un addon qui gere le dns dans le cluster kubernetes
- 3 etcd: la base données clé valeur qui stocke l'état du cluster
- 4 apiserver : le compsant central du cluster
- 5 controller manager: gere les controllers
- 6, 7, 8 kube-proxy: gere les regles reseau dans le cluster
- 9 scheduler: planifie et selectionne les nodes qui vont recevoir les pods
Commentaires
Connectez-vous pour rejoindre la discussion.
Aucun commentaire pour le moment.