В изоляции. История появления и развития контейнеров
У всего на свете есть своя история. В некоторых случаях она полна неожиданных поворотов, как сюжет детективного романа, в других довольно-таки проста и незатейлива. Имеется история и у двух самых популярных систем контейнеризации: Docker и Kubernetes. О появлении и эволюции развития этих востребованных технологий рассказывает сегодняшняя статья.
И Docker, и Kubernetes ведут свою родословную от виртуальных машин, которые, в свою очередь, зародились еще в 60-х. Первые эксперименты в этом направлении проводили сотрудники исследовательского центра компании IBM в городе Йорктаун Хайтс — здесь разрабатывались программные эмуляторы для компьютеров IBM 7040, позволявшие запускать несколько экземпляров приложения на одной машине. В перспективе такие эмуляторы должны были способствовать развитию аппаратно-независимых программ и облегчить переносимость кода на ЭВМ с другими архитектурами. Виртуализация требовалась и для совершенствования языков программирования высокого уровня: с ее помощью создавалась среда выполнения для пользовательских приложений, осуществлялась репликация операционной среды, эмулировалась система команд процессора.
Если появление виртуальных машин стало отправной точкой для развития систем контейнеризации, то поворотным моментом в их истории был, безусловно, 1979 год, когда в AT&T и Bell Laboratories разработали 7-ю версию Unix. Помимо прочих нововведений в этой версии появился системный вызов chroot, изменяющий местоположение корневой папки процесса и его дочерних элементов. Это заложило основу технологии изоляции процессов и разделения доступа к файлам для каждого процесса в Unix. Запущенному в системе процессу выделялся собственный объем памяти и определялись файловые дескрипторы. Кроме того, появились технологии межпроцессного взаимодействия (IPC). В 1982 году chroot был включен в состав BSD, что позволило использовать аналогичные механизмы изоляции в производных системах. Но, тем не менее, Unix по-прежнему имел единое пространство процессов, сетевой стек и IPC для всех пользователей, что не исключало возможности захвата системных ресурсов одним приложением, и могло оказать влияние на работу других пользователей ОС. Иными словами, задача организации эффективного контроля со стороны ядра над использованием ресурсов процессами все еще оставалась актуальной.
FreeBSD Jail
Следующий шаг на пути к появлению современных контейнеров был сделан в 2000 году, причем сделала его небольшая частная компания R&D Associates, предлагавшая услуги виртуального хостинга. Этот провайдер пытался решить важную техническую задачу: отделить собственные ресурсы на сервере от проектов своих клиентов, так, чтобы они могли работать независимо и не мешали друг другу. На серверах R&D Associates использовалась FreeBSD, поэтому созданная ими технология Jail работала именно в этой ОС.
Jail представляла собой систему виртуализации, позволявшую запускать внутри FreeBSD еще несколько экземпляров FreeBSD, которые использовали то же ядро, но собственное независимое окружение и набор приложений. Соответственно, такая изолированная система имела собственные настройки, благодаря чему можно было сконфигурировать подобный «виртуальный сервер» в соответствии с потребностями пользователя. Запущенный внутри Jail процесс работает в своего рода «песочнице», а сама изолированная система использует локальный набор файлов, процессов, учетных записей пользователей и суперпользователей. Изнутри она практически неотличима от реальной ОС.
Впервые эта технология была внедрена в FreeBSD версии 4.0, выпущенной 14 марта 2000 года — в этой версии появилась утилита и системный вызов jail. До версии FreeBSD 7.2 каждый экземпляр изолированной операционной системы требовал для своего запуска выделенный IP-адрес, в этой же версии появилась поддержка нескольких адресов IPv4 и IPv6 для каждой виртуальной машины и возможность привязки «контейнера» к определенным процессорам на многопроцессорных серверах.
Linux-VServer
В течение года FreeBSD Jail считалась наиболее современной системой виртуализации на базе *nix, пока в 2001-м не появился ее аналог для Linux под названием VServer. Как и Jail, VServer позволял разделять ресурсы ОС (файловые системы, сетевые адреса, память) путем добавления возможностей виртуализации в ядро Linux. Создателями VServer считаются программисты Жак Гелинас и Герберт Пётцель, а сам продукт распространялся бесплатно на основе лицензии GNU GPL как программное обеспечение с открытым исходным кодом.
Каждая изолированная копия системы в терминологии Linux-VServer называлась «контекстом безопасности», а работающая система в нем — виртуальным частным сервером (Virtual Private Server, VPS). Работу VPS обеспечивала утилита, подобная chroot. Фактически, запуск VPS сводился к инициализации ОС в новом контексте безопасности, а его остановка сводилась к уничтожению всех процессов, связанных с данным контекстом безопасности.
Linux-VServer быстро обрел популярность у провайдеров виртуального хостинга, где под управлением этой технологии создавались VPS на базе различных дистрибутивов Linux, прежде всего, Debian.
Построенные на основе Linux-VServer виртуальные серверы могли использовать общую файловую систему и общие наборы файлов (посредством жестких ссылок), что позволяло экономить дисковое пространство. Процессы на виртуальном сервере выполнялись как обычные процессы в хост-системе. Это более эффективно с точки зрения использования памяти и операций ввода-вывода, чем эмуляция всей ОС. Вместе с тем, использование Linux-VServer требовало внесения изменений в ядро Linux, и в этом инструменте отсутствовали возможности кластеризации или миграции процессов, поэтому ядро хоста являлось единой точкой отказа для всех виртуальных серверов. Кроме того, некоторые системные вызовы (в основном связанные с оборудованием, например, часы реального времени) и части файловых систем /proc и /sys оставались невиртуализированными. Все это в совокупности можно отнести к недостаткам Linux-VServer по сравнению с современными системами контейнеризации, обеспечивающими значительно более высокий уровень изоляции.
В 2005 году появилась еще одна технология виртуализации для Linux под названием Open VZ (Open Virtuzzo). Она также использовала пропатченное ядро Linux и позволяла запускать несколько копий ОС под управлением одного ядра в так называемых «виртуальных средах» (Virtual Environments, VE). Несмотря на определенную популярность, Open VZ так никогда и не стала частью официального ядра Linux.
Первые контейнеры
Первые контейнеры, официально называвшиеся именно этим термином, появились в феврале 2004 года в операционной системе Solaris 10 от Sun Microsystems, они использовались на серверах с архитектурой x86 и SPARC. В отличие от описанных ранее систем виртуализации, Solaris Containers включали в себя не только изолированные «песочницы» для запуска ОС (в терминологии разработчика они назывались «зонами»), но также инструменты управления системными ресурсами, допускавшими создание «моментальных снимков» отдельных зон и их клонирование. То есть, механизмы оркестрации.
Зоны представляли собой полностью изолированные виртуальные серверы внутри хостовой операционной системы. Каждый такой экземпляр ОС имел собственное сетевое имя, использовал выделенные сетевые интерфейсы, собственную файловую систему, набор пользователей (включая root) и конфигурацию. При этом для работы виртуального сервера не требовалось жестко выделять память или процессор — аппаратные ресурсы использовались общие, однако при необходимости администратор имел возможность зарезервировать определенные серверные мощности для какой-то конкретной зоны. Процессы внутри контейнеров выполнялись изолированно, не имели доступа друг к другу и потому не могли конфликтовать.
Основным отличием Solaris Containers от предшественников можно назвать то обстоятельство, что, как и ранее, виртуальные ОС использовали ядро хостовой системы, но при желании администратор мог запускать копии системы в контейнерах с собственным ядром. Это стало следующим важным шагом в эволюции технологий контейнеризации.
Контейнеры от Google
В 2006 году корпорация Google разработала собственную систему разделения ресурсов под названием Process Containers. Позже она была переименована в control groups, или, сокращенно, cgroups, а еще позже ее включили в ядро Linux.
Технологически cgroups — это группа процессов, для которых на уровне операционной системы наложены ограничения на использование различных ресурсов — памяти, ввода-вывода, сети. Такие изолированные группы процессов можно объединять в иерархические системы и управлять ими. Сgroups реализовывает не только изоляцию, но также приоретизацию (различным группам можно выделить разный объем ресурсов) и строгий учет. Для контроля над группами используются специальные механизмы управления: можно временно «заморозить» выбранную группу, создать ее «моментальный снимок» и восстановить состояние контейнера из контрольной точки. На основе этой технологии спустя два года была создана система LXC.
LXC и Warden
Linux Containers (LXC) — это полноценная контейнерная система для Linux, обеспечивающая полную виртуализацию на уровне операционной системы. Ее разработали программисты Даниэль Лескано, Стефан Грабе и Серж Айюн в 2008 году. LXC опиралась на cgroups и принцип изоляции пространства имен, поддерживаемые ядром Linux начиная с версии 2.6.24. LXC обеспечивает работу контейнеров на уровне операционной системы, используя собственный процесс и сетевое пространство, без необходимости создания полноценной виртуальной машины.
Одной из характерных черт развития IT-технологий, а в особенности — продуктов с отрытыми исходниками, является преемственность. LXC легла в основу нескольких проектов реализации изолированных контейнеров не только в Linux, но и в других операционных системах. Одним из них стал Warden, выпущенный в 2011 году сообществом CloudFoundry. Warden позволяет изолировать среды в любой ОС, работая как демон, и предоставляя API для управления контейнерами. В CloudFoundry создали клиент-серверную модель для оркестрации набора контейнеров на нескольких хостах, частью которой был Warden, предоставлявший пользователям сервис для управления cgroups, пространствами имен и жизненным циклом процессов в изолированной среде. Позже разработчики Warden заменили LXC собственной системой виртуализации.
Вторым проектом, взявшим за основу LXC (но позже также отказавшимся от этой технологии в пользу собственных разработок) стал проект Docker, стартовавший в 2013 году.
Docker
Работы над Docker начались в инкубаторе стартапов «Y Combinator» в 2011 году, его создателями были программисты Камель Фунади, Соломон Хайкс и Себастьян Пал. В отличие от предшественников, эта система контейнеризации изначально задумывалась, как коммерческий сервис для облачных инфраструктур, доступный клиентам по модели SaaS.
Первой коммерческой компанией, использовавшей Docker для своих внутренних проектов, стал французский облачный провайдер dotCloud, а широкой публике продукт был представлен на конференции PyCon в Санта-Кларе в марте 2013 года. Уже 19 сентября того же года Docker объявил о сотрудничестве с корпорацией Red Hat с целью интеграции продукта в Fedora, Red Hat Enterprise Linux и OpenShift. Год спустя, в версии Docker 0.9, LXC был заменен собственной библиотекой libcontainer, написанной на языке программирования Go.
С момента появления на рынке Docker и внедрения на его основе многими облачными провайдерами услуги предоставления клиентам контейнеров, как сервиса, популярность этой технологии стала стремительно расти. Фактически, именно Docker стал основоположником целой экосистемы для управления контейнерами. Одним из ярких представителей этого семейства по праву считается Kubernetes.
Kubernetes
Появившийся в июне 2014 года, Kubernetes очень быстро стал самой популярной системой для автоматизации развёртывания, масштабирования и управления контейнеризированными приложениями промышленного уровня. Это программное обеспечение с открытым исходным кодом позволяет управлять целыми кластерами контейнеров, как единым целым.
Изначально этот продукт зародился в недрах Google для внутренних нужд — корпорации была необходима надежная система управления кластерами виртуальных серверов, обслуживающих поисковую систему и другие нагруженные сервисы компании. Первая версия проекта имела кодовое название Google Borg в честь одной из героинь фантастического сериала Star Trek, но позже он был переименован в «Project Seven». В качестве логотипа разработчики Джо Беда, Брендан Бёрнс, Крэйг Маклаки, Тим Хокин и Брайан Грант выбрали морской штурвал, имеющий семь ручек. Однако такое название показалось Google не слишком запоминающимся, и его было решено сменить: новым именем продукта стало древнегреческое слово κυβερνήτης — «рулевой». Часто вместо него для краткости используется нумероним k8s — поскольку между «k» и «s» в слове «kubernetes» насчитывается 8 букв.
В 2014 году Google опубликовала в широком доступе написанные на Go исходники Kubernetes, а год спустя совместно с Linux Foundation был основан специальный фонд Cloud Native Computing Foundation (CNCF), которому разработчики передали права на этот продукт. Изначально в качестве движка для управления контейнерами использовался Docker, но в 2016 году он был заменен на собственный компонент Container Runtime Interface (CRI), поддерживавший помимо Docker и другие системы контейнеризации.
Безопасность и удобство контейнеров, а также высокая скорость развертывания привели к появлению отдельного направления DevOps, нацеленного на разработку контейнерных приложений, сокращающих время выхода новых проектов на рынок. С момента появления Kubernetes большинство крупнейших игроков на рынке облачных технологий, включая VMWare, Azure, AWS и других, объявили о его поддержке поверх собственных инфраструктур. Системы контейнеризации непрерывно развиваются, появляются новые инструменты для создания и развертывания контейнерных приложений, а также для управления большими кластерами контейнеров в центрах обработки данных. Kubernetes поддерживает все более сложные классы приложений, позволяющие предприятиям переходить как на гибридное облако, так и на микросервисные архитектуры. Контейнеризация превратилась в основу современной программной инфраструктуры, а Kubernetes сегодня используется в большинстве крупных корпоративных проектов. На июнь 2023 года проект Kubernetes на GitHub является одним из самых активных сообществ среди продуктов с открытым исходным кодом, он насчитывает более 3400 участников. Это свидетельствует о том, что контейнерные технологии пользуются значительной популярностью, и число компаний, использующих их для предоставления своим клиентам различных услуг, будет только расти.
Источники
FreeBSD Jail, Linux-VServer, Solaris Containers, OpenVZ, Cgroups, LXC, Docker, Kubernetes.