[K8s] Migratie van dockershim

In onderstaand schema zie je als eerste een K8s configuratie die gebruik maakt van dockershim. In het schema daaronder staat een K8s configuratie zonder docker, maar met de CRI-containerd

Dockershim vs. CRI with Containerd

Dockershim is een shim waarmee de gehele docker engine gebruikt kan worden voor de container images. In Kubernetes release v1.24 is de dockershim verwijderd en wordt gebruik gemaakt van CRI-containerd. (of CRI-Dockerd)

Container images die gemaakt zijn met docker werken nog steeds prima met containerd en dus geen probleem voor images die reeds aanwezig zijn.

In oude(re) versies van Kubernetes werd alleen docker ondersteund als container runtime. De markt vroeg om ondersteuning voor meer container runtimes en toen werd de Container Runtime Interface (CRI) in het leven geroepen waarmee kubelet de container runtime gebruikt. Omdat docker er al was vóór de CRI is een tussen oplossing gevonden in de vorm van dockershim. Hiermee kan de CRI gebruikt worden om docker als container runtime te gebruiken.

Als nu containerd gebruikt wordt, zal de noodzaak voor dockershim verdwijnen en dat is wat met Kubernetes v1.24 gedaan is met als (enige) nadeel dat er geen ‘docker ps‘ of ‘docker exec‘ meer gebruikt kan worden.

Migratie

Er is documentatie hiervoor te lezen op https://kubernetes.io/docs/tasks/administer-cluster/migrating-from-dockershim/check-if-dockershim-removal-affects-you/

Laten we ervan uit gaan dat er geen privileged Pods zijn die docker-commando’s gebruiken. Verder zullen registry-settings in /etc/docker/daemon.json toegepast moeten gaan worden in de containerd runtime.

CRI-Dockerd

In Kubernetes v1.23 kan gebruik gemaakt worden van de cri-dockerd runtime die een 3rd-party vervanging is voor dockershim. Hiermee kan de Docker Engine gebruikt blijven worden via de CRI. Mocht je dit gebruiken, dan heeft het verwijderen van dockershim geen effect op jouw configuratie.

Indien je wel dockershim gebruikt en wilt migreren naar cri-dockerd, volg dan deze stappen:

  1. Installeer cri-dockerd.
  2. Cordon en drain de node.
  3. Configureer kubelet om cri-dockerd te gebruiken.
  4. Restart kubelet.
  5. Controleer of de node ‘healthy’ is..

Configureer kubelet om cri-dockerd te gebruiken:

Edit het bestand /var/lib/kubelet/kubeadm-flags.env op elke node en wijzig de --container-runtime-endpoint instelling naar  unix:///var/run/cri-dockerd.sock

Vervolgens dient een annotation op de node(s) gewijzigd te worden. Edit de node met kubectl en wijzig kubeadm.alpha.kubernetes.io/cri-socket naar unix:///var/run/cri-dockerd.sock

Na deze twee wijzigingen dient kubelet herstart te worden en daarna uncordoned.

containerd

Migreren naar containerd gaat alsvolgt:

  • drain de node en stop de docker-engine:
systemctl stop kubelet
systemctl disable docker.service --now
  • Installeer en configureer containerd:
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
  • Configureer kubelet om containerd te gebruiken:

Edit het bestand /var/lib/kubelet/kubeadm-flags.env op elke node en wijzig --container-runtime=remote en --container-runtime-endpoint=unix:///run/containerd/containerd.sock

Vervolgens dient een annotation op de node(s) gewijzigd te worden. Edit de node met kubectl en wijzig kubeadm.alpha.kubernetes.io/cri-socket naar unix:///run/containerd/containerd.sock

  • Herstart kubelet:
systemctl start kubelet
  • Optioneel: Verwijder de docker runtime:
sudo apt-get purge docker-ce docker-ce-cli