Luna. Высокоскоростная установка операционных систем

в 1:23, , рубрики: Baremetal, HPC, luna, provisioning, системное администрирование

Всем привет.

Представляю на суд общественности новую утилиту для высокоскоростного bare-metal provisioning-а северов.

TL;DR

Конкурент xCAT/Warewulf/Rocks. Использует BitTorrent для раздачи образов OC. Поддерживаемые ОС — RHEL-семейство. Debian/Ubuntu — в работе. Самый масштабный тест на данный момент: холодная загрузка HPC кластера из 512 нод производится за 4 минуты. Автоматическое определение имени ноды на базе switch-port пар.
Линк: https://github.com/dchirikov/luna

Чуть больше деталей

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

Сначала это был классический pet-project, но сейчас это вышло в люди, и мы с моей компанией заинсталировали уже чуть меньше 10 кластеров от 30 до 500 нод. Первый релиз который не стыдно показать людям мы выкатили не так давно, поэтому есть повод покрасоваться на хабре :)

Имея опыт с другими системами и пообщавшись с инженерами заказчиков, мной были выбраны 2 киллер-фичи: образы вместо kickstart и битторент для разливки.

Первое использует, например, Bright, а так же xCAT для diskless-метода. Идею с торрентом мне подкинул один из заказчиков из Швеции.

Она гениальна в своей простоте. HPC-кластер — это когда у нас сотни вычислительных нод с абсолютно-одинаковой конфигурацией. То есть образ системы один и тот же. Поэтому вместо того что бы каждая нода вытягивала свою копию операционной системы с мастер-сервера и рвала этому бедному серверу интерфейс, пусть ноды делятся тем что уже скачано. Работающие образы на каждой ноде отличаются незначительно: буквально hostname и ip-адреса.

Поэтому мы создаем этот образ на мастер-ноде. Делается это элементарно — создание chroot окружения довольно тривиальная задача. Потом все дерево упаковывается в tarball и запихивается в торрент.
Секретный соус — dracut модуль который лежит в initrd. Он умеет общатся с сервером (и знает как его найти из /proc/cmdline), имеет самописный облегченный torrent-client, а так же умеет выполнять простейшие команды. Буквально curl | bash. Часто задаваемый вопрос: "А что торрент-клиент работает всегда?" Ответ: "Нет, только при загрузке, перед pivotroot все сервисы имеющие отношения к модулю luna прекращают свою работу."

Зачем нам надо грузить ноды быстро? Во-первых, это краси^W уменьшает время ввода кластера в строй. За довольно ограниченое время инсталляции у нас есть возможность провести множество тестов с разлиными параметрами и конфигами. HPC — это вещь в себе. Если у тебя запускается HPL (Linpack) на 4 нодах совсем не факт что он запустится на 400. Во-вторых, заказчик может позволить включать ноды только когда для них есть работа. И для загрузки не надо ждать по пол-часа: время загрузки не зависит от размера задачи поставленнной в шедулер (Slurm, например). Нет больше разницы влючить 2 ноды или 100.

Использование образов ОС так же уменьшает боль при экспериментах с кластером — все те пакеты и конфиги которые установелы в chroot окружении окажутся на ноде. Нет больше сюрпризов когда xCAT тихой сапой отказался ставить пакет или просто отвалился по неизвестной причине.
Более того, есть возможность сконфигурировать ноду и "сграбить" ее в образ. Поэтому установка драйверов или каких-нибудь экзотических пакетов которым обазяательно подавай RDMA девайсы при установке облегчается значительно.

Технические детали.

Если все еще интересно, дальше пройдусь по техническим деталям, утилитам и архитектуре.

luna — основная утилита конфигурации. У нее есть куча под-объектов. Опишу основные и, приблизительно в том порядке в котором нужно запускать что бы сконфигурировать кластер.

luna cluster — я решил отказаться от текстовых конфигов поэтому все что ожидается увидеть в конфигах конфигурируется тут: диапазоны портов, директория для хранения файлов, сеть для dhcp и т.п.

luna network — описание сетей. Сети назначаются на интерфейсы в группах, которые, в свою очередь, назначаются на ноды.

luna osimage — образ операционной системы. Описывает путь до дерева директорий. Включает версию и параметры ядра которое нужно грузить. Также хранит exclude-лист для "сграбливания" ноды.

luna group — описание групп нод. Как я уже говорил, ноды имеют мало индивидуальности, поэтому основная конфигурация происходит здесь. Создаются интерфейсы (например em2), назначается сеть, прописываются дополнительные параметры которые пойдут в ifcfg-em2 файл. Назначаются параметры BMC/IPMI. Также здесь есть 3 типа скриптов: pre-, part-, post-. Это обыкновенные bash-скрипты которые выполняются на разных этапах инсталляции.

Первый используется редко. По идее, здесь может быть описано что-то такое, что должно исполнятся до конфигурирования ноды. Это может быть, например, перезагрузка BMC или прошивка BIOS (однако, я настоятельно не рекомендую этого делать!).

part-script — от partitioning. Его назначение — конфигурировать диски (если есть) и монтировать их под /sysroot. Если дисков нет, то монтировать tmpfs. После того как все смонтировано, туда загрузится и развернется образ операционки.

post-script — прописать fstab, установить grub и все такое. На этом этапе мы можем chroot-нуться в /sysroot и сделать что нам надо уже не в dracut-огружении, а, практически, в полнофункциональной OC.

Да, забыл упомянуть, что dracut модуль поднимает сетевые интерфейсы и ssh демон, поэтому его вполне можно использовать как rescue-окружение. Доступно большинство бинарников и утилит: awk, sed, parted, и т.п. Более того есть режим service когда нода не пытается загружать образ, а остается в dracut.

Последний объект я хотел бы упомянуть, это luna node. Здесь конфигурируются индивидуальные параметры ноды: имя, ip-адреса, mac-адрес, switch и порт в которые нода подключена.

Про mac-адрес стоит сказать поподробнее. Фактически это центральный идентификатор ноды. Но вбивать вручную 6 октетов для тысячи нод очень грустно. Поэтому есть 2 других режима назначения. Один — когда админ может выбрать имя ноды из списка при загрузке. Luna использует iPXE поэтому есть возможность писать довольно продвинутые меню. Второй метод — назначить switch и порт для ноды. То есть, например, любая нода подключенная в первый порт первого свича будет именована как node001 а ее mac-адрес запишется в базу. Кстати, в качестве базы используется MongoDB.

Помимо luna, есть еще несколько исполняемых файлов:
lweb — это веб-сервис который собсвенно и раздает задания (bash-скрипты) и boot-меню. Они посылаются на исполнение на нодах.
ltorrent — торрент-"сервер" для раздачи образов.
lpower — обертка над ipmitool для быстрой перезагрузки/включения/выключениян нод. Берет логины и пароли из базы luna.
lchroot — обертка над chroot. Позволяется быстро "провалится" в chroot оружение ОС-образа. Кроме того, умеет подделывать uname -r :)

[root@master ~]# uname -r
3.10.0-327.36.1.el7.x86_64
[root@master ~]# lchroot compute
IMAGE PATH: /opt/luna/os/compute
chroot [root@compute /]$ uname -r
4.8.10-1.el7.elrepo.x86_64

Уфф… Пожалуй на этом все. Могу сказать что запланировано дальше.

  • Производительность. На данный мемент работа с базой происходит далеко не самым эффеективным образом. Это не сказыватеся на загрузке нод, но сказывается на CLI. Поэтому тут есть над чем поработать.
  • Мой коллега подготовил pull-request с поддержкой Ubuntu. Скорей всего добавим.
  • Изменить логику работы с интерфейсами. Они иногда странная и нервирует меня :)
  • Добавить больше тестов. Проект уже вышел из ясельного возраста, поэтому стоит применять лучшие прктики.
  • Думаем над ограничением BitTorrent траффика между свичами. Пока все работатет и так, но кто знает когда на нас упадет exascale :)

P.S. Почему luna? А потому.

Автор: PapaPadlo

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js