OpenVZ: контейнеры и управление ресурсами в Linux
Кирилл Колышкин, Москва, РФ, kir@openvz.org
LVEE 2009
Рассмотрена технология контейнерной виртуализации на примере OpenVZ. Описываются основные функции ядра OpenVZ (изоляция и виртуализация, управление ресурсами, чекпойнтинг и миграция) и пользовательских утилит. Кратко демонстрируются основные возможности OpenVZ.
1 Виртуализация
Под виртуализацией понимается система или методология разделения ресурсов компьютера на множество независимых сред исполнения. Это позволяет разорвать жесткую связь «один компьютер – одна система» и обеспечить гораздо большую гибкость компьютерной инфраструктуры.
В настоящее время наиболее популярны технологии эмуляции, паравиртуализации, динамической трансляции и т.п., позволяющие одновременно запускать множество различных операционных систем на одном физическом сервере. В качестве примеров продуктов, использующих такие технологии, можно привести VMware, Xen, KVM, Parallels Desktop/Workstation.
При этом подходе платформа виртуализации предоставляет множество экземпляров виртуального «железа», на каждом из которых запускается операционная система, именуемая гостевой. Каждая ОС при этом имеет свое собственное ядро, драйвера устройств и т.п., и выполняет типичные для ОС функции – управление «железом», процессами, сетью и т.п. Основное преимущество подхода заключается в возможности запускать любые ОС, главный недостаток – сравнительно большие накладные расходы (и отсюда падение производительности) и малая плотность размещения гостевых сред. В какой-то мере проблему накладных расходов помогают решать новые аппаратные технологии (Intel VT, VT-D, AMD V и т.п.). Отчасти помогает использование паравиртуализации; при этом, однако, требуется модификация кода ядра гостевой ОС.
Альтернативным подходом к виртуализации является использование так называемой виртуализации на уровне операционной системы, или контейнеров. При этом виртуализация происходит уровнем выше, а именно на стыке между системным (ядро) и прикладным программным обеспечением. Ядро ОС модифицируется таким образом, чтобы все интерфейсы, которые оно предоставляет для программ, были выделены в отдельные сущности, называемые контейнерами. Преимуществами такого подхода являются высокая производительность, масштабируемость и плотностью размещения. Наиболее фундаментальное ограничение контейнерного подхода — невозможность запускать различные ОС. Примеры реализаций контейнерной виртуализации: FreeBSD Jails, Solaris Zones/Containers, Linux-VServer, OpenVZ, Parallels Virtuozzo Containers, IBM AIX 6 WPARs.
Каждая из технологий виртуализации имеет свои достоинства и недостатки, обуславливающие сферы применения решений, на ней основанных.
2 Контейнер
Контейнер (также используются термины Virtual Environment (VE), VPS, VDS, раздел (partition) и т.п.) — это отдельная изолированная среда выполнения программ, которая (с точки зрения ее владельца и запущенных в контейнере программ) выглядит как обычный выделенный сервер.
Каждый контейнер имеет свою иерархию процессов (начиная с init), файловую систему, пользователей (включая root), сетевое устройство с IP-адресами, таблицы маршрутизации, правила сетевого файрволла (netfilter/iptables) и так далее.
Множество контейнеров сосуществует в рамках одного физического сервера. В разных контейнерах при этом могут работать разные дистрибутивы Linux, однако все контейнеры работают под одним и тем же ядром.
3 Ядро OpenVZ
Ядро OpenVZ — это модифицированное ядро Linux, которое добавляет следующую функциональность: виртуализация и изоляция отдельных подсистем ядра, управление ресурсами, а также чекпойнтинг.
Виртуализация и изоляция, собственно, позволяют в рамках единого ядра ОС создавать множество контейнеров, каждый из которых имеет свои собственные процессы, файлы, сетевые и другие устройства и т.п. Таким образом, вся функциональность, предоставляемая ядром процессам пользователя, разграничена между контейнерами. Подсистема управления ресурсами позволяет ограничивать и делить между контейнерами такие ресурсы, как процессорное время, память и дисковое пространство. Чекпойнтинг — это процесс «замораживания» работающего контейнера с сохранением полного образа его состояния в файл и возможностью последующего полного восстановления этого состояния.
3.1 Система управления ресурсами OpenVZ
Система управления ресурсами в OpenVZ состоит из четырех основных компонентов:
1. Двухуровневая дисковая квота. Администратор хост-системы может установить дисковые квоты на каждый контейнер в терминах дискового пространства и количества айнодов (i-nodes). Это первый уровень дисковой квоты.
В дополнение к этому администратор контейнера (root) может использовать обычные утилиты внутри своего контейнера для настройки стандартных дисковых квот UNIX для пользователей и групп.
2. «Честный» планировщик. Планировщик процессора в OpenVZ также двухуровневый. На первом уровне планировщик решает, какому контейнеру дать квант процессорного времени, базируясь на значении параметра cpuunits для данного контейнера. На втором уровне стандартный планировщик Linux решает, какому процессу в выбранном контейнере дать квант процессорного времени, базируясь на стандартных приоритетах процесса в ОС и т.п. Таким образом, каждый контейнер получает процессорное время вне зависимости от количества процессов в нем.
3. Планировщик ввода-вывода. Позволяет задать каждому контейнеру приоритет дискового ввода-вывода. Пропускная способность подсистемы ввода-вывода делится между контейнерами с учетом этих приоритетов.
4. User Beancounters. Это набор счетчиков, ограничений и гарантий для различных ресурсов на каждый контейнер. Контролируется примерно 20 ресурсов: оперативная память, различные объекты ядра, например, разделяемые сегменты памяти IPC, сетевые буферы и т. п.
Чекпойнтинг позволяет производить «живую» миграцию контейнера на другой физический сервер. Контейнер «замораживается» и его состояние сохраняется в файл на диске. Далее этот файл можно перенести на другую машину и там «разморозить» (восстановить рабочее состояние) контейнера. Задержка этого процесса (время, когда контейнер в «замороженном» состоянии) составляет примерно несколько секунд. Важно подчеркнуть, что это задержка, а не отказ в обслуживании, так как разрыва сетевых соединений не происходит.
4 Утилиты OpenVZ
В состав OpenVZ входит набор утилит vzctl, предоставляющий довольно высокоуровневый интерфейс командной строки для создания и управления виртуальными средами. Так, например, для создания и запуска нового контейнер необходимо всего две команды — vzctl create и vzctl start.
Для изменения различных параметров контейнера служит команда vzctl set.
Практически все ресурсы (например, размер виртуальной памяти) могут быть изменены во время работы контейнера. В других технологиях виртуализации (напр. эмуляции или паравиртуализации) это либо достаточно сложно технически, либо невозможно.
5 Области применения
Средства контейнерной виртуализации дают возможность воспользоваться всеми преимуществами виртуализации, не платя при этом большую цену в виде падения производительности.
- Консолидация серверов позволяет сэкономить на стоимости оборудования, серверных площадках и затратах на обслуживание.
- Весьма привлекательно использование технологий контейнерной виртуализации для хостинга ввиду низкой себестоимости контейнера, возможностей массового управления, быстрого создания контейнеров. Однако следует заметить, что в этом сценарии надежная изоляция и управление ресурсами приобретают критическую важность.
- Безопасность может быть существенно улучшена при разнесении разных сетевых сервисов (демонов) в разные контейнеры. В качестве дополнительных преимуществ пользователь получает динамическое управление ресурсами и возможность «живой» миграции.
- Использование контейнеров в процессе разработки и тестирования программного обеспечения выглядит привлекательно ввиду хорошей производительности, возможностей иметь большое количество контейнеров, различные дистрибутивы, версии библиотек, производить клонирование контейнеров и т.п.
- В образовательных целях контейнеры можно использовать, чтобы дать каждому студенту права root, не требуя для этого большого количества серверов. Возможность пробовать разные дистрибутивы, а также быстро создавать новые контейнеры сводит к минимуму необходимость в частой переинсталляции.