Инструмент Docker предоставляет всё необходимое для сборки, загрузки, запуска и остановки контейнеров. Он отлично подходит для управления этими процессами в окружении одного хоста и минимального количества контейнеров.
Однако, многие пользователи Docker используют эту платформу в качестве инструмента для простого масштабирования большого количества контейнеров между множества хостов. Кластеризованные Docker-хосты ставят перед администратором ряд специфических задач, для решения которых необходимы другие инструменты.
В данной статье речь пойдёт о планировщиках и инструментах оркестровки Docker. Такие инструменты предоставляют базовый интерфейс для управления контейнерами.
Планирование задач, оркестровка и управление кластером
При распределении приложений между несколькими хостами появляется заманчивая возможность управлять каждой хост-системой и абстрагироваться от особенностей платформы. Оркестровка – это довольно широкий термин, который охватывает распределение и планированию задач, управление кластером и возможность добавления дополнительных хостов.
В таком окружении распределение – это возможность загружать на хост-систему конфигурационные файлы, которые определяют правила запуска каждого отдельного контейнера. Распределение относится к определённому акту загрузки конфигураций на хост; а планировщики – это инструменты, которые отвечают за взаимодействие этих файлов с системой инициализации хостов, что позволяет управлять сервисами и предоставлять им необходимые функции и ресурсы.
Управление кластером – это, по сути, процесс управления группой хостов. Такой процесс может включать в себя добавление и удаление хостов из кластера, получение сведений о текущем состоянии хостов и контейнеров, запуск и остановку процессов и т.п. Управление кластерами очень тесно связано с планированием и распределением, потому что планировщики должны иметь доступ к каждому хосту кластера, чтобы функционировать должным образом. Потому часто для управления кластером и распределения задач используется один и тот же инструмент.
Для запуска и управления контейнерами между хостами кластера планировщик должен взаимодействовать с системой инициализации каждого отдельного хоста. В то же время для удобства управления планировщик отображает общее состояние сервисов в кластере. В результате получается нечто вроде «общекластерной» системы инициализации. Для этого планировщики, как правило, копируют структуру команд систем инициализации отдельных хостов.
Одной из основных задач планировщиков является выбор хостов. Если администратор запускает сервис (контейнер) в кластере, планировщик автоматически выбирает наименее загруженный хост. В случае необходимости администратор может задать настройки запуска контейнера. Тогда планировщик будет искать хост, отвечающий этим требованиям.
Как планировщик выбирает хост?
Как правило, планировщики работают согласно политике распределения по умолчанию. Она определяет, каким образом нужно распределять, если от администратора системы не поступило никаких настроек. К примеру, планировщик может отправлять новые задачи на наименее загруженные хосты.
Планировщики обычно предоставляют механизмы для переопределения и тонкой настройки процесса выбора хоста, что позволяет удовлетворить индивидуальные требования контейнеров. К примеру, администратор может передать планировщику, что два контейнера всегда должны работать на одном хосте (то есть используются как компоненты единой системы), или же наоборот, что определённые контейнеры ни при каких обстоятельствах не должны попасть на один хост.
Также планировщики могут принимать во внимание ограничения, указанные в виде метаданных. Это позволяет планировщику отмечать и тегировать определённые хосты. Это может понадобиться, к примеру, в случае, если хост содержит том данных, необходимый приложению. Некоторые сервисы необходимо устанавливать на все хосты в кластере. Большинство планировщиков легко справляются с подобными задачами.
Функции планировщиков
Распределение задач, как правило, тесно связано с задачами по управлению кластером, поскольку обе эти функции подразумевают работу и с хостами, и с кластером в целом.
Программы для управления кластером можно использовать для получения информации о хостах кластера, добавления и удаления хостов и даже для подключения к отдельным хостам для их тонкой настройки. Эти функции могут выполняться планировщиком или отдельным процессом.
Как правило, управление кластером также связано с инструментами обнаружения сервисов или распределёнными хранилищами данных типа «ключ-значение». Они отлично подходят для хранения распределённых данных о конфигурациях кластера (поскольку сам кластер имеет распределённый характер).
Потому в случае если какие-либо настройки не могут быть предоставлены самим планировщиком, отдельными операциями в кластере можно управлять путём изменения настроек в хранилище конфигураций. К примеру, управлять списком хостов кластера можно при помощи инструмента обнаружения сервисов.
Хранилища типа «ключ-значение» также часто используются для хранения метаданных о конфигурациях определённых хостов. Хосты можно тегировать. При этом установленные ярлыки будут использованы для распределения задач между хостами и группами хостов.
Распределение задач и мультиконтейнерные развёртывания
Иногда приложение разделяется на отдельные сервисы, однако при этом сервисы должны восприниматься как единое приложение. В отдельных случаях развёртывание одного сервиса без развёртывания остальных сервисов приложения не имеет никакого смысла, поскольку они представляют собой единое приложение и должны работать вместе.
Продвинутое распределение задач позволяет группировать контейнеры. Таким образом, администратор может работать с группой контейнеров как с единым целым. Это называется управлением группами контейнеров. Такая функция обеспечивает одновременный запуск компонентов, состоящих в тесной связи. Компоненты выполняются как единое целое, что упрощает процесс управления приложением и при этом сохраняет все преимущества разделения функциональности приложения между его компонентами. В результате администратор получает все преимущества контейнеризации и сервис-ориентированной архитектуры с минимальными затратами на управление системой.
Группировка компонентов позволяет одновременно запускать и останавливать всю группу. Кроме того, это позволяет выполнять более сложные задачи (как, например, настройка отдельных подсетей или масштабирование на уровне групп контейнеров)
Инициализация
Инициализация – это понятие, тесно связанное с управлением кластером; по сути, это процесс добавления хостов и его начальных конфигураций. В случае с Docker инициализация включает в себя настройку платформы Docker и добавление нового хоста в кластер.
В результате такого действия хост должен быть полностью готов к работе. Однако механизмы инициализации отличаются в зависимости от инструментов и типов хостов. К примеру, если хост является виртуальной машиной, его можно настроить при помощи инструментов типа vagrant. Многие облачные провайдеры позволяют создавать новые хосты с помощью интерфейса. А процесс инициализации физического сервера может повлечь за собой необходимость выполнения отдельных операций вручную. Начальную настройку хостов можно выполнить при помощи таких инструментов как Chef, Puppet, Ansible или Salt; такие инструменты предоставят хосту все необходимые для его добавления в кластер данные.
Процесс инициализации может выполнять администратор или автоматизированные инструменты управления кластером. Последний метод подразумевает возможность запроса дополнительных хостов. К примеру, в случае поступления высокой нагрузки на приложение система может автоматически добавлять новые хосты и горизонтально масштабировать контейнеры для балансировки этой нагрузки.
Популярные планировщики
Наиболее распространёнными планировщиками, которые обеспечивают распределение задач и управление кластером, являются:
- fleet: это инструмент CoreOS, предназначенный для распределения задач и управления кластером. Он извлекает данные о хостах кластера с помощью etcd и предоставляет systemd-подобный инструмент управления сервисами.
- marathon: инструмент Mesosphere для распределения задач и управления кластером. Работает вместе с mesos и обеспечивает управление сервисами, которые выполняются в течение продолжительного времени. Также marathon предоставляет веб-интерфейс для управления контейнерами.
- Swarm: планировщик Docker, который был анонсирован в декабре 2014 года. Он позволяет выполнять инициализацию контейнеров на хостах с установленной платформой Docker при помощи встроенного синтаксиса Docker.
Для управления кластером Mesosphere использует такой инструмент:
- mesos: Apache mesos является инструментом для распределения и управления ресурсами кластера. Он обеспечивает доступ к доступным ресурсам кластера другим компонентам (например, marathon). Это что-то вроде ядра кластера.
Продвинутое распределение задач и управление группами контейнеров предоставляют такие инструменты:
- kubernetes: продвинутый планировщик от Google, предоставляющий больше функций по управлению контейнерами. Позволяет отмечать контейнеры ярлыками, группировать их, назначать им индивидуальные подсети.
- compose: инструмент Docker, разработанный для управления группами контейнеров при помощи декларативных конфигурационных файлов. Он получает данные о взаимодействии контейнеров с помощью Docker-ссылок.
Заключение
Управление кластером, планирование и распределение задач – это неотъемлемые аспекты надёжной работы кластеризованных сервисов. Это обеспечивает надёжный фундамент для управления сервисами и приложениями. Продуктивное использование планировщиков позволяет влиять на приложения, затрачивая на это незначительные усилия.