containerd
containerd — это промышленный контейнерный рантайм (runtime), предназначенный для управления жизненным циклом контейнеров на Linux- и Windows-системах. Он реализует спецификации Open Container Initiative (OCI) и выступает в качестве основного компонента для запуска и изоляции контейнерных процессов. containerd разработан как легковесный, модульный и стабильный слой, который может быть встроен в более крупные системы оркестрации, такие как Kubernetes, Docker и другие платформы.
История
Проект containerd был создан компанией Docker Inc. в 2014 году как часть экосистемы Docker. Изначально он представлял собой внутренний компонент демона Docker, отвечающий за низкоуровневые операции с контейнерами: создание, запуск, остановку и удаление. В 2017 году, в рамках стратегии открытости и модульности, Docker Inc. передала containerd в управление Cloud Native Computing Foundation (CNCF). Это решение позволило проекту развиваться независимо от Docker и стать стандартом де-факто для контейнерных рантаймов.
В 2019 году containerd достиг статуса «инкубационного» проекта в CNCF, а в 2022 году — статуса «зрелого» (graduated). Ключевые вехи развития включают поддержку Windows-контейнеров (с версии 1.3), внедрение CRI (Container Runtime Interface) для интеграции с Kubernetes, а также оптимизацию производительности и безопасности.
Архитектура и устройство
Модульная структура
containerd построен по модульному принципу. Его ядро представляет собой демон (containerd daemon), который взаимодействует с операционной системой через системные вызовы. Основные модули включают:
- Metadata store — хранилище метаданных о контейнерах, образах и снимках (snapshots). Использует BoltDB (встроенная база данных) или другие бэкенды.
- Snapshotter — компонент, отвечающий за управление файловыми системами контейнеров. Поддерживает overlayfs, aufs, devicemapper и другие драйверы.
- Content store — хранилище содержимого образов (blob-ов), таких как слои файловой системы и конфигурации.
- Task manager — управляет жизненным циклом процессов внутри контейнера (запуск, остановка, сигналы).
- GRPC API — интерфейс для взаимодействия с внешними клиентами (например, containerd-shim, CRI).
Взаимодействие с ядром ОС
Для изоляции контейнеров containerd использует механизмы ядра Linux:
- Namespaces — изоляция процессов, сети, файловой системы, IPC и других ресурсов.
- Cgroups — ограничение и учёт ресурсов (CPU, память, диск).
- Seccomp — фильтрация системных вызовов для повышения безопасности.
- Capabilities — управление привилегиями процессов.
На Windows containerd использует аналогичные механизмы, такие как Job Objects и Hyper-V изоляция.
containerd-shim
Ключевой компонент containerd — containerd-shim. Это процесс-посредник, который запускается для каждого контейнера и обеспечивает его изоляцию от основного демона. Shim выполняет следующие функции:
- Запускает процесс контейнера с использованием низкоуровневого рантайма (runc, kata, gVisor).
- Передаёт сигналы (SIGTERM, SIGKILL) процессу контейнера.
- Обеспечивает работу контейнера даже после перезапуска основного демона containerd.
- Собирает и передаёт логи (stdout/stderr) и метрики.
Классификация и виды
По типу рантайма
containerd поддерживает несколько низкоуровневых рантаймов, реализующих спецификацию OCI:
- runc — стандартный рантайм, использующий cgroups и namespaces. Является наиболее распространённым.
- Kata Containers — рантайм, обеспечивающий аппаратную виртуализацию для каждого контейнера (через гипервизор).
- gVisor — рантайм, эмулирующий системные вызовы в пользовательском пространстве, что повышает безопасность.
- Firecracker — микровиртуализация, используемая в AWS Lambda и Fargate.
По способу интеграции
- Встроенный в Docker — containerd используется как стандартный рантайм начиная с Docker Engine 1.11.
- Автономный — containerd может работать как самостоятельный сервис, управляемый через CLI (ctr) или API.
- Через CRI — интеграция с Kubernetes через Container Runtime Interface (CRI). containerd является одним из наиболее популярных CRI-рантаймов.
Применение
В Kubernetes
containerd — один из основных контейнерных рантаймов, поддерживаемых Kubernetes. Начиная с версии 1.24, Kubernetes официально отказался от поддержки Docker в пользу containerd и других CRI-совместимых рантаймов. containerd обеспечивает:
- Запуск подов и контейнеров.
- Управление образами (pull, push, tag).
- Сбор метрик и логов.
- Интеграцию с сетевыми плагинами (CNI).
В Docker
Docker Engine использует containerd как внутренний компонент для управления контейнерами. Пользователи Docker обычно не взаимодействуют с containerd напрямую, но он отвечает за все низкоуровневые операции.
Встраиваемые системы и IoT
Благодаря лёгкости и модульности, containerd применяется в embedded-системах, устройствах Интернета вещей (IoT) и edge-вычислениях. Например, в проектах Balena, KubeEdge и OpenYurt.
Промышленные и серверные среды
containerd используется в крупных облачных провайдерах (AWS, Google Cloud, Azure) для управления контейнерами в production-средах. Он обеспечивает стабильность, низкую задержку и эффективное использование ресурсов.
Сравнение с другими рантаймами
| Характеристика | containerd | Docker (полный стек) | CRI-O |
|---|---|---|---|
| Размер | ~50 МБ | ~200 МБ | ~100 МБ |
| Зависимости | Минимальные | Полный стек (docker CLI, buildx, compose) | Минимальные |
| Поддержка CRI | Да (нативная) | Через cri-dockerd | Да (нативная) |
| Поддержка Windows | Да (с версии 1.3) | Да | Нет |
| Модульность | Высокая | Средняя | Высокая |
| Популярность в Kubernetes | Очень высокая | Снижается | Высокая |
Интересные факты
- containerd поддерживает «ленивую загрузку» образов (lazy pulling) через технологию stargz (Seekable Tar GZip), что ускоряет запуск контейнеров.
- containerd может работать без root-привилегий в режиме rootless, используя пользовательские пространства имён (user namespaces).
- containerd является основой для многих коммерческих продуктов, включая Docker Desktop, Mirantis Container Runtime и Rancher.
- containerd поддерживает snapshotter на основе overlayfs, что позволяет эффективно использовать дисковое пространство при работе с несколькими контейнерами на основе одного образа.
- containerd имеет встроенную поддержку seccomp и AppArmor для усиления безопасности контейнеров.
Критика и ограничения
- containerd не предоставляет средств для сборки образов (build) — для этого требуется отдельный инструмент, например, buildkit или Docker build.
- containerd не имеет встроенного оркестратора — для управления кластерами контейнеров необходимо использовать Kubernetes или другие системы.
- containerd не поддерживает прямую работу с Docker Compose — для запуска многоконтейнерных приложений требуется дополнительная настройка.
- containerd требует определённой квалификации для настройки и администрирования, особенно в нестандартных средах (например, с нестандартными snapshotter-ами).
Источники
- Официальная документация containerd (github.com/containerd/containerd)
- Cloud Native Computing Foundation (CNCF) — containerd project overview
- Kubernetes documentation — Container Runtimes
- Open Container Initiative (OCI) — Runtime Specification
- Docker Inc. — история containerd
- Статьи и публикации на Habr, Medium, Opensource.com
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →