Nous allons utiliser l'outil kubeadm qui va nous permettre de monter un cluster Kubernetes facilement tout en respectant les best practices d'installation.
Nous allons préparer 3 serveurs Ubuntu 18.04 avec le container runtime containerd. Un "master" et deux workers :
sudo hostnamectl set-hostname k8s-control # Puis se déco/reco
sudo hostnamectl set-hostname k8s-worker1 # Puis se déco/reco
sudo hostnamectl set-hostname k8s-worker2 # Puis se déco/reco
Sur toutes les machines
sudo vim /etc/hosts
# Ajouter les 3 IPs privées du cluster
172.31.28.195 k8s-control
172.31.24.234 k8s-worker1
172.31.31.176 k8s-worker2
# Activation des modules overlay / br_netfilter
cat << EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
# Activation des modules
sudo modprobe overlay
sudo modprobe br_netfilter
# Modification nécessaire pour le réseau kubernetes
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
# On applique directement la configuration
sudo sysctl --system
# Installation containerd
sudo apt-get update && sudo apt-get install -y containerd
sudo mkdir -p /etc/containerd
# Ajout configuration par défaut de containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# Restart containerd
sudo systemctl restart containerd
# Désactiver le swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
On va maintenant attaquer la partie installation de kubeadm, kubelet et kubectl :
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
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=1.21.0-00 kubeadm=1.21.0-00 kubectl=1.21.0-00
sudo apt-mark hold kubelet kubeadm kubectl
On va maintenant initialiser le cluster, UNIQUEMENT SUR LE MASTER :
# Cela peut prendre plusieurs minutes (> 5 minutes)
sudo kubeadm init --pod-network-cidr 192.168.0.0/16 --kubernetes-version 1.21.0
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
On va maintenant vérifier le noeud (MASTER) :
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-control NotReady control-plane,master 2m21s v1.21.0
On voit que le status est en "NotReady". Cela est normal car nous n'avons pas de CNI (Container Network Interface).
Afin de disposer des network policy, nous allons installer le CNI Calico (MASTER) :
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
On va maintenant ajouter nos workers au cluster. Pour se faire récupérer la commande "kubeadm join" qui a été généré par kubeadm init ou faire la commande suivante (MASTER) :
kubeadm token create --print-join-command
Sur les deux autres serveurs, exécuter la commande (WORKERS) :
sudo kubeadm join 172.31.28.195:6443 --token t6zdej.yyyyyyyy --discovery-token-ca-cert -hash sha256:xxxxx
On vérifie maintenant (MASTER) :
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-control Ready control-plane,master 7m4s v1.21.0
k8s-worker1 Ready <none> 49s v1.21.0
k8s-worker2 Ready <none> 45s v1.21.0
Tout est prêt Nous avons notre cluster.