Прывітанне!
Мяне клічуць Сяргей, я працую інфраструктурным інжынерам у камандзе API платформы tinkoff.ru.
У гэтым артыкуле я раскажу аб праблемах, з якімі сутыкалася наша каманда пры падрыхтоўцы балансавальнікаў на аснове. Nginx для розных праектаў. Таксама раскажу пра інструмент, які дазволіў пераадолець большую частку з іх.
Nginx - гэта шматфункцыянальны і актыўна развіваецца проксі-сервер. Ён адрозніваецца вялікай колькасцю модуляў, вось далёка не поўны спіс. Кожны праект накладае пэўныя патрабаванні да функцыяналу балансавальніка і версіі Nginx (напрыклад наяўнасць http/2 і праксіраванне grpc), і складу яго модуляў.
Нам жадаецца бачыць свежую версію з патрэбным наборам модуляў, якая працуе пад вызначаным дыстрыбутывам Linux. У нашым выпадку гэта deb-і rpm-based сістэмы. Варыянт з кантэйнерамі ў дадзеным артыкуле не разглядаецца.
Нам хочацца аператыўна змяняць функцыянал нашых балансіроўшчыкаў. І тут адразу паўстае пытанне — як гэтага дабіцца, затраціўшы як мага менш рэсурсаў? А яшчэ б лепш наладзіць працэс так, каб мы маглі задаць канчатковы лік уваходных параметраў, а на вынахадзе атрымаць артэфакт у выглядзе deb/rpm пакета для патрэбнай АС.
У выніку можна сфармуляваць шэраг праблем:
Не заўсёды ёсць пакеты са свежай версіяй Nginx.
Няма пакетаў з патрэбнымі модулямі.
Кампіляцыя і зборка пакета ўручную займае шмат часу і папросту стомная.
Няма апісання, як сабраны той ці іншы інстанс Nginx.
Каб вырашыць гэтыя праблемы, напрошваецца нейкая прылада, які прымаў бы на ўваход спецыфікацыю ў чалавекачытаемым фармаце і збіраў па ёй пакет Nginx з патрэбным функцыяналам.
Не знайшоўшы прыдатнага для нас варыянту на прасторах гітхаба, мы вырашылі стварыць свой інструмент. nginx-builder.
Спецыфікацыі
У нашай прыладзе мы жадалі ствараць апісанне спецыфікацыі ў выглядзе кода, які затым можна пакласці ў Git-рэпазітар. Для гэтага абралі звыклы для падобных рэчаў фармат - yaml. Прыклад спецыфікацыі:
Тут мы паказваем, што жадаем бачыць deb-пакет з версіяй Nginx 1.14.2 з патрэбным наборам модуляў. Секцыя з модулямі - апцыянальная. Для кожнага з іх можна задаць:
Назва.
Адрас, дзе яго можна атрымаць:
Git-рэпазітар. Таксама можна паказаць галінку ці тэг.
Вэб-спасылка на архіў.
Лакальная спасылка на архіў.
Некаторыя модулі патрабуюць усталёўкі дадатковых залежнасцяў, напрыклад для nginx-auth-ldap патрэбен усталяваны libldap2-dev. Неабходныя залежнасці таксама можна пазначыць пры апісанні модуля.
атачэнне
У нашай прыладзе можна хутка атрымліваць асяроддзе з усталяванымі ўтылітамі для кампіляцыі, зборкі пакета і іншым дапаможным ПА. Тут як нельга лепш падыходзіць docker-кантэйнер са ўсім неабходным (у рэпазітары ўжо ёсць пары прыкладаў docker-файлаў для ubuntu і centos).
Пасля таго, як спецыфікацыя складзена і падрыхтавана асяроддзе, мы запускаем наш зборшчык, папярэдне ўсталяваўшы яго залежнасці:
Нумар рэвізіі тут апцыянальны і служыць для версіявання зборак. Ён запісваецца ў метаінфармацыю пакета, што дазваляе лёгка абнаўляць яго на сэрверах.
Па логах можна назіраць за тым, што адбываецца. Вось прыклад асноўных момантаў:
builder - INFO - Parse yaml file: example.config.yaml
builder - INFO - Download scripts for build deb package
builder - INFO - Downloading nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Downloading 3d-party modules...
builder - INFO - Module nginx-auth-ldap will download by branch
builder - INFO - -- Done: nginx-auth-ldap
builder - INFO - -- Done: ngx_http_substitutions_filter_module
builder - INFO - Module headers-more-nginx-module will downloading
builder - INFO - Module nginx-module-vts will download by tag
builder - INFO - -- Done: nginx-module-vts
builder - INFO - Module ngx_devel_kit will download by tag
builder - INFO - -- Done: ngx_devel_kit
builder - INFO - -- Done: ngx_cache_purge
builder - INFO - -- Done: ngx_http_dyups_module
builder - INFO - Downloading dependencies
builder - INFO - Building .deb package
builder - INFO - Running 'dh_make'...
builder - INFO - Running 'dpkg-buildpackage'...
dpkg-deb: building package 'nginx' in '../nginx_1.14.1-1_amd64.deb'.
Так літаральна парай каманд мы ствараем асяроддзе і патрэбную зборку Nginx, і пакет з'яўляецца ў дырэкторыі, адкуль запушчаны скрыпт.
Убудаванне
Таксама мы можам убудаваць наш інструмент у CI/CD працэсы. У гэтым можа дапамагчы любая з мноства існуючых на сённяшні дзень CI-сістэм, напрыклад Teamcity або Gitlab CI.
У выніку пры кожнай змене спецыфікацыі ў Git-рэпазітары аўтаматычна запускаецца зборка артэфакта. Нумар рэвізіі прывязваецца да лічыльніка запускаў білда.
Выдаткаваўшы яшчэ трохі чакай, можна наладзіць адпраўку артэфакта ў лакальны рэпазітар пакетаў, Nexus, Artifactory і гэтак далей.
Дадатковым плюсам з'яўляецца тое, што канфігурацыйны yaml-файл можна падлучыць у Ansible ці іншую сістэму аўтаматычнага канфігуравання, і браць адтуль нумар версіі і тыпу пакета, якія мы жадаем задэплоіць.
Што далей
Праект яшчэ не завершаны. Вось над чым мы працуем зараз:
Пашыраем магчымасць канфігуравання, але пры гэтым захоўваем яе максімальна просты. Не жадаецца вызначаць тысячу параметраў, калі трэба ўсяго два, а астатняе падыходзіць па змаўчанні. Да гэтага ставяцца сцягі кампіляцыі (цяпер змяніць іх можна ва ўнутраным файле канфігурацыі src/config.py), шляхі ўсталёўкі, карыстача для запуску.
Дадаем варыянты аўтаматычнай адпраўкі пакета ў розныя сховішчы артэфактаў.