Helló!
A nevem Szergej, infrastruktúra mérnökként dolgozom a tinkoff.ru API platforma csapatában.
Ebben a cikkben arról fogok beszélni, hogy milyen problémákkal szembesült a csapatunk a különböző projektekhez készült load balancerek előkészítése során. Emellett bemutatok egy eszközt, amely lehetővé tette, hogy a legtöbb problémát leküzdjük.
Az Nginx egy sokoldalú és folyamatosan fejlődő proxy szerver. Nagy számú modullal rendelkezik, . Minden projekt bizonyos követelményeket támaszt a load balancer funkcionalitásával és az Nginx verziójával (például http/2 meglétével és grpc proxyzással) valamint a modulok együttesével kapcsolatban.
Szeretnénk, ha a friss verzió a szükséges modulokkal működne egy bizonyos Linux disztribútor alatt. Az esetünkben ez deb- és rpm-alapú rendszerek. A konténeres megoldás nem kerül szóba ebben a cikkben.
Fontos számunkra, hogy gyorsan változtathassuk a load balancereink funkcionalitását. Itt azonnal felmerül a kérdés — hogyan érhetjük el mindezt, hogy a lehető legkevesebb erőforrást használjuk? Jobb lenne, ha a folyamatot úgy tudnánk kialakítani, hogy megadhassunk egy végső számú bemeneti paramétert, és a kimenetként egy deb/rpm csomagot kapjunk a kívánt operációs rendszerhez.
Végül egy sor problémát megfogalmazhatunk:
- Nem mindig állnak rendelkezésre friss Nginx verziójú csomagok.
- Nincs elérhető csomag a szükséges modulokkal.
- A kézi fordítás és csomagépítés sok időt igényel, és egyszerűen kimerítő.
- Nincs leírás arról, hogyan készült az adott Nginx példány.
Ezeknek a problémáknak a megoldására szükség van egy eszközre, amely emberi olvasásra alkalmas formátumban várná a specifikációt, és az alapján összeszerelné a szükséges funkcionalitással rendelkező Nginx csomagot.
Miután nem találtunk megfelelő megoldást a GitHubon, úgy döntöttünk, hogy létrehozunk saját eszközünket — .
Specifikációk
Eszközünkben a specifikációkat kód formájában szeretnénk létrehozni, amelyet aztán Git-tárolóba helyezhetünk. Ehhez a hasonló esetekhez szokásos yaml formátumot választottuk. A specifikáció példája:
nginx_verzió: 1.14.1
kimeneti_csomag: deb
modulok:
- modul:
név: nginx-auth-ldap
git_url: https://github.com/kvspb/nginx-auth-ldap.git
git_branch: master
függőségek:
- libldap2-dev
- modul:
név: ngx_http_substitutions_filter_module
git_url: https://github.com/yaoweibin/ngx_http_substitutions_filter_module.git
- modul:
név: headers-more-nginx-module
web_url: https://github.com/openresty/headers-more-nginx-module/archive/v0.261.zip
- modul:
név: nginx-module-vts
git_url: https://github.com/vozlt/nginx-module-vts.git
git_tag: v0.1.18
- modul:
név: ngx_devel_kit
git_url: https://github.com/simplresty/ngx_devel_kit.git
git_tag: v0.3.0
- modul:
név: ngx_cache_purge
git_url: https://github.com/FRiCKLE/ngx_cache_purge.git
- modul:
név: ngx_http_dyups_module
git_url: https://github.com/yzprofile/ngx_http_dyups_module.git
- modul:
név: nginx-brotli
git_url: https://github.com/eustas/ngx_brotli.git
git_tag: v0.1.2
- modul:
név: nginx_upstream_check_module
git_url: https://github.com/yaoweibin/nginx_upstream_check_module.git
- modul:
név: njs
git_url: https://github.com/nginx/njs.git
git_tag: 0.2.5
config_folder_path: nginx
Itt megadjuk, hogy deb csomagot szeretnénk látni az Nginx 1.14.2 verziójával a megfelelő modulok készletével. A modulok szekciója opcionális. Mindegyikhez megadható:
- Név.
- Cím, ahonnan megszerezhető:
- Git-repozitórium. Meg lehet adni ágat vagy taget is.
- Weblink az archívumhoz.
- Helyi hivatkozás az archívumhoz.
Néhány modul további függőségek telepítését igényli, például az nginx-auth-ldap számára szükséges a telepített libldap2-dev. A szükséges függőségek szintén megadhatók a modul leírásában.
Környezet
Eszközünk segítségével gyorsan létrehozható a környezet a szükséges fordítóeszközökkel, csomaggyártási és egyéb segédprogramokkal. Ehhez a legjobban a docker-konténer illik, amely minden szükséges tartalommal rendelkezik (a repozitóriumban már található néhány példa docker fájl az ubuntu és centos számára).
Miután a specifikáció elkészült és a környezet előkészítve, elindítjuk a buildert, miután telepítettük a függőségeit:
pip3 install -r requirements.txt
./main.py build -f [konfig_fájl].yaml -r [revízió_száma]
A revíziószám itt opcionális, és a build verziózására szolgál. Ez bejegyzésre kerül a csomag meta-információiban, ami lehetővé teszi a könnyű frissítést a szervereken.
A naplók alapján figyelemmel kísérhető, ami történik. Itt van néhány alapvető elem példaként:
builder - INFO - Yaml fájl elemzése: example.config.yaml
builder - INFO - Script-ek letöltése a deb csomag létrehozásához
builder - INFO - NGINX forrás letöltése...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - 3d-s modulok letöltése...
builder - INFO - Az nginx-auth-ldap modul ágat letölt
builder - INFO - -- Kész: nginx-auth-ldap
builder - INFO - -- Kész: ngx_http_substitutions_filter_module
builder - INFO - A headers-more-nginx-module modul letöltése folyamatban
builder - INFO - Az nginx-module-vts modul címke alapján töltődik le
builder - INFO - -- Kész: nginx-module-vts
builder - INFO - Az ngx_devel_kit címke alapján töltődik le
builder - INFO - -- Kész: ngx_devel_kit
builder - INFO - -- Kész: ngx_cache_purge
builder - INFO - -- Kész: ngx_http_dyups_module
builder - INFO - Függőségek letöltése
builder - INFO - .deb csomag készítése
builder - INFO - 'dh_make' futtatása...
builder - INFO - 'dpkg-buildpackage' futtatása...
dpkg-deb: az 'nginx' csomag építése a '..\/nginx_1.14.1-1_amd64.deb'-ben.
Így pár parancs segítségével létrehozzuk a környezetet és a szükséges NGINX buildet, és a csomag megjelenik abban a könyvtárban, ahonnan a szkript elindult.
Beillesztés
Ezenfelül integrálhatjuk eszközünket CI/CD folyamatokba. Ebben bármelyik létező CI rendszer segíthet, például vagy .
Ennek eredményeként minden egyes specifikációváltozásnál automatikusan elindul az artefaktum buildelése a Git-tárhelyen. A revízió szám a build indítások számlálójához van kötve.
Egy kis időráfordítással beállítható az artefaktum helyi csomagtárba, például Nexusba, Artifactoryba való automatikus küldése.
További előny, hogy a konfigurációs yaml fájl csatlakoztatható Ansible-hoz vagy más automatikus konfiguráló rendszerhez, és leolvashatjuk belőle a verziószámot és a csomag típusát, amelyet telepíteni szeretnénk.
Mi következik
A projekt még nem fejeződött be. Az alábbiakon dolgozunk most:
- A konfigurálhatóság lehetőségeit bővítjük, miközben megőrizzük a lehető legnagyobb egyszerűséget. Nem szeretnénk ezer paramétert megadni, ha csak kettő szükséges, és a többi megfelel az alapértelmezettnek. Ide tartoznak a fordítási zászlók (jelenleg ezek az src/config.py belső konfigurációs fájlban módosíthatók), telepítési utak, futtatásra szolgáló felhasználó.
- Automatikus csomagküldési lehetőségeket adunk hozzá különböző artefaktumtárakba.
- Felhasználói parancs végrehajtása a modul betöltésekor (például a használatához először egy adott verzió patch-ét kell alkalmazni)
- Tesztelés hozzáadása:
- A csomag helyesen települ.
- A NGINX a szükséges verzióval és a kért zászlókkal és modulokkal van összeállítva.
- Megfelelő utak, felhasználói fiókok stb. kerülnek létrehozásra.
De ezt az eszközt már most is használhatja, és javasolhatja a fejlesztéseket – Üdvözöljük!
Forrás: habr.com
