Erzwingen Sie, dass Kubernetes Containerd verwendet, wenn Docker installiert ist

Erzwingen Sie, dass Kubernetes Containerd verwendet, wenn Docker installiert ist

Ich habe Kubernetes-Knoten, auf denen sowohl Docker als auch Containerd installiert sind. Ich brauche Docker auf dem Knoten, um CI-Pipelines und -Builds auszuführen. Wie kann ich Kubernetes dazu bringen, das empfohlene Containerd anstelle von Docker zu verwenden? In der vorhandenen Dokumentation wird empfohlen, Docker aus dem System zu entfernen, was in meinem Fall nicht wünschenswert ist.

Gibt es eine Möglichkeit, Kubernetes zu zwingen, containerd anstelle von Docker als Container-Laufzeitumgebung zu verwenden, wenn beide installiert sind?

Antwort1

Kubelet ist der Prozess, der für die Containeraktionen auf dem Node verantwortlich ist, und er hateine Reihe von Befehlszeilenflagsum ihm mitzuteilen, dass ein Remote-Containerverwaltungsanbieter verwendet werden soll (soweit ich weiß, werden sowohl containerd als auch cri-o auf die gleiche Weise verwendet):

[Service]
ExecStart=/usr/local/bin/kubelet --container-runtime=remote --container-runtime-endpoint=unix:///var/run/dockershim.sock

(vorausgesetzt, Ihr Containerd lauscht auf demselben dockershim.sockPfad)

Im Handbuch wird ausdrücklich darauf hingewiesen, dass Sie diese Flags nicht mit einer vorhandenen Node-Registrierung vertauschen sollen, da beim Erstellen der Container bestimmte Annahmen getroffen werden. Wenn Sie also bereits einen Node haben, der Docker verwendet, stoppen Sie idealerweise Kubelet, löschen Sie diese Container kubectl delete node $the_node_nameund lassen Sie Kubelet sich mit der richtigen Konfiguration erneut registrieren.

Antwort2

Bei Tests unter Ubuntu 20.04 bestand eine einfache und saubere Möglichkeit zum Aktivieren der Containerd-Laufzeit darin, diesen Inhalt hinzuzufügen zu /etc/systemd/system/kubelet.service.d/20-use-containerd.conf:

Environment="KUBELET_EXTRA_ARGS=--container-runtime remote --container-runtime-endpoint=unix:///var/run/containerd/containerd.sock"

Dies fügt dem Kubelet-Dienst einige zusätzliche Argumente hinzu, um Containerd zu aktivieren, anstatt sich standardmäßig auf Docker-Shim zu verlassen.

Es wird empfohlen, den Knoten neu zu starten oder zumindest Kubelet, Docker und Containerd für den Wechsel zu stoppen, da ein einfacher Kubelet-Neustart versucht, die Container über Containerd auszuführen, während sie noch mit Docker ausgeführt werden.

verwandte Informationen