Всем привет. Представляю на суд общественности новую утилиту для высокоскоростного 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-меню. Они посылаются на исполнение на нодах. lweb включает в себя торрент-трекер. Весь траффик локализован внутри кластера — ничего не утекает наружу.
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? А потому.

Поделиться с друзьями
-->

Комментарии (24)


  1. igordata
    24.03.2017 08:08

    Аж слюни потекли.


    1. PapaPadlo
      24.03.2017 13:15

      Спасибо. Приму это как комплимент :)


  1. Meklon
    24.03.2017 08:51

    Обязательно пощупаю на виртуальных машинах. Насчет поддержки Debian/Ubuntu — очень актуально. Многие не используют RHEL и его производные.


    1. PapaPadlo
      24.03.2017 13:16

      Ну, в HPC практически монополия производных редхата. Centos и Scientfic Linux во все поля.


  1. acmnu
    24.03.2017 11:23
    +1

    Тоже надо будет попробовать. Действительно это актуальная проблема. В OpenStack при использовании Fuel тоже идет раворачивание с образа, но без торента.


    1. PapaPadlo
      24.03.2017 13:18

      Мне часто хочется плакать от опренстека и как там все сделано. :)
      Была идея впилить это все в опенстек и разворачивать qcow2 образ вместо тарбола, но это довольно накладно — запихать распаковщик в initrd образ.


    1. PapaPadlo
      24.03.2017 13:36

      Если я правильно понял. Fuel разливает образы а потом накатывает паппетовые конфиги. Не сильно большой шаг вперед по сравнению с xCAT. В том место паппета — баш скрипты. Представим что нам надо поставить 100 нод. Каждая из них сначала стянет образ а потом будет долго и печально ставить все с помощью apt/yum. А если еще и перезагрузка для нового ядра требуется? А если драйвера поставить для нового ядра и еще одна перезагрузка?

      Luna сразу позволяет создать образ со всем необходимым на берегу и накатить на ноду. Приблизительно, как если бы разворачивали ноду из бекапа.


      1. acmnu
        24.03.2017 13:47
        +1

        Там проблема в вариативности. Есть 10 ролей для ноды, соответственно набор пакетов разный. Именно этот набор и ставится с помощью папет. А база раскатывается с образа.


        1. PapaPadlo
          24.03.2017 13:55

          Да, принято. Когда для каждой ноды свой набор пакетов — не очень логично держать 10 практически идентичных образов. Но в общем-то и луне никто не запрещает раскатать базу и сверху заполировать паппетом или анзиблем :)
          Причем за «базу» можно взять образ со всеми возможными пакетами — это не скажется на скорости установки, только на используемом месте. А паппет только включит нужные.


        1. smartlight
          24.03.2017 18:39

          Fuel генерит один образ(архив) и потом его раварачивает на ноде, а папет ставит недостающие пакеты, да и это большой минус что во Fuel`е не прикрутили торрент ибо PXE сервер слушает обычно на 1Г интерфейсе в админ сети и на бОльшом энве провижион(раскатка образа) нод занимает достаточное время.


  1. kay
    24.03.2017 11:45

    На мой bashizm похоже. Только я для тестирования OS в KVM это использую.https://github.com/kayrus/deploy-vm


    1. kay
      24.03.2017 11:47

      А для деплоя серверов пока только такой костыль с initramfs: https://github.com/kayrus/rescue-initramfs
      Есть такие хостинги, которые за переустановку OS берут бабло и не поддерживают некоторые дистрибутивы. Вот и приходится выкручиваться.


  1. IvanGur
    24.03.2017 12:59

    Есть вот такой замечательный проект


  1. iscsi
    24.03.2017 14:07

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

    https://github.com/xcat2/xcat-core/commit/471d9471716c0010612599487cd0814828652e7a
    >Идею с торрентом мне подкинул один из заказчиков из Швеции.


    1. PapaPadlo
      24.03.2017 14:14

      Что мешает использовать ansible для pre/post скриптов?

      Надо тащить питон в initrd. Тогда он будет не 50 мегабайт как сейчас а 300, как инсталлятор анаконды.

      https://github.com/xcat2/xcat-core/commit/471d9471716c0010612599487cd0814828652e7a

      Я видел этот коммит, но уже после того как начал копать в эту сторону.
      Но ребята из xcat почему-то не сказали где должен находится торрент-трекер и как его интегрировать. По сути они просто добавили еще один бинарь в initrd без интеграции с остальным xcat-ом. Точнее даже не добавили а «дали возможность добавить». Даже документации нет.


      1. iscsi
        24.03.2017 14:23

        Open Source.
        >Точнее даже не добавили а «дали возможность добавить». Даже документации нет.


        1. PapaPadlo
          24.03.2017 14:34

          Ну да. xCAT сам по себе не плох если у тебя один кластер и ты каждыйы день его видишь. Ты знаешь где какие скрипты у тебя лежат. Где что запускается и откуда вызывается. Но когда у тебя новый кластер каждый месяц и еще порядка 50 на поддержке это превращается в ад. Тут и там какие-то грязные хаки, недетерминированность и код на баше, перле, питоне и авке, причем в одном файле. Это все инсталлируется разными инженерами с разным уровнем опыта и видением «как правильно». Даже когда ты заглядываешь в свой код годовой давности хочется делать рука-лицо, а тут еще и умножается.


  1. DarkTiger
    25.03.2017 12:42

    «Во-вторых, заказчик может позволить включать ноды только когда для них есть работа»

    Богатые у Вас заказчики, видимо. Обычно при включении-выключении выходит из строя некоторый процент нод, потому стараются питанием не баловаться без совсем уж крайней необходимости. Даже в S3.
    То же самое с дисками — Яндекс на Хабре давал оценку в 10-15% выхода дисков из строя при сбое питания, хотя, конечно, разум с трудом принимает эту цифру


    1. PapaPadlo
      25.03.2017 16:09

      Ну я лично тоже не сильно в восторге от идеи включения/выключения нод. Но во-первых на больших кластерах бывает так что вот прямо в конкретный момент не нужны все ноды и дешевле держать ЗИП, чем жечь электричество, а во-вторых дисков там часто просто нет — рамдиск. Спасибо образу операционки — не надо ничего ставить дополнительно, развернул и в бой. Ну и в-третьих, кто я такой, что бы указывать заказчику, что ему делать с его железом :)


      1. PapaPadlo
        25.03.2017 16:29

        что ему делать с его железом

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


        1. smartlight
          25.03.2017 18:55

          Ну да, а тебе надо деплоить сегодня, а не ждать когда доставят/смонтируют/скомутируют


          1. PapaPadlo
            25.03.2017 22:01

            Я говорю об HPC. Если речь идет о выключениях то это обычно кластер от 100 нод. Обычно — около 500 Выход из строя пары-тройки год вообще не проблема. Ну уменьшит пользователь количество MPI ранков — ничего страшного. Применительно к более приземления вещам это могут быть, я не знаю, аппликейшн-сервера в новогодний период. Если у тебя их сотни, при выходе одного из строя на оставшиеся возрастет нагрузка. Но, честно говоря, в этих ваших деплоях вообще не специалист. Но очевидно, что если пара серверов — это проблема, не стоит использовать эту фичу :)


  1. acmnu
    27.03.2017 11:45

    Всегда хотел поработать с HPC. Работа с чистой математикой как-то повышает самооценку. А кто заказщики? Банки? Можно, так сказать, обзор примерный обзор рынка?


    1. PapaPadlo
      27.03.2017 12:23

      Могу сказать, что с моей стороны математики не сильно много. Я занимаюсь системными вещами и иногда перфомансом. «Выше» по стеку находится MPI (тоже моя тема часто, как минимум знать как запускать) и математические библиотеки: BLAS, MLK. Еще выше сидит уже софт заказчиков — здесь и начинается матан. Это уже их сфера ответственности. Заказчики, как правило, универы. Чистая наука: физика, биомед, геофизика, погода. Они разрабатывают алгоритмы и гоняют на этих кластерах.