Hoe te migreren van Dockershim in Kubernetes v1.24 en later

0
60

Kubernetes v1.24 en latere releases worden verzonden zonder Dockershim na de beëindiging ervan in de v1.20-release van december 2020. Dockershim is niet langer beschikbaar als een ingebouwde containerruntime. U moet in plaats daarvan een andere ondersteunde runtime gebruiken, zoals containerd, CRI-O of Docker Engine met de cri-dockerd-adapter.

In dit artikel laten we zien hoe u kunt controleren of u getroffen bent, en leggen we vervolgens uit hoe u kunt migreren naar een andere runtime. U moet deze stappen uitvoeren voordat u een upgrade naar Kubernetes v1.24 of een latere versie uitvoert, zodat de workloads van uw cluster niet worden beïnvloed.

Wat was Dockershim?

Dockershim is ontwikkeld als een noodzakelijk onderdeel, zodat Kubernetes meer containerruntimes kon ondersteunen. Bij de start van het project werkte Kubernetes alleen met Docker Engine. Deze beperking werd opgeheven door de introductie van de CRI-standaard. Elke CRI-compatibele runtime kan nu worden gebruikt met Kubernetes, inclusief containerd en CRI-O, een OCI-implementatie van de standaard.

Hoewel CRI Kubernetes nieuwe flexibiliteit bracht, vormde het een probleem voor bestaande clusters. Docker had geen ondersteuning voor de CRI-standaard, dus Dockershim werd gebouwd om de compatibiliteit van het Kubernetes-team er bovenop te laten komen. Dockershim was een directe integratie met Docker Engine die altijd bedoeld was als een tijdelijke maatregel.

De containerbeweging is nu veel meer dan Docker, zoals de oorspronkelijke Kubernetes-push naar CRI aantoont. Docker zelf is opgesplitst in afzonderlijke componenten waarvan de runtime is geëxtraheerd als containerd, een afgestudeerde van de Cloud Native Computing Foundation (CNCF).

containerd wordt volledig ondersteund door Kubernetes en is meer geschikt voor standalone gebruik in cloudomgevingen. Kubernetes heeft de Docker CLI en zijn overvloed aan functies niet nodig om uw pods uit te voeren; het enige dat nodig is, is de mogelijkheid om containers op een relatief laag niveau te starten en te laten draaien. Dockershim is verwijderd omdat het moeilijk te onderhouden was. Het gebruik ervan creëerde fragiele code die nauw was gekoppeld aan de implementatie van Docker Engine.

Controleren of u Dockershim gebruikt

Het is zeer onwaarschijnlijk dat recent gecreëerde clusters op moderne platforms Dockershim gebruiken. Dit omvat clusters die worden beheerd door populaire cloudproviders zoals Amazon EKS, Azure AKS, Google GKE en DigitalOcean DOKS.

U zult hoogstwaarschijnlijk actie moeten ondernemen als u uw eigen cluster onderhoudt en eerst heb het een aantal jaren geleden opgezet. U kunt controleren of u Dockershim gebruikt als de runtime voor een van uw Nodes door deze Kubectl-opdracht uit te voeren:

$ kubectl get nodes -o wide NAME STATUS VERSION CONTAINER-RUNTIME node-1 Ready v1.22.8 docker ://19.3.1 node-2 Ready v1.22.8 containerd://1.4.13

In dit voorbeeld gebruikt een van de knooppunten containerd en kan deze ongewijzigd worden gelaten. Het andere knooppunt is geconfigureerd met Docker en kan worden beïnvloed door de verwijdering van Dockershim. U kunt dit controleren door deze opdracht op de Node uit te voeren:

$ tr \0 ' ' < /proc/”$(pgrep kubelet)”/cmdline | grep “–container-runtime”

Uw Node gebruikt Dockershim om containers uit te voeren als er geen uitvoer wordt weergegeven. Als u wel wat uitvoer krijgt, inspecteert u de weergegeven –container-runtime-endpoint-vlagwaarde om te bepalen of Dockershim actief is. Er wordt een runtime-eindpunt van unix:///run/containerd/containerd.sock-signalen containerd gebruikt, dus migratie is niet nodig.

Een knooppunt wijzigen&#8217 ;s Runtime

Nodes die Dockershim gebruiken, moeten worden bijgewerkt om een ​​andere runtime te gebruiken. Tap eerst de workloads van het knooppunt af met Kubectl, zodat uw pods opnieuw worden gepland naar andere knooppunten in uw cluster. Je moet ook de Node afsluiten om te voorkomen dat er nieuwe Pods worden gepland.

$ kubectl cordon node-1 $ kubectl drain node-1 –ignore-daemonsets

Voer vervolgens de volgende opdrachten uit op de Node zelf. Begin met het stoppen van de Docker-daemon en het Kubelet-werkproces van Node:

$ systemctl stop kubelet $ systemctl schakel docker.service uit –nu

Nu kunt u uw nieuwe runtime installeren.

< h3 id="using-containerd">Containerd gebruiken

containerd is over het algemeen de voorkeursoplossing voor huidige clusters. U zou naar containers moeten kunnen migreren als u niet afhankelijk bent van specifieke functies van Docker Engine. Als dat zo is, ga dan naar de volgende sectie en installeer in plaats daarvan cri-dockerd.

Voeg Docker's repository toe aan uw systeem als uw pakketlijsten het nog niet bevatten. containerd wordt gedistribueerd in Docker's repository.

$ sudo apt-get update $ sudo apt-get install ca-certificaten curl gnupg lsb-release $ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg –dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg $ echo “deb [arch=$(dpkg –print-architecture) ondertekend door=/usr/share/keyrings/docker -archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Installeer containerd:

$ sudo apt update $ sudo apt install containerd

Update nu het Node's Kubelet-configuratiebestand om de nieuwe runtime te gebruiken. Open /var/lib/kubelet/kubeadm-flags.env. Zoek of voeg de vlaggen –container-runtime en –container-runtime-endpoint toe met de volgende waarden:

  • –container-runtime=remote
  • –container-runtime-endpoint=unix:///run/containerd/containerd.sock

Verander vervolgens de socketannotatie die is opgeslagen voor het Node-object in het Kubernetes-besturingsvlak:

$ kubectl edit node node-1

Zoek in het geopende bestand de annotatie kubeadm.alpha.kubernetes.io/cri-socket en verander deze in unix:///run/containerd/containerd.sock . Sla het bestand op en sluit het om het object van de Node bij te werken.

Herstart Kubelet nu opnieuw:

$ systemctl start kubelet

Geef de Node even de tijd om te starten en verbinding te maken met het Kubernetes-besturingsvlak. Je zou de opdracht get nodes moeten kunnen herhalen en zien dat containerd nu wordt gebruikt.

$ kubectl get nodes -o wide NAME STATUS VERSION CONTAINER-RUNTIME node-1 Ready v1.22.8 containerd://1.4.13 node-2 Ready v1.22.8 containerd://1.4.13

Verwijder tenslotte het cordon dat u rond het knooppunt hebt geplaatst zodat het Pods kan gaan ontvangen:

$ kubectl uncordon node-1

Cri-dockerd gebruiken

cri-dockerd is een runtime die gezamenlijk is ontwikkeld door Docker en Mirantis. Het is in feite een op zichzelf staande versie van Dockershim die onafhankelijk wordt onderhouden. Het stelt je in staat om vertrouwde functionaliteit te blijven gebruiken zonder het Kubernetes-project te belasten met de onderhoudsvereisten van Dockershim.

Zorg ervoor dat je Docker Engine al hebt geïnstalleerd. Installeer vervolgens cri-dockerd door het nieuwste binaire bestand te downloaden van GitHub-releases:

$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.2.0/cri-dockerd-v0.2.0-linux-amd64.tar.gz $ tar xvf cri-dockerd-v0.2.0- linux-amd64.tar.gz $ mv cri-dockerd /usr/local/bin/

Volgende download, installeer en schakel de systemd-serviceconfiguraties van cri-dockerd in:

wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd /cri-docker.socket sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service sudo systemctl daemon-reload sudo systemctl enable cri-docker.service sudo systemctl enable –now cri-docker.socket

Nu kunt u uw Node& #8217;s Kubelet-configuratie om cri-dockerd te gebruiken. Dit is vergelijkbaar met het configureren van een Node om containerd te gebruiken.

Open /var/lib/kubelet/kubeadm-flags.env. Zoek of voeg de vlaggen –container-runtime en –container-runtime-endpoint toe met de volgende waarden:

  • –container-runtime=remote
  • — container-runtime-endpoint=unix:///var/run/cri-dockerd.sock

Verander vervolgens de socketannotatie van het Node-object:

$ kubectl edit node node-1

Zoek in het geopende bestand de annotatie kubeadm.alpha.kubernetes.io/cri-socket en verander deze in unix:///var/run/cri-dockerd.sock. Sla het bestand op en sluit het om het object van de Node bij te werken.

Herstart Kubelet nu opnieuw:

$ systemctl start kubelet

Wacht even en gebruik vervolgens Kubectl om te controleren of de Node actief is. Het zal nog steeds de Docker-runtime tonen, maar het is nu gebaseerd op de stand-alone cri-dockerd, in plaats van de Dockershim die is geïntegreerd met Kubernetes.

$ kubectl get nodes -o brede NAME STATUS VERSION CONTAINER -RUNTIME node-1 Ready v1.22.8 docker://19.3.1 node-2 Ready v1.22.8 containerd://1.4.13

Je kunt nu het cordon verwijderen dat je rond de Node hebt geplaatst. Het zal weer verzoeken voor Pod-planning accepteren.

$ kubectl uncordon node-1

Conclusion

Kubernetes v1.24 heeft de Dockershim-component verwijderd die eerder CRI-compatibiliteit voor Docker Engine integreerde. Hoewel de meeste recente clusters niet worden beïnvloed, moet u controleren of u Dockershim gebruikt voordat u een upgrade naar de nieuwe release uitvoert.

De runtime waarnaar moet worden overgeschakeld, is afhankelijk van hoe u uw cluster momenteel gebruikt. containerd is meestal een goede keuze als u Docker-functies niet gebruikt. U kunt cri-dockerd gebruiken om Dockershim-achtige integratie terug te brengen als u compatibiliteit wilt behouden met bestaande tooling die afhankelijk is van Docker Engine. Dit helpt ook als u de Docker-daemon-socket (/var/run/docker.sock) in uw containers monteert om Docker-in-Docker-workflows van stroom te voorzien.

De verwijdering van Dockershim heeft geen& #8217; heeft geen invloed op hoe u containerafbeeldingen bouwt en gebruikt. Kubernetes kan nog steeds afbeeldingen uitvoeren die zijn gemaakt met docker-build en ze zijn compatibel met alle ondersteunde runtimes. CRI-runtimes werken met elke afbeelding in OCI-indeling, zoals uitgevoerd door Docker en andere afbeeldingsbouwers.

LEES VOLGENDE

  • › Gegevens importeren met Google Spreadsheets-functies
  • › Framework heeft zojuist de coolste Chromebook ooit gelanceerd
  • › Koop een Budget Surface Laptop Go 2 voor nog minder, plus meer deals
  • › Microsoft lanceert nieuwe Surface-pc's op 12 oktober
  • › De beste iPhone 14 Pro-hoesjes van 2022
  • › Arrays combineren, hervormen en vergroten/verkleinen in Excel