Ответ
CRI (Container Runtime Interface) — это плагино-ориентированный API, который позволяет kubelet взаимодействовать с различными контейнерными средами выполнения (container runtimes). Он абстрагирует специфику каждого runtime (например, containerd, CRI-O), предоставляя kubelet единый интерфейс для выполнения ключевых операций: создание, запуск, остановка и удаление контейнеров, а также управление их образами.
Почему CRI важен? До его появления kubelet был тесно связан с Docker через встроенный код (dockershim). CRI позволил Kubernetes поддерживать любую среду выполнения, реализующую этот интерфейс, что дало больше выбора и гибкости.
Основные CRI-совместимые runtime:
- containerd: Высокопроизводительный, стабильный runtime, изначально выделенный из Docker. Стандартный выбор для многих дистрибутивов Kubernetes.
- CRI-O: Легковесная реализация, созданная специально для Kubernetes. Фокусируется на простоте, безопасности и соответствию спецификациям OCI.
Как это выглядит на практике? Kubelet настраивается на использование конкретного CRI через сокет. Например, в конфигурации kubelet или в аргументах командной строки указывается:
--container-runtime-endpoint=unix:///var/run/containerd/containerd.sock
# или
--container-runtime-endpoint=unix:///var/run/crio/crio.sock
Когда kubelet нужно запустить под, он отправляет gRPC-запрос по этому сокету, содержащий спецификацию контейнера (образ, команды, ресурсы) в формате protobuf. CRI-совместимый runtime получает этот запрос и выполняет низкоуровневые операции для создания контейнера через низкоуровневый runtime (например, runc).
Итог: CRI — это критически важный слой абстракции в архитектуре Kubernetes, который обеспечивает независимость от конкретной технологии контейнеризации и способствует здоровой экосистеме.