Что такое CRI в Kubernetes?

«Что такое CRI в Kubernetes?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

CRI (Container Runtime Interface) — это плагино-ориентированный API, который позволяет kubelet взаимодействовать с различными контейнерными средами выполнения (container runtimes). Он абстрагирует специфику каждого runtime (например, containerd, CRI-O), предоставляя kubelet единый интерфейс для выполнения ключевых операций: создание, запуск, остановка и удаление контейнеров, а также управление их образами.

Почему CRI важен? До его появления kubelet был тесно связан с Docker через встроенный код (dockershim). CRI позволил Kubernetes поддерживать любую среду выполнения, реализующую этот интерфейс, что дало больше выбора и гибкости.

Основные CRI-совместимые runtime:

  1. containerd: Высокопроизводительный, стабильный runtime, изначально выделенный из Docker. Стандартный выбор для многих дистрибутивов Kubernetes.
  2. 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, который обеспечивает независимость от конкретной технологии контейнеризации и способствует здоровой экосистеме.