TL; DR
В этой статье мы говорим о кроссплатформенном гибридном облаке, построенном поверх Docker . С нашими изменениями, внесенными в набор инструментов Docker , вот список сюрпризов:
- Мы успешно объединили наши 50 узлов Linux / ARM и еще 50 общедоступных узлов Linux / x86-64 DigitalOcean в единый виртуальный движок Docker, используя Docker Swarm , с изменениями.
- Мы запускаем чистый Linux / ARM (не Linux / x86-64) кластер, и нам удается подготовить кластер с помощью Docker Machine с драйвером нашей машины.
- Независимо от аппаратной архитектуры (так как это узлы ARM и x86-64), мы успешно используем Docker Compose для масштабирования Nginx до 100 контейнеров в этом кластере из 100 узлов.
Гибридное облако и докер
С набором инструментов Docker мы уже успели настроить гибридное облако. Docker Machine помогает нам создавать и управлять машинами, ориентированными на контейнеры. Он поставляется с большим набором драйверов, от локального VirtualBox до IaaS, такого как Amazon EC2 или DigitalOcean. Docker Machine просто делает эти машины готовыми для Docker.
Docker Swarm помогает нам сформировать кластер экземпляров Docker, которые предоставляются Docker Machine. Неважно, где работают двигатели Docker. Если их IP-адреса достижимы, Swarm может сформировать их как виртуальный хост Docker. Затем он позволяет любому клиенту Docker управлять кластером. Со стандартными машинами и Swarm у нас уже есть простой способ создать гибридное облако на основе Docker.
Несмотря на то, что Docker работает где угодно, в настоящее время существует ограничение, заключающееся в том, что он официально поддерживает только архитектуру Linux / x86-64 (также известную как AMD64). Это понятно, поскольку Linux / x86-64 является самой крупной и известной платформой. Как упоминалось ранее, мы можем запустить гибридное облако Linux / x86-64 с Docker.
Но что если мы хотим объединить несколько аппаратных архитектур в единую конечную точку?
ARM и облака с низким энергопотреблением
Факт: архитектуры ARM появляются на рынке серверного класса.
ARM-серверы и облака постепенно появляются. AppliedMicro поставляет X-Gene, первый в мире сервер ARMv8 с 64-разрядной системой на кристалле. HP Moonshot, основанный на X-Gene SoC, уже поставляет серверы такого типа в центры обработки данных. Манчестер основе фирмы, DataCentred , построил платформу OpenStack облако поверх серверов Moonshot. В дополнение к 64-битному классу ARM , французский стартап Scaleway предлагает 32-битный IaaS на основе ARM с прошлого года.
Наша история
В апреле прошлого года мы писали о кластере Aiyara, кластере Spark / Hadoop, построенном на платах ARM. Его техническое описание было любезно опубликовано в Руководстве по большим данным DZone.
С тех пор мы столкнулись с новой проблемой.
Несмотря на то, что мы успешно используем Ansible для управления нашим кластером Aiyara, управлять программными приложениями для кластера сложно.
Мы пришли к выводу, что нам нужен уровень виртуализации даже в небольших масштабах. Однако подход Hypervisor не подходит для нас, потому что мы используем процессоры ARM для кластера.
Есть ли лучший способ?
К счастью, в то же время, когда мы работали над Айярой, Докер сиял. Затем мы взглянули на Docker и приложили усилия, чтобы запустить его на нашем ARM-кластере. По крайней мере, он работает. Далее, как мы должны управлять Docker в режиме кластеризации?
В декабре прошлого года Docker анонсировал новый набор инструментов для поддержки своей экосистемы, а именно Swarm, Machine и Compose. Мы планировали использовать Swarm для управления виртуализацией на уровне кластера. Так что это наша отправная точка, чтобы внести свой вклад в Swarm . Позже в феврале мы обнаружили, что Docker Machine будет очень полезна для нас при подготовке узлов кластера. Но у Machine пока нет драйверов для поддержки аппаратного обеспечения. Поэтому мы решили реализовать один, драйвер Aiyara для машины.
Результат фантастический. Это позволяет нам одновременно контролировать и наш кластер, и публичные облака, используя простой рабочий процесс, аналогичный тому, который предлагается в Docker Orchestration. Вот как это выглядит:
$ machine ls
NAME ACTIVE DRIVER STATE URL SWARM
rack-1-node-11 aiyara tcp://192.168.1.11:2376
rack-1-node-12 aiyara tcp://192.168.1.12:2376
rack-1-node-13 * aiyara tcp://192.168.1.13:2376
rack-1-node-14 aiyara tcp://192.168.1.14:2376
rack-1-node-15 aiyara tcp://192.168.1.15:2376
Единственной оставшейся, но самой большой проблемой было то, что образы Docker доступны только в специфичных для платформы двоичных форматах. Если вы создадите образ для архитектуры Linux / x86-64 (amd64), он не будет работать на компьютере с Linux / ARM. Хотя мы можем подражать ему через QEMU , но это не будет достаточно хорошим выбором.
Нам повезло найти хорошее решение. Наши версии Swarm и Machine прекрасно работают вместе, чтобы сделать кластер прозрачно работающим с образами x86-64 и ARM.
Начиная с малого, гибридное облако с 2 узлами
Вот список нашего самого маленького гибридного облака. У нас есть узел, работающий на плате ARM, а другой — это компьютер DigitalOcean 512 Мб. Дополнительный локальный мастер- узел действует как Swarm Master.
$ machine ls
NAME ACTIVE DRIVER STATE URL SWARM
master * none tcp://127.0.0.1:3376
ocean-1 digitalocean Running tcp://128.199.108.67:2376
rack-1-node-4 aiyara tcp://192.168.1.4:2376
Docker Machine упрощает оркестровку. Мы можем просто использовать конфигурацию компьютера, чтобы обеспечить всю конфигурацию, необходимую для клиента Docker. Вы можете увидеть Docker Orchestration для получения дополнительной информации.
$ docker $(machine config master --swarm) info
Containers: 2
Strategy: spread
Filters: affinity, health, constraint, port, dependency
Nodes: 2
ocean-1: 128.199.108.67:2376
└ Containers: 1
└ Reserved CPUs: 0 / 1
└ Reserved Memory: 0 B / 514.5 MiB
└ Labels: executiondriver=native-0.2, kernelversion=3.13.0-43-generic, operatingsystem=Ubuntu 14.04.1 LTS, provider=digitalocean, storagedriver=aufs
rack-1-node-4: 192.168.1.4:2376
└ Containers: 1
└ Reserved CPUs: 0 / 2
└ Reserved Memory: 0 B / 2.069 GiB
└ Labels: architecture=arm, executiondriver=native-0.2, kernelversion=3.19.4, operatingsystem=Debian GNU/Linux 7 (wheezy), provider=aiyara, storagedriver=aufs
Приведенная выше команда docker info прошла через Swarm Master. Он показал, что у нас есть кластер из 2 узлов, первый из которых использует провайдер Docker Machine DigitalOcean. Второй — наш узел Айяра. Оба используют AUFS в качестве механизма хранения.
Затем мы попытались вытянуть образы Debian на каждый узел перед его запуском.
$ docker $(machine config master --swarm) pull debian
rack-1-node-4: Pulling debian:latest...
ocean-1: Pulling debian:latest...
ocean-1: Pulling debian:latest... : downloaded
rack-1-node-4: Pulling debian:latest... : downloaded
Ну, Ocean-1 явно тянет изображение быстрее ?
Затем мы протестировали выполнение простой команды uname -a дважды через Swarm. Мы использовали образ Debian . Swarm выберет узел для первого запуска, затем другой узел для второго запуска, потому что его стратегия планирования по умолчанию распространяется , алгоритм, который будет размещать контейнеры как можно более широко.
$ docker $(machine config master --swarm) run debian uname -a
Linux e75d5877493e 3.19.4 #2 SMP Mon Apr 20 02:39:39 ICT 2015 armv7l GNU/Linux
$ docker $(machine config master --swarm) run debian uname -a
Linux 6d6b9d406f88 3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 GNU/Linux
Давай посмотрим, что за этим стоит. Мы запустили ps -a, чтобы показать все контейнеры внутри кластера. Вам может показаться интересным, что на самом деле наш узел ARM запускал контейнер с другим изображением, используемым узлом DigitalOcean. Aiyara / Debian: latest.arm наш Debian ARM изображение. Версия Swarm Aiyara достаточно умна, чтобы понять, что мы собираемся разместить новый контейнер на компьютере ARM, поэтому она выбрала для нас правильный образ для конкретной платформы.
$ docker $(machine config master --swarm) ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6d6b9d406f88 debian:latest "uname -a" 14 minutes ago Exited (0) 13 minutes ago ocean-1/focused_leakey
e75d5877493e aiyara/debian:latest.arm "uname -a" 14 minutes ago Exited (0) 14 minutes ago rack-1-node-4/modest_ritchie
Кластер из 100 узлов
Ну, кластер с двумя узлами слишком прост. Вот облако из 100 узлов в действии.
Поскольку у нас уже есть 50 узлов ARM в нашем кластере, мы затем создадим еще 50 узлов в DigitalOcean. Вот команда для создания узла DigitalOcean.
$ machine create -d digitalocean --digitalocean-access-token=token --digitalocean-region=sgp1 ocean-1
Мы выполнили приведенную выше команду для узла океан-1 до океана-50 . В основном мы использовали параметры по умолчанию, поэтому у нас есть 512 МБ виртуальных машин из плана $ 5 / мес.
Было бы очень сложно масштабировать количество узлов вручную, но Docker Compose мог бы помочь нам с этим легко справиться. Мы создали каталог и назвали его aiyara_cloud . Затем мы разместили там файл описания для нашего модуля развертывания docker-compose.yml . Мы запустили бы веб- сервер Nginx на каждом узле и хотели бы привязать порт 80 хоста к открытому порту контейнера. Вот наше описание YML:
$ cat docker-compose.yml
web:
image: nginx
ports:
- "80:80"
Мы запустили первый узел с помощью следующей команды:
$ docker-compose up -d
Чтобы масштабировать веб- сервер до 100 узлов, мы использовали:
$ docker-compose scale web=100
Затем вы увидите, что другие 99 контейнеров будут создаваться из каждого образа платформы и правильно размещаться на их оборудовании, один за другим. Вот список всех работающих контейнеров в гибридном облаке на основе Docker ARM / x86-64.
Мы благодарим DigitalOcean за то, что он позволяет нам запускать 50 капель за раз, чтобы мы могли создать большое гибридное облако с 100 узлами, смешивая кластер Aiyara и DigitalOcean вместе.
Вывод
Сегодня мы успешно создали первое известное кроссплатформенное гибридное облако на основе Docker с небольшими изменениями для Machine и Swarm. Эти изменения позволяют нам прозрачно использовать Docker на разнородном оборудовании.
Мы предполагаем, что этот вид гибридного облака важен. Эта архитектура поможет нам:
- баланс производительности и энергопотребления облака
- постепенно переносить изображения на предпочитаемые вами платформы
- смешивать и сочетать гибридное облако, чтобы использовать доступные ресурсы
Microsoft собирается поддерживать Docker для следующей версии Windows-сервера, поэтому после этого появятся некие образы Docker для Windows / AMD64 . Также Linux / AArch64 уже выходит на рынок. К счастью, наша кроссплатформенная гибридная облачная архитектура уже готова для них. Если вы уже используете Docker, эта межплатформенная гибридная облачная архитектура минимизирует изменения вашего рабочего процесса DevOps.
Эта концепция кроссплатформенного гибридного облака никогда бы не появилась без прочной основы экосистемы Docker . Мы благодарим команды Docker, Swarm, Machine и Compose за их отличную работу! Наша команда просто внесла небольшой вклад в дополнение к ним.