РџСЂРІРμы!
Ég heiti Sergey, ég vinn sem innviðaverkfræðingur í API teyminu á tinkoff.ru pallinum.
Í þessari grein mun ég tala um vandamálin sem teymið okkar stóð frammi fyrir við að útbúa jafnvægismenn út frá Nginx til ýmissa verkefna. Ég mun líka segja þér frá tólinu sem gerði mér kleift að sigrast á flestum þeirra.
Nginx er fjölvirkur proxy-þjónn sem er í virku þróun. Það býður upp á mikinn fjölda eininga, þetta er ekki tæmandi listi. Hvert verkefni setur ákveðnar kröfur um virkni jafnvægisbúnaðarins og útgáfu Nginx (til dæmis tilvist http/2 og grpc umboð), og samsetningu eininga þess.
Okkur langar til að sjá nýja útgáfu með nauðsynlegum einingum sem keyra undir tiltekinni Linux dreifingu. Í okkar tilviki eru þetta deb- og rpm-undirstaða kerfi. Valkosturinn með gámum er ekki tekinn til greina í þessari grein.
Við viljum fljótt breyta virkni jafnvægistækjanna okkar. Og hér vaknar strax spurningin: hvernig á að ná þessu með því að eyða eins litlu fjármagni og mögulegt er? Það væri enn betra að setja ferlið upp þannig að við getum tilgreint takmarkaðan fjölda inntaksbreytur og við úttakið fengið grip í formi deb/rpm pakka fyrir viðkomandi stýrikerfi.
Fyrir vikið er hægt að móta fjölda vandamála:
Það eru ekki alltaf pakkar með nýjustu útgáfunni af Nginx.
Það eru engir pakkar með nauðsynlegum einingum.
Að setja saman og smíða pakka handvirkt er tímafrekt og beinlínis leiðinlegt.
Það er engin lýsing á því hvernig þetta eða hitt Nginx tilvik er sett saman.
Til að leysa þessi vandamál skapast þörf fyrir tól sem myndi taka sem inntak forskrift á mönnum læsilegu sniði og setja saman Nginx pakka með nauðsynlegri virkni byggt á því.
Þar sem við fundum ekki viðeigandi valkost fyrir okkur á víðáttumiklu Github, ákváðum við að búa til okkar eigið tól - nginx-byggir.
Tæknilýsing
Í tólinu okkar vildum við búa til lýsingu á forskriftinni í formi kóða, sem síðan er hægt að setja í Git geymslu. Til að gera þetta völdum við sniðið sem er kunnuglegt fyrir slíka hluti - yaml. Dæmi um forskrift:
Hér gefum við til kynna að við viljum sjá deb pakka með Nginx útgáfu 1.14.2 með nauðsynlegu setti eininga. Hlutinn með einingum er valfrjáls. Fyrir hvert þeirra geturðu stillt:
Nafn.
Heimilisfang þar sem þú getur nálgast það:
Git geymsla. Þú getur líka tilgreint útibú eða merki.
Vefhlekkur í skjalasafn.
Staðbundin hlekkur á skjalasafnið.
Sumar einingar krefjast þess að fleiri ósjálfstæði séu sett upp, til dæmis þarf nginx-auth-ldap að libldap2-dev sé uppsett. Einnig er hægt að tilgreina nauðsynlegar ósjálfstæði þegar einingunni er lýst.
Umhverfið
Í tólinu okkar geturðu fljótt fengið umhverfi með uppsettum tólum fyrir samantekt, pakkasamsetningu og annan aukahugbúnað. Docker gámur með öllu sem þú þarft er tilvalinn hér (geymslan hefur nú þegar nokkur dæmi um Docker skrár fyrir Ubuntu og centos).
Eftir að forskriftin hefur verið samin og umhverfið undirbúið, ræsum við smiðinn okkar, eftir að hafa áður sett upp ósjálfstæði þess:
Endurskoðunarnúmerið hér er valfrjálst og er notað fyrir útgáfu samsetningar. Það er skrifað inn í metaupplýsingar pakkans, sem gerir það auðvelt að uppfæra á netþjónum.
Úr skránum er hægt að fylgjast með því sem er að gerast. Hér er dæmi um aðalatriðin:
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'.
Svo, með aðeins nokkrum skipunum, búum við til umhverfið og nauðsynlega Nginx samsetningu og pakkinn birtist í möppunni þar sem handritið er ræst.
Innfelling
Við getum líka samþætt tólið okkar í CI/CD ferla. Einhver af mörgum CI kerfum sem eru til í dag getur hjálpað til við þetta, til dæmis Teamcity eða Gitlab CI.
Þar af leiðandi, í hvert sinn sem forskriftin breytist í Git geymslunni, er smíði gripsins ræst sjálfkrafa. Endurskoðunarnúmerið er tengt við ræsingarteljarann.
Með aðeins meiri tíma geturðu stillt gripinn þannig að hann verði sendur í pakkageymsluna þína, Nexus, Artifactory og svo framvegis.
Aukakostur er að hægt er að tengja yaml stillingarskrána við Ansible eða annað sjálfvirkt stillingarkerfi, og þaðan getum við tekið útgáfunúmerið og pakkagerðina sem við viljum dreifa.
Hvað er næst
Verkinu er enn ekki lokið. Hér er það sem við erum að vinna að núna:
Við víkkum út möguleika á stillingum en höldum því um leið eins einfalt og mögulegt er. Þú vilt ekki skilgreina þúsund færibreytur ef þú þarft aðeins tvær, og restin passar sjálfgefið. Þetta felur í sér safnflögg (nú geturðu breytt þeim í innri stillingarskránni src/config.py), uppsetningarslóð og ræst notanda.
Við erum að bæta við valkostum til að senda pakka sjálfkrafa í ýmsar gripageymslur.