Ahoj!
Jmenuji se Sergey a pracuji jako infrastrukturní inženýr v týmu API platformy tinkoff.ru.
V tomto článku budu hovořit o problémech, kterým náš tým čelil při přípravě balancérů na základě Nginx pro různé projekty. Řeknu vám také o nástroji, který mi umožnil překonat většinu z nich.
Nginx je multifunkční a aktivně se vyvíjející proxy server. Disponuje velkým množstvím modulů, toto není úplný seznam. Každý projekt klade určité požadavky na funkčnost balanceru a verzi Nginx (například přítomnost http/2 a grpc proxying) a složení jeho modulů.
Rádi bychom viděli čerstvou verzi s požadovanou sadou modulů, běžící pod konkrétní linuxovou distribucí. V našem případě se jedná o systémy založené na deb- a rpm. Možnost s kontejnery není v tomto článku zvažována.
Chceme rychle změnit funkčnost našich balancerů. A zde se hned nabízí otázka: jak toho dosáhnout při vynaložení co nejméně prostředků? Ještě lepší by bylo nastavit proces tak, abychom mohli specifikovat konečný počet vstupních parametrů a na výstupu dostali artefakt v podobě deb/rpm balíčku pro požadovaný OS.
V důsledku toho lze formulovat řadu problémů:
Ne vždy existují balíčky s nejnovější verzí Nginx.
Neexistují žádné balíčky s požadovanými moduly.
Ruční kompilace a sestavení balíčku je časově náročné a vyloženě únavné.
Neexistuje žádný popis toho, jak se ta či ona instance Nginx sestavuje.
K vyřešení těchto problémů vyvstává potřeba nástroje, který by vzal jako vstup specifikaci ve formátu čitelném pro člověka a na jejím základě sestavil balíček Nginx s potřebnou funkčností.
Protože jsme pro rozlehlost Githubu nenašli vhodnou volbu, rozhodli jsme se vytvořit vlastní nástroj - nginx-builder.
Specifikace
V našem nástroji jsme chtěli vytvořit popis specifikace ve formě kódu, který lze následně vložit do úložiště Git. K tomu jsme zvolili formát známý pro takové věci – yaml. Příklad specifikace:
Zde uvádíme, že chceme vidět deb balíček s Nginx verze 1.14.2 s požadovanou sadou modulů. Sekce s moduly je volitelná. Pro každý z nich můžete nastavit:
Jméno.
Adresa, kde to můžete získat:
Git úložiště. Můžete také zadat větev nebo značku.
Webový odkaz na archiv.
Místní odkaz na archiv.
Některé moduly vyžadují instalaci dalších závislostí, například nginx-auth-ldap vyžaduje instalaci libldap2-dev. Potřebné závislosti lze také specifikovat při popisu modulu.
Prostředí
V našem nástroji můžete rychle získat prostředí s nainstalovanými utilitami pro kompilaci, sestavování balíčků a další pomocný software. Ideální je zde kontejner Docker se vším, co potřebujete (úložiště již má pár příkladů souborů Docker pro ubuntu a centos).
Po sestavení specifikace a připraveném prostředí spustíme náš builder, který předtím nainstaloval jeho závislosti:
Číslo revize zde je volitelné a používá se pro verzování sestavení. Zapisuje se do metainformací balíčku, což usnadňuje aktualizaci na serverech.
Z logů můžete sledovat, co se děje. Zde je příklad hlavních bodů:
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 pomocí několika příkazů vytvoříme prostředí a požadované sestavení Nginx a balíček se objeví v adresáři, odkud se skript spouští.
Vkládání
Náš nástroj můžeme také integrovat do procesů CI/CD. S tím může pomoci například kterýkoli z mnoha systémů CI, které dnes existují Týmové město nebo Gitlab CI.
Výsledkem je, že při každé změně specifikace v úložišti Git se automaticky spustí sestavení artefaktu. Číslo revize je spojeno s počítadlem spuštění sestavení.
S trochou více času můžete nakonfigurovat, aby byl artefakt odeslán do vašeho místního úložiště balíčků, zařízení Nexus, Artifactory atd.
Další výhodou je, že konfigurační soubor yaml lze připojit k Ansible nebo jinému automatickému konfiguračnímu systému a odtud můžeme vzít číslo verze a typ balíčku, který chceme nasadit.
Co je další
Projekt ještě není dokončen. Zde je to, na čem nyní pracujeme:
Rozšiřujeme možnost konfigurace, ale zároveň ji udržujeme co nejjednodušší. Nechcete definovat tisíc parametrů, pokud potřebujete pouze dva a zbytek se ve výchozím nastavení hodí. To zahrnuje příznaky kompilace (nyní je můžete změnit v interním konfiguračním souboru src/config.py), instalační cestu a spouštěcího uživatele.
Přidáváme možnosti pro automatické odeslání balíčku do různých úložišť artefaktů.