В 2026 году вопрос «какой container runtime выбрать для Kubernetes» уже почти всегда про два варианта: containerd и CRI-O. Оба работают через CRI (Container Runtime Interface): kubelet создаёт pod sandbox, запускает контейнеры, получает статусы, логи, exec/attach и события.
Но в продакшене различия проявляются не в CRI-методах, а в «обвязке»: как устроено хранилище образов, как настраиваются registry mirrors, где лежат конфиги, какие привычные инструменты есть у дежурной смены, как ведёт себя GC, и что вы увидите в логах при проблемах с TLS/авторизацией.
Ниже — практический разбор: чем реально отличаются containerd и CRI-O, как выстроить диагностику через crictl, где чаще ломается image pull, и по каким критериям выбирать runtime под вашу эксплуатационную модель.
Контекст 2026: CRI — единственная «точка правды» для kubelet
kubelet общается с runtime только по CRI. Это полезно помнить в двух типовых ситуациях: «поды не стартуют» и «мы настроили зеркала, но ничего не изменилось».
- Если runtime корректно реализует CRI, то базовые операции kubelet выполняет одинаково.
- Поведение вокруг CRI всё равно различается: конфигурация pull/mirrors, доверие к CA, GC образов, интеграция с SELinux/AppArmor, нюансы cgroup v2.
- Runbook’и удобнее строить от CRI: первичная диагностика через
crictlедина для containerd и CRI-O.
Практический вывод: выбирая runtime, вы выбираете не «API для kubelet», а операционную модель узла Kubernetes: конфиги, диагностика, обновления, интеграции и привычные инструменты.
containerd vs CRI-O: архитектура и философия эксплуатации
containerd: универсальный runtime и большая экосистема
containerd вырос из Docker-мира, но давно независим. Его часто используют не только в Kubernetes, поэтому вокруг него много tooling и интеграций. На k8s-узле containerd обычно работает с встроенным CRI-плагином и запускает контейнеры через OCI runtime (например, runc).
- Часто проще найти документацию и готовые примеры под разные дистрибутивы.
- Богатая экосистема вокруг snapshotter’ов и сопутствующих утилит.
- Есть удобный CLI-слой nerdctl с почти Docker-like UX для ручной проверки pull/образов.
CRI-O: минимализм «только для Kubernetes»
CRI-O проектировался как runtime именно для Kubernetes: меньше лишних сущностей, прямой фокус на CRI и на типовые k8s-сценарии. Во многих enterprise-окружениях CRI-O воспринимается как «родной» компонент узла, особенно там, где сильная культура SELinux и стек containers-tools.
- Предсказуемая модель: узел — appliance для Kubernetes, без желания обслуживать «ещё один контейнерный мир» рядом.
- Удобно, если организация уже стандартизировалась на Podman/Buildah/Skopeo для работы с образами в CI/CD.
Важно не путать: CRI-O не «podman внутри». Podman — отдельный CLI и набор практик вокруг контейнеров, но в эксплуатации они часто идут рядом.

Если вы планируете кластер на отдельных виртуальных машинах и хотите предсказуемый контроль над диском/сетью и политиками, иногда проще выделить узлы под Kubernetes на VDS: удобно для тестов mirrors, нагрузочных rollout’ов и воспроизведения инцидентов.
Инструменты администратора: crictl, nerdctl, podman
Для эксплуатации Kubernetes-узлов удобно разделить инструменты на два слоя: CRI-диагностика и «глубокая» runtime-специфика.
crictl: базовый стандарт для runbook’ов
crictl показывает то, что kubelet реально видит через CRI: sandboxes, контейнеры, ошибки pull, runtime info, логи. Это лучший «первый шаг» независимо от выбора containerd/CRI-O.
crictl info
crictl ps -a
crictl pods
crictl logs <container_id>
crictl pull registry.example.com/team/app:1.2.3
Если вы пишете инструкции для дежурной смены, стандартизируйте «первую тройку» действий через crictl: идентифицировать runtime, повторить pull, снять логи.
nerdctl: быстро проверить pull и образы в containerd
nerdctl выбирают команды, которые привыкли к Docker CLI и хотят похожий UX на узле. Он особенно полезен для быстрых проверок доступности registry, авторизации и кеша образов.
nerdctl images
nerdctl pull registry.example.com/team/app:1.2.3
nerdctl run --rm registry.example.com/library/busybox:latest sh -c "echo ok"
Нюанс: в Kubernetes контейнеры запускает kubelet, а не nerdctl. Но nerdctl удобен как «ручной тест» окружения узла, когда нужно быстро отделить сетевую проблему от Kubernetes-манифестов.
podman: полезен в экосистеме CRI-O, но CRI не заменяет
podman часто нужен не для kubelet, а для процессов вокруг образов: сборка, инспекция, перенос между registry (вместе с Buildah/Skopeo). Для диагностики «почему pod не стартует» всё равно обычно решает crictl.
Если вам важна тема изоляции и sandboxing, полезно заранее определиться с подходом на уровне платформы и политики. В этом контексте уместно почитать про альтернативную изоляцию: изоляция контейнеров с gVisor и Firecracker.
Image pull и registry mirrors в 2026: где чаще всего «болит»
Проблемы с image pull остаются топ-1 причиной «поды не стартуют» при новых кластерах, переезде registry или смене корпоративного CA. И здесь важнее всего не «какой runtime быстрее», а насколько предсказуемо вы управляете pull-политикой, зеркалами и TLS.
Зачем mirrors нужны даже при хорошей сети
- Устойчивость к лимитам и деградациям публичных registry.
- Контроль egress и маршрутизации, снижение зависимости от внешнего интернета.
- Централизация доверия к сертификатам и политикам доступа.
Практика для продакшена: держите зеркало для массовых базовых образов и отдельный приватный registry для внутренних сборок. Если вы строите приватный registry с TLS и авторизацией, пригодится материал: приватный registry с TLS и авторизацией: настройка без сюрпризов.
Главная ловушка mirrors
Частая ошибка миграций: зеркала настраивают «как раньше для Docker», а Kubernetes-узлы их игнорируют. Причина простая: kubelet ходит в runtime, а runtime читает свои конфиги (и свои trust store нюансы).
Если после настройки зеркала поды всё равно тянут образы из исходного registry, проверяйте конфигурацию runtime на конкретном узле и повторяйте pull через
crictl pull.
Диагностика pull: минимальный порядок действий
- Убедиться, какой runtime и какой CRI endpoint реально используется:
crictl info. - Проверить DNS и маршрут до registry именно с узла (а не с control-plane).
- Повторить pull тем же именем образа:
crictl pull ...и сохранить текст ошибки. - Проверить TLS: корпоративный CA, цепочка, SNI, промежуточные сертификаты.
- Проверить credentials:
imagePullSecretsв нужном namespace или node-level auth (если применяете). - Проверить ограничения: прокси/фаервол, egress-политики, а также массовый параллелизм pull при rollout.

Если вы поднимаете внутренний registry, ingress или панели управления, заранее закройте вопрос с доверенной цепочкой и сроками: так меньше ночных инцидентов из-за TLS. Для этого удобно использовать предсказуемые SSL-сертификаты под единый корпоративный стандарт.
kubelet runtime на узле: что важно не забыть в 2026
На практике большинство «странных» проблем с ограничениями ресурсов и деградациями упирается не в runtime, а в согласованность kubelet, systemd и cgroup v2.
- cgroup v2 и драйвер: важнее всего согласовать kubelet и runtime по cgroup driver (обычно
systemd), и не смешивать несовместимые ожидания. - Garbage collection: забитый диск под
/var/libприводит к лавинообразным отказам: новые pod’ы не стартуют, старые начинают рестартиться, узел уходит в NotReady. - Логи и ротация: следите за ростом логов контейнеров и политикой ротации на узле, иначе диск «съедят» не только слои образов.
- Массовые rollout’ы: параллельный pull сотен подов на свежие узлы — это нагрузочный тест сети, диска и распаковки слоёв.
Если вам нужно глубже разобраться в связке systemd и cgroup-ограничений на узле, полезна практическая заметка: systemd slices и cgroup: почему появляются «странные лимиты».
Производительность: что сравнивать правильно
Разница «containerd vs CRI-O» по чистой производительности в типовых кластерах обычно меньше, чем влияние следующих факторов:
- быстрый локальный NVMe против медленного диска или перегруженного сетевого хранилища;
- наличие локального registry mirror против pull «через интернет»;
- корректная конфигурация cgroup v2 против конфликтов kubelet/runtime/systemd;
- размер и структура образов (слои, кеш, частота обновлений).
Чтобы сравнение имело смысл, измеряйте метрики, которые реально влияют на SLO деплоя:
- время от создания pod до readiness;
- время pull отдельно от распаковки (сеть против диска/CPU);
- IO pressure на хранилище runtime во время распаковки слоёв;
- стабильность при массовых деплоях и node churn.
Безопасность и совместимость: SELinux/AppArmor, политика и ожидания
В 2026 чаще побеждает подход «security by default»: SELinux enforcing, строгие профили, разделение узлов по типам нагрузок. Здесь выбор runtime обычно определяется тем, как вашей команде проще сопровождать политики и разбор инцидентов.
- Если у вас enterprise-дистрибутив с сильной практикой SELinux, CRI-O часто проще вписывается в корпоративную модель.
- Если среда смешанная и нужны разные интеграции вокруг runtime, containerd обычно даёт больше гибкости и вариантов tooling.
- Rootless как идея полезен, но в Kubernetes чаще решают задачу через политики и изоляцию workload’ов, а не через «rootless runtime на узле».
Отдельно держите в голове доверие к TLS: как вы распространяете корпоративный CA и какие сертификаты принимают узлы. Для внутренних сервисов (registry, ingress, панели) проще сопровождать единый подход к сертификатам и срокам.
Практические рекомендации: что выбрать в 2026
Когда чаще выбирают containerd
- Нужен привычный «почти Docker» UX на узлах через nerdctl для оперативных проверок.
- Смешанная среда (разные дистрибутивы/подходы), и вы хотите более универсальный runtime-компонент.
- Планируются нестандартные интеграции вокруг containerd-экосистемы.
Когда чаще выбирают CRI-O
- Kubernetes — единственный потребитель runtime на узле, и вы хотите минимализм «k8s-first».
- Организация уже живёт в модели Podman/Buildah/Skopeo и строгих security-практик.
- Важна предсказуемость «узел как appliance» и меньше поводов для зоопарка инструментов.
Если сомневаетесь: выбирайте по эксплуатационным критериям
- Какие команды реально доступны дежурной смене:
crictlплюс nerdctl илиcrictlплюс podman-стек? - Кто и как будет сопровождать image pull, mirrors, корпоративный CA и доступы к registry?
- Как вы обновляете узлы и насколько важно совпадение с рекомендациями вашего дистрибутива?
- Что чаще ограничивает rollout: сеть до registry, IO диска, CPU распаковки, политика безопасности?
Мини-чеклист перед финальным решением
- Поднимите тестовый узел и прогоните массовый деплой, похожий на прод: те же образы, та же
imagePullPolicy, тот же размер нод-пула. - Настройте mirrors и подтвердите их использование через
crictl pullна каждом типе узлов. - Измерьте время до readiness на «холодном» кэше и на «тёплом» кэше образов.
- На стенде сымитируйте заполнение диска и проверьте восстановление (GC, алерты, поведение kubelet/runtime).
- Зафиксируйте runbook: где логи runtime, какие команды первичной диагностики, как проверять TLS/CA и доступ к registry.
Вывод
В паре containerd vs CRI-O в 2026 нет одного «правильного» победителя. Оба зрелые и полноценно работают с Kubernetes через CRI. containerd чаще выбирают за универсальность и удобный CLI-слой через nerdctl. CRI-O — за минимализм «Kubernetes-only» и органичность в средах, где доминирует podman-экосистема и строгие security-практики.
Рациональный выбор делается не по синтетическим бенчмаркам, а по жизненному циклу узла: image pull, mirrors, доверие к TLS, GC, диагностика, обновления и требования безопасности. Именно там runtime превращается в экономию часов (или потерю дней) на эксплуатации.


