Заставить Kubernetes использовать containerd при установке Docker

Заставить Kubernetes использовать containerd при установке Docker

У меня есть узлы Kubernetes с установленными docker и containerd. Мне нужен docker на узле для запуска конвейеров CI и сборок. Как заставить Kubernetes использовать рекомендуемый containerd вместо docker? Существующая документация рекомендует удалить docker из системы, что нежелательно в моем случае.

Есть ли способ заставить Kubernetes использовать containerd в качестве среды выполнения контейнера вместо docker, если установлены оба?

решение1

Kubelet — это процесс, отвечающий за действия контейнера на узле, и он имеетнабор флагов командной строкичтобы указать ему использовать удаленного поставщика управления контейнерами (насколько мне известно, containerd и cri-o используются одинаково):

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

(предполагается, что ваш containerd прослушивает тот же dockershim.sockпуть)

В прекрасном руководстве специально говорится, что не следует переключать эти флаги при существующей регистрации узла, поскольку при создании контейнеров делаются определенные предположения. Поэтому, если у вас уже есть узел, использующий Docker, в идеале остановите kubelet, удалите эти контейнеры kubectl delete node $the_node_nameи дайте kubelet повторно зарегистрироваться с правильной конфигурацией.

решение2

Протестировано на Ubuntu 20.04. Простым и понятным способом включения среды выполнения containerd было добавление этого содержимого в /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"

Это добавляет некоторые дополнительные аргументы в службу kubelet, чтобы включить containerd вместо использования docker-shim по умолчанию.

Рекомендуется перезапустить узел или, по крайней мере, остановить kubelet, docker и containerd для коммутатора, так как простой перезапуск kubelet попытается запустить контейнеры через containerd, пока они все еще работают с использованием docker.

Связанный контент