- PVSM.RU - https://www.pvsm.ru -
Всем привет!
В прошлой статье [1] мы начали разговор о преимуществах контейнерной изоляции (контейнеризации), теперь мне бы хотелось углубится в технические аспекты реализации контейнеров.

Для Linux существует по крайне мере три реализации контейнеров:
Постойте, а где же LXC и что за Linux upstream containers c namespaces да cgroups? Если мы обсуждаем подсистему ядра Linux, отвечающую за изоляцию наборов процессов друг от друга, то называть ее LXC категорически не верно по той причине, что LXC — это имя собственное, название набора утилит [2] только для управления подсистемами ядра Linux, а вовсе не для обеспечения работы контейнеров в ядре!
Механизмы, которые обеспечивают работу контейнеров внутри ядра, называются namespaces (вот хороший обзор [3] данной функциональности). Кроме этого, за ограничения различных ресурсов контейнера (объем занимаемой памяти, нагрузка на диск, нагрузка на центральный процессор) отвечает механизм ядра — cgroups (обзор [4]). А в свою очередь обе эти технологии для удобства повествования я решил объединить под названием Linux upstream containers, то есть контейнеры из актуальной версии Linux ядра с kernel.org.
Если же говорить о пространстве пользователя, то такие пакеты как LXC, systemd-nspawn и даже vzctl (утилита из проекта OpenVZ) занимаются исключительно тем, что создают/удаляют namespac'ы и конфигурируют для них cgroup'ы.
Если с Linux upstream containers все более-менее понятно, так как они входят в ядро Linux, то для OpenVZ потребуются пояснения. OpenVZ — это open source проект [5] развиваемый компанией Parallels (называвшейся ранее SwSoft) с 2005 года (уже более 8 лет) и занимающийся разработкой и поддержкой production ready решения по контейнеризации на базе ядра Linux (патчи накладываются на ядра от RHEL).
Данный проект состоит из двух частей — Linux ядра с патчами от компании Parallels (vzkernel), а также набора утилит для управления ядром (vzctl, vzlist и проч). Так как модифицированное ядро от OpenVZ строится на базе ядра Red Hat Enterprise Linux, то логично предположить, что рекомендованная ОС для OpenVZ — это RedHat либо CentOS. Также недавно была осуществлена очень большая работа по предоставлению поддержки OpenVZ в Debian 7 Wheezy, но со своей стороны я все равно рекомендуют использовать OpenVZ исключительно на CentOS 6.
На данный момент в мире насчитывается более 25 тысяч серверов (стоит отметить, что в связи с особенностями сбора статистики, данные несколько занижены) с установленным OpenVZ, подробную статистику можно увидеть тут: https://stats.openvz.org/ [6]

Для проекта OpenVZ можно выделить следующие вехи развития:
Я, к сожалению, никак не могу прокомментировать отличия RHEL4/RHEL5 версий, так как даже не видел RHEL 4 версию. А вот отличия в RHEL 5 и 6 — крайне значительные, наиболее важный аспект в них, что солидная часть патча OpenVZ была удалена и вместо нее проект OpenVZ перешел на использование стандартных механизмов ядра Linux — namespace и cgroups, в будущих же версиях данная работа будет продолжена и в светлом будущем OpenVZ для своей работы не будет требовать ничего, кроме набора утилит, весь требуемый функционал ядра будет в Linux upstream.
Две фундаментальных технологии лежат в основе Linux upstream containers — это namespaces и cgroups. Фреймворк namespaces в виде mount namespace был впервые представлен [7] в 2000 году известным разработчиком Al Viro (Alexander Viro). В свою же очередь фреймворк cgroup был разработан в Google, с участием инженеров Paul Menage и Rohit Seth.
Также очень большой вклад в разработку новых подсистем namespaces/cgroups внесли разработчики проекта OpenVZ. В частности, namespace'ы PID [8] и Net были разработаны в контексте проекта OpenVZ. Коме этого, недавно был переведен в стабильную фазу фреймворк Criu для сериализации/десериализации наборов работающих Linux процессов lwn.net/Articles/572125/ [9], разрабатывался он также в контексте решения задач для OpenVZ.
Если Вы хотите оценить вклад самостоятельно, предлагаю два документа — отчет [10] о вкладе компаний в разработку ядра в 2013 году и аналогичный отчет [11] за 2012й год: Parallels там имеет вклад 0.7% и 0.9% соответственно. Может показаться, что 1% — это мало, то хотелось бы напомнить, что размер правок в год достигает нескольких миллионов строк.
Если Вы уже используете OpenVZ и у Вас есть что сообщить (баги) или чем поделиться (патчи), то милости прошу в баг-трекер [12] OpenVZ Каждый Ваш бег репорт улучшает стабильность и качество проекта для всех его пользователей!

Тут я хотел бы пойти по пути, через который, уверен, проходил каждый системный администратор, у которого стояла задача «изолировать пользователей друг от друга» в пределах одного Linux сервера.
Итак, допустим у нас имеется два веб-приложения, которые принадлежат разным клиентам (обращаю внимание, я тут не использую термин «пользователи», чтобы не было путаницы с Linux пользователями) и не должны никак влиять друг на друга (например, при взломе, перегрузке, исчерпании ресурсов) и тем более на сам физический сервер.
Давайте последовательность предпринимаемых шагов представим в виде списка:
Итого, для реализации изоляции базовых систем нам потребовались следующие namespace'ы:
Безусловно, путь был очень тернистый и реализация данных подсистем в ядре шла в немного иной последовательности, но сейчас все они доступны и собрались в такую чудесную картину под названием Linux upstream containers!

Спасибо что остаетесь с нами! В ближайшие дни мы подготовим и опубликуем продолжение серии!
Отдельно хотелось бы поблагодарить Andrey Wagin avagin [13] за помощь в редактуре особо сложных технических вопросов.
С уважением,
CTO хостинг-компании FastVPS [14]
Павел Одинцов
Автор: pavelodintsov
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/52795
Ссылки в тексте:
[1] статье: http://habrahabr.ru/company/FastVPS/blog/208650/)
[2] набора утилит: http://linuxcontainers.org
[3] обзор: http://lwn.net/Articles/531114/
[4] обзор: https://www.kernel.org/doc/Documentation/cgroups/
[5] проект: http://openvz.org/
[6] https://stats.openvz.org/: https://stats.openvz.org/
[7] представлен: http://www.ibm.com/developerworks/linux/library/l-mount-namespaces/index.html
[8] PID: http://lwn.net/Articles/259217/
[9] lwn.net/Articles/572125/: http://lwn.net/Articles/572125/
[10] отчет: http://www.linuxfoundation.org/publications/linux-foundation/who-writes-linux-2013
[11] отчет: http://go.linuxfoundation.org/who-writes-linux-2012
[12] баг-трекер: https://bugzilla.openvz.org/
[13] avagin: http://habrahabr.ru/users/avagin/
[14] FastVPS: http://fastvps.ru
[15] Источник: http://habrahabr.ru/post/209072/
Нажмите здесь для печати.