Если вы сталкиваетесь с необходимостью поддерживать множество сред для одного приложения, работаете с микросервисными архитектурами, имеете большой набор приложений или среду, в которой приложение развертывается для каждого пользователя, разрабатываете высокопроизводительное, масштабируемое приложение, то DC/OS – среда, на которую стоит обратить внимание.
Представим инфраструктуру как слоеный пирог: нижний слой представляет собой аппаратные серверы, выше может размещаться виртуализированная среда, еще выше – контейнерная среда, в которой находятся приложения. Каждый последующий слой является более абстрактным, независимым от аппаратуры, целеориентированным и более удобным для пользователя.
Аппаратные серверы. Являются самым базовым, наименее специализированным слоем. Этот слой не всегда удобен для непосредственного использования под приложения, поскольку он не обеспечивает отказоустойчивости и достаточной изоляции приложений, размещенных в рамках одной операционной системы. Чтобы преодолеть ограничения серверов, начали развиваться среды виртуализации ресурсов и контейнеризации приложений.
Виртуализированная среда. Является уровнем абстрактных серверов, которые “нарезаются” так, чтобы максимально соответствовать назначению и обеспечить максимальную утилизацию нижележащей аппаратуры. На одном аппаратном сервере размещается от нескольких до сотен виртуальных серверов.
Контейнерная среда. Контейнеры еще более специфичны и служат для изоляции приложений. Широко известные контейнерные среды – это Docker, LXC, OpenVZ, Virtuozzo, FreeBSD Jail, Solaris Containers. Этот уровень может располагаться как непосредственно на аппаратных серверах, так и в виртуальных серверах, в зависимости от целей и удобства. Как правило, контейнеров могут быть десятки и сотни даже на виртуальном сервере.
Обычно, соотношение сущностей между уровнями различается на порядки. Легко отметить, что управлять таким зоопарком может быть весьма затратно. Для виртуализированной среды давно применяются системы оркестрации виртуальных серверов – OpenStack, Apache CloudStack, VmWare vSphere, OpenNebula и другие. Они позволяют эффективно абстрагироваться от “железа” и представить все хозяйство в удобном виде, обслуживать его и развивать. Часто на этом все и останавливается. Администраторы нарезают виртуальные серверы под конкретные приложения и используют их.
Однако, в современном мире DevOps такое положение вещей не является желательным подходом. Виртуальный сервер теперь не считается достаточно удобным, он слишком сложен, он не ориентирован на удобство использования в условиях постоянных изменений. Современные подходы к созданию и развертыванию приложений диктуют новые требования. Самое главное из них – это неизменность среды. В случае же виртуального сервера, неизменность среды не гарантируется. Установка, обновление, удаление или переконфигурирование приложений ведет к изменению среды.
Разработчики полюбили Docker именно за то, что он предоставил возможность поддержания “чистой” неизменной среды с высоким уровнем изоляции ресурсов. Воодушевленные данной возможностью разработчики стали использовать Docker для доставки приложений. Теперь на одной аппаратной или виртуальной машине можно запускать одно приложение любых версий в каких угодно конфигурациях, удалять ненужные развертывания по необходимости, при этом среда остается чистой.
Если попробовать запустить на одном сервере linux множество экземпляров MySQL, вы поймете как сложно это сделать, с Docker – это элементарно.
С другой стороны масла в огонь подливает переход к меньшим сервисам в рамках микросервисной архитектуры. Звезда смерти NetFlix демонстрирует нам как много микросервисов может использоваться в сложном приложении, а каждый из них выполняется в отдельном контейнере в десятках, сотнях и даже тысячах копий для обеспечения высокой производительности сервиса:
Принцип “разделяй и властвуй” в действии. На минутку представьте, что каждый микросервис может быть развернут одновременно в нескольких версиях кода.
Управление этим хозяйством на практике невозможно без специальных инструментов оркестрации. На сцену выходят Kubernetes, Docker Swarm, Apache Mesos и его дружелюбное воплощение – DC/OS. Эти инструменты позволяют замкнуть все уровни абстракции среды исполнения в единый организм.
Наша компания широко использует DC/OS и Docker Swarm для создания приложений. Мы пока что не используем Kubernetes, поскольку не сталкивались с задачами, в которых текущие инструменты не проявляют себя в лучшем свете и не имеем соответствующих запросов от клиентов.
Apache Mesos и Docker Swarm которые решают следующие задачи:
- управление доступными ресурсами кластера;
- запуск и поддержание приложений в определенном состоянии.
В целом, Apache Mesos кажется нам более универсальным, поскольку Docker Swarm представляет те же функции, что и Mesos + фреймворк Marathon, в то время как для Mesos существуют десятки других фреймворков, которые подходят для специфических задач, например, развертывания, управление и масштабирование кластеров Cassandra, HDFS или Kafka.
Apache Mesos сложный инструмент и требует значительного погружения для развертывания и управления:
Однако, основной спонсор проекта – компания Mesosphere разработала вычислительную среду DC/OS, которая является интегрированной платформой для Mesos и множества фреймворков для самых разных нужд. Эта среда легко устанавливается на виртуальные или аппаратные серверы, стабильно работает и содержит все необходимые компоненты для оркестрации приложений с помощью Apache Mesos.
DC/OS предоставляет следующие возможности:
- объединяет CPU, RAM, системы хранения виртуальных или физических серверов в единый пул ресурсов;
- запускает контейнерные или родные для операционной системы приложения в этом пуле с резервированием ресурсов CPU, RAM, системы хранения;
- поддерживает запуск задач по расписанию с помощью фреймворков Metronome, Chronos;
- позволяет обновлять приложения в кластере без простоя;
- обеспечивает отказоустойчивость приложений за счет перезапуска сбойных приложений, резервирование и балансировку нагрузки между приложениями;
- поддерживает группы приложений, которые имеют согласованную политику запуска, остановки, обновления;
- поддерживает сетевую изоляцию и выделение каждому приложению отдельного адреса;
- балансирует нагрузку между экземплярами одного приложения;
- позволяет добавлять и удалять дополнительные вычислительные узлы;
- предлагает каталог готовых фреймворков и контейнеров для специфических нужд, например, HDFS, Kafka, Elasticsearch, Cassandra, Redis, MySQL, PostgreSQL, которые устанавливаются в один клик;
- предоставляет полноценное API, CLI и пользовательский интерфейс для управления всей инфраструктурой;
- позволяет использовать ресурсы GPGPU, кластерных файловых систем Ceph и Amazon EBS.
Таким образом, DC/OS является мета операционной системой, которая использует планировщик Mesos для управления ресурсами. Так и расшифровывается “Data-Center Operating System).
Ценность DC/OS в том, что она предоставляет полностью интегрированную среду, в которой разработчики могут:
- выполнять CI/CD
- развертывать версии приложений для каждой ветки;
- маршрутизировать трафик с помощью балансировщика и DNS между различными версиями приложений, например, app-develop.cluster, app-release.cluster, app-feature-x.cluster;
- экспериментировать с кодом в среде, неотличимой от настоящей;
- сразу сделать полностью программно-определяемое развертывание в терминах приложений, а не настроек операционной системы;
- развертывать инфраструктурные компоненты в один клик (например, полностью рабочий кластер Apache Kafka, или реплицируемую MongoDB);
- делать деплоймент в духе A/B, Canary, Blue green;
- использовать приватные Docker-реестры;
- создавать приложения, которые используют обработку больших данных и машинное обучение.
Все возможности интегрированы и описаны в документации или в статьях. Вам не надо думать, каким образом реализовать что-то в среде разработки так, чтобы это работало в производственной среде. Мы в Битворкс разработали общий подход, который позволяет использовать DC/OS для элегантной разработки приложений с использованием практик DevOps, CI/CD. В будущей статье мы рассмотрим подробно как с помощью DC/OS и Gitlab CE организовать полноценную среду разработки, тестирования и выполнения приложений.
При правильном подходе с DC/OS вы перестанете бояться потерять всю инфраструктуру, поскольку сможете развернуть все за считанные часы из Git, сможете легко обновлять приложения с выходом новых версий, предоставите заинтересованных лицам все необходимые версии кода для тестирования и демонстраций, сможете без труда поддерживать тысячи версий приложения для разных клиентов в одном кластере. Подробнее о DC/OS можно узнать на официальном сайта проекта.
Если вам понравился этот пост, поделитесь им с друзьями.