Прежде чем перейти к описанию работы dockershim, необходимо понять, как Kubernetes взаимодействует с контейнерами. Здесь на помощь приходит термин CRI.
Описание CRI
Container Runtime Interface (CRI) — основной протокол для связи между компонентом kubelet в кластере Kubernetes и исполняемой средой контейнеров. Это способ, при помощи которого Kubernetes взаимодействует с контейнерным движком (dockershim, CRI-O или другим). Принцип работы CRI следующий:
- Компонент кластера kubelet отправляет запрос к интерфейсу CRI.
- CRI принимает запрос и отправляет его к Container runtime (например, к dockershim).
- После того как Container runtime получил запрос, он обрабатывает его и в зависимости от запроса создает, удаляет или изменяет контейнер.
Описание dockershim
С технической точки зрения в качестве движка для контейнеров в Kubernetes всегда использовался именно компонент под названием dockershim. Под термином Docker, который чаще всего использовался в этом контексте, подразумевают сразу четыре сущности:
- одноименную компанию Docker Inc;
- инструмент Docker;
- контейнеры Docker;
- образы Docker
Docker не включает в себя интерфейс CRI, поэтому разработчики создали прослойку под названием dockershim, которая представляет собой интерфейс между компонентом kubelet и демоном программы Docker.
Принцип работы dockershim следующий:
- Компонент кластера kubelet отправляет запрос к интерфейсу CRI.
- CRI принимает запрос и отправляет его к dockershim.
- Dockershim перенаправляет запрос к демону Docker.
- Демон Docker получает запрос, обрабатывает его и посылает компоненту containerd.
Компонент containerd представляет собой программу-демон, запущенную на хостовой ОС и предназначенную для управления жизненным циклом контейнеров, включая скачивание и хранение образов. Ранее containerd был частью Docker, ныне представлен исключительно как самостоятельный продукт. Одной из причин такого решения было то, что разработчики хотели максимально сократить и ускорить работу самого Docker. containerd — это индустриальный стандарт для контейнерных движков.
Описание CRI-O
Движок CRI-O был разработан с нуля при поддержке таких компаний, как Red Hat, IBM, Intel, и представляет собой легковесную альтернативу движку containerd. Среди функций CRI-O — скачивание образов контейнеров, а также их запуск и управление. Однако сам CRI-O не является средой выполнения и предназначен для запуска сторонних OCI-утилит. Среди списка поддерживаемых числятся runs и Kate, которые могут работать в качестве среды выполнения контейнера. Возможно подключение и использование любой среды выполнения, которая совместима с OCI.
Принцип работы CRI-O следующий:
- Kubernetes связывается с компонентом kubelet для запуска модуля. Модули — это концепция Kubernetes, состоящая из одного или нескольких контейнеров, совместно использующих одни и те же пространства имен IPC, NET и PID и находящихся в одной и той же cgroup.
- Kubelet перенаправляет запрос демону CRI-O через Kubernetes CRI для запуска нового модуля. CRI-O использует библиотеку контейнеров/изображений для извлечения изображения из реестра контейнеров.
- Загруженный образ распаковывается в корневые файловые системы контейнера, хранящиеся в файловых системах COW, с использованием контейнеров / библиотеки хранения.
- После создания rootfs для контейнера CRI-O генерирует JSON-файл спецификации среды выполнения OCI, описывающий, как запустить контейнер с помощью OCI Generate tools.
- Затем CRI-O запускает OCI-совместимую среду выполнения, используя спецификацию для запуска контейнерных процессов. Среда выполнения OCI по умолчанию — runc.
Runc — утилита и среда выполнения для запуска контейнеров. Разрабатывается в рамках проекта Open Containers компанией Docker как единый стандарт в области контейнеризации. Для запуска и работы runc не требуется Docker.
Каждый контейнер контролируется отдельным процессом, который содержит значение PID 1 контейнерного процесса. Он обрабатывает ведение журнала для контейнера и записывает код выхода для процесса контейнера.
Подключение к сети для модуля настраивается с помощью CNI, поэтому с CRI-O можно использовать любой плагин CNI.
В этой статье я коротко рассказал о двух популярных контейнерных движках, которые использует платформа Kubernetes. Для вашего удобства я подготовил сравнительную таблицу с характеристиками каждого движка.
Несмотря на то что поддержка dockershim уже завершена, его можно встретить при использовании некоторых старых версий Kubernetes. В свою очередь, движок CRI-O стал активно использоваться в Kubernetes и уже стал чуть ли не стандартом контейнерных движков. Какой из них изучать и использовать, выбирать вам.