🥇Si të arrish në qiell dhe të bëhesh pilot | ProHoster
Quhem Sergej dhe punoj si inxhinier infrastrukture në ekipin e platformës API të tinkoff.ru.
Në këtë artikull do të flas për problemet me të cilat u përball ekipi ynë gjatë përgatitjes së balancuesve të ngarkesës të bazuar në për projekte të ndryshme. Do të tregoj gjithashtu për mjetin që na lejoi të kapërcenim shumicën e tyre.
Nginx është një proxy server shumëfunksional që zhvillohet në mënyrë aktive. Ai dallohet për një numër të madh modulesh, . Çdo projekt vendos kërkesa të caktuara për funksionalitetin e balancuesit, për versionin e Nginx-it (për shembull, mbështetja për http/2 dhe proxying për grpc) dhe për përbërjen e moduleve të tij.
Ne duam të kemi një version të fundit me grupin e duhur të moduleve, që funksionon në një shpërndarje të caktuar Linux. Në rastin tonë, bëhet fjalë për sisteme deb- dhe rpm-based. Opsioni me kontejnerë nuk trajtohet në këtë artikull.
Ne duam të ndryshojmë me shpejtësi funksionalitetin e balancuesve tanë. Dhe këtu lind menjëherë pyetja: si mund ta arrijmë këtë duke shpenzuar sa më pak burime? Edhe më mirë do të ishte ta organizonim procesin në mënyrë që të mund të përcaktonim një numër të kufizuar parametrash hyrës dhe në dalje të merrnim një artefakt në formën e një pakete deb/rpm për OS-in e nevojshëm.
Si përfundim, mund të formulojmë një sërë problemesh:
- Jo gjithmonë ka paketa me versionin më të fundit të Nginx-it.
- Nuk ka paketa me modulet e nevojshme.
- Kompilimi dhe ndërtimi i paketës manualisht kërkon shumë kohë dhe është thjesht i lodhshëm.
- Nuk ka përshkrim se si është ndërtuar ky apo ai instancë e Nginx-it.
Për të zgjidhur këto probleme, nevojitet një mjet që të marrë si hyrje një specifikim në një format të lexueshëm për njerëzit dhe, mbi bazën e tij, të ndërtojë një paketë Nginx me funksionalitetin e kërkuar.
Duke mos gjetur një zgjidhje të përshtatshme për ne në GitHub, vendosëm të krijonim mjetin tonë — .
Specifikimet
Në mjetin tonë donim të krijonim përshkrimin e specifikimit në formë kodi, i cili më pas mund të ruhej në një repository Git. Për këtë zgjodhëm formatin e njohur për gjëra të tilla — yaml. Shembull specifikimi:
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
Këtu përcaktojmë që duam të marrim një paketë deb me versionin Nginx 1.14.2 dhe grupin e nevojshëm të moduleve. Seksioni i moduleve është opsional. Për secilin prej tyre mund të specifikohen:
- Emri.
- Adresa nga ku mund të merret:
- Depoja Git. Mund të specifikoni gjithashtu degën ose tag-un.
- Lidhja web drejt arkivit.
- Lidhja lokale drejt arkivit.
Disa module kërkojnë instalimin e varësive shtesë; për shembull, për nginx-auth-ldap duhet të jetë i instaluar libldap2-dev. Varësitë e nevojshme mund të specifikohen gjithashtu në përshkrimin e modulit.
Mjedisi
Me mjetin tonë mund të përgatitni shpejt një mjedis me utilitete të instaluara për kompilim, ndërtimin e paketës dhe softuer tjetër ndihmës. Zgjidhja më e përshtatshme këtu është një kontejner Docker me gjithçka të nevojshme (në depo ka tashmë disa shembuj të Dockerfile për Ubuntu dhe CentOS).
Pasi të jetë përgatitur specifikimi dhe mjedisi të jetë gati, nisim ndërtuesin tonë, pasi të kemi instaluar më parë varësitë e tij:
pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]
Numri i revisionit këtu është opsional dhe përdoret për versionimin e ndërtimeve. Ai ruhet në metainformacionin e paketës, gjë që e bën përditësimin e saj në serverë të thjeshtë.
Procesin mund ta ndiqni përmes log-eve. Ja një shembull i pikave kryesore:
builder - INFO - Përpuno skedarin yaml: example.config.yaml
builder - INFO - Shkarko skriptet për ndërtimin e paketës deb
builder - INFO - Po shkarkohet kodi burimor i nginx...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Po shkarkohen modulet e palëve të treta...
builder - INFO - Moduli nginx-auth-ldap do të shkarkohet sipas branch-it
builder - INFO - -- Përfundoi: nginx-auth-ldap
builder - INFO - -- Përfundoi: ngx_http_substitutions_filter_module
builder - INFO - Moduli headers-more-nginx-module do të shkarkohet
builder - INFO - Moduli nginx-module-vts do të shkarkohet sipas tag-ut
builder - INFO - -- Përfundoi: nginx-module-vts
builder - INFO - Moduli ngx_devel_kit do të shkarkohet sipas tag-ut
builder - INFO - -- Përfundoi: ngx_devel_kit
builder - INFO - -- Përfundoi: ngx_cache_purge
builder - INFO - -- Përfundoi: ngx_http_dyups_module
builder - INFO - Po shkarkohen varësitë
builder - INFO - Po ndërtohet paketa .deb
builder - INFO - Po ekzekutohet 'dh_make'...
builder - INFO - Po ekzekutohet 'dpkg-buildpackage'...
dpkg-deb: po ndërtohet paketa 'nginx' në '../nginx_1.14.1-1_amd64.deb'.
Kështu, fjalë për fjalë me vetëm disa komanda, krijojmë mjedisin dhe build-in e nevojshëm të Nginx, ndërsa paketa shfaqet në direktoriumin nga i cili është nisur skripti.
Integrimi
Gjithashtu, mund ta integrojmë mjetin tonë në proceset CI/CD. Për këtë mund të ndihmojë cilido nga sistemet e shumta CI që ekzistojnë sot, për shembull ose .
Si rezultat, sa herë që ndryshon specifikimi në repository-n Git, build-i i artefaktit nis automatikisht. Numri i revision-it lidhet me numëruesin e ekzekutimeve të build-it.
Duke investuar edhe pak kohë, mund të konfiguroni dërgimin e artefaktit në një repository lokal paketash, Nexus, Artifactory e kështu me radhë.
Një avantazh shtesë është se skedari i konfigurimit yaml mund të lidhet me Ansible ose me një sistem tjetër të automatizimit të konfigurimit, dhe prej andej të merren numri i versionit dhe lloji i paketës që duam të deploy-ojmë.
Çfarë pason
Projekti ende nuk ka përfunduar. Ja se për çfarë po punojmë tani:
- Po zgjerojmë mundësitë e konfigurimit, duke i ruajtur njëkohësisht sa më të thjeshta. Nuk ka kuptim të përcaktohen një mijë parametra kur duhen vetëm dy, ndërsa pjesa tjetër është e përshtatshme sipas parazgjedhjes. Këtu përfshihen flamujt e kompilimit (aktualisht ato mund të ndryshohen në skedarin e brendshëm të konfigurimit src/config.py), rrugët e instalimit dhe përdoruesi për ekzekutim.
- Po shtojmë opsione për dërgimin automatik të paketës në depo të ndryshme artefaktesh.
- Ekzekutimi i një komande të personalizuar gjatë ngarkimit të modulit (për shembull, për përdorimin e duhet fillimisht të aplikohet një patch i një versioni të caktuar)
- Po shtojmë kryerjen e testeve:
- Paketa instalohet saktë.
- Nginx ka versionin e kërkuar dhe është ndërtuar me flamujt dhe modulet e nevojshme.
- Krijohen rrugët, llogaritë dhe të tjera sipas nevojës.
Por këtë mjet mund ta përdorni që tani, si edhe të propozoni përmirësime — mirë se vini!
Burimi: habr.com
