Создание ванильного посланника с помощью cmake

EnvoyCon и KubeCon в Сиэтле 2018

Мы использовали Lyft, чтобы добраться до KubeCon / EnvoyCon из аэропорта Сиэтла. Тесное сотрудничество с Envoy заставило нас подумать о Lyft, а не о других сервисах. Однако каждый раз, когда мы садимся в Lyft, мы спрашиваем водителя, почему он выбирает Lyft. И каждый раз за этим стоит интересная история / перспектива.

Конференция - одна из лучших, на которых мы присутствовали. Итак, можно спросить, что же делает конференцию такой замечательной? Для нас это были посетители. Мы обнаружили здоровое сочетание поставщиков, демонстрирующих решения, и реальных пользователей, использующих эту технологию.

Популярность и дорожная карта Envoy

Еще более захватывающим было то, насколько широкое признание получил Envoy. Что выделялось, так это то, что Envoy потребовалось всего два года, чтобы достичь такого уровня популярности. Это впечатляет по сравнению с другими прокси с открытым исходным кодом.

Envoy так успешен, потому что за ним стоит отличная команда. Это очень хорошо управляемый и очень хорошо скоординированный проект. Это также было очевидно из дорожной карты и нескольких инициатив, связанных с Envoy.

Тем, кто вкладывается в Envoy или хочет узнать больше, мы настоятельно рекомендуем посетить веб-сайт kubecon / envoycon / канал YouTube, чтобы прочувствовать конференцию.

Использование CMake для сборок Envoy

Хотя мы не презентовали YAStack на EnvoyCon, в разговорах о нем говорили. Также возникло желание использовать cmake для создания envoy. Есть люди, которые включают посланников в проекты, за которые они берутся. Они хотели использовать cmake с envoy по нескольким причинам:

  • В их существующей системе сборки использовался CMake
  • Библиотека, которую они пытались интегрировать с использованным CMake
  • Они были более знакомы с CMake и менее знакомы с bazel.

Адаптация системы сборки YAStack

YAStack использует CMake для сборки проекта. С точки зрения кода, YAStack сначала компилирует dpdk и f-stack. Затем он компилирует envoy и связывает его с библиотеками dpdk и f-stack.

YAStack использует CMake, и нам не составило труда внести изменения в эту систему сборки. Поскольку было несколько запросов на это, мы подумали о создании репозитория для сборки vanilla envoy с помощью cmake. Это поможет избежать дублирования усилий в сообществе.

Мы добавили проект envoy-cmake на github, который собирает обычный envoy с помощью cmake. Есть некоторые шероховатости (статический двоичный файл для envoy, сборочные контейнеры и т. Д.), Которые мы в конечном итоге исправим, но базовая сборка работает. Вот небольшое описание того, как работает сборка и различные компоненты.

Иерархия сборки CMake

Верхний уровень CMakeLists.txt находится в каталоге envoy. Он включает все подкаталоги, в которых также есть файл CMakeLists.txt.

Именование проектов для этих подкаталогов / подпроектов осуществляется автоматически. Это достигается с помощью файла CMakeSettings.txt. Каждый файл CMakeLists.txt в подпапках включает файл CMakeSettings.txt. Этот файл отвечает за название проекта. Он получает имя проекта, используя подкаталог, которому он принадлежит. Например, проект в разделе envoy / source / extensions называется envoy-source-extensions. Все пути включения поддерживаются в CMakeIncludes.txt и включены в каждый файл CMakeLists.txt.

Api (protos) - это первое, что компилируется. У прототипов файлов есть зависимости от ожидаемой структуры каталогов. Для этого мы сначала создаем каталоги и копируем зависимые прото-файлы из разных мест. Каталоги и файлы proto настраиваются и копируются в каталог build / protos.

Генерация файлов производится с помощью скрипта envoy / scripts / generate_pb.py. Он принимает прото-файлы в качестве входных данных из каталога build / protos и выводит сгенерированные файлы в каталог build / include. Затем эти сгенерированные файлы компилируются в библиотеку. CMakeLists.txt в envoy / api обеспечивает это.

После сборки библиотеки protos / api внешние зависимости (в разделе envoy / external) компилируются. Далее идет исходный код envoy (в разделе envoy / source). А потом тесты (посланник / тест). Компиляция теста вызывает другую иерархию файлов CMake для компиляции компонентов теста.

Улучшения

В настоящее время мы планируем следующие улучшения (в произвольном порядке).

  • Используйте встроенную поддержку cmake для protobuf
  • Улучшение отслеживания зависимостей между проектами
  • Создать статический двоичный файл для envoy-source-exe
  • Создание образов контейнеров
  • Используя файл repositories.bzl для подсказки, загрузите определенную версию предварительно созданных файлов tar / archive для зависимой библиотеки (в разделе envoy / external). Прямо сейчас все они компилируются.
  • Начните использовать предварительно скомпилированные библиотеки, чтобы сократить время сборки.
  • Используйте подмодули git для получения и обновления зависимостей

Исправление проблем

  • Процесс сборки предполагает наличие компилятора протокола. Чтобы использовать совместимую версию, соберите / установите ее в envoy / external / protobuf-3.5.0
  • В процессе сборки также предполагается, что установлен двоичный файл protoc-gen-validate. Мы проверили сборку с помощью двоичного файла protoc-gen-validate, созданного из источника, помеченного тегом v0.0.6.
  • Если сборка зависает при компиляции external / nghttp2–1.30.0, используйте ./configure - enable-lib-only для сборки только библиотек для nghttp2.

Заключение

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

Если вы можете придумать конкретное улучшение, которое могло бы помочь, или хотите, чтобы мы поставили улучшение перед другими, свяжитесь с нами, используя форму контакт на yastack.io. Или напишите нам и поздоровайтесь, нам нравится получать отзывы от сообщества.