Pré-requis : 3 VMs sous Linux
Dans notre cas, nous allons utiliser le "Container Runtime" Docker. Mais nous pouvons utiliser d'autre CR : containerd, CRI-O...
Voici comment installer Docker sur Ubuntu 20.04 (installation sur les 3 noeuds) :
sudo apt-get update
sudo apt-get install -y \
apt-transport-https \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Une fois le repository ajouté, on va installer Docker engine :
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io
# Empêche le package docker d'être mis à jour automatiquement
sudo apt-mark hold docker-ce
Vérification de la version docker :
$ sudo docker version
Client: Docker Engine - Community
Version: 20.10.6
API version: 1.41
Go version: go1.13.15
Git commit: 370c289
Built: Fri Apr 9 22:47:17 2021
OS/Arch: linux/amd64
Context: default
Experimental: true
...
Afin de ne pas utiliser sudo à chaque fois, nous allons ajouter notre user au groupe docker :
sudo usermod -aG docker $USER
En production, seuls les utilisateurs de confiance doivent être autorisés à contrôler votre daemon Docker cela donne accès à des droits root (voir docker daemon attack surface)
Avant d'installer les outils, nous allons désactiver le swap :
# Vérifier si on le swap activé :
$ sudo swapon --show
NAME TYPE SIZE USED PRIO
/swap.img file 1.9G 4.5M -2
# Si rien ne sort, pas de swap, passer à la suite
sudo swapoff -a
sudo rm /swap.img
# Supprimer la ligne de swap dans /etc/fstab
/swap.img none swap sw 0 0
sudo swapon --show
Installation des 3 outils (installation sur les 3 noeuds) :
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
cat << EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Vérification de la version de kubeadm :
$ kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:30:03Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
On va maintenant lier les 3 noeuds. Un master, 2 workers.
Sur le master :
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
Lorsque c'est fini (peut prendre plusieurs minutes), Copier la commande kubeadm join que l'initialisation a fourni.
On va maintenant initialiser la configuration kubeconfig pour notre user :
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 que tout est bon :
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:31:21Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"21", GitVersion:"v1.21.0", GitCommit:"cb303e613a121a29364f75cc67d3d580833a7479", GitTreeState:"clean", BuildDate:"2021-04-08T16:25:06Z", GoVersion:"go1.16.1", Compiler:"gc", Platform:"linux/amd64"}
On va initialiser les 2 workers afin de finir la mise en place du cluster. Pour se faire, copier la commande kubeadm join et l'exécuter avec sudo :
sudo kubeadm join 172.31.36.190:6443 --token 9nw8uo.n0recr8auo6c84un \
--discovery-token-ca-cert-hash sha256:c9c2225cecebe6a654a74ceee0e5bac4c3ca56863a50a2f8bea80eee85def511
Evidemmment ne publiez pas cette commande sur internet avec un cluster de production. Celle-ci contient l'IP du Master (172.31.36.190:6443) ainsi que les tokens.
Une fois effectué, retourner sur le master puis vérifier que les tout fonctionne bien :
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
15634bebb11c.mylabserver.com NotReady <none> 2m53s v1.21.0
27cc9650391c.mylabserver.com NotReady <none> 3m1s v1.21.0
a6a8895f8f1c.mylabserver.com NotReady control-plane,master 8m35s v1.21.0
Le statut "NotReady" est normal, nous devons maitenant installer un plugin réseau pour kubernetes.
Kubernetes supporte différentes solutions réseau afin d'effectuer la connexion entre les containers. Ici, nous allons utiliser Flannel.
Sur les 3 noeuds :
echo "net.bridge.bridge-nf-call-iptables=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Installation de flannel depuis le master :
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
Refaire un kubectl get nodes quelques minutes plus tard. Le cluster devrait être en statut "Ready".
Si ce n'est pas le cas, vérifier que tous les pods systèmes sont bien up/running :
$ kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
coredns-558bd4d5db-5tmz7 1/1 Running 0 16m
coredns-558bd4d5db-ww2nv 1/1 Running 0 16m
etcd-a6a8895f8f1c.mylabserver.com 1/1 Running 0 16m
kube-apiserver-a6a8895f8f1c.mylabserver.com 1/1 Running 0 16m
kube-controller-manager-a6a8895f8f1c.mylabserver.com 1/1 Running 0 16m
kube-flannel-ds-f58j5 1/1 Running 0 2m40s
kube-flannel-ds-ncqp7 1/1 Running 0 2m40s
kube-flannel-ds-p66k9 1/1 Running 0 2m40s
kube-proxy-72mph 1/1 Running 0 10m
kube-proxy-p9qxz 1/1 Running 0 16m
kube-proxy-vflcs 1/1 Running 0 10m
kube-scheduler-a6a8895f8f1c.mylabserver.com 1/1 Running 0 16m