Ahoj!
Volám sa Sergey, pracujem ako inžinier infraštruktúry v tíme API platformy tinkoff.ru.
V tomto článku budem hovoriť o problémoch, ktorým náš tím čelil pri príprave vyvažovačov Nginx pre rôzne projekty. Poviem vám tiež o nástroji, ktorý mi umožnil prekonať väčšinu z nich.
Nginx je multifunkčný a aktívne sa rozvíjajúci proxy server. Obsahuje veľké množstvo modulov, toto nie je úplný zoznam. Každý projekt kladie určité požiadavky na funkčnosť balancera a verziu Nginx (napríklad prítomnosť http/2 a grpc proxying) a zloženie jeho modulov.
Radi by sme videli čerstvú verziu s požadovanou sadou modulov, ktorá beží pod špecifickou distribúciou Linuxu. V našom prípade ide o systémy založené na deb- a rpm. Možnosť s kontajnermi sa v tomto článku nezohľadňuje.
Chceme rýchlo zmeniť funkčnosť našich balancerov. A tu sa hneď vynára otázka: ako to dosiahnuť pri vynaložení čo najmenej zdrojov? Ešte lepšie by bolo nastaviť proces tak, aby sme mohli zadať konečný počet vstupných parametrov a na výstupe dostať artefakt v podobe balíka deb/rpm pre požadovaný OS.
V dôsledku toho je možné formulovať množstvo problémov:
Nie vždy existujú balíčky s najnovšou verziou Nginx.
Neexistujú žiadne balíčky s požadovanými modulmi.
Manuálne zostavenie a zostavenie balíka je časovo náročné a úplne únavné.
Neexistuje žiadny popis, ako sa zostavuje tá alebo tá inštancia Nginx.
Na vyriešenie týchto problémov vzniká určitý nástroj, ktorý by zobral ako vstup špecifikáciu v ľudsky čitateľnom formáte a na jej základe zostavil balík Nginx s potrebnou funkcionalitou.
Keďže sme pre rozľahlosť Githubu nenašli vhodnú možnosť, rozhodli sme sa vytvoriť vlastný nástroj - nginx-builder.
Špecifikácie
V našom nástroji sme chceli vytvoriť popis špecifikácie vo forme kódu, ktorý je možné následne vložiť do úložiska Git. Na tento účel sme zvolili formát známy pre takéto veci - yaml. Príklad špecifikácie:
Tu uvádzame, že chceme vidieť deb balík s Nginx verzie 1.14.2 s požadovanou sadou modulov. Časť s modulmi je voliteľná. Pre každý z nich môžete nastaviť:
Názov.
Adresa, kde ho môžete získať:
Úložisko Git. Môžete tiež určiť vetvu alebo značku.
Webový odkaz na archív.
Miestny odkaz na archív.
Niektoré moduly vyžadujú inštaláciu ďalších závislostí, napríklad nginx-auth-ldap vyžaduje nainštalovaný libldap2-dev. Pri popise modulu je možné špecifikovať aj potrebné závislosti.
okolia
V našom nástroji môžete rýchlo získať prostredie s nainštalovanými pomôckami na kompiláciu, zostavovanie balíkov a ďalší pomocný softvér. Ideálny je tu kontajner Docker so všetkým, čo potrebujete (úložisko už má niekoľko príkladov súborov Docker pre ubuntu a centos).
Po vypracovaní špecifikácie a príprave prostredia spustíme náš builder, ktorý predtým nainštaloval jeho závislosti:
Číslo revízie je tu voliteľné a používa sa na zostavovanie verzií. Zapisuje sa do meta informácií balíka, čo uľahčuje aktualizáciu na serveroch.
Z denníkov môžete sledovať, čo sa deje. Tu je príklad hlavných bodov:
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'.
Takže pomocou niekoľkých príkazov vytvoríme prostredie a požadovanú zostavu Nginx a balík sa objaví v adresári, odkiaľ sa skript spúšťa.
Vkladanie
Náš nástroj môžeme tiež integrovať do procesov CI/CD. Pomôcť s tým môže napríklad ktorýkoľvek z mnohých systémov CI, ktoré dnes existujú Teamcity alebo Gitlab CI.
Výsledkom je, že pri každej zmene špecifikácie v úložisku Git sa automaticky spustí zostavenie artefaktu. Číslo revízie je prepojené s počítadlom spustenia zostavy.
S trochou viac času môžete nakonfigurovať, aby bol artefakt odoslaný do vášho lokálneho úložiska balíkov, Nexus, Artifactory atď.
Ďalšou výhodou je, že konfiguračný súbor yaml je možné pripojiť k Ansible alebo inému automatickému konfiguračnému systému a odtiaľ môžeme prevziať číslo verzie a typ balíka, ktorý chceme nasadiť.
čo ďalej
Projekt ešte nie je ukončený. Tu je to, na čom teraz pracujeme:
Rozširujeme možnosť konfigurácie, no zároveň ju zachovávame čo najjednoduchšiu. Nechcete definovať tisíc parametrov, ak potrebujete iba dva a zvyšok sa štandardne hodí. To zahŕňa príznaky kompilácie (teraz ich môžete zmeniť v internom konfiguračnom súbore src/config.py), cestu inštalácie a spúšťacieho používateľa.
Pridávame možnosti automatického odosielania balíka do rôznych úložísk artefaktov.