- PVSM.RU - https://www.pvsm.ru -

Многие DevOps-инженеры и системные администраторы, особенно успевшие поработать с Kubernetes, уже слышали про проект CRI-O [1], озаглавленный как «легковесная исполняемая среда для контейнеров в Kubernetes». Однако зачастую представления о его назначении, возможностях и статусе весьма размыты — из-за молодости проекта, отсутствия опыта практического применения и растущего числа изменений в области стандартов для контейнеров. Эта статья — ликбез о CRI-O, рассказывающая о появлении проекта, его особенностях и актуальном статусе.
Следуя за растущей популярностью применения Linux-контейнеров, в середине 2015 года некоммерческая организация The Linux Foundation при содействии CoreOS, Docker, Red Hat и ряда других компаний представила [2] проект Open Container Project, который ныне известен как Open Container Initiative (OCI) [3]. Его цель — «создание открытых индустриальных стандартов для форматов и исполняемой среды контейнеров».

Предполагалось, что проект объединит базу конкурирующих продуктов для контейнеров, таких как runc от Docker и appc от CoreOS, в единые стандарты. Актуальным же итогом деятельности OCI стал выпуск [4] минувшим летом версии 1.0 для двух стандартов:
В то же самое время и независимо от Open Container Initiative, но «с акцентом на продвижение стандартов для контейнеров через OCI», компания Red Hat занялась созданием OCID (Open Container Initiative Daemon), поместив его в инкубатор [7] проекта Kubernetes и анонсировав [8] в сентябре 2016 года.
В рамках OCID инженеры Red Hat собирались развивать инновации в области контейнеров: исполняемой среды, распространения образов, хранилища, их подписи и т.п. При этом проект позиционировался как «не конкурирующий с Docker», потому что «в действительности он использует ту же исполняемую среду OCI runc, что применяется в Docker Engine, тот же формат образов и позволяет использовать docker build и относящиеся к нему инструменты».
Уже тогда OCID назывался «реализацией стандартного интерфейса для исполняемой среды для контейнеров в Kubernetes», в котором следуют философии UNIX, когда одна утилита выполняет одну задачу. Поэтому функциональность OCID была сразу разбита по следующим компонентам:
Однако название «OCID», напрямую ссылающееся на инициативу OCI, не получило одобрения в самой Open Container Initiative, поскольку к списку официальных проектов OCID не относился. И уже вскоре после первого анонса, по требованию OCI [15], проект получил новое название — CRI-O [1] («CRI» расшифровывается как «Container Runtime Interface»).
По существу можно сделать вывод, что OCI стала необходимой предтечей для CRI-O, а в Red Hat воспользовались трендом стандартизации, способствуя ему с одной стороны и преследуя свои цели (низкоуровневый стек для Project Atomic и OpenShift) — с другой. Сообщество Linux и Open Source от этого скорее только выиграло, получив конкуренцию и разнообразие среди свободных продуктов, да и в OCI подчеркнули, что их недовольство было связано исключительно с названием проекта, но не самим его назначением:
«Open Container Initiative (OCI) сосредоточена на создании формальной спецификации для исполняемой среды и формата образов контейнеров, поскольку стандартизация в этих областях будет способствовать и другим инновациям. Любые другие проекты на данный момент выходят за рамки OCI, однако мы поощряем своих участников, продолжающих работу над спецификацией для исполняемой среды и формата образов, поскольку это полезно для всей индустрии. Инновации быстро происходят на уровне реализации, и мы намерены интегрировать все уместные улучшения в спецификации. Наша цель — поддерживать эффективный рост и здоровье технологии контейнеров и всего сообщества Open Source».
По сей день Red Hat продолжает продвигать CRI-O в мире ИТ-специалистов, примером чему может служить недавняя (июнь 2017 г.) публикация «6 причин, почему CRI-O — лучшая исполняемая среда для Kubernetes [16]» в блоге Project Atomic. В качестве таких причин авторы называют:

Другой пример технологического евангелизма в этом направлении — совсем свежий (сентябрь 2017 г.) доклад «Понимая стандарты для контейнеров [19]» (видео [20], слайды [21]) в исполнении Scott McCarty из Red Hat:

Но вернёмся к технологической составляющей CRI-O. Как же устроен этот проект?
На сегодня, благодаря усилиям Red Hat, Intel, SUSE, Hyper и IBM (все они числятся среди основных компаний-разработчиков CRI-O), мы получили альтернативу Docker для Kubernetes, позволяющую запускать поды с использованием любой исполняемой среды для контейнеров, совместимой со спецификацией OCI. Официально при этом поддерживаются всем известная runc, а также Clear Containers [22] от Intel (являются частью более глобального проекта Clear Linux [23]; в прошлом месяце выпустили их версию 3.0 [24], переписанную на Go).
Компоненты CRI-O практически не изменились со времён анонса OCID: помимо исполняемой среды (совместимой с OCI) это прежние OCI Runtime Tools, containers/storage, containers/image, CNI, а также новая небольшая утилита conmon [25], предназначенная для мониторинга контейнеров (включая обнаружение ошибок нехватки памяти — OOM) и обработки журналирования из процесса контейнера.
Общая же архитектура CRI-O и его место в Kubernetes представляется следующим образом:

Принцип функционирования Kubernetes в связке с CRI-O сводится к следующей схеме:
Последний публичный релиз CRI-O — 1.0.0-rc3 [27], выпущенный на прошлой неделе. Среди его изменений выделяются поддержка Minikube (для запуска CRI-O с локальным кластером Kubernetes), лимиты для размера лога контейнера, поддержка квоты для overlay, возможность запуска на файловых системах на базе tmpfs. Его анонс завершается фразой, что «теперь мы близки к выпуску 1.0, как только количество багов уменьшится».
Релиз Kubernetes 1.8 [28], который состоялся в конце сентября, «повысил» статус поддержки CRI-O до стабильного, поскольку были пройдены все тесты e2e.
Для перевода вашей инсталляции Kubernetes с Docker на CRI-O потребуется:
/etc/crio/crio.conf, /etc/containers/policy.json и т.п.; сам сервис запускается как системная служба — рекомендуется в связке с systemd) на каждом узле, где осуществляется миграция./etc/systemd/system/kubelet.service) и настроить её параметры (/etc/kubernetes/kubelet.env).Более подробную инструкцию можно найти здесь [29].
Напоследок, нельзя не упомянуть параллельную активность со стороны компании Docker под названием cri-containerd [30]. Это ещё одна Open Source-реализация уже упомянутого интерфейса Kubernetes CRI для тех, кто выбрал containerd в качестве единственной исполняемой средой для контейнеров (вместе с теми же runc и CNI для решения соответствующих задач). Имея статус альфа-версии, cri-containerd поддерживает Kubernetes 1.7+, прошла все тесты на валидацию с CRI и все тесты node e2e.
На недавнем выступлении Liu Lantao (Google) и Abhinandan Prativadi (Docker) было объявлено, что бета-версию ожидают к концу года (слайды доклада [31]):

А в завершении такой статьи не могу не привести цитату [32] Kelsey Hightower, хорошо известного в DevOps-сообществе как минимум благодаря «Kubernetes The Hard Way [33]»:
cri-o, containerd, rkt или docker? С нетерпением жду дня, когда ответом будет: «Всё равно».
Читайте также в нашем блоге:
Автор: shurup
Источник [37]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/virtualizatsiya/265591
Ссылки в тексте:
[1] CRI-O: http://cri-o.io/
[2] представила: https://www.nixp.ru/news/13486.html
[3] Open Container Initiative (OCI): https://www.opencontainers.org/
[4] выпуск: https://www.nixp.ru/news/14118.html
[5] runtime-spec: https://github.com/opencontainers/runtime-spec/
[6] image-spec: https://github.com/opencontainers/image-spec
[7] инкубатор: https://github.com/kubernetes-incubator/cri-o
[8] анонсировав: https://www.redhat.com/en/blog/running-production-applications-containers-introducing-ocid
[9] OCI Runtime Tools: https://github.com/opencontainers/runtime-tools
[10] containers/image: https://github.com/containers/image
[11] skopeo: https://github.com/projectatomic/skopeo
[12] containers/storage: https://github.com/containers/storage
[13] CNI (Container Network Interface): https://github.com/containernetworking/cni
[14] этой статье: https://habrahabr.ru/company/flant/blog/329830/
[15] требованию OCI: https://thenewstack.io/oci-distances-ocid-container-project-now-named-cri-o/
[16] 6 причин, почему CRI-O — лучшая исполняемая среда для Kubernetes: https://www.projectatomic.io/blog/2017/06/6-reasons-why-cri-o-is-the-best-runtime-for-kubernetes/
[17] цитатой: https://github.com/kubernetes-incubator/cri-o/issues/332#issuecomment-275256700
[18] контрибьюторов: https://github.com/kubernetes-incubator/cri-o/graphs/contributors
[19] Понимая стандарты для контейнеров: https://medium.com/cri-o/understanding-container-standards-1e1448cbb92c
[20] видео: https://www.youtube.com/watch?v=rlj0UZlvGp0
[21] слайды: https://docs.google.com/presentation/d/1OpsvPvA82HJjHN3Vm2oVrqca1FCfn0PAfxGZ2w_ZZgc/edit#slide=id.g26188a52c4_2_10
[22] Clear Containers: https://clearlinux.org/documentation/clear-containers/clear-containers.html
[23] Clear Linux: https://clearlinux.org/
[24] версию 3.0: https://www.nixp.ru/news/14173.html
[25] conmon: https://github.com/kubernetes-incubator/cri-o/tree/master/conmon
[26] Kubernetes CRI: https://github.com/kubernetes/kubernetes/blob/242a97307b34076d5d8f5bbeb154fa4d97c9ef1d/docs/devel/container-runtime-interface.md
[27] 1.0.0-rc3: https://medium.com/cri-o/we-just-released-cri-o-1-0-0-rc3-73da5a79e72c
[28] Kubernetes 1.8: https://habrahabr.ru/company/flant/blog/338230/
[29] здесь: https://github.com/kubernetes-incubator/cri-o/blob/master/kubernetes.md
[30] cri-containerd: https://github.com/kubernetes-incubator/cri-containerd
[31] слайды доклада: https://www.slideshare.net/Docker/kubernetes-cri-containerd-integration-by-lantao-liu-google
[32] цитату: https://twitter.com/kelseyhightower/status/914884130797633538
[33] Kubernetes The Hard Way: https://github.com/kelseyhightower/kubernetes-the-hard-way
[34] Зачем нужен containerd и почему его отделили от Docker: https://habrahabr.ru/company/flant/blog/325358/
[35] В чём суть проекта Moby и почему главным репозиторием Docker вдруг стал moby/moby?: https://habrahabr.ru/company/flant/blog/329136/
[36] Наш опыт с Kubernetes в небольших проектах: https://habrahabr.ru/company/flant/blog/331188/
[37] Источник: https://habrahabr.ru/post/340010/
Нажмите здесь для печати.