containerd: что это и как настроить для Kubernetes | Глоссарий FREEHOSTING

containerd

containerd Runtime
containerd — containerd — среда выполнения контейнеров уровня отрасли, управляющая полным жизненным циклом контейнера: загрузкой образов, хранилищем, сетью и запуском через runc. Используется как CRI-плагин в Kubernetes.

Определение простыми словами

containerd — это демон управления контейнерами, который берёт на себя всю «черновую» работу: скачивает образы из реестра, распаковывает слои файловой системы, создаёт сетевые пространства имён и запускает контейнерный процесс через низкоуровневый runtime runc. Docker сам использует containerd внутри себя с версии 1.11.

В экосистеме Kubernetes containerd работает как CRI-совместимый runtime: kubelet общается с ним по gRPC-интерфейсу Container Runtime Interface, а containerd уже передаёт задачи runc. Это убирает лишний слой абстракции по сравнению со схемой kubelet → dockershim → Docker → containerd → runc.

Сравнение

Runtime Уровень CRI Особенность
containerd высокий Да (встроен) Минималистичный, используется в большинстве managed-кластеров
CRI-O высокий Да (нативный) Разработан специально для Kubernetes, меньший footprint
Docker Engine высокий Нет (нужен shim) Полный CLI-инструментарий, избыточен для production-кластеров
Podman высокий Через podman-remote Rootless по умолчанию, совместим с Docker CLI

Кейсы использования

  • Kubernetes-кластер на «голом» железе или VPS — containerd устанавливается как единственный runtime, kubelet подключается напрямую без Docker.
  • CI/CD-пайплайн — сборка и запуск тестовых контейнеров через nerdctl (CLI-обёртка, совместимая с Docker) без установки полного Docker Engine.
  • Встраивание в платформы — Amazon EKS, Google GKE и Azure AKS используют containerd как дефолтный runtime начиная с Kubernetes 1.24.
  • Изолированное выполнение задач — запуск разовых задач (batch jobs) с гарантированной изоляцией namespace и cgroup без оркестратора.

Негативный пример: использовать containerd напрямую для локальной разработки, когда нужен docker-compose — nerdctl поддерживает compose, но экосистема плагинов и документация значительно беднее; для десктопной разработки Docker Desktop или Podman Desktop удобнее.

Технические детали

Установка на Ubuntu и базовая настройка для Kubernetes:

apt-get install -y containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
systemctl restart containerd
systemctl enable containerd

Проверка состояния и список запущенных контейнеров через встроенный CLI:

ctr version
ctr containers list
ctr images list
ctr tasks list

Для удобной работы рекомендуется nerdctl — он понимает те же флаги, что и docker:

nerdctl run -d --name nginx -p 80:80 nginx:alpine
nerdctl ps
nerdctl logs nginx
nerdctl stop nginx

Конфигурационный файл /etc/containerd/config.toml управляет snapshotter (overlayfs по умолчанию), registry-зеркалами и настройками cgroup. Параметр SystemdCgroup = true обязателен при использовании systemd как init-системы — иначе kubelet и containerd будут конфликтовать за управление cgroup v2.

Частые вопросы

Чем containerd отличается от Docker?

Docker — полноценный инструмент с CLI, build-системой и compose. containerd — только runtime без пользовательского интерфейса: он управляет жизненным циклом контейнеров, а Docker использует его внутри себя. В Kubernetes containerd подключается напрямую через CRI, исключая Docker из цепочки.

Нужно ли устанавливать Docker, если используется containerd?

Нет. containerd работает самостоятельно. Для работы с образами и контейнерами из командной строки используйте ctr (встроен) или nerdctl — он совместим с синтаксисом docker CLI.

Какой snapshotter выбрать для containerd?

По умолчанию используется overlayfs — он подходит для большинства случаев на Linux-ядрах ≥4.18. Для систем без поддержки overlay (например, некоторые конфигурации с ZFS или BTRFS) можно переключиться на native или devmapper в config.toml.

Как проверить, что containerd используется в Kubernetes-кластере?

Выполните kubectl get nodes -o wide — в столбце CONTAINER-RUNTIME будет указано containerd://1.x.x. Также можно проверить через crictl info на узле.