Ceci est une ancienne révision du document !
Table des matières
Installation de Kubernetes
Nous allons installer Kubernetes sur 2 serveurs :
- Un pour le rôle de master (IP: 10.0.6.8)
- Un pour le rôle de node (IP: 10.0.4.248)
Prérequis
Matériel requis
La machine doit disposer minimum des ressources suivantes :
- 2 Go de mémoire RAM
- 2 CPU
Désactiver la Swap sur les machines
Il est nécessaire de désactiver la swap pour faire fonctionner Kubernetes.
Désactiver la swap sur les 2 serveurs :
swapoff -a
Pour désactiver de manière persistante, mettre ne commentaire le point de montage swap dans le fichier /etc/fstab.
Configurations noyau Linux requis
Editer le fichier :
vim /etc/modules-load.d/k8s.conf
Ajouter les lignes :
overlay br_netfilter
Activer les modules :
modprobe overlay modprobe br_netfilter
Vérifier que les modules sont chargés :
lsmod | grep br_netfilter lsmod | grep overlay
Résultat attandu :
br_netfilter 32768 0 bridge 294912 1 br_netfilter overlay 163840 0
Editer le fichier :
vim /etc/sysctl.d/kubernetes.conf
Insérer les lignes suivantes (Autorisation du Bridge et de l'IP Forwarding) :
net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1
Activation des options réseau du noyau :
sysctl --system
Installer et configurer Docker
Créer le répertoire :
mkdir -p /etc/systemd/system/docker.service.d
Editer le fichier :
vim /etc/docker/daemon.json
Insérer le contenu suivant :
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
Relancer le service Docker :
systemctl daemon-reload systemctl restart docker
Installer Cri-Dockerd (Editeur Mirantis)
Il est nécessaire d'installer un interface CRI (Container Runtime Interface). L'interface recommandée par Kubernetes pour Docker est cri-dockerd.
Vérifier que Docker est bien lancé :
systemctl status docker
Installer les paquetages pré-requis :
apt install git wget curl
Identification de la dernière version de Cri-Dockerd :
VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g') echo $VER
Téléchargement et décompression de l'archive
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgz
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service
wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket
tar xvf cri-dockerd-${VER}.amd64.tgz
Copie des fichiers dans le système :
mv cri-dockerd/cri-dockerd /usr/local/bin/ mv cri-docker.socket cri-docker.service /etc/systemd/system/ sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service
Tester le binaire :
cri-dockerd --version
Résultat attendu :
cri-dockerd 0.3.7 (170103f2)
Activer et lancer Cri-Dockerd :
systemctl daemon-reload systemctl enable cri-docker.service systemctl enable --now cri-docker.socket
Vérifier que le service fonctionne :
systemctl status cri-docker.socket
Résultat attendu :
● cri-docker.socket - CRI Docker Socket for the API Loaded: loaded (/etc/systemd/system/cri-docker.socket; enabled; preset: enabled) Active: active (listening) since Mon 2023-12-04 05:45:27 UTC; 10s ago ...
Installation
A faire sur le master et les nodes
Ajouter le dépôt à APT :
apt install apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | gpg --dearmor -o /etc/apt/trusted.gpg.d/google.gpg add-apt-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"
Installation :
apt update apt install kubelet kubeadm kubectl kubernetes-cni
Vérifier le fonctionnement :
kubectl version --client && kubeadm version
Résultat attendu :
Client Version: v1.28.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
kubeadm version: &version.Info{Major:"1", Minor:"28", GitVersion:"v1.28.2", GitCommit:"89a4ea3e1e4ddd7f7572286090359983e0387b2f", GitTreeState:"clean", BuildDate:"2023-09-13T09:34:32Z", GoVersion:"go1.20.8", Compiler:"gc", Platform:"linux/amd64"}
Activer le service kubelet de Kubernetes :
systemctl enable kubelet
Initialisation du Master et ajout des Nodes
Initialisation du Master
Il s'agit d'installer les images et lancer les conteneurs nécessaires au fonctionnement du Master.
Ajouter l'enregistrement de l'hôte dans le fichier hosts :
echo "10.0.6.8 k8s-master" >> /etc/hosts
Paramétrer la méthode de récupération d'image.
kubeadm config images pull --cri-socket /run/cri-dockerd.sock
Initialisation du Cluster :
kubeadm init --pod-network-cidr=192.168.89.0/16 --cri-socket /run/cri-dockerd.sock
- pod-network-cidr : C'est pour définir le réseau dédié au fonctionnement des POD Kubernetes. Il faut que les IP des nodes soient dans ce réseau.
Résultat attendu :
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.0.6.8:6443 --token 0f1p8l.i5789sopbs4yod8r \
--discovery-token-ca-cert-hash sha256:99642bae81510327a55119dbc73bb3291eda748924cd889090239292dd91fea8
Nous allons suivre les instructions indiqué lors de l'initialisation du Cluster :
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
Vérifier les informations du cluster :
kubectl cluster-info
Résultat attendu :
Kubernetes control plane is running at https://10.0.6.8:6443 CoreDNS is running at https://10.0.6.8:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Ajout des Nodes
A faire sur chaque node.
Pour enregistrer le node au master :
kubeadm join 10.0.6.8:6443 --token 0f1p8l.i5789sopbs4yod8r --discovery-token-ca-cert-hash \ sha256:99642bae81510327a55119dbc73bb3291eda748924cd889090239292dd91fea8 --cri-socket /run/cri-dockerd.sock
Vérification des nodes sur le Master
Vérifier la liste des nodes :
kubectl get nodes
Résultat attendu :
NAME STATUS ROLES AGE VERSION k8s-master NotReady control-plane 18m v1.28.2 k8s-node NotReady <none> 8m37s v1.28.2
Installation et configuration du plugin réseau
Nous utiliserons le plugin Flannel.
Il est validé par l'éditeur Kubernetes.
Installation de Flannel
Récupération du fichier manisfeste Yml :
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
Editer le fichier téléchargé :
vim kube-flannel.yml
Ajuster la variable Network dans la section net-conf.json
net-conf.json: |
{
"Network": "192.168.89.0/16",
"Backend": {
"Type": "vxlan"
}
}
Appliquer le manisfeste :
kubectl apply -f kube-flannel.yml
Vérifier si les pods Flannel ont bien démarré :
kubectl get pods -n kube-flannel
Résultat attendu :
NAME READY STATUS RESTARTS AGE kube-flannel-ds-6dqj2 1/1 Running 0 95s kube-flannel-ds-lkt76 1/1 Running 0 95s
Vérifier que les nodes sont prêt :
kubectl get nodes -o wide
Résultat attendu :
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME k8s-master Ready control-plane 56m v1.28.2 10.0.6.8 <none> Debian GNU/Linux 12 (bookworm) 6.1.0-13-cloud-amd64 docker://24.0.7 k8s-node Ready <none> 46m v1.28.2 10.0.4.248 <none> Debian GNU/Linux 12 (bookworm) 6.1.0-13-cloud-amd64 docker://24.0.7
Test de fonctionnement
Nous allons déployer une simple application pour le test.
Téléchargement et création de l'application :
kubectl apply -f https://k8s.io/examples/pods/commands.yaml
Résultat attendu :
pod/command-demo created
Vérifier que l'application fonctionne :
kubectl get pods
Résultat attendu :
NAME READY STATUS RESTARTS AGE command-demo 0/1 Completed 0 4m16s
Configurations complémentaires
Paramétrer la complétion de commande Kubernetes :
echo 'source <(kubectl completion bash)' >>~/.bashrc
L'activer à la volée :
source /etc/bash_completion source <(kubectl completion bash)
Installation du Dashboard (optionnel)
Déploiement
Déploiement du Dashboard :
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
Pour vérifier, lister des services :
kubectl get svc -n kubernetes-dashboard
Résultat attendu :
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE dashboard-metrics-scraper ClusterIP 10.110.254.116 <none> 8000/TCP 2m4s kubernetes-dashboard ClusterIP 10.97.175.192 <none> 443/TCP 2m4s
Publier le service
Lancer le proxy :
kubectl proxy
Création du compte utilisateur
Créer un fichier manifeste :
vim dashboard-admin.yaml
Insérer le contenu suivant :
apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard
Appliquer le manisfeste :
kubectl apply -f dashboard-admin.yaml
Résultat attendu :
serviceaccount/admin-user created clusterrolebinding.rbac.authorization.k8s.io/admin-user created
