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, теперь можно повторить все то же самое для следующей ноды.