Ahoj!
Jmenuji se Sergej, pracuji jako infrastrukturální inženýr v týmu API platformy tinkoff.ru.
V tomto článku se podělím o problémy, se kterými se náš tým potýkal při přípravě balancerů na základě pro různé projekty. Také představím nástroj, který nám umožnil překonat většinu z nich.
Nginx je multifunkční a aktivně se rozvíjející proxy server. Vyznačuje se velkým množstvím modulů, . Každý projekt klade určité požadavky na funkčnost balanceru a verzi Nginx (například přítomnost http/2 a proxying grpc) a na soubor jeho modulů.
Chceme vidět aktuální verzi s potřebným souborem modulů, která funguje pod určitým distribucí Linuxu. V našem případě jde o systémy založené na deb a rpm. Varianta s kontejnery v tomto článku nebude zvažována.
Chceme rychle měnit funkčnost našich balancerů. A hned nastává otázka — jak toho dosáhnout s co nejmenšími náklady? Ještě by bylo lepší nastavit proces tak, abychom mohli stanovit konečný počet vstupních parametrů a na výstupu získat artefakt ve formě deb/rpm balíčku pro potřebný operační systém.
Nakonec můžeme formulovat řadu problémů:
- Ne vždy jsou k dispozici balíčky s aktuální verzí Nginx.
- Nejsou k dispozici balíčky s potřebnými moduly.
- Ruční kompilace a sestavení balíčku trvá mnoho času a je zkrátka únavné.
- Není popsáno, jak je konstruován ten či onen instance Nginx.
Abychom tyto problémy vyřešili, je potřeba vytvořit určitý nástroj, který by jako vstup přijímal specifikaci ve čitelné podobě a sestavoval balíček Nginx s požadovanou funkčností.
Nenašli jsme pro nás vhodné řešení v hlubinách Gitu, a tak jsme se rozhodli vytvořit svůj nástroj — .
Specifikace
V našem nástroji jsme chtěli vytvářet popis specifikace ve formě kódu, který by bylo možné uložit do Git repozitáře. K tomu jsme zvolili obvyklý formát pro podobné účely — yaml. Příklad specifikace:
nginx_version: 1.14.1
output_package: deb
modules:
- module:
name: nginx-auth-ldap
git_url: https://github.com/kvspb/nginx-auth-ldap.git
git_branch: master
dependencies:
- libldap2-dev
- module:
name: ngx_http_substitutions_filter_module
git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
- module:
name: headers-more-nginx-module
web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip
- module:
name: nginx-module-vts
git_url: https://github.com/vozlt/nginx-module-vts.git
git_tag: v0.1.18
- module:
name: ngx_devel_kit
git_url: https://github.com/simplresty/ngx_devel_kit.git
git_tag: v0.3.0
- module:
name: ngx_cache_purge
git_url: https://github.com/FRiCKLE/ngx_cache_purge.git
- module:
name: ngx_http_dyups_module
git_url: https://github.com/yzprofile/ngx_http_dyups_module.git
- module:
name: nginx-brotli
git_url: https://github.com/eustas/ngx_brotli.git
git_tag: v0.1.2
- module:
name: nginx_upstream_check_module
git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git
- module:
name: njs
git_url: https://github.com/nginx/njs.git
git_tag: 0.2.5
config_folder_path: nginx
Zde uvádíme, že chceme vidět deb balíček s verzí Nginx 1.14.2 s potřebnou sadou modulů. Sekce moduly je volitelná. Pro každý z nich můžeme stanovit:
- Název.
- Adresa, kde je k dispozici:
- Git repozitář. Je také možné uvést větev nebo tag.
- Webový odkaz na archiv.
- Místní odkaz na archiv.
Některé moduly vyžadují instalaci dalších závislostí, například pro nginx-auth-ldap je potřeba nainstalovaný libldap2-dev. Požadované závislosti lze také uvést při popisu modulu.
Prostředí
V našem nástroji můžeme rychle získat prostředí s nainstalovanými nástroji pro kompilaci, stavbu balíčku a další pomocný software. Sem perfektně zapadá docker kontejner se vším potřebným (v repozitáři již je několik příkladů docker souborů pro ubuntu a centos).
Jakmile je specifikace sestavena a prostředí připraveno, spustíme náš builder poté, co nainstalujeme jeho závislosti:
pip3 install -r requirements.txt
./main.py build -f [konfig_file].yaml -r [revize]
Číslo revize je zde volitelné a slouží k verzionování sestavení. Je zaznamenáno v metainformacích balíčku, což usnadňuje jeho aktualizaci na serverech.
Podle logů můžeme sledovat, co se děje. Zde je příklad hlavních bodů:
builder - INFO - Zpracování yaml souboru: example.config.yaml
builder - INFO - Stahování skriptů pro vytvoření deb balíčku
builder - INFO - Stahování nginx src...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Stahování 3d-party modulů...
builder - INFO - Modul nginx-auth-ldap se stáhne podle větve
builder - INFO - -- Hotovo: nginx-auth-ldap
builder - INFO - -- Hotovo: ngx_http_substitutions_filter_module
builder - INFO - Modul headers-more-nginx-module se stáhne
builder - INFO - Modul nginx-module-vts se stáhne podle štítku
builder - INFO - -- Hotovo: nginx-module-vts
builder - INFO - Modul ngx_devel_kit se stáhne podle štítku
builder - INFO - -- Hotovo: ngx_devel_kit
builder - INFO - -- Hotovo: ngx_cache_purge
builder - INFO - -- Hotovo: ngx_http_dyups_module
builder - INFO - Stahování závislostí
builder - INFO - Vytváření .deb balíčku
builder - INFO - Spuštění 'dh_make'...
builder - INFO - Spuštění 'dpkg-buildpackage'...
dpkg-deb: vytváření balíčku 'nginx' v '..../nginx_1.14.1-1_amd64.deb'.
Tak snadno několika příkazy vytvoříme prostředí a požadovanou sestavu Nginx, a balíček se objeví v adresáři, odkud byl skript spuštěn.
Vkládání
Také můžeme náš nástroj integrovat do CI/CD procesů. V tom může pomoci jakýkoli z mnoha současných CI systémů, například nebo .
Jako výsledek se při každé změně specifikace v Git repozitáři automaticky spustí sestavení artefaktu. Číslo revize se váže na čítač spuštění buildu.
Pokud věnujeme ještě trochu času, můžeme nastavit odesílání artefaktu do místního repozitáře balíčků, Nexus, Artifactory a tak dále.
Dalším plusem je, že konfigurační yaml soubor lze připojit v Ansible nebo jiném systému automatického konfigurace a brát odtud číslo verze a typu balíčku, který chceme nasadit.
Co dál
Projekt ještě není dokončen. Na čem nyní pracujeme:
- Rozšiřujeme možnosti konfigurace, ale zároveň ji udržujeme co nejjednodušší. Nechceme definovat tisíc parametrů, pokud potřebujeme jen dva, a ostatní jsou vhodná podle výchozího nastavení. To se týká kompilátorových příznaků (v současnosti je lze měnit v interním konfiguračním souboru src/config.py), cest instalace, uživatele pro spuštění.
- Přidáváme možnosti automatického odesílání balíčku do různých úložišť artefaktů.
- Provádění uživatelského příkazu při načítání modulu (například pro použití je třeba nejprve aplikovat opravu určité verze)
- Přidáváme testování:
- Balíček se správně instaluje.
- Nginx má požadovanou verzi a byl sestaven s požadovanými příznaky a moduly.
- Vytvářejí se potřebné cesty, uživatelské účty a tak dále.
Ale můžete tento nástroj používat již nyní a také navrhovat vylepšení — Vítejte!
Zdroj: habr.com
