Как собрать кластер из двух raspberry. Создаём систему развертывания приложений с помощью Docker. Почему Cluster HAT

Вполне возможно, что это самый дешёвый и доступный кластер, построенный в домашних условиях.
В данный момент он считает задачки seti@home.

Сборка

Сборка не составляет особого труда - вот список материалов для повторения:

  • 4 платы OrangePi PC (One тоже подойдет) с кабелями питания
  • 16 стоек для печатных плат для крепления между собой
  • 4 стойки (коротких) для крепления на подставку или использования в качестве ножек
  • 2 куска оргстекла (верхняя и нижняя крышка)
  • Вентилятор 92 мм
  • 4 уголка для крепления вентилятора
  • 100Mbs Ethernet HUB, желательно с питанием либо 5, либо 12 вольт
  • Патчкорды для соединения Ethernet в необходимом количестве (кстати, поскольку сеть все равно 100 МБит, можно использовать 4х-жильную телефонную лапшу и немного сэкономить на кабеле)
  • Источник питания (об этом позже)
  • Для связи с внешним миром - дешёвый USB WiFi

Скручиваем вместе четыре платы, крепим верхнюю и нижнюю крышки, ставим вентилятор с использованием уголков. На верхнюю крышку водружаем хаб и соединяем наш всё вместе через Ethernet.

А вот так “изделие” выглядит “с тыльной стороны”.

К сожалению, синей изоленты не было - так что хаб крепим резиночками.

Питание

Каждая из OPI потребляет не меньше ампера (производитель рекомендует источник не меньше 1.5…2A). Вентилятор требует 12 вольт, хаб тоже, хотя бывают и 5-вольтовые модели.

Так что потребуется хороший источник питания с двумя напряжениями.

Старый компьютерный вполне подойдет, но лучше использовать современный безвентиляторный импульсный источник, например от MeanWell.

Я, собственно, так и поступил, упаковав его в корпус от винтажного блока питания и выведя наружу обычный молекс-разъем (как на компьютере).

Для “раздачи” 5ти вольт будем использовать модифицированный USB-хаб из дешевых. Для этого можно либо высверлить чип, либо просто отрезать ножки данных, оставив только цепи питания и землю. Я остановился на втором способе, правда внутри проложил еще “толстые” соединения на линии 5В. Ну и повесим ответный molex для соединения с БП. Получается примерно так:

А вот вся конструкция в сборе:

Система

Вообще, это просто “маленькая локальная сеть из 4х компьютеров”.
В качестве базовой системы - обычный Debian, о котором уже много говорили .

Сеть

Самый верхний узел - clunode0, он умеет соединяться по WiFi с внешней сетью, при этом раздает “интернет” на машины clunode1, clunode2, clunode3. Там же работает сервер NFS для общего хранилища и dnsmasq для раздачи DHCP адресов вида 10.x.x.x.

На clunode0 в /etc/network/interfaces примерно такая запись:

1
2
3
4
5
6
7
8
9
10
11
12
13
auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-scan-ssid 1
wpa-ap-scan 1
wpa-key-mgmt WPA-PSK
wpa-proto RSN WPA
wpa-pairwise CCMP TKIP
wpa-group CCMP TKIP
wpa-ssid "MyWiFi"
wpa-psk "MyWiFiPassword"
post-up /usr/local/bin/masquerade.sh eth0 wlan0
iface default inet dhcp

Хотя, вроде как там ситуация переломилась и бинарник можно сгрузить с сайта. Не проверял - проще было собрать самому.

Еще можно установить и настроить консольную утилиту boinctui . Выглядит всё вполне пристойно (animated GIF):

Перспективы

Можно развить идею - вот навскидку несколько идеек:

  • Первая плата (clunode0) - load balancer, сlunode2,3 - веб-сервера или приложение, clunode4 - БД ==> микродатацентр:)
  • Hadoop (и такие случаи уже есть, народ строит кластеры на Raspberry)
  • Proxmox кластер, правда я не уверен, что все запчасти доступны для ARM
  • Майнер cryptocurrency, если конечно подберете криптовалюту, которую всё еще выгодно майнить на процессоре и выгодно майнить вообще.

Спасибо, что дочитали до конца.


Плата Cluster HAT является решением проблемы построения кластерных вычислений. Распределенные вычисления сложны и этот крошечный аппаратный комплект является одним из решением данной проблемы.

Не смотря на то, что создание не такое и простое, это представляет собой один из самых впечатляющих проектов Raspberry Pi.

Почему Cluster HAT?

Плата Cluster HAT (Hardware Attached on Top) взаимодействует с (контроллером) Raspberry Pi A+ / B+ / 2 / 3 / 4 и четырьмя платами Raspberry Pi Zero. Она настроена на использование режима USB Gadget. Кроме того, это идеальный инструмент для обучения, тестирования или моделирования небольших кластеров.

Cluster HAT использует гибкость Raspberry Pi, позволяя программистам экспериментировать с кластерными вычислениями.

Важно отметить, что HAT не поставляется с платой Raspberry Pi или Pi Zero. Обе платы нужно будет приобретать отдельно. Производитель Pimoroni предоставляет инструкции по сборке и управлению на своей странице продукта . Также компания утверждает, что существует 3 способа настройки платы HAT.

Технические характеристики Cluster HAT

  • HAT может быть использована с любым из модулей Pi Zero 1.2, Pi Zero 1.3 и Pi Zero W.
  • Режим USB Gadget: Ethernet и последовательная консоль.
  • Встроенный 4-портовый хаб USB 2.0.
  • Питание Raspberry Pi Zeros осуществляет через контроллер Pi GPIO (USB дополнительно).
  • Питание Raspberry Pi Zero контролируется через контроллер Pi GPIO (I2C).
  • Разъем для контроллер последовательной консоли (FTDI Basic).
  • Контроллер Pi может быть перезагружен без прерывания питания для Pi Zeros (восстановление сети при загрузке).

Комплект включает в себя:

  • Комплект крепления HAT (стойки и винты)
  • Короткий USB провод (цвет может отличаться)

В заключении

Плата Cluster HAT v2.3 сейчас доступна для покупки и хотя ее пока нет в наличии у

— миниатюрный компьютер, размером чуть больше флешки, с огромным количеством возможностей. ПК можно использовать и по прямому назначению — подключить мышь, клавиатуру, монитор и работать, как с обычным компьютером. Но возможности Raspberry гораздо шире — и эти возможности используют любители гаджетов и технологий. В сегодняшнем обзоре — 5 интереснейших проектов на основе Raspberry Pi.

Планшет

Да, если у вас нет планшета, самое время его сделать своими руками. В этом нам поможет Raspberry Pi и подробная инструкция (правда, на английском языке). Диагональ у такого планшета составляет 10 дюймов. Конфигурация же повторяет конфигурацию Raspberry Pi.

Суперкомпьютер

Сам по себе мини-компьютер не очень производительный. Но если объединить несколько десятков Raspberry в единый кластер, может получиться очень мощная система со значительными вычислительными ресурсами.

Не так давно был создан настоящий суперкомпьютер из 64 Raspberry Pi. Поскольку корпуса для таких устройств не продаются, то было решено сделать корпус самостоятельно, из кирпичиков Lego.

Как сделать нечто подобное самостоятельно? Вот подробнейшая инструкция от автора этой разработки.

Skype-телефон

Если вы регулярно общаетесь по Skype, стандартные методы общения (микрофон, ПК) могли и надоесть, как надоели они создателю следующего проекта. Для того, чтобы сделать разговоры по Skype интереснее, разработчик поместил сам Raspberry в корпус дискового телефона, подключил Сеть, и создал специальное ПО, позволяющее переводить количество прокруток диска телефона в символы.

В результате получилось интереснейшая Skype-станция. От обычного дискового телефона система отличается только тем, что сзади подключено два провода, а не один.

Фотокамера

На основе «малинки» можно сделать и мощную фотокамеру с производительной начинкой. При этом все, что нужно — светодиоды, немного оптики и 3D-принтер, чтобы распечатать корпус устройства. Конечно, нельзя забывать и о самом мини-компьютере Raspberry — именно он обеспечивает работу камеры.

Сделать такую систему самостоятельно тоже можно, хотя сделать это не так просто.

Система «свободно/занято» для офисного туалета

Работники офисов иногда теряют драгоценное время, подойдя к туалету, и увидев, что место уже занято. Неприятно, плюс утекает драгоценное рабочее время. Чтобы избежать таких случаев, можно сделать систему предупреждения, которая будет транслировать статус офисного туалета (свободно или занято) на компьютеры всех сотрудников.

Для того, чтобы определить, есть человек внутри или нет, система использует следующий алгоритм:

1. Делается снимок через приложение Streamer;
2. Анализируется яркость пикселей в определенном месте, алгоритм работает на основе PHP-GD;
3. Если яркость отличается от эталонной, система дает сигнал;
4. Пользователь получает сообщение «занято».

Используется энтузиастами для самых различных целей. Так, например энтузиаст Дэвид Гилл (David Guill) решил использовать его для постройки кластера - группы компьютеров, соединенных между собой и представляющих, с точки зрения пользователя, единый аппаратный ресурс. Проект решено было назвать 40-Node Raspi Cluster. Стоит заметить, что кластер Дэвиду был необходим для того, чтобы набраться опыта в программировании на распределенных системах, так что кластер из Raspberry Pi будет заменять собой, на время обучения, настоящий супер-компьютер.

По простому можно было бы собрать кластер из Raspberry Pi, используя вместо корпуса стелаж или недорогой шкаф (как в случаи с ), но поскольку Дэвид увлекается моддингом, то и кластер он решил сделать стильный, максимально приближенный по своему виду и удобству к серийным решениям. И, надо сказать, у Дэвида это получилось, ведь его проект намного более продуман, чем многие серийные корпуса. Кстати, сделан корпус проекта 40-Node Raspi Cluster из акриловых панелей, нарезанных по размеру с помощью лазера и склеенных вручную.

Основными отличительными особенностями проекта 40-Node Raspi Cluster стали: крутой внешний вид, достаточно компактный размер (как большая башня), удобный доступ ко всем компонентам и возможность их замены без необходимости разбирать корпус, безвинтовое крепление частей коруса и многих комплектующих, а также порядок в проводах (а их в данном проекте ой как не мало). Данный проект включает в себя 40 компактных компьютеров Raspberry Pi (40 ядер Broadcom BCM2835 с частотой 700 МГц, 20 ГБ распределенной оперативной памяти), два 24-портовых свитча, один блок питания форм-фактора ATX, пять жестких дисков емкостью по 1 ТБ (с возможностью расширения до 12 штук), 440 ГБ флеш-памяти, а также роутер с возможностью беспроводного подключения.


Компьютеры Raspberry Pi в данном проекте сгруппированы по четыре штуки на кастомных акриловых креплениях, которых в данном проекте десять штук. Благодаря такому креплению (как в блейд-серверах), обеспечивается удобный доступ и легкая замена компактных компьютеров. Для каждого блейда с Raspberry Pi предусмотрен свой компактный DC-DC преобразователь, питающийся от общего ATX блока питания. Охлаждение кластера реализовано с помощью четырех 140 мм вентиляторов, за которыми установлены фильтры.

Дополнительной «моддинговости» проекту 40-Node Raspi Cluster добавляет обилие светодиодов - их в проекте более трех сотен (на мини-компьютерах, свитчах, роутерах и вентиляторах), при этом в процессе работы они будут мигать в соответствии с нагрузкой. Размеры данного проекта составляют 25 х 39 х 55 см, а примерная стоимость постройки - 3000 долларов.

С внешним и внутренним видом, а также с особенностями, проекта 40-Node Raspi Cluster вы можете ознакомиться по прикрепленным фото и видео. Если же данный проект вас заинтересовал, то ознакомиться с ним детальней, а Дэвид описал постройку этого монстра очень детально, можно посетив соответствующую заметку на его личном сайте.

Сегодня речь пойдёт о замечательном инструменте, а именно о контейнерной системе развертывания приложений - Docker. Разработчиков для Raspberry Pi тема касается непосредственно. Добро пожаловать под кат.

1. Что такое Docker

Возможно не все знакомы с системами развертывания. Поэтому я поясню.

Говоря совсем простым языком, Docker - это такая система, которая позволяет один раз настроить приложение на одной машине, сохранить его окружение (не только конфигурацию, а именно и окружение тоже) и зависимости, дальше распространять его уже настроенным в виде контейнера. Т.е. для развертывания ничего не понадобится кроме образа.

Также вы можете где-нибудь увидеть слова "Docker" и "виртуализация" в одном предложении, это не значит что Docker эмулирует процессор, память, ядро ОС и т.д., виртуализация происходит на уровне ядра т.е. все "виртуализируемые" им процессы являются реальными процессами вашей ОС.

Как вы уже догадались можно придумать массу применений. Например, вы собираетесь сделать кластер Raspberry Pi, который будет майнить биткоины (кстати, это нерентабельно в наши дни) и на каждую из 1000 имеющихся в арсенале плат вы должны установить и настроить один и тот же софт. Да, можно скомпилировать свой образ ОС, но это во-первых не так быстро, во-вторых это не так гибко (конфигурация чуть-чуть поменялась и надо пересобирать весь образ ОС).

Или, например, вы хотите распространять ваше приложение под несколько модификаций одноплатных компьютеров: Rpi1, Rpi2, O-droid, Rpi3. Везде одна и та же структура приложения, один и тот же исполняемый код, но конфигурация отличается. Вы можете создать 3,4 отдельных мануала для пользователей по установке и настройке, а потом вам это надоест и вы создадите N различных, уже настроенных конфигураций вашего приложения под самые популярные платформы и будете распространять их виде контейнеров.

Это то что я придумал навскидку. На самом деле Docker это очень-очень мощный инструмент, применений ему можно найти неограниченное количество.

Самым большим плюсом является то, что развернуть контейнер можно на абсолютно любой другой машине где установлен Docker.

Ладно, вводная часть что-то слишком затянулась. Перейдем к делу.

2. Установка

Если вы устанавливаете систему с нуля, то возможно рациональнее воспользоваться уже готовым образом от команды Hypriot.

Большинство пользователей не будет переустанавливать систему из-за того что хотят попробовать Docker. Поэтому ниже будет приведен процесс установки на Raspbian.

0. Если у вас старая версия Raspbian, обновляемся до новой т.к. с версии Debian 8 появилась поддержка ядра Docker "из коробки":

$ sudo sed -i "s/wheezy/jessie/" /etc/apt/sources.list $ sudo sed -i "s/wheezy/jessie/" /etc/apt/sources.list.d/raspi.list $ sudo apt-get update && sudo apt-get -y upgrade # answer "y" to upcoming questions $ sudo sudo apt-get -y dist-upgrade # answer "y" to upcoming questions $ sudo init 6 $ sudo apt-get -y autoremove $ sudo apt-get -y purge $(dpkg -l | awk "/^rc/ { print $2 }") $ sudo init 6

1. На официальном сайте отсутствует мануал с описанием установки на Raspberry Pi, но команда Hypriotпроделала большую работу по автоматизации установки Docker на Raspberry. Воспользуемся плодами их труда:

$ git clone https://github.com/hypriot/rpi-docker-builder.git $ cd rpi-docker-builder $ sudo sh build.sh $ sudo sh run-builder.sh

После этого пакет для установки Docker вы найдете в каталоге./dist/docker-hypriot_1.10.3-1_armhf.deb. На данный момент это последняя версия.

Ленивые могут воспользоваться готовыми пакетами от Hypriot:

$ curl -sSL http://downloads.hypriot.com/docker-hypriot_1.10.3-1_armhf.deb >/tmp/docker-hypriot_1.10.3-1_armhf.deb $ sudo dpkg -i /tmp/docker-hypriot_1.10.3-1_armhf.deb $ rm -f /tmp/docker-hypriot_1.10.3-1_armhf.deb $ sudo sh -c "usermod -aG docker $SUDO_USER" $ sudo systemctl enable docker.service

2. Проверка работоспособности

Sudo docker info

Docker version

Выведет информацию о версии, количестве контейнеров, версии ядра, драйверов и т.д.

3. Теперь любое приложение, которое есть в виде docker-контейнера для ARM, можно устанавливать с помощью docker run на Raspberry Pi.

Следующая команда скачает и развернёт небольшой уже настроенный веб-сервер:

Docker run -d -p 80:80 hypriot/rpi-busybox-httpd

Список контейнеров можно посмотреть с помощью

Docker ps

3. Использование

Можно, конечно, описывать основные команды и прочее, но за этим лучше обращаться к документации.

Поэтому мы рассмотрим на примере.

Предположим мы хотим собрать контейнер в котором будет веб сервер NGinx и PHP 5.4.

В начале пишется инструкция по сборке образа. Листинг файла с комментариями приведен ниже.

src: build/backend/Dockerfile

# Используем за основу контейнера Ubuntu 14.04 LTS FROM ubuntu:14.04 # Переключаем Ubuntu в неинтерактивный режим - чтобы избежать лишних запросов ENV DEBIAN_FRONTEND noninteractive # Устанавливаем локаль RUN locale-gen ru_RU.UTF-8 && dpkg-reconfigure locales # Добавляем необходимые репозитарии и устанавливаем пакеты RUN apt-get install -y software-properties-common RUN add-apt-repository -y ppa:ondrej/php5-5.6 RUN add-apt-repository -y ppa:nginx/stable RUN sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4F4EA0AAE5267A6C RUN apt-get update RUN apt-get upgrade -y RUN apt-get install -y wget curl php5-fpm php5-mysql php5-gd php5-curl php-pear php-apc php5-mcrypt php5-imagick php5-memcache supervisor nginx # Добавляем описание виртуального хоста ADD iloverpi.ru /etc/nginx/sites-enabled/iloverpi.ru # Отключаем режим демона для Nginx (т.к. запускать будем сами) RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf # Отключаем режим демона для php-fpm RUN sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /etc/php5/fpm/php-fpm.conf # Добавляем конфиг supervisor (описание процессов, которые мы хотим видеть запущенными на этом контейнере) ADD supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Объявляем, какие директории мы будем подключать VOLUME ["/var/www"] # Объявляем, какой порт этот контейнер будет транслировать EXPOSE 80 # Запускаем supervisor CMD ["/usr/bin/supervisord"]

src: build/backend/supervisord.conf

Nodaemon=true loglevel=debug command=/usr/sbin/nginx autorestart=true command=/usr/sbin/php5-fpm autorestart=true

Полный список команд с пояснениями доступен по ссылке .

Теперь, используя эту инструкцию, собираем образ iloverpi.ru.

Sudo docker build -t iloverpi.ru ~/PATH_TO_DOCKERFILE_DIR

Образ iloverpi.ru надо запустить, тем самым создав контейнер. Помимо этого требуется связать 80 порт хоста с 80 портом контейнера. Для удобства и полноты примера также свяжем /var/www хоста и /var/www контейнера.

$ sudo docker run -v /var/www:/var/www -p 80:80 -м -t iloverpi.ru

Убеждаемся что контейнер запущен:

Sudo docker ps | grep "iloverpi.ru"

Имя контейнера не было указано явно, поэтому он получил автоматическое название, с помощью которого мы можем с ним взаимодействовать.

У меня вывод предыдущей команды выглядит так:

D8429cc192c0 astgo.ru/dev:latest "/usr/bin/supervisor 20 seconds ago Up 19 seconds 0.0.0.0:80->80/tcp container23

Здесь "container23" - имя контейнера.

Для взаимодействия с командной строкой контейнера существует команда

Sudo docker exec -i -t container23 bash

После этого станет доступно обычное приглашение командной строки. Это и будет консоль нашего контейнера.

Итак, мы собрали и развернули свой контейнер, научились с ним взаимодействовать.

Статья получилась длинной, но надеюсь Вам было интересно. До новых встреч.