Je vais pas revenir sur l'actualité et l'annonce de Kubernetes qui déprécie Docker dans les futures versions, je vous invite à lire les articles existants sur le sujet. Par exemple celui-ci : https://particule.io/blog/kubernetes-docker-support/
Je vais plutôt m'intéresser au côté technique de l'installation d'un cluster Kubernetes sans Docker.
Je repars sur la même base que mon article précédent : https://www.aukfood.fr/quand-buster-pilote-le-porte-conteneurs/
Je pars sur une infra avec 4 serveurs :
- un master qui aura une ip publique et un réseau privé
- 3 workers sur le réseau privé
- Debian 10 à jour
- pas de swap
Plus tard j'ajouterais des disques additionnels sur les workers pour mettre en place un stockage persistant avec Longhorn #teaserfuturarticle
Kernel récent
Sur la Debian 10 on à de base un kernel 4.19. Pour bénéficier des dernières avancées des kernel Linux on peut installer les paquets backports de Debian et installer la Debian 5.9. Voir : https://www.osradar.com/how-to-install-linux-kernel-5-9-debian-10/
Installation de containerd
A la place de docker on va installer containerd.
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
echo "deb [arch=amd64] https://download.docker.com/linux/debian buster stable" > /etc/apt/sources.list.d/docker.list
apt update
apt install containerd
rm /etc/containerd/config.toml
systemctl restart containerd
Installation des paquets pour kubernetes
Pour cette partie aucuns changements :
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" > /etc/apt/sources.list.d/kubernetes.list
apt update
apt install kubeadm kubelet kubectl -y
Activation de modules réseau
Il faut activer les modules suivants (nb ne pas oublier de les mettre en chargement automatique) :
modprobe overlay
modprobe br_netfilter
Adaptation de sysctl
Dans /etc/sysctl.conf :
net.bridge.bridge-nf-call-iptables=1
net.ipv4.ip_forward=1
net.ipv6.conf.all.disable_ipv6 = 1
sysctl -p
Fini, les serveurs sont prêts.
Sur le master
On commence par initialiser le master avec la commande suivante :
kubeadm init --ignore-preflight-errors=all --cri-socket /run/containerd/containerd.sock --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=IP_PRIVEE --apiserver-cert-extra-sans=IP_PUBLIQUE
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
--apiserver-cert-extra-sans : me permet d'accéder à l'api kubernetes depuis l'extérieur
Pour le réseau
Cette fois-ci j'ai choisi de mettre en place weavenet :
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
i-two-km01 Ready control-plane,master 60m v1.20.2 5.135.65.148 <none> Debian GNU/Linux 10 (buster) 5.9.0-0.bpo.5-amd64 containerd://1.4.3
Ajout des noeuds
Cette procédure ne change pas par rapport aux autres installations de Kubernetes
kubeadm join 192.168.72.101:6443 --token _token_ --discovery-token-ca-cert-hash sha256:_sha_
Les nœuds sont prêt.
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
i-two-km01 Ready control-plane,master 65m v1.20.2 5.135.65.148 <none> Debian GNU/Linux 10 (buster) 5.9.0-0.bpo.5-amd64 containerd://1.4.3
i-two-wk01 Ready <none> 3m28s v1.20.2 192.168.72.211 <none> Debian GNU/Linux 10 (buster) 5.9.0-0.bpo.5-amd64 containerd://1.4.3
i-two-wk02 Ready <none> 2m22s v1.20.2 192.168.72.212 <none> Debian GNU/Linux 10 (buster) 5.9.0-0.bpo.5-amd64 containerd://1.4.3
i-two-wk03 Ready <none> 96s v1.20.2 192.168.72.213 <none> Debian GNU/Linux 10 (buster) 5.9.0-0.bpo.5-amd64 containerd://1.4.3
Tests
Quelques tests pour valider l'installation du cluster.
kubectl create deploy web --image=nginx
kubectl expose deploy/web --port=80 --type=NodePort
kubectl scale deploy/web --replicas=5
Ce qui va donner :
kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
web-96d5df5c8-2kx44 1/1 Running 0 6m7s 10.42.0.1 i-two-wk03 <none> <none>
web-96d5df5c8-8pshp 1/1 Running 0 20s 10.42.0.2 i-two-wk03 <none> <none>
web-96d5df5c8-bq6cb 1/1 Running 0 20s 10.36.0.1 i-two-wk02 <none> <none>
web-96d5df5c8-g8j5t 1/1 Running 0 20s 10.44.0.1 i-two-wk01 <none> <none>
web-96d5df5c8-jrjdz 1/1 Running 0 20s 10.36.0.2 i-two-wk02 <none> <none>
Conclusion
Tout fonctionne normalement même sans Docker 🙂
Sources
https://www.techrepublic.com/article/how-to-install-kubernetes-on-ubuntu-server-without-docker/