1.8к
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

Сравнение контейнерных движков Docker и CRI-O

Время чтения 2 минуты
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
1.8к
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Для запуска контейнеров платформа Kubernetes использует Container runtime, то есть движок для контейнеров. Долгое время основным движком считался Docker, но Kubernetes также поддерживает containerd, CRI-O и Mirantis Container Runtime. Начиная с версии Kubernetes 1.20 разработчики объявили, что в будущих версиях поддержка dockershim завершится, а в версии 1.24 Docker уже полностью удален из списка поддерживаемых движков. Одной из причин такого решения было то, что Docker несовместим с Container Runtime Interface (CRI). В качестве замены можно перейти на CRI-O, который позиционирует себя как легковесную исполняемую среду для контейнеров в Kubernetes. 

Меня зовут Александр Бархатов, я работаю на позиции DevSecOps-инженера в компании-интеграторе, которая занимается внедрением ПО. В этой статье я подробно рассмотрю и сравню два движка для контейнеров — dockershim и CRI-O.

Сравнение контейнерных движков Docker и CRI-O

Прежде чем перейти к описанию работы dockershim, необходимо понять, как Kubernetes взаимодействует с контейнерами. Здесь на помощь приходит термин CRI.

Описание CRI

Container Runtime Interface (CRI) — основной протокол для связи между компонентом kubelet в кластере Kubernetes и исполняемой средой контейнеров. Это способ, при помощи которого Kubernetes взаимодействует с контейнерным движком (dockershim, CRI-O или другим). Принцип работы CRI следующий:

  1. Компонент кластера kubelet отправляет запрос к интерфейсу CRI.
  2. CRI принимает запрос и отправляет его к Container runtime (например, к dockershim).
  3. После того как Container runtime получил запрос, он обрабатывает его и в зависимости от запроса создает, удаляет или изменяет контейнер.

Схема работы CRI

Описание dockershim

С технической точки зрения в качестве движка для контейнеров в Kubernetes всегда использовался именно компонент под названием dockershim. Под термином Docker, который чаще всего использовался в этом контексте, подразумевают сразу четыре сущности:

  • одноименную компанию Docker Inc;
  • инструмент Docker;
  • контейнеры Docker;
  • образы Docker

Docker не включает в себя интерфейс CRI, поэтому разработчики создали прослойку под названием dockershim, которая представляет собой интерфейс между компонентом kubelet и демоном программы Docker.

Принцип работы dockershim следующий:

  1. Компонент кластера kubelet отправляет запрос к интерфейсу CRI.
  2. CRI принимает запрос и отправляет его к dockershim.
  3. Dockershim перенаправляет запрос к демону Docker.
  4. Демон Docker получает запрос, обрабатывает его и посылает компоненту containerd.

Схема работы dockershim

Компонент containerd представляет собой программу-демон, запущенную на хостовой ОС и предназначенную для управления жизненным циклом контейнеров, включая скачивание и хранение образов. Ранее containerd был частью Docker, ныне представлен исключительно как самостоятельный продукт. Одной из причин такого решения было то, что разработчики хотели максимально сократить и ускорить работу самого Docker. containerd — это индустриальный стандарт для контейнерных движков.

Описание CRI-O

Движок CRI-O был разработан с нуля при поддержке таких компаний, как Red Hat, IBM, Intel, и представляет собой легковесную альтернативу движку containerd. Среди функций CRI-O — скачивание образов контейнеров, а также их запуск и управление. Однако сам CRI-O не является средой выполнения и предназначен для запуска сторонних OCI-утилит. Среди списка поддерживаемых числятся runs и Kate, которые могут работать в качестве среды выполнения контейнера. Возможно подключение и использование любой среды выполнения, которая совместима с OCI.

Принцип работы CRI-O следующий:

  1. Kubernetes связывается с компонентом kubelet для запуска модуля. Модули — это концепция Kubernetes, состоящая из одного или нескольких контейнеров, совместно использующих одни и те же пространства имен IPC, NET и PID и находящихся в одной и той же cgroup.
  2. Kubelet перенаправляет запрос демону CRI-O через Kubernetes CRI для запуска нового модуля. CRI-O использует библиотеку контейнеров/изображений для извлечения изображения из реестра контейнеров.
  3. Загруженный образ распаковывается в корневые файловые системы контейнера, хранящиеся в файловых системах COW, с использованием контейнеров / библиотеки хранения.
  4. После создания rootfs для контейнера CRI-O генерирует JSON-файл спецификации среды выполнения OCI, описывающий, как запустить контейнер с помощью OCI Generate tools.
  5. Затем CRI-O запускает OCI-совместимую среду выполнения, используя спецификацию для запуска контейнерных процессов. Среда выполнения OCI по умолчанию — runc.

Runc — утилита и среда выполнения для запуска контейнеров. Разрабатывается в рамках проекта Open Containers компанией Docker как единый стандарт в области контейнеризации. Для запуска и работы runc не требуется Docker.

Каждый контейнер контролируется отдельным процессом, который содержит значение PID 1 контейнерного процесса. Он обрабатывает ведение журнала для контейнера и записывает код выхода для процесса контейнера.

Подключение к сети для модуля настраивается с помощью CNI, поэтому с CRI-O можно использовать любой плагин CNI.

Схема архитектуры CRI-O

В этой статье я коротко рассказал о двух популярных контейнерных движках, которые использует платформа Kubernetes. Для вашего удобства я подготовил сравнительную таблицу с характеристиками каждого движка.

Несмотря на то что поддержка dockershim уже завершена, его можно встретить при использовании некоторых старых версий Kubernetes. В свою очередь, движок CRI-O стал активно использоваться в Kubernetes и уже стал чуть ли не стандартом контейнерных движков. Какой из них изучать и использовать, выбирать вам. 

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники