Статьи

Кроссплатформенное гибридное облако с докером

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 за их отличную работу! Наша команда просто внесла небольшой вклад в дополнение к ним.