Kubernetes sans Docker

 

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/