Меняем Docker на ContainerD в качестве CRI для Kubernetes

Docker Kubernetes ContainerD

Дамы и господа, Docker всё, расходимся. Шутка.

А если серьезно, то у нас есть примерно год, чтобы избавиться от Docker в качестве среды исполнения контейнеров в Kubernetes. В версии 1.20 (которая выйдет уже совсем скоро) будет объявлен устаревшим Docker. А в версии 1.23 его поддержка будет удалена вовсе. Чтобы в будущем не было проблем с обновлением кластера, надо потрудиться уже сейчас.

Менять мы его будем на ContainerD, т.к. под капотом у того же Docker как раз ContainerD и лежит. Надо лишь убрать всех посредников.

Сейчас, без особых проблем, переезд можно осуществить только на Linux узлах. ContainerD для Windows хоть и зарелизился, но в Kubernetes всё еще не очень хорошо работает. Есть год на работу напильником.

Начинаем.

  1. Создаем файл /etc/systemd/system/kubelet.service.d/0-containerd.conf с вот таким содержимым:
    [Service]
    Environment="KUBELET_EXTRA_ARGS=--container-runtime=remote --runtime-request-timeout=15m --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
    
  2. Если у нас есть Docker, то ContainerD у нас уже есть на узлах. Его надо лишь инициализировать. Делается это так:
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    
  3. Перезагружаем узел. Или не перезагружаем, но шаманим с перезапуском docker, kubelet, cotnainerd... Перезагрузить проще.
  4. Проверяем результат:
    kubectl get nodes -owide
    
    В качестве container-runtime ожидаем увидеть что-то вроде containerd://1.3.9

Вот и всё.