Экосистема Docker: знакомство с общими компонентами
Серия туториалов
Этот туториал является 1-ой частью из 5-ти в серии статей Экосистема Docker.
Введение
Контейнеризация - это процесс распространения и развёртывания приложений портируемым и предсказуемым образом. Это достигается путём упаковывания компонентов и их зависимостей в стандартные, изолированные и лёгкие окружения (process environments), называемые контейнерами. В настоящее время многие организации заинтересованы в создании приложений и сервисов, которые могут быть легко развёрнуты на распределенных системах, позволяя системе легко масштабироваться и оставаться работоспособной при отказе отдельных машин или приложения. Docker - платформа для контейнеризации, разработанная для упрощения и стандартизации развертывания в разных окружениях, в значительной степени помог распространению данной практики проектирования и управления сервисами. Разработано большое количество программного обеспечения, работающего на основе данной экосистемы распределённого управления контейнерами.
Docker и контейнеризация
На сегодняшний день Docker является самым распространённым программным обеспечением для контейнеризации. Хотя существуют и другие системы контейнеризации, Docker делает создание и управление контейнерами простым и легко интегрируется с многими open-source проектами.
На картинке выше Вы можете увидеть (в упрощенном виде), как контейнеры соотносятся с хост-системой. Контейнеры изолируют отдельные приложения и используют ресурсы операционной системы с помощью Docker. В развёрнутом виде на картинке справа можно видеть, что контейнеры построены при помощи "слоев", при этом несколько контейнеров могут иметь общие нижние слои, уменьшая использование ресурсов.
Основные преимущества Docker:
- Использование меньшего количества ресурсов: Вместо виртуализации всей операционной системы контейнеры изолируют все на уровне процесса и используют ядро хоста.
- Портируемость: Все зависимости контейнеризованного приложения находятся внутри контейнера, что позволяет запускать его на любом Docker-хосте.
- Предсказуемость: Хосту все равно, что запущено внутри контейнера, а контейнеру все равно, на каком хосте он работает. Интерфейсы стандартизованы и взаимодействия предсказуемы.
Обычно на этапе проектирования приложения или сервиса, в котором будет использоваться Docker, лучше всего разнести функциональность по разным контейнерам, такой подход называется сервисно-ориентированной архитектурой. Он дает возможность в последствии легко масштабировать или обновлять компоненты независимо друг от друга. Наличие такой гибкости - одна из множества причин, по которым люди заинтересованы в Docker для разработки и развертывания приложений.
Узнать больше о контейнеризации приложений при помощи Docker можно из следующей статьи данного цикла.
Service Discovery и Global Configuration Stores
Обнаружение служб (Service discovery) является одним из компонентов общей стратегии, направленной на то, чтобы развёртывание контейнеров было гибким и масштабируемым. Обнаружение служб используется для того, чтобы контейнеры могли узнавать об окружении, в котором они находятся, без участия администратора. Контейнеры могут находить информацию о подключении к компонентами, с которыми они должны взаимодействовать, а также регистрировать себя таким образом, чтобы остальные инструменты знали о их доступности. Эти инструменты также обычно функционируют как глобально распределенные хранилища конфигураций (globally distributed configuration stores), позволяющие устанавливаться специальные настройки конфигурации для Вашей инфраструктуры.
На картинке выше Вы можете видеть пример того, как приложение регистрирует себя в системе обнаружения служб. После этого другие приложения при помощи системы обнаружения служб могут находить информацию о том, как подключиться к зарегистрированному ранее приложению.
Эти инструменты обычно реализованы как простые хранилища типа "ключ-значение" (key-value), распределенные по хостам в кластеризованном окружении. Обычно такие хранилища предоставляют HTTP API для доступа и изменения значений. Некоторые имеют дополнительные меры безопасности, например, шифрование и механизмы контроля доступа. Распределённые хранилища необходимы для управления кластеризованными Docker-хостами в дополнении к их основной функции - предоставлению информации для конфигурирования новых контейнеров.
Некоторые задачи хранилищ обнаружения служб:
- Передача (по запросу) приложениям данных, необходимых для подключения к службам, от которых они зависят.
- Регистрация (по запросу) информации о подключении к сервису (для целей, указанных в предыдущем пункте).
- Предоставление глобально доступного хранилища для разных конфигурационных данных.
- Хранение информации о членах кластера, необходимой программному обеспечению по управлению кластером.
Некоторые популярные инструменты обнаружения служб и соответствующие проекты:
- etcd: обнаружение служб / глобально распределённое хранилище "key-value";
- consul: обнаружение служб / глобально распределенное хранилище "key-value";
- zookeeper: обнаружение служб / глобально распределенное хранилище "key-value";
- crypt: проект для шифрования записей etcd;
- confd: наблюдает за "key-value" хранилищами и запускает переконфигурацию сервисов с новыми значениями.
Узнать больше об обнаружении служб в Docker можно из соответствующей статьи данного цикла.
Инструменты работы с сетью (networking tools)
Контейнеризованные приложения поддаются сервис-ориентированному дизайну, который поощряет разделение функционала на отдельные компоненты. Хотя это делает управление и масштабирование проще, в то же время требует большей уверенности в надёжной работе сети между компонентами. Docker предоставляет основные сетевые структуры, необходимые для соединений "контейнер-контейнер" и "контейнер-хост".
Встроенные сетевые возможности Docker предоставляют два механизма связывания контейнеров. Первый - открыть порты контейнера и настроить их для работы с хостом для внешней маршрутизации. Вы можете задать порт на хосте или позволить Docker случайно выбрать неиспользуемый порт с большим номером. Это универсальный способ предоставления доступа к контейнеру, который работает для большинства случаев.
Второй метод - позволить контейнерам общаться при помощи Docker "ссылок". Связанный с их помощью контейнер будет получать информацию о подключении к контейнеру на другой стороне связи, что позволит ему автоматически подключаться, если он настроен для отслеживания изменений. Это позволяет устанавливать взаимодействие между контейнерами на одном хосте без необходимости заранее знать порт или адрес расположения сервиса.
Такой базовый уровень сетевого взаимодействия подходит для окружений, например, с одним хостом. Однако экосистема Docker породила множество проектов, которые фокусируются на расширении сетевой функциональности, доступной для операторов и разработчиков. Такие инструменты дают некоторые дополнительные возможности:
- Перекрытие сетей для упрощения и унификации адресного пространства на нескольких хостах.
- Bиртуальные частные сети (VPN), адаптированные для предоставления безопасных связей между различными компонентами.
- Назначение подсетей для каждого хоста или приложения.
- Установка macvlan интерфейсов для взаимодействия.
- Настройка кастомных MAC-адресов, шлюзов и т.д. для Ваших контейнеров.
Некоторые проекты, улучшающие работу с сетью для Docker:
- flannel: Перекрытие сетей, обеспечивающее каждый хост отдельной подсетью.
- weave: Перекрытие сетей, объединяющее все контейнеры в одну сеть.
- pipework: Расширенный набор инструментов для работы с сетью, позволяющий настройку произвольных сетевых конфигураций.
Узнать больше о разных подходах к работе с сетью в Docker можно из соответствующей статьи данного цикла.
Планирование, управление кластером и оркестровка
Ещё одним компонентом, необходимым для построения кластеризованной контейнерной среды, является планировщик (Scheduler). Планировщики ответственны за запуск контейнеров на доступных хостах.
Изображение выше демонстрирует упрощенной процесс принятия решения по планированию работы приложения. Запрос посылается через API или специальное приложение по управлению приложениями. Далее Планировщик оценивает условия запроса и состояние доступных хостов. В данном примере, он получает информацию о плотности размещения контейнеров из распределенного хранилища данных / инструмента обнаружения служб (как рассматривалось выше), чтобы разместить новое приложение на наименее загруженном хосте.
Этот процесс выбора хоста является одной из ключевых задач Планировщика. Обычно в него встроены функции автоматизации данного процесса, при этом администратор имеет возможность задать некоторые ограничения. Примеры таких ограничений:
- Поместить контейнер на тот же хост, что и другой указанный контейнер.
- Убедиться, что контейнер не будет помещен на тот же хост, что и другой указанный контейнер.
- Поместить контейнер на хост с соответствующим названием или мета-информацией.
- Поместить контейнер на наименее загруженный хост.
- Запустить контейнер на всех хостах кластера.
Планировщик отвечает за загрузку контейнеров на соответствующие хосты, а также их запуск, остановку и управление жизненным циклом процесса.
Поскольку Планировщик должен взаимодействовать с каждым хостом в группе, он также обычно несет на себе функции управления кластером. Это позволяет Планировщику получать информацию о членах кластера и выполнять административные задачи. Оркестровкой (Orchestration), в данном контексте, обычно называется комбинация функций планирования контейнеров и управления хостами.
Некоторые популярные проекты, которые функционируют как планировщики и инструменты управления хостами:
- fleet: планировщик и инструмент управления кластером.
- marathon: планировщик и инструмент управления службами.
- Swarm: планировщик и инструмент управления службами.
- mesos: сервис абстракции хостов, объединяющий ресурсы хоста для планировщика.
- kubernetes: расширенный планировщик, способный управлять группами контейнеров.
- compose: инструмент контейнерной оркестровки для создания групп контейнеров.
Узнать больше о планировании, группировке контейнеров и программном обеспечении для управления кластерами для Docker можно из соответствующей статьи данного цикла.
Заключение
Теперь Вы знакомы с основными функциями большинства программного обеспечения, связанного с экосистемой Docker. Сам Docker, как и все его сопутствующие проекты, продвигает стратегию управления программным обеспечением, дизайна и развертывания приложений, которая дает высокую степень масштабируемости. Понимая и используя возможности разных проектов, Вы можете выполнить развертывание сложных приложений, достаточно гибких для учета разнообразных требований к эксплуатации.
0 Comments