Содержание статьи
«Что? Еще одна система виртуализации? Но я же только осилил Docker!» — скажешь ты и будешь прав. Виртуализация везде, и новых инструментов в этой сфере масса. Но Virtuozzo и бесплатный OpenVZ — проекты не новые, их пилят уже больше десяти лет. При этом информации в доступной форме о них немного. Мы решили разобраться, что такое Virtuozzo, чем он отличается от Docker, для каких задач он подходит и, главное, нужен ли он именно тебе или твоей компании.
Что такое Virtuozzo
Чем Virtuozzo отличается от Docker? Virtuozzo — это поставщик инфраструктуры. Другими словами — это поставщик виртуальных серверов. Используя Virtuozzo, можно создавать контейнер, в котором находится вся ОС. Это было предназначением Virtuozzo с самого начала, еще с двухтысячных годов. В виртуальный сервер ставится Apache, Plesk или какая-то другая панель управления, и это называется VPS-хостингом.
Когда мы говорим о Virtuozzo, то речь идет именно о виртуализации. Когда мы говорим о Docker, нужно понимать, что это не средство виртуализации — это средство доставки приложений. Docker построен на базе runC/libcontainer, и основной сценарий использования — быстро доставлять приложение из каталога образов на продакшен-сервер, который может быть физическим сервером, персональным компьютером или виртуальным сервером в облаке.
Virtuozzo — это софт, который дает виртуализацию, то есть легковесные виртуальные машины. Для Docker нет разницы между контейнером с полной операционкой, куда можно ставить приложение, и установкой на виртуальную машину в Amazon, Google Cluster, Azure и так далее. Когда приходит это понимание, сразу становится видна разница. В одном случае «контейнер» — это application container, в другом — системный или ОС-контейнер.
Virtuozzo поставляет софт для сервис-провайдеров. Скажем, провайдеры могут на основе Virtuozzo сделать мини-облако из VPS, и туда можно будет ставить Docker. Когда к этим провайдерам с Virtuozzo приходят их конечные пользователи и говорят «нам нужен Docker-контейнер», иногда возникает недопонимание. Недавно мы с нашими менеджерами обсуждали, куда встроить пользовательский интерфейс для Docker и Kubernetes (это еще одна система управления контейнерами). Пришли к выводу, что его нужно встраивать в UI самообслуживания наших сервис-провайдеров, а не в UI самих сервис-провайдеров, отвечающий за управление контейнерами.
Virtuozzo, в отличие от Docker, можно использовать для «живой» миграции приложений. Эта функция была с самого создания Virtuozzo, но реализация разнилась от версии к версии. До версии Virtuozzo 6 она была реализована в ядре. Пару лет назад мы сделали большой патч и предложили его сообществу Linux kernel, но патч отвергли. Мы, конечно, расстроились, но решили подумать, что можно изобрести вместо этого. В итоге удалось сделать так, что потребовалось внести небольшие и приемлемые изменения в ядро, а все остальное ушло в user space. Этот проект мы назвали CRIU. Есть сайт, criu.org, им занимается Павел Емельянов. Именно он изобрел эту технологию выноса кода из ядра, и ей сейчас активно пользуются. Она вошла в стандартные дистрибутивы — Red Hat, Ubuntu — и даже в Docker. В Virtuozzo 7 она используется как основная технология миграции контейнеров.
Virtuozzo устанавливается прямо на «голое железо». Мы даем ISO или флешку с инсталлятором, как у операционки. Пройдя через слайды инсталлятора, на выходе получаешь нашу ОС и систему виртуализации с нашим ядром. Стоит признать, что на сегодняшний день наше ядро не так сильно отличается от vanilla по сравнению с тем, как это было 5–10 лет назад. Мы принимаем активное участие в разработке ядра Linux и по статистике входим в топ-20 или даже топ-10 по патчам в ядро — в основном в области контейнерной виртуализации. Еще мы участвуем в разработке эмулятора QEMU и гипервизора KVM.
Virtuozzo и open source
До сих пор есть вещи, которые мы по той или иной причине не включаем в апстрим. Например, улучшения, связанные с производительностью, которые позволяют быть на 50% быстрее, чем тот же OpenVZ. Мы аккуратно смотрим: если в апстриме таких изменений не наблюдается, никто на эту тему не думает, мы их оставляем в своем ядре. Это те ценные вещи, которые Virtuozzo приносит своим пользователям. Если мы будем всё выкладывать, то за что платить деньги?
Мы выработали стратегию работы с опенсорсом методом проб и ошибок. Одно время была мысль, что нужно коммитить вообще все, но оказалось, что клиенты в таком случае ожидают, что опенсорсный проект должен быть бесплатным. Пришлось искать некий баланс. Он строится по простому принципу: если в апстриме заметна какая-то активность в разработке того, что у нас уже есть, значит, пора вливать туда. Потому что нам же потом будет накладно переделывать свое решение с учетом того, что без нас сделают в апстриме. Но при этом мы не торопимся делиться своими уникальными решениями — сначала их нужно монетизировать. В общем, прагматичный подход победил, и противостоять этому бесполезно.
Опенсорсный проект OpenVZ появился где-то в районе 2004 года. Сейчас мы позиционируем его как ядро, поверх которого ставится Virtuozzo. Изначально это было сделано для того, чтобы облегчить интеграцию, да и в целом улучшить восприятие. Когда есть один опенсорсный проект, другой опенсорсный проект легче воспринимает то, что ты делаешь, поскольку видит, что все доступно. В этом была основная цель OpenVZ, которой он успешно достиг.
Вокруг OpenVZ появилось пользовательское комьюнити, не целое поколение, конечно, но достаточное количество сисадминов-фанатов. Выпуская ядра в OpenVZ, мы получаем ценную обратную связь: что работает, что не работает. Люди зачастую присылают нам фиксы или просто указывают на проблемы, помогая нам экономить время разработки.
OpenVZ — это, по сути, базовая версия Virtuozzo. Далеко не все функции, которые есть в Virtuozzo, есть в OpenVZ. И мы постоянно работаем над тем, чтобы эта разница сохранялась и наши же клиенты понимали, что OpenVZ отстает от флагмана.
Уникальные черты Virtuozzo
Если говорить о важных вещах, которые есть в Virtuozzo и которых нет в OpenVZ, то стоит отметить систему кеширования. Благодаря ей плотность серверов Virtuozzo на 30–50% больше. У нас есть полностью проприетарная распределенная система хранения данных (Virtuozzo Storage), которая намного лучше по производительности в сравнении с Ceph. Есть такие возможности, как Disk Encryption для контейнеров, которые позволяют шифровать диски контейнеров ключами конечных пользователей. Установка обновлений без перезагрузки — ReadyKernel. Также в Virtuozzo есть поддержка каталогов и образов Bitnami.
Идея Virtuozzo Storage зародилась так: мы провели тур по нашим основным клиентам и обнаружили, что примерно 33% дискового пространства в их дата-центрах с Virtuozzo ничем не занято. Эти 33% можно продавать, использовать, как-то монетизировать. Появилась мысль объединить хранилище и отдать его в использование под наши контейнеры и виртуальные машины. С технической стороны это подкрепляется тем фактом, что сервис-провайдеры и хостеры не стараются сидеть на последнем, наиболее мощном оборудовании. Они часто используют старые серверы. И возникла идея сделать хранилище для такого оборудования. Если говорить на языке заказчиков, от Ceph оно отличается тем, что оно, во-первых, в разы быстрее, во-вторых, это хранилище оптимизировано под наши контейнеры и виртуальные машины. Оно идет как компонент Virtuozzo. Технология не открытая, и открывать ее мы не планируем.
Bitnami выпускает в формате Virtuozzo образы для примерно 50 разных приложений. Когда сервис-провайдер покупает Virtuozzo, у него есть возможность оформить платную подписку на них.
У покупателей Virtuozzo есть более-менее стандартный набор приложений, которые они запаковывают в образы, из которых создаются потом виртуальные серверы. Было принято решение договориться с Bitnami о том, что они будут поставлять эти образы и обновлять их по мере поступления апдейтов от вендоров приложений.
Многим клиентам интересен интерфейс для масс-менеджмента. Если есть одна нода, то ей можно управлять с помощью CLI. Но когда появляется несколько нод, нужно другое решение. Это хороший повод добавить ценную вещь для покупателей. Вот пример для живой миграции: есть одна нода с процессором AMD и другая — с Intel. Общий пользовательский интерфейс, который работает поверх группы серверов, должен это учитывать и говорить, что миграция невозможна, CPU несовместимы при миграции между такими нодами. Или, к примеру, бэкап-менеджмент. Когда нода одна, достаточно положить бэкапы в папочку, и всё. А когда нод несколько, то всё намного сложнее. Мы видим, как наши клиенты, у которых по 6000 нод, пытаются организовать это, но все равно ничего не получается. Здесь есть возможность вынести эту логику и заменить на уровне UI. Это есть в Virtuozzo, но нет в OpenVZ.
Наш гипервизор основан на стандартных для Linux эмуляторе QEMU и гипервизоре KVM. До седьмой версии у нас был свой проприетарный гипервизор. Кстати, в Parallels Desktop for Mac гипервизор тот же самый, только собранный для Mac. Он полностью выполнял свою функцию и был очень хорошим, но мы год за годом смотрели на то, что происходит с KVM. Скажем, пять лет назад было понятно, что мы лучше KVM во многом. А три года назад стало заметно, что комьюнити KVM бежит быстрее. Видя, что делает моя команда, в сравнении с тем, что делает комьюнити, я отдавал себе отчет, что не получится долго выжимать из команды больше фич, чем есть в KVM. В какой-то момент, проведя исследование, мы поняли, что нам нужно перейти на KVM, но при этом забрать с собой те вещи, которые у нас есть и которые отличают нас от того, что есть у них в апстриме. В итоге наша система бэкапов и кеширования дает прирост производительности 40% и более.
На базе Virtuozzo делаются некоторые решения для DevOps. К примеру, Jelastic — мы в партнерстве с его разработчиками выпустили Virtuozzo DevOps. Чтобы сделать из Virtuozzo такое решение, требуется тот уровень, который привнес Jelastic.
Есть клиенты, которые используют Virtuozzo не только как сервис-провайдеры, но и в других сценариях. В том числе и очень крупные американские компании. Если такому клиенту подходит Virtuozzo, но не хватает каких-то фич, они иногда запрашивают их у нас, и мы добавляем. Но основная часть наших клиентов — это все же сервис-провайдеры. К примеру, в России Caravan, Infobox, Rusonyx работают на Virtuozzo. В США — например, в GoDaddy используют наши решения.
Алексей Кобец о себе
Мой творческий путь начинался с МФТИ. Я мечтал попасть на факультет аэролетательной техники, но, когда я уже подавал документы, мне сказали, что это не круто, а крут факультет общей и прикладной физики. Я поступил туда.
До этого у меня даже компьютера не было, встречи с ним случались на занятиях по информатике. Потом я одним из первых на курсе купил себе компьютер, и с того времени появилась тяга к программированию. Тогда мы часто ставили VMware, в ней запускали всякие ОС... Через какое-то время это увлечение для меня вылилось в поиск базовой кафедры и научного руководителя, чтобы изучать виртуализацию. На горизонте появился Александр Геннадьевич Тормасов, он воспитал, наверное, всех топ-менеджеров в компаниях Acronis, Virtuozzo, Parallels и так далее. Даже Сергей Белоусов защитил диссертацию под его руководством. В общем, я пошел к Александру Геннадьевичу практикантом в SWsoft. Я делал какие-то задания, которые он выдавал, и в какой-то момент пришло приглашение заняться тестированием в SWsoft, я согласился. По тем временам это были хорошие деньги, хорошая подработка на лето. Мы начали писать систему автотестов для ядра Virtuozzo. Вот так все и начиналось. Это было лето 2000 или 2001 года, приблизительно мой третий курс.
Программировать я начал с Shell и Perl. На них тогда писались тесты. Но приходилось писать на C и C++. Было подозрение, что ядро Linux падает, когда открывается огромное количество TCP-сокетов и по ним гоняются данные. Мои начальники поспорили, напишем ли мы такой тест, который уронит ядро в oops, или не напишем. Я на это потратил, наверное, месяц. Но отлаживал и запускал на системе с одним процессором. Я уже был готов сдаться, но в последний момент взял другой сервер SMP и запустил — система мгновенно упала.
Как начинался Virtuozzo
Главной идеей Virtuozzo было создать раздельные среды для хостеров. Им нужно иметь раздельный биллинг и быть изолированными друг от друга таким образом, чтобы не было проблем с распределением ресурсов. Изолировать, естественно, нужно было и от хоста, чтобы не оставлять возможность проникновения. Эту задачу поручили спроектировать Александру Геннадьевичу, и на выходе как раз получилась технология, которую мы называли по-разному: virtual environments, контейнеры. Это и легло в основу Virtuozzo и OpenVZ. Во всех патентах мы описываем именно эту технологию.
Когда я пришел в компанию в 1999 или 2000 году, работа над виртуальными окружениями уже велась. Сейчас, спустя довольно много лет, понятно, что нет такого плана, который сразу гарантировал бы успех. Методом проб и ошибок мы искали, где можно применить нашу технологию. В то время был бум веб-сайтов, все делали сайты, всем хотелось где-то их хостить. Было понятно, что виртуальные машины — это для сайтов слишком жирные сущности. Можно изолировать на уровне процессов, но этого все равно недостаточно. Одно время мы делали что-то вроде cgroups на стероидах, но в итоге пошли по пути дополнения изоляции файловой системы и сетевой изоляции.
Существовала версия Virtuozzo для FreeBSD, но она не была выпущена, потому что доминирует Linux. Есть версия для Windows — это один из проектов, над которым мне посчастливилось работать.
О безопасности
У нас ни разу не было случаев эксплуатации уязвимости изнутри виртуальной машины. Такие вещи всплывают очень редко, и те, кто о них знает, наверное, хранят их в тайне. Мы очень серьезно к этому относимся. К примеру, кроме внутреннего секьюрити-аудита (у нас есть целая секьюрити-команда, которая этим занимается), мы еще нанимаем сторонних и работаем с компанией Openwall. Мы проводим секьюрити-ревью каждой большой версии. Недавно закончили ревью Virtuozzo 7. Ничего такого, что открыло бы путь для эскейпа, не нашли, но есть небольшие ошибки, которые мы исправляем. Мы очень внимательно следим за секьюрити. Например, когда выходят ядра Red Hat, мы смотрим, что там произошло, и порой даже что-то чиним и отсылаем в Red Hat. Периодически Red Hat нас благодарит. А иногда мы выпускаем свое ядро раньше, чем появляется Red Hat с фиксом.
У Virtuozzo есть программа вроде bug bounty, но попроще. Есть почта security@virtuozzo.com, куда приходят письма с баг-репортами. Мы их классифицируем и, если подтвердим наличие серьезной уязвимости, вознаграждаем таких людей. Такое бывает нечасто, но мы честно платим.
Кого берут в Virtuozzo
Мы работаем с несколькими вузами, есть студенческие программы и интернатура. Начинающим можно прийти туда. Студенты, к примеру, занимаются CRIU. Через один-два года стажировки студенты приходят к нам на полный рабочий день и подключаются к серьезным разработкам. Если посмотреть на команду, у нас достаточно большое число людей прошли такой путь, начиная с меня самого.
Если высшего образования нет, но есть интересные разработки, мы посмотрим, поговорим с вами и, возможно, возьмем. В первую очередь нужно разбираться в ядре. Если ты успел засветиться в сообществе и занимаешься вещами, связанными с производительностью, с разработкой гостевых драйверов, с разработкой систем виртуализации, мы, конечно же, обратим на тебя внимание.
Разработчикам ядра нужно знать C, а пользовательский интерфейс мы пишем на Go. Но для тех, у кого есть глубокие знания программирования, язык уже не так важен. Я сам пришел в компанию, не зная ни C, ни C++ и не имея опыта. Я знал Perl и Shell, но в итоге разобрался. Главное — чтобы человек был способен к развитию и увлечен.