Hi!
Mani sauc Sergejs, es strÄdÄju par infrastruktÅ«ras inženieri platformas tinkoff.ru API komandÄ.
Å ajÄ rakstÄ es runÄÅ”u par problÄmÄm, ar kurÄm saskÄrÄs mÅ«su komanda, pamatojoties uz balansieriem Nginx dažÄdiem projektiem. Es arÄ« pastÄstÄ«Å”u par rÄ«ku, kas ļÄva man pÄrvarÄt lielÄko daļu no tiem.
Nginx ir daudzfunkcionÄls un aktÄ«vi attÄ«stÄs starpniekserveris. Tam ir liels skaits moduļu, tas nav pilnÄ«gs saraksts. Katrs projekts uzliek noteiktas prasÄ«bas balansÄtÄja funkcionalitÄtei un Nginx versijai (piemÄram, http/2 un grpc starpniekservera klÄtbÅ«tnei) un tÄ moduļu sastÄvam.
MÄs vÄlÄtos redzÄt jaunu versiju ar nepiecieÅ”amo moduļu komplektu, kas darbojas saskaÅÄ ar noteiktu Linux izplatÄ«Å”anu. MÅ«su gadÄ«jumÄ tÄs ir uz deb un rpm balstÄ«tas sistÄmas. Å ajÄ rakstÄ nav apskatÄ«ta iespÄja ar konteineriem.
MÄs vÄlamies Ätri mainÄ«t savu balansÄtÄju funkcionalitÄti. Un te uzreiz rodas jautÄjums: kÄ to panÄkt, tÄrÄjot pÄc iespÄjas mazÄk resursu? VÄl labÄk bÅ«tu iestatÄ«t procesu tÄ, lai mÄs varÄtu norÄdÄ«t ierobežotu skaitu ievades parametru un izejÄ saÅemtu artefaktu deb/rpm pakotnes veidÄ vÄlamajai OS.
RezultÄtÄ var formulÄt vairÄkas problÄmas:
Ne vienmÄr ir pakotnes ar jaunÄko Nginx versiju.
Nav nevienas pakotnes ar nepiecieŔamajiem moduļiem.
ManuÄla pakotnes sastÄdÄ«Å”ana un izveide ir laikietilpÄ«ga un patiesi nogurdinoÅ”a.
Nav apraksta par to, kÄ Å”Ä« vai cita Nginx instance tiek samontÄta.
Lai atrisinÄtu Ŕīs problÄmas, rodas vajadzÄ«ba pÄc rÄ«ka, kas par ievadi Åemtu specifikÄciju cilvÄkam lasÄmÄ formÄtÄ un uz tÄs pamata saliktu Nginx pakotni ar nepiecieÅ”amo funkcionalitÄti.
Neatrodot mums piemÄrotu iespÄju Github plaÅ”ajÄ vietÄ, mÄs nolÄmÄm izveidot savu rÄ«ku - nginx veidotÄjs.
SpecifikÄcijas
MÅ«su rÄ«kÄ mÄs vÄlÄjÄmies izveidot specifikÄcijas aprakstu koda veidÄ, ko pÄc tam var ievietot Git repozitorijÄ. Lai to izdarÄ«tu, mÄs izvÄlÄjÄmies Å”ÄdÄm lietÄm pazÄ«stamu formÄtu - yaml. SpecifikÄcijas piemÄrs:
Å eit mÄs norÄdÄm, ka vÄlamies redzÄt deb pakotni ar Nginx versiju 1.14.2 ar nepiecieÅ”amo moduļu komplektu. Sadaļa ar moduļiem nav obligÄta. Katram no tiem varat iestatÄ«t:
VÄrds.
Adrese, kur to var saÅemt:
Git repozitorijs. Varat arÄ« norÄdÄ«t filiÄli vai tagu.
Arhīva tīmekļa saite.
VietÄjÄ saite uz arhÄ«vu.
Dažiem moduļiem ir jÄinstalÄ papildu atkarÄ«bas, piemÄram, nginx-auth-ldap ir jÄinstalÄ libldap2-dev. Aprakstot moduli, var norÄdÄ«t arÄ« nepiecieÅ”amÄs atkarÄ«bas.
Vide
MÅ«su rÄ«kÄ varat Ätri iegÅ«t vidi ar instalÄtÄm utilÄ«tprogrammÄm kompilÄÅ”anai, pakotÅu montÄžai un citai palÄ«gprogrammatÅ«rai. Å eit ir ideÄls Docker konteiners ar visu nepiecieÅ”amo (repozitorijÄ jau ir daži Docker failu piemÄri ubuntu un centos).
PÄc specifikÄcijas sastÄdÄ«Å”anas un vides sagatavoÅ”anas mÄs palaižam savu celtnieku, iepriekÅ” uzstÄdot tÄ atkarÄ«bas:
PÄrskatÄ«Å”anas numurs Å”eit nav obligÄts un tiek izmantots komplektu versiju veidoÅ”anai. Tas ir ierakstÄ«ts pakotnes metainformÄcijÄ, padarot to viegli atjauninÄmu serveros.
No žurnÄliem varat pÄrraudzÄ«t notiekoÅ”o. Å eit ir galveno punktu piemÄrs:
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'.
TÄtad, tikai ar pÄris komandÄm mÄs izveidojam vidi un nepiecieÅ”amo Nginx montÄžu, un pakotne parÄdÄs direktorijÄ, no kura tiek palaists skripts.
IegulŔana
MÄs varam arÄ« integrÄt mÅ«su rÄ«ku CI/CD procesos. PiemÄram, jebkura no daudzajÄm mÅ«sdienÄs esoÅ”ajÄm CI sistÄmÄm var palÄ«dzÄt Å”ajÄ jautÄjumÄ Teamcity vai Gitlab CI.
RezultÄtÄ katru reizi, kad Git krÄtuvÄ mainÄs specifikÄcijas, artefakta bÅ«vÄjums tiek automÄtiski palaists. PÄrskatÄ«Å”anas numurs ir saistÄ«ts ar bÅ«vÄjuma palaiÅ”anas skaitÄ«tÄju.
PatÄrÄjot nedaudz vairÄk laika, varat konfigurÄt artefaktu, lai tas tiktu nosÅ«tÄ«ts uz vietÄjo pakotÅu krÄtuvi, Nexus, Artifactory un tÄ tÄlÄk.
Papildu priekÅ”rocÄ«ba ir tÄ, ka yaml konfigurÄcijas failu var savienot ar Ansible vai citu automÄtisko konfigurÄcijas sistÄmu, un no turienes mÄs varam paÅemt versijas numuru un pakotnes veidu, kuru vÄlamies izvietot.
Kas ir nÄkamais
Projekts vÄl nav pabeigts. LÅ«k, pie kÄ mÄs paÅ”laik strÄdÄjam:
MÄs paplaÅ”inÄm konfigurÄcijas iespÄju, bet tajÄ paÅ”Ä laikÄ saglabÄjam to pÄc iespÄjas vienkÄrÅ”Äku. JÅ«s nevÄlaties definÄt tÅ«kstoÅ” parametru, ja jums ir nepiecieÅ”ami tikai divi, un pÄrÄjie ir piemÄroti pÄc noklusÄjuma. Tas ietver kompilÄcijas karogus (tagad varat tos mainÄ«t iekÅ”ÄjÄ konfigurÄcijas failÄ src/config.py), instalÄcijas ceļu un palaiÅ”anas lietotÄju.
MÄs pievienojam opcijas automÄtiskai pakotnes nosÅ«tÄ«Å”anai uz dažÄdÄm artefaktu krÄtuvÄm.