Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët

Për kërkesën tonë, Habr krijoi një Hub Kubernetes dhe na bën të kënaqur të publikojmë postimin e parë aty. Abonohuni!

Kubernetes është e thjeshtë. Pse bankat po më paguajnë shumë para për punën time në këtë fushë, ndërsa çdo kush mund ta zotërojë këtë teknologji për disa orë?

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët

NĂ«se dyshoni se Kubernetes mund tĂ« mĂ«sohet kaq shpejt - ju sugjeroj ta provoni vetĂ«. Duke zotĂ«ruar kĂ«tĂ« material, do tĂ« jeni nĂ« gjendje tĂ« drejtoni njĂ« aplikacion tĂ« bazuar nĂ« mikroshĂ«rbime nĂ« njĂ« grup Kubernetes. Mund ta garantoj, pasi kjo metodologji qĂ« pĂ«rdoret kĂ«tu Ă«shtĂ« ajo qĂ« pĂ«rdor pĂ«r tĂ« mĂ«suar klientĂ«t tanĂ« pĂ«r Kubernetes. ÇfarĂ« e dallon kĂ«tĂ« udhĂ«zues nga tĂ« tjerĂ«t? NĂ« tĂ« vĂ«rtetĂ«, shumĂ« gjĂ«ra. Shumica e materialeve tĂ« tilla fillojnĂ« me shpjegimin e gjĂ«rave tĂ« thjeshta - koncepteve tĂ« Kubernetes dhe veçorive tĂ« komandĂ«s kubectl. AutorĂ«t e kĂ«tyre materialeve e supozojnĂ« se lexuesi i tyre Ă«shtĂ« i njohur me zhvillimin e aplikacioneve, me mikroshĂ«rbimet dhe me kontejnerĂ«t Docker. Ne do tĂ« ndjekim njĂ« rrugĂ« tjetĂ«r. Fillimisht do tĂ« tregojmĂ« se si tĂ« drejtoni nĂ« kompjuter njĂ« aplikacion tĂ« bazuar nĂ« mikroshĂ«rbime. Pastaj do tĂ« shqyrtojmĂ« ndĂ«rtimin e imazheve tĂ« kontejnerĂ«ve pĂ«r çdo mikroshĂ«rbim. VetĂ«m pas kĂ«saj do tĂ« njohim Kubernetes dhe do tĂ« shqyrtojmĂ« depozitimin e njĂ« aplikacioni tĂ« bazuar nĂ« mikroshĂ«rbime nĂ« njĂ« grup tĂ« menaxhuar nga Kubernetes.

Ky qasje, me një afrim gradual drejt Kubernetes, do të ofrojë një thellësi kuptimi të nevojshme për një njeri të zakonshëm për të kuptuar se si gjithçka është e thjeshtë në Kubernetes. Kubernetes është, pa dyshim, një teknologji e thjeshtë, për sa kohë që i është e njohur atij që dëshiron ta zotërojë, ku dhe si përdoret.

Tani, pa fjalë të panevojshme, le të fillojmë punën dhe të flasim për aplikacionin me të cilin do të punojmë.

Aplikacioni eksperimental

Aplikacioni ynë do të kryejë vetëm një funksion. Pranon, si të dhëna hyrëse, një fjali, dhe më pas, duke përdorur mjete analize teksti, realizon një analizë sentimenti (sentiment analysis) të kësaj fjale, duke marrë një vlerësim të qëndrimit emocional të autorit të fjalës ndaj një objekti të caktuar.

Kështu duket dritarja kryesore e këtij aplikacioni.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Aplikacioni në web për analizimin e tonit të teksteve

Nga një pikëpamje teknike, aplikacioni përbëhet nga tre mikroshërbime, secili nga të cilat zgjidh një grup të caktuar detyrash:

  • SA-Frontend — serveri web Nginx qĂ« shĂ«rben skedarĂ«t statikĂ« tĂ« React.
  • SA-WebApp — aplikacioni web i shkruar nĂ« Java, i cili pĂ«rpunon kĂ«rkesat nga frontend-i.
  • SA-Logic — njĂ« aplikacion Python qĂ« ekzekuton analizĂ«n e tonit tĂ« tekstit.

ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet qĂ« mikroshĂ«rbimet nuk ekzistojnĂ« nĂ« izolim. Ato realizojnĂ« idenĂ« e "ndarjes sĂ« detyrave", por, gjithashtu, duhet tĂ« bashkĂ«punojnĂ« me njĂ«ra-tjetrĂ«n.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Flukset e të dhënave në aplikacion

Në diagramin e mësipërm, mund të shihni etapat e numëruara të funksionimit të sistemit, që ilustrojnë flukset e të dhënave në aplikacion. Le të analizojmë ato:

  1. Shfletuesi i kërkon serverit një skedar index.html (i cili, nga ana e tij, shkarkon paketën e aplikacionit React).
  2. Përdoruesi ndërvepron me aplikacionin, çka shkakton një kërkesë për aplikacionin web të bazuar në Spring.
  3. Aplikacioni web redirekton kërkesën për ekzekutimin e analizës së tekstit tek aplikacioni Python.
  4. Aplikacioni Python kryen analizën e tonit të tekstit dhe kthen rezultatin si përgjigje ndaj kërkesës.
  5. Aplikacioni Spring dërgon përgjigjen në aplikacionin React (i cili, nga ana e tij, tregon rezultatin e analizës së tekstit për përdoruesin).

Kodi për të gjithë këto aplikacione mund të gjendet këtu. Ju rekomandoj ta kopjoni këtë depoishëm tani, pasi na presin eksperimentime interesante me të.

Nisja e aplikacionit të bazuar në mikroshërbime në kompjuterin lokal

PĂ«r tĂ« bĂ«rĂ« qĂ« aplikacioni tĂ« funksionojĂ«, na nevojitet tĂ« nisim tĂ« tre mikroshĂ«rbimet. Le tĂ« fillojmĂ« me aplikacionin mĂ« simpatik tĂ« tĂ« gjithĂ«ve — aplikacionin frontend.

▍Konfigurimi i React pĂ«r zhvillimin lokal

Për të nisur aplikacionin React, ju nevojitet të instaloni në kompjuterin tuaj platformën Node.js dhe NPM. Pas instalimit të të gjitha këtyre, kaloni me terminal në folderin e projektit sa-frontend dhe ekzekutoni komandën e mëposhtme:

npm install

Duke ekzekutuar këtë komandë, në folderin node_modules do të shkarkohen varësitë e aplikacionit React, të cilat janë regjistruar në skedarin package.json. Pasi të përfundojë shkarkimi i varësive, në të njëjtin folder ekzekutoni komandën e tillë:

npm start

Ja ku jemi. Tani aplikacioni React është nisur, dhe për të hyrë në të, mund të kaloni në shfletues në adresën localhost:3000. Mund të bëni ndonjë ndryshim në kodin e tij. Efekti i këtyre ndryshimeve do ta shihni menjëherë në shfletues. Kjo është e mundur falë asaj që quhet zëvendësim "nxehtë" i moduleve. Falë kësaj, zhvillimi i frontend-it bëhet një aktivitet i thjeshtë dhe të këndshëm.

▍ PĂ«rgatitja e aplikacionit React pĂ«r prodhim

Për qëllime të përdorimit të vërtetë të aplikacionit React, na nevojitet ta konvertojmë në një grup skedarësh statikë dhe t'i dorëzojmë ata klientëve, duke përdorur një server web.

Për të ndërtuar aplikacionin React, sërish, duke përdorur terminalin, kaloni në dosjen sa-frontend dhe ekzekutoni komandën e mëposhtme:

npm run build

Kjo do të çojë në krijimin e një direktorie në dosjen e projektit build. Në të do të gjenden të gjitha skedaret statikë që janë të nevojshme për funksionimin e aplikacionit React.

▍ ShĂ«rbimi i skedarĂ«ve statikĂ« me Nginx

Së pari duhet të instaloni dhe të nisni serverin web Nginx. Këtu mund ta shkarkoni dhe të gjeni udhëzimet për instalimin dhe nisjen e tij. Më pas duhet të kopjoni përmbajtjen e dosjes sa-frontend/build në folderin [your_nginx_installation_dir]/html.

Me këtë qasje, skedari i gjeneruar gjatë procesit të ndërtimit të aplikacionit React index.html do të jetë i aksesueshëm në adresën [your_nginx_installation_dir]/html/index.html. Ky është skedari që, sipas parazgjedhjes, serveri Nginx e ofron kur i drejtohesh. Serveri është i konfiguruar për të dëgjuar në portin 80, por mund të konfigurohet siç dëshironi, duke modifikuar skedarin [your_nginx_installation_dir]/conf/nginx.conf.

Tani hapni shfletuesin dhe shkoni në adresën localhost:80. Do të shihni faqen e aplikacionit React.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Aplikacioni React, i shërbyer nga serveri Nginx

NĂ«se tani shkruani ndonjĂ« gjĂ« nĂ« fushĂ«n Type your sentence dhe klikoni butonin Send — nuk do tĂ« ndodhĂ« asgjĂ«. Por, nĂ«se e shikoni konsolĂ«n, atje mund tĂ« shihni mesazhe gabimi. PĂ«r tĂ« kuptuar se ku ndodhin kĂ«to gabime, le t'i ndjekim kodin e aplikacionit.

▍ Analiza e kodit tĂ« aplikacionit frontend

Duke parĂ« kodin e skedarit App.js, mund tĂ« shohim se klikimi nĂ« buton Send thĂ«rret metodĂ«n analyzeSentence(). Kodi i kĂ«saj metode Ă«shtĂ« i dhĂ«nĂ« mĂ« poshtĂ«. NĂ« tĂ« njĂ«jtĂ«n kohĂ«, vini re se çdo rresht qĂ« ka njĂ« koment tĂ« tillĂ« # ĐĐŸĐŒĐ”Ń€, ka njĂ« shpjegim tĂ« dhĂ«nĂ« poshtĂ« kodit. NĂ« tĂ« njĂ«jtĂ«n mĂ«nyrĂ« do tĂ« analizojmĂ« dhe segmentet e tjera tĂ« kodit.

analyzeSentence() {
    fetch('http://localhost:8080/sentiment', {  // #1
        method: 'POST',
        headers: {
            'Content-Type': 'application/json'
        },
        body: JSON.stringify({
                       sentence: this.textField.getValue()})// #2
    })
        .then(response => response.json())
        .then(data => this.setState(data));  // #3
}

1. URL ku të cilës bëhet kërkesa POST. Supozohet se në këtë adresë ndodhet një aplikacion që pret kërkesa të tilla.

2.Trupi i kërkesës që i dërgohet aplikacionit. Ja një shembull i trupit të kërkesës:

{
    sentence: "Më pëlqen yogobella!"
}

3.Pasi merrni një përgjigje për kërkesën, përditësohet gjendja e komponentit. Kjo shkakton rindizjen e komponentit. Nëse marrim të dhëna (pra, një objekt JSON që përmban të dhënat e futur dhe vlerësimin e llogaritur të tekstit), do ta shkruajmë komponentin Polarity, pasi do të përmbushen kushtet përkatëse. Këtu është si e përshkruajmë komponentin:

const polarityComponent = this.state.polarity !== undefined ?
     :
    null;

Kodi duket se funksionon mirë. Por çfarë nuk është në rregull? Nëse supozoni se në atë adresë ku aplikacioni përpiqet të dërgojë kërkesën POST, nuk ka asgjë që mund ta pranojë dhe ta përpunojë këtë kërkesë, do jeni plotësisht në të drejtat tuaja. Pikërisht, për të përpunuar kërkesat që vijnë në adresën http://localhost:8080/sentiment, na nevojitet një aplikacion web, të bazuar në Spring.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Na nevojitet një aplikacion Spring që të pranojë kërkesën POST

▍Konfigurimi i aplikacionit web, tĂ« bazuar nĂ« Spring

Për të instaluar një aplikacion Spring, ju nevojitet JDK8 dhe Maven dhe variablat e mjedisit të konfiguruar siç duhet. Pasi të keni instaluar gjithçka, mund të vazhdoni me punën mbi projektin tonë.

▍Paketa e aplikacionit nĂ« njĂ« skedar jar

Shkoni, me ndihmën e terminalit, në dosjen sa-webapp dhe shtypni komandën në vazhdim:

mvn install

Pas ekzekutimit tĂ« kĂ«saj komande, do tĂ« krijohet njĂ« direktore nĂ« dosjen sa-webapp Atje do tĂ« ndodhet aplikacioni Java, i paketuar nĂ« skedarin jar, i pĂ«rfaqĂ«suar nga skedari targetsentiment-analysis-web-0.0.1-SNAPSHOT.jar ▍Nisja e aplikacionit Java.

Shkoni në dosjen

dhe nisni aplikacionin me komandën në vazhdim: target java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar

Gjatë ekzekutimit të kësaj komande do të ndodhë një gabim. Për të filluar zgjidhjen e saj, mund të analizoni informacionet mbi përjashtimin në të dhënat e gjurmimit të stackut:

Gjatë ekzekutimit të kësaj komande do të ndodhë një gabim. Për të filluar zgjidhjen e tij, mund të analizojmë informacionin mbi përjashtimin në të dhënat e gjurmimit të stack-ut:

Gabimi në krijimin e bean me emrin 'sentimentController': Injekcioni i varësive të autowire nuk kishte sukses; përjashtimi i përfshirë është java.lang.IllegalArgumentException: Nuk mund të zgjidhte vendin e rezervuar 'sa.logic.api.url' në vlerën "${sa.logic.api.url}"

Për ne, këtu gjëja më e rëndësishme është përmendja e pamundësisë për të zbuluar vlerën sa.logic.api.url. Do të analizojmë kodin, në të cilin ndodh gabimi.

▍Analiza e kodit Java-aplikacionit

Ja një fragment i kodit, në të cilin ndodh gabimi.

@CrossOrigin(origins = "*")
@RestController
public class SentimentController {
    @Value("${sa.logic.api.url}")    // #1
    private String saLogicApiUrl;
    @PostMapping("/sentiment")
    public SentimentDto sentimentAnalysis(
        @RequestBody SentenceDto sentenceDto) 
    {
        RestTemplate restTemplate = new RestTemplate();
        return restTemplate.postForEntity(
                saLogicApiUrl + "/analyse/sentiment",    // #2
                sentenceDto, SentimentDto.class)
                .getBody();
    }
}

  1. Në SentimentController ka një fushë saLogicApiUrl. Vlera e tij përcaktohet nga pronësia sa.logic.api.url.
  2. String saLogicApiUrl konkatenohet me vlerën /analyse/sentiment. Së bashku, ato formojnë adresën për kryerjen e thirrjes në mikroshërbimin që kryen analizën e tekstit.

▍Caktimi i vlerĂ«s sĂ« pronĂ«s

Në Spring, burimi standard i vlerave të pronave është skedari application.properties, i cili mund të gjendet në adresën sa-webapp/src/main/resources. Por përdorimi i tij nuk është mënyra e vetëm për të caktuar vlera pronash. Kjo mund të bëhet edhe përmes komandës së mëposhtme:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=ÇFARË.ËSHTË.SA.LOGIC.API.URL

Vlera e kësaj prona duhet të tregojë adresën e aplikacionit tonë Python.

Duke e konfiguruar atë, ne i tregojmë aplikacionit web Spring se ku duhet të drejtohet për të kryer kërkesat për analizë teksti.

Për të mos e komplikuar jetën, do të vendosim që aplikacioni Python të jetë i aksesueshëm në adresën localhost:5000 dhe do të përpiqemi ta mbajmë në mend. Si rezultat, komanda për të nisur aplikacionin Spring do të duket kështu:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Sistemi ynë i mungon aplikacioni Python.

Tani na mbetet vetëm të nisim aplikacionin Python dhe sistemi do të funksionojë si pritej.

▍Caktimi i aplikacionit Python

Për të nisur aplikacionin Python, duhet të keni instaluar Python 3 dhe Pip, dhe duhet të jenë të konfiguruara siç duhet variablat përkatës të mjedisit.

▍Instalimi i varĂ«sive

Shkoni në dosjen e projektit sa-logic/sa dhe kryeni këto komanda:

python -m pip install -r requirements.txt
python -m textblob.download_corpora

▍Nisja e aplikacionit

Pas instalimit të varësive, jemi të gatshëm për të nisur aplikacionin:

python sentiment_analysis.py

Pas ekzekutimit të kësaj komande, do të njoftohemi për këtë:

* Po punon në http://0.0.0.0:5000/ (Shtypni CTRL+C për të mbyllur)

Kjo do të thotë se aplikacioni është aktiv dhe pret kërkesa në adresën localhost:5000/

▍KĂ«rkimi i kodit

Le të shqyrtojmë kodin e aplikacionit Python për të kuptuar se si reagon ndaj kërkesave:

from textblob import TextBlob
from flask import Flask, request, jsonify
app = Flask(__name__)                              #1
@app.route("/analyse/sentiment", methods=['POST'])      #2
def analyse_sentiment():
    sentence = request.get_json()['sentence']           #3
    polarity = TextBlob(sentence).sentences[0].polarity #4
    return jsonify(                                      #5
        sentence=sentence,
        polarity=polarity
    )
if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)                #6

  1. Inicializimi i objektit Flask.
  2. Caktimi i adresës për të kryer kërkesat POST ndaj saj.
  3. Ekstraktimi i pronës sentence nga trupi i kërkesës.
  4. Inicializimi i objektit anonim TextBlob dhe marrja e vlerës polarity për propozimin e parë që ka ardhur në trupin e kërkesës (në këtë rast është një propozim i vetëm që po dërgohet për analizë).
  5. Kthimi i përgjigjes, në trupin e së cilës përmban tekstin e propozimit dhe treguesin e llogaritur për të. polarity.
  6. Nisja e aplikacionit Flask, i cili do të jetë i aksesueshëm në adresën 0.0.0.0:5000 (mund të aksesoni atë edhe me një strukturë të tillë si localhost:5000).

Tani mikroshërbimet, përbërëse të aplikacionit, janë aktivizuar. Ato janë të konfiguruara për të bashkëvepruar me njëra-tjetrën. Kështu duket skema e aplikacionit në këtë fazë të punës.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Të gjitha mikroshërbimet, përbërëse të aplikacionit, janë vënë në një gjendje funksionale.

Tani, para se tĂ« vazhdojmĂ«, hapni aplikacionin React nĂ« shfletues dhe provoni tĂ« analizoni njĂ« propozim me tĂ«. NĂ«se gjithçka Ă«shtĂ« bĂ«rĂ« siç duhet — pas klikimit tĂ« butonit Send do tĂ« shihni rezultatet e analizĂ«s nĂ«n fushĂ«n e tekstit.

Në seksionin e ardhshëm, do të flasim se si të nisni mikroshërbimet tona në konteinerët Docker. Kjo është e nevojshme për të përgatitur aplikacionin për t'u nisur në klasterin Kubernetes.

Konteinerët Docker

Kubernetes — Ă«shtĂ« njĂ« sistem pĂ«r automatizimin e shpĂ«rndarjes, shkallĂ«zimit dhe menaxhimit tĂ« aplikacioneve tĂ« kontenjerizuara. Njihet gjithashtu si "orkestra e kontenjerĂ«ve" (container orchestrator). NĂ«se Kubernetes punon me kontenjerĂ«, atĂ«herĂ« pĂ«rpara se ta pĂ«rdorim kĂ«tĂ« sistem, duhet sĂ« pari tĂ« kemi kĂ«ta kontenjerĂ«. Por fillimisht le tĂ« flasim pĂ«r atĂ« se çfarĂ« janĂ« kontenjerĂ«t. Mendoj se pĂ«rgjigjja mĂ« e mirĂ« pĂ«r pyetjen se çfarĂ« janĂ« mund tĂ« gjendet nĂ« dokumentacionin Docker:

Imazhi i kontenjerit është një paketë e lehtë, autonome dhe ekzekutueshme që përmban një aplikacion, duke përfshirë gjithçka të nevojshme për ekzekutimin e tij: kodin e aplikacionit, mjedisin e ekzekutimit, mjetet dhe bibliotekat e sistemit, konfigurimet. Aplikacionet e kontenjerizuara mund të përdoren në mjediset Linux dhe Windows, dhe ato gjithmonë do të funksionojnë njësoj pavarësisht nga infrastruktura.

Kjo do të thotë se kontenjerët mund të ekzekutohen në çdo kompjuter, përfshirë serverat e prodhimit, dhe në çdo mjedis, aplikacionet e mbyllura brenda tyre do të funksionojnë njësoj.

Për të hetuar karakteristikat e kontenjerëve dhe për t'i krahasuar ato me mënyra të tjera të ekzekutimit të aplikacioneve, le të shqyrtojmë shembullin e shërbimit të aplikacionit React duke përdorur një makinë virtuale dhe një kontenjer.

▍ ShĂ«rbimi i skedhave statike tĂ« aplikacionit React me mjete tĂ« makinĂ«s virtuale

Duke u përpjekur të organizojmë shërbimin e skedhave statike me mjetet e makinave virtuale, do të përballemi me këto disavantazhe:

  1. Përdorim joefektiv i burimeve, pasi çdo makinë virtuale përfaqëson një sistem operativ të plotë.
  2. Varësia nga platforma. Ajo që funksionon në ndonjë kompjuter lokal, mund të mos funksionojë në serverin e prodhimit.
  3. Shkallëzimi i ngadalshëm dhe kërkues për burime të zgjidhjeve të bazuara në makina virtuale.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Serveri web Nginx që shërben skedhat statike, i ekzekutuar në një makinë virtuale

Nëse për të zgjidhur një detyrë të ngjashme aplikojmë kontenjerë, atëherë, në krahasim me makinat virtuale, do të vërejmë këto pika të forta:

  1. Përdorim efektiv i burimeve: puna me sistemin operativ nëpërmjet Docker.
  2. Pavarësia nga platformat. Një kontenier që zhvilluesi mund ta ekzekutojë në kompjuterin e tij, do të funksionojë kudo.
  3. Instalimi i lehtë përmes përdorimit të shtresave të imazheve.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Serveri web Nginx, i cili shërben skedarë statikë, i nisur në kontenier

Ne i kemi krahasuar makinat virtuale me kontenierët vetëm në disa pika, por edhe kjo mjafton për të ndjerë forcën e madhe të kontenierëve. Këtu mund të gjeni detaje rreth kontenierëve Docker.

▍NdĂ«rtimi i imazhit tĂ« kontenierit pĂ«r aplikacionin React

Bloku kryesor i ndërtimit të kontenierit Docker është skedari Dockerfile. Në fillim të këtij skedari bëhet regjistrimi i imazhit bazë të kontenierit, pastaj përfshihen një sërë udhëzimesh që tregojnë rendin e ndërtimit të kontenierit, i cili do të përmbushë nevojat e një aplikacioni të caktuar.

Para se të fillojmë të punojmë me skedarin Dockerfile, kujtojmë atë që kemi bërë për të përgatitur skedarët e aplikacionit React për të qenë të vendosur në serverin Nginx:

  1. Ndërtimi i paketës së aplikacionit React (npm run build).
  2. Nisja e serverit Nginx.
  3. Kopjimi i përmbajtjes së drejtorisë build nga folderi i projektit sa-frontend në folderin e serverit nginx/html.

Më poshtë do të mund të shihni paralelizma midis krijimit të një konteneri dhe veprimeve të përshkruara më sipër, të kryera në kompjuterin lokal.

▍PĂ«rgatitja e skedarit Dockerfile pĂ«r aplikacionin SA-Frontend

Udhëzimet që do të përfshihen në Dockerfile për aplikacionin SA-Frontend, përbëhen vetëm nga dy komanda. Kjo është për shkak se grupi i zhvilluesve të Nginx ka përgatitur një bazë imazh për Nginx, që do të përdorim për të ndërtuar imazhin tonë. Ja ato dy hapa që duhet të përshkruajmë:

  1. Baza e imazhit duhet të jetë imazhi Nginx.
  2. Përmbajtja e folderit sa-frontend/build duhet të kopjohet në folderin e imazhit nginx/html.

Nëse kaloni nga ky përshkrim në skedarin Dockerfile, ai do të duket kështu:

FROM nginx
COPY build /usr/share/nginx/html

Siç e shihni, gjithçka këtu është shumë e thjeshtë, ndërkohë përmbajtja e skedarit rezulton të jetë mjaft e lexueshme dhe e kuptueshme. Ky skedar i tregon sistemit se çfarë duhet të marrë nga imazhi nginx me të gjithë atë që ka brenda, dhe të kopjojë përmbajtjen e drejtorisë build në direktorinë nginx/html.

KĂ«tu mund tĂ« keni njĂ« pyetje lidhur me se si e di se ku saktĂ«sisht duhet tĂ« kopjoj skedarĂ«t nga folderi build, pra — nga ku u mor rruga /usr/share/nginx/html. NĂ« tĂ« vĂ«rtetĂ«, edhe kĂ«tu nuk ka asgjĂ« tĂ« komplikuar. Kjo Ă«shtĂ« pĂ«r shkak se informacionet pĂ«rkatĂ«se mund tĂ« gjenden nĂ« pĂ«rshkrimin tĂ« imazhit.

▍NdĂ«rtimi i imazhit dhe ngarkimi i tij nĂ« depo

Para se të mund të punojmë me imazhin e gatshëm, na nevojitet ta dërgojmë atë në depo të imazheve. Për këtë, do të përdorim platformën falas të hostingut të imazheve Docker Hub. Në këtë fazë pune, ju lutem të bëni këto hapa:

  1. Instalo Docker.
  2. Regjistrohu në faqen e internetit Docker Hub.
  3. Hyni në llogarinë tuaj duke ekzekutuar në terminal komandën e këtij lloji:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

Tani na nevojitet të kalojmë në direktorinë sa-frontend dhe ta ekzekutojmë atje komandën e këtij lloji:

docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend .

Këtu dhe në vazhdim në komanda të ngjashme $DOCKER_USER_ID duhet të zëvendësohet me emrin tuaj të përdoruesit në Docker Hub. Për shembull, kjo pjesë e komandës mund të duket kështu: rinormaloku/sentiment-analysis-frontend.

Në të njëjtën kohë, kjo komandë mund të shkurtoshet duke hequr nga ajo -f Dockerfile, sepse në folderin ku ne ekzekutojmë këtë komandë, ky skedar tashmë është i pranishëm.

Për të dërguar imazhin e gatshëm në depo, na nevojitet komandë e tillë:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Pas ekzekutimit të saj, kontrolloni listën e depozitave tuaja në Docker Hub për të parë nëse ngarkimi i imazhit në ruajtjen e cloud ishte i suksesshëm.

▍Fillimi i kontejnerit

Tani kushdo mund të ngarkojë dhe të ekzekutojë imazhin, i njohur si $DOCKER_USER_ID/sentiment-analysis-frontend. Për ta bërë këtë, nevojitet të kryhen komandat e mëposhtme:

docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

Tani kontejneri është i ekzekutuar, dhe ne mund të vazhdojmë punën duke krijuar imazhe të tjera të nevojshme. Por, para se të vazhdojmë, le të kuptojmë strukturën 80:80, e cila shfaqet në komandën e startit të imazhit dhe mund të duket e paqartë.

  • Numri i parĂ« 80 Ă«shtĂ« numri i portit tĂ« hostit (dmth - kompjuterit lokal).
  • Numri i dytĂ« 80 Ă«shtĂ« porta e kontejnerit nĂ« tĂ« cilĂ«n kĂ«rkesa duhet tĂ« redirektohet.

Le ta shqyrtojmë ilustrimin e mëposhtëm.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Redirektimi i portave

Sistemi kryen redirektimin e kërkesave nga porta <hostPort> në portën <containerPort>. Pra, kërkesa për portin 80 e kompjuterit redirektohet në portin 80 e kontejnerit.

Pasi porta 80 është e hapur në kompjuterin lokal, mund ta qasni aplikacionin nga ky kompjuter me adresën localhost:80. Nëse sistemi juaj nuk mbështet Docker, aplikacioni mund të fillohet në një makinë virtuale Docker, adresë e së cilës do të duket si :80. Për të zbuluar adresën IP të makinës virtuale Docker, mund të përdorni komandën docker-machine ip.

Në këtë fazë, pas nisjes me sukses të kontejnerit të aplikacionit frontend, duhet të keni mundësi të hapni faqen e tij në shfletues.

▍Skedari .dockerignore

Duke ndërtuar imazhin e aplikacionit SA-Frontend, ne mund të kemi vënë re se ky proces është jashtëzakonisht i ngadaltë. Kjo ndodh për shkak se duhet të dërgohet konteksti i ndërtimit të imazhit te demoni Docker. Direktoriumi që përfaqëson kontekstin e ndërtimit përcaktohet nga argumenti i fundit i komandës docker build. Në rastin tonë, në fund të kësaj komande qëndron pika. Kjo sjell që në kontekstin e ndërtimit të përfshihet struktura si vijon:

sa-frontend:
|   .dockerignore
|   Dockerfile
|   package.json
|   README.md
+---build
+---node_modules
+---public
---src

Por na nevojitet vetëm dosja build. Ngarkimi i çfarëdo gjëje tjetër është një humbje e kotë kohe. Ndërtimi mund të shpejtohet duke i treguar Docker-it se cilat direktoriume mund të injorohen. Pikërisht për këtë na nevojitet skedari .dockerignore. Nëse jeni të njohur me skedarin .gitignore, struktura e këtij skedari, me siguri do t'ju duket e njohur. Ai përmban një listë direktoriumesh që sistemi i ndërtimit të imazhit mund t'i injorojë. Në rastin tonë, përmbajtja e këtij skedari duket kështu:

node_modules
src
public

Skeda .dockerignore duhet të jetë në të njëjtën dosje me skedarin Dockerfile. Tani ndërtimi i imazhit do të zgjasë vetëm disa sekonda.

Tani do të merremi me imazhin për aplikacionin Java.

▍NdĂ«rtimi i imazhit tĂ« kontejnerit pĂ«r aplikacionin Java

E dini, në të vërtetë keni studiuar gjithçka të nevojshme për të krijuar imazhe kontejnerësh. Prandaj ky seksion do të jetë shumë i shkurtër.

Hapni skedarin Dockerfile, i cili ndodhet në dosjen e projektit sa-webapp. Nëse e lexoni tekstin e këtij skedari, do të gjeni vetëm dy konstrukte të reja që fillojnë me fjalët kyçe ENV dhe EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000


EXPOSE 8080

Fjala kyçe ENV lejon të deklaroni variabla mjedisi brenda kontejnerëve Docker. Në veçanti, në rastin tonë, ajo lejon të caktoni URL-në për qasje në API-në e aplikacionit, që kryen analizën e teksteve.

Fjala kyçe EXPOSE lejon të tregojë Docker se cilin port duhet ta hapë. Ne do të përdorim këtë port gjatë punës me aplikacionin. Mund ta vëreni që në Dockerfile për aplikacionin SA-Frontend nuk ka një komandë të tillë. Kjo nevojitet vetëm për qëllime dokumentimi, në fjalë të tjera, kjo konstrukcion është e destinuar për ata që do të lexojnë Dockerfile.

NdĂ«rtimi i imazhit dhe dĂ«rgimi i tij nĂ« depo duket pikĂ«risht si nĂ« shembullin e mĂ«parshĂ«m. NĂ«se ende nuk jeni shumĂ« tĂ« sigurt nĂ« aftĂ«sitĂ« tuaja – komandat pĂ«rkatĂ«se mund t'i gjeni nĂ« skedarin README.md nĂ« dosjen sa-webapp.

▍NdĂ«rtimi i imazhit tĂ« kontejnerit pĂ«r aplikacionin Python

Nëse shikoni përmbajtjen e skedarit Dockerfile në dosjen sa-logic, nuk do të gjeni asgjë të re për vetë. Komandat për ndërtimin e imazhit dhe dërgimin e tij në depo gjithashtu duhet të jenë të njohura për ju, por ato, ashtu si në rastin e aplikacioneve tona të tjera, mund të gjenden në skedarin README.md në dosjen sa-logic.

▍Testimi i aplikacioneve tĂ« kontenierizuara

A mund të besoni në diçka që nuk e keni testuar? As unë nuk mundem. Le të provojmë kontejnerët tanë.

  1. Le të fillojmë kontejnerin e aplikacionit sa-logic dhe ta konfigurojmë atë për të dëgjuar në portin 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. Le të fillojmë kontejnerin e aplikacionit sa-webapp dhe ta konfigurojmë atë për të dëgjuar në portin 8080. Për më tepër, na nevojitet të konfirmojmë portin në të cilin aplikacioni Python do të presë kërkesat nga aplikacioni Java, duke rishikuar variablin e ambientit SA_LOGIC_API_URL:
    $ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

PĂ«r tĂ« mĂ«suar se si tĂ« gjej IP-adresĂ«n e kontejnerit ose tĂ« makinerisĂ« virtuale Docker – referohuni nĂ« skedarin README.

Le të fillojmë kontejnerin e aplikacionit sa-frontend:

docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend

Tani gjithçka është gati për të hyrë në shfletues në adresën localhost:80 dhe të testoni aplikacionin.

Vini re se nëse e keni ndryshuar portin për sa-webapp, ose nëse po punoni me një makinë virtuale Docker, do t'ju nevojitet të redaktoni skedarin App.js në dosjen sa-frontend, duke ndërruar IP-adresën ose numrin e portit në metodën analyzeSentence(), duke zëvendësuar të dhënat e vjetruara me të dhëna të sakta. Pas kësaj, duhet ta rindërtoni imazhin dhe ta përdorni atë.

Ja si duket skema e aplikacionit tonë tani.

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët
Mikrosherbimet ekzekutohen në kontejnerë

Përmbledhje: përse na nevojitet Kubernetes cluster?

Së fundi, ne kemi shqyrtuar skedarët Dockerfile, folëm për mënyrën e ndërtimit të imazheve dhe dërgimit të tyre në depo Docker. Përveç kësaj, mësuam si të përshpejtojmë ndërtimin e imazheve duke përdorur skedarin .dockerignore. Në fund, mikroshërbimet tona tani ekzekutohen në kontejnerët Docker. Këtu mund t'ju lindë një pyetje e drejtë përse na nevojitet Kubernetes. Përgjigjia për këtë pyetje do t'i kushtohet pjesës së dytë të këtij materiali. Ndërkohë, mendoni për pyetjen e mëposhtme:
Supozoni se aplikacioni ynĂ« web pĂ«r analizĂ«n e teksteve Ă«shtĂ« bĂ«rĂ« i njohur nĂ« tĂ« gjithĂ« botĂ«n. Çdo minutĂ«, miliona kĂ«rkesa i drejtohen atij. Kjo do tĂ« thotĂ« se mikroshĂ«rbimet sa-webapp dhe sa-logic do tĂ« jenĂ« nĂ«n njĂ« ngarkesĂ« tĂ« madhe. Si mund ta shkallĂ«zojmĂ« kontejnerĂ«t, nĂ« tĂ« cilĂ«t ekzekutohen mikroshĂ«rbimet?

Udhëzuesi për Kubernetes, pjesa 1: aplikacionet, mikroshërbimet dhe kontejnerët

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster