Tere!
Minu nimi on Sergei, olen infrastruktuuriinsener tinkoff.ru API plaanis.
Selles artiklis räägin probleemidest, millega meie meeskond silmitsi seisis, valmistades ette tasakaalustajaid põhinedes erinevatele projektidele. Samuti tutvustan tööriista, mis aitas suure osa neist probleemidest ületada.
Nginx on mitmeotstarbeline ja aktiivselt arenev vahendiserver. Sellel on palju mooduleid, . Iga projekt seab tasakaalustaja funktsioonidele ja Nginx versioonile (nt http/2 olemasolu ja grpc edastamine) teatud nõudmised.
Soovime näha viimast versiooni vajalike moodulitega, mis töötavad teatud Linuxi distributsiooni all. Meie puhul on need deb- ja rpm-põhised süsteemid. Kaugemaid konteinerivõimalusi ei käsitleta.
Soovime kiiresti muuta meie tasakaalustajate funktsionaalsust. Siin kerkib kohe küsimus — kuidas seda saavutada, kulutades võimalikult vähe ressursse? Veel parem oleks, kui saaksime protsessi seadistada nii, et saaksime määrata lõpliku arvu sisendparameetreid ning väljundina saada artefakti deb/rpm paketi kujul vajalikule opsüsteemile.
Kokkuvõttes võib välja tuua mitmeid probleeme:
- Mitte alati ei ole saadaval pakette värskeima versiooniga Nginx.
- Ei ole pakette vajalike moodulitega.
- Paketi käsitsi kompileerimine ja kokkupanek võtab palju aega ja on lihtsalt tüütu.
- Ei ole kirjeldust, kuidas on kokku pandud teatud Nginx instants.
Nende probleemide lahendamiseks on vajalik mingi tööriist, mis võtaks sisendiks inimkeeles loetava spetsifikatsiooni ja koguks selle põhjal vajaliku funktsionaalsusega Nginx paketi.
Kuna me ei leidnud meie jaoks sobivat varianti GitHubist, otsustasime luua oma tööriista — .
Spetsifikatsioonid
Meie tööriistas soovisime luua spetsifikatsiooni kirjelduse koodina, mille saab seejärel paigutada Git-reposiitiumisse. Selleks valisime sarnaste juba kasutatavate asjade jaoks tuttava formaadi — yaml. Spetsifikatsiooni näide:
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
Siin anname teada, et soovime näha deb-paketti Nginx versiooniga 1.14.2 koos vajalike moodulitega. Moodulite jaotis on valikuline. Igaühe jaoks saab määrata:
- Nimi.
- Aadress, kust selle kätte saada:
- Git-repositoorium. Samuti saab määrata haru või sildi.
- Veebilingi arhiiv.
- Kohalik lingi arhiiv.
Mõned moodulid nõuavad täiendavate sõltuvuste installimist, näiteks nginx-auth-ldap jaoks on vajalik installitud libldap2-dev. Vajalikud sõltuvused saab samuti märkida mooduli kirjelduses.
Keskkond
Meie tööriista abil on võimalik kiiresti saada keskkonda, kus on installitud kompilatsiooniks vajalikud utiliidid, paketi koostamiseks ja muu abiprogrammi jaoks. Siin sobib hästi docker-konteiner koos kogu vajaliku (hoidlas on juba paar näidet docker-failidest ubuntu ja centos jaoks).
Pärast spetsifikatsiooni koostamist ja keskkonna ettevalmistamist käivitame meie koostaja, eelnevalt installides selle sõltuvused:
pip3 install -r requirements.txt
./main.py build -f [конфиг_файл].yaml -r [номер_ревизии]
Revisjoni number on siin valikuline ja teenib versiooni haldamise eesmärki. See salvestatakse paketi metaandmetesse, mis võimaldab seda serverites hõlpsasti uuendada.
Logide abil saab jälgida, mis toimub. Siin on näide põhipunktidest:
builder - INFO - Parsige yaml-faili: example.config.yaml
builder - INFO - Laadimine skripte .deb paketi koostamiseks
builder - INFO - Laadimine nginx allikast...
builder - INFO - --> http://nginx.org/download/nginx-1.14.1.tar.gz
builder - INFO - Laadimine kolmandate osapoolte mooduleid...
builder - INFO - Moodul nginx-auth-ldap laaditakse haru järgi
builder - INFO - -- Valmis: nginx-auth-ldap
builder - INFO - -- Valmis: ngx_http_substitutions_filter_module
builder - INFO - Moodul headers-more-nginx-module laaditakse
builder - INFO - Moodul nginx-module-vts laaditakse sildi järgi
builder - INFO - -- Valmis: nginx-module-vts
builder - INFO - Moodul ngx_devel_kit laaditakse sildi järgi
builder - INFO - -- Valmis: ngx_devel_kit
builder - INFO - -- Valmis: ngx_cache_purge
builder - INFO - -- Valmis: ngx_http_dyups_module
builder - INFO - Laadimine sõltuvustest
builder - INFO - Koostamine .deb pakett
builder - INFO - Käivitamine 'dh_make'...
builder - INFO - Käivitamine 'dpkg-buildpackage'...
dpkg-deb: paketi 'nginx' ehitamine '../nginx_1.14.1-1_amd64.deb'.
Nii, mõne käsu abil loome keskkonna ja vajaliku Nginxi kogu ning pakett ilmub katalooge, kust skript käivitatakse.
Integreerimine
Samuti saame meie tööriista integreerida CI/CD protsessidesse. Selleks võivad aidata mitmed praegu olemasolevad CI-süsteemid, näiteks või .
Seega, iga kord, kui spetsifikatsioon Giti repos muutub, käivitatakse automaatselt artefakti koostamine. Revisjoni number on seotud ehituse käivituste loendiga.
Veidi rohkem aega kulutades on võimalik seadistada arhiivi saatmine kohalikku paketirepositooriumisse, Nexus, Artifactory jne.
Lisaks on kasu selles, et konfiguratsioonifaili yaml saab ühendada Ansible või mõne muu automaatse konfigureerimise süsteemiga ning sealt võtta välja versiooninumbri ja paketi tüübi, mida soovime juurutada.
Mis edasi
Projekt pole veel lõpetatud. Siin on, millega me praegu tegeleme:
- Laieneme konfigureerimise võimalusting, säilitades seejuures maksimaalse lihtsuse. Ei soovi määrata tuhandet parameetrit, kui vaja on vaid kahte, samas kui ülejäänud sobivad vaikimisi. Siia alla kuuluvad kompileerimislipud (hetkel saab neid muuta sise konfiguratsioonifailis src/config.py), installiteed, jooksutaja kasutaja.
- Lisame valikud pakettide automaatseks saatmiseks erinevatesse artefaktide hoidlatestesse.
- Kasutaja määratud käsu täitmine mooduli laadimise ajal (nt kasutamiseks peab esmalt rakendama teatud versiooni plaastri)
- Lisame testimise läbiviimise:
- Pakett installitakse korrektselt.
- Nginx on õige versioon ja see on kokku pandud vajalike lippude ja moodulitega.
- Loodud on vajalikud teed, kontod jne.
Kuid võid juba praegu seda tööriista kasutada ning pakkuda parendusi — tere tulemast!
Allikas: habr.com
