Миграция с Docker на containerd в среде Kubernetes

2020

 

Системный администратор

Kubernetes отказывается от Docker для выполнения контейнеров после версии 1.20. (Прим. переводчика: в декабре мы уже писали о том, как это изменение повлияет на задачи разработчиков и инженеров эксплуатации: Docker is deprecated  и как теперь быть?)

Без паники. Контейнеры Docker все еще поддерживаются, но без dockershim/Docker  слоя между Kubernetes и containerd, который будет удален, начиная с версии 1.22+.

Если вы используете Docker, нужно перейти на поддерживаемый интерфейс container runtime interface (CRI). Хорошим вариантом будет containerd  он уже есть у вас на ноде Kubernetes, если вы работаете с Docker.

Дополнительное преимущество  меньше издержек благодаря отсутствию dockershim и уровней преобразования Docker, как видно на иллюстрации.


Переход с dockershim на containerd CRI

Как мигрировать?

Сначала проверяем, какая среда запуска контейнеров (container runtime) у нас используется. Это можно сделать командой kubectl get nodes -o wide

Как видите, здесь у нас Docker.

kubectl get nodes -o wide

Проверим, есть ли у нас containerd CLI /usr/bin/ctr и неймспейс moby из Docker.

ctr namespace list

Можно посмотреть запущенные контейнеры в этом неймспейсе.

ctr —namespace moby container list

Если все выглядит нормально, можно изменить CRI. Меняем по одной ноде за раз, начиная с рабочих нод и заканчивая мастером. Если мастер только один, вы временно потеряете доступ к кластеру, но он восстановится сам.

Cordon и drain

Выполняем cordon и drain для нод, чтобы перенести поды на другие ноды.

Останавливаем сервисы

stop kubelet and docker

Удаляем Docker (по желанию)

Удалять Docker не обязательно, но так все будет понятнее, на диске освободится немного места, а риска ошибок будет меньше.

Конфигурация containerd

Отключим строку disabled_plugins в /etc/containerd/config.toml , чтобы CRI загрузился.

Если для cotainerd нет файла конфигурации, создайте новый дефолтный файл.

generate new config

Меняем среду запуска

Правим файл /var/lib/kubelet/kubeadm-flags.env и добавляем среду containerd во флаги  —container-runtimeremote и —container-runtimeendpoint=unix:///run/containerd/containerd.sock"

Файл kubeadm-flags будет выглядеть как-то так:

Запускаем kubelet

Изменив среду запуска, запускаем сервис kubelet.

Проверяем

Запускаем kubectl get nodes -o wide и видим, что у измененной ноды новая среда запуска.

Измененная нода все еще имеет статус cordoned. Отменим его.

Если проверить неймспейсы на ноде сейчас, увидим k8s.io. Неймспейс moby теперь пуст, никакие контейнеры в нем не выполняются — все мигрировало в k8s.io.

view new k8s.io containerd namespace

Мы успешно изменили CRI, теперь можно повторить все то же самое для следующей ноды.

Источник