Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë

Me kërkesën tonë, Habr krijoi një hub Kubernetes dhe na vjen mirë që publikojmë publikimin e parë aty. Abonohuni!

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

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë

NĂ«se dyshoni se Kubernetes mund tĂ« mĂ«sohet kaq shpejt — ju lutem, provoni ta bĂ«ni vetĂ«. PikĂ«risht, duke zotĂ«ruar kĂ«tĂ« material, do tĂ« jeni nĂ« gjendje tĂ« lançoni njĂ« aplikacion tĂ« bazuar nĂ« mikroshĂ«rbime nĂ« njĂ« grup Kubernetes. Mund ta garantoj kĂ«tĂ«, sepse me kĂ«tĂ« metodologji, e cila Ă«shtĂ« pĂ«rdorur kĂ«tu, unĂ« i mĂ«soj klientĂ«t tanĂ« si tĂ« punojnĂ« me Kubernetes. ÇfarĂ« e ndan kĂ«tĂ« udhĂ«zues nga tĂ« tjerĂ«t? NĂ« tĂ« vĂ«rtetĂ« — shumĂ« gjĂ«ra. NjĂ«soj si shumica e materialeve tĂ« tilla, ata fillojnĂ« me shpjegimin e gjĂ«rave tĂ« thjeshta — koncepteve tĂ« Kubernetes dhe veçorive tĂ« komandĂ«s kubectl. AutorĂ«t e kĂ«tyre materialeve mendojnĂ« se lexuesi i tyre Ă«shtĂ« i njohur me zhvillimin e aplikacioneve, me mikroshĂ«rbimet dhe me konteinerĂ«t Docker. Ne do tĂ« ndjekim njĂ« rrugĂ« tjetĂ«r. SĂ« pari, do t'i tregojmĂ« se si tĂ« lançoni njĂ« aplikacion tĂ« bazuar nĂ« mikroshĂ«rbime nĂ« kompjuterin tuaj. MĂ« pas do tĂ« shqyrtojmĂ« ndĂ«rtimin e imazheve tĂ« konteinerĂ«ve pĂ«r secilin mikroshĂ«rbim. Pas kĂ«saj, do tĂ« njohim Kubernetes dhe do tĂ« shqyrtojmĂ« lançimin e aplikacionit tĂ« bazuar nĂ« mikroshĂ«rbime nĂ« njĂ« grup tĂ« menaxhuar nga Kubernetes.

Ky qasje, me afrim gradual ndaj Kubernetes, do t'i japë një thellësi kuptimi situatës që i nevojitet një personi të zakonshëm për të kuptuar se si e thjeshtë është gjithçka në Kubernetes. Kubernetes është, pa dyshim, një teknologji e thjeshtë, nëse dikush që dëshiron ta mësojë e di se ku dhe si përdoret ajo.

Tani, pa fjalë të tepërta, 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. Ai merr si input një fjali, dhe më pas, duke përdorur mjete analize teksti, bën analizën e emocioneve (sentiment analysis) të asaj fjali, duke marrë një vlerësim të qëndrimit emocional të autorit ndaj një objekti të caktuar.

Ja si duket dritarja kryesore e këtij aplikacioni.

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Aplikacioni web për analizën e emocioneve të teksteve

Nga pikëpamja teknike, aplikacioni përbëhet nga tre mikroshërbime, secili prej të cilëve zgjidh një grup të caktuar detyrash:

  • SA-Frontend — serveri web Nginx, i cili shĂ«rben skedarĂ«t statikĂ« tĂ« React.
  • SA-WebApp — aplikacioni web, i shkruar nĂ« Java, i cili trajton kĂ«rkesat nga frontend-i.
  • SA-Logic — aplikacioni Python qĂ« kryen analizĂ«n e emocioneve tĂ« tekstit.

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

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Fluxet e të dhënave në aplikacion

Në diagramin e mësipërm mund të shihni fazat e numëruara të punës së sistemit, që ilustrojnë fluxet e të dhënave në aplikacion. Le t'i shqyrtojmë ato:

  1. Shfletuesi kërkon nga serveri një skedar index.html (i cili, nga ana e tij, shkarkon paketën e aplikacionit React).
  2. Përdoruesi interagoon me aplikacionin, e cila shkakton një kërkesë në aplikacionin web të bazuar në Spring.
  3. Aplikacioni web redirekton kërkesën për analizimin e tekstit në aplikacionin Python.
  4. Aplikacioni Python kryen analizën e emocioneve të tekstit dhe kthen rezultatin si përgjigje për kërkesën.
  5. Aplikacioni Spring dërgon përgjigjen në aplikacionin React (dhe ai, nga ana e tij, tregon rezultatin e analizës së tekstit për përdoruesin).

Kodi për të gjitha këto aplikacione mund të gjendet këtu. Ju rekomandoj që tani të kopjoni këtë repository për vete, pasi para nesh na presin shumë eksperimente interesante me të.

Lançimi i aplikacionit të bazuar në mikroshërbime në kompjuterin lokal

PĂ«r tĂ« bĂ«rĂ« qĂ« aplikacioni tĂ« funksionojĂ«, na nevojitet tĂ« lançojmĂ« tĂ« tre mikroshĂ«rbimet. Le tĂ« fillojmĂ« me atĂ« mĂ« tĂ« bukur nga ta — aplikacionin frontend.

▍Konfigurimi i React pĂ«r zhvillim lokal

Për të lançuar aplikacionin React, duhet të instaloni platformën Node.js dhe NPM në kompjuterin tuaj. Pasi të keni bërë këtë, kaloni, duke përdorur terminalin, 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, për të cilat ka shënime në skedarin package.json. Pasi të ketë përfunduar shkarkimi i varësive, në të njëjtin folder ekzekutoni këtë komandë:

npm start

Kjo është gjithçka. Tani aplikacioni React është lançuar, dhe mund ta aksesoni, duke shkuar në shfletues në adresën localhost:3000. Mund të bëni disa ndryshime në kodin e tij. Efekti i këtyre ndryshimeve do ta shihni menjëherë në shfletues. Kjo është e mundur falë asaj që quhet "ndërrim i nxehtë" të moduleve. Kështu, zhvillimi i frontend-it bëhet një aktivitet i thjeshtë dhe i këndshëm.

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

PĂ«r qĂ«llime reale tĂ« pĂ«rdorimit tĂ« aplikacionit React, na nevojitet qĂ« ta transformojmĂ« atĂ« nĂ« njĂ« grup skedash statike dhe t’ua ofrojmĂ« ato klientĂ«ve duke pĂ«rdorur njĂ« server web.

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

npm run build

Kjo do të krijojë në dosjen e projektit një direktorium ndërto. Aty do të përmbahen të gjithë skedarët statikë të nevojshëm për funksionimin e aplikacionit React.

▍Menaxhimi i skedave Statike me Nginx

Së pari, duhet të instaloni dhe të filloni serverin web Nginx. Këtu mund ta shkarkoni dhe të gjeni udhëzime për instalimin dhe fillimin. Pastaj duhet të kopjoni përmbajtjen e dosjes sa-frontend/build në dosjen [your_nginx_installation_dir]/html.

Me këtë qasje, skedari i gjeneruar gjatë ndërtimit të aplikacionit React index.html do të jetë i disponibilizuar në adresën [your_nginx_installation_dir]/html/index.html. Ky është skedari që, për parazgjedhje, serveri Nginx e ofron kur i qaset. Serveri është i konfiguruar për të dëgjuar në portin 80, por mund ta konfigurosh ashtu si dëshiron, duke e redaktuar 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: aplikacione, mikroshërbime dhe konteinerë
Aplikacioni React, i menaxhuar nga serveri Nginx

NĂ«se tani shkruani diçka nĂ« fushĂ«n Type your sentence dhe klikoni nĂ« butonin Send — nuk do tĂ« ndodhĂ« asgjĂ«. Por, nĂ«se shikoni nĂ« konsolĂ«, aty mund tĂ« shihni mesazhe gabimesh. NĂ« mĂ«nyrĂ« qĂ« tĂ« kuptojmĂ« se ku ndodhin kĂ«to gabime, do ta analizojmĂ« kodin e aplikacionit.

▍Analiza e Kodit tĂ« Aplikacionit tĂ« Frontend-it

Duke parĂ« kodin e skedarit App.js, mund tĂ« shohim se kur shtypet butoni Send thirr njĂ« metodĂ« analyzeSentence(). Kodi i kĂ«tij metodi Ă«shtĂ« renditur mĂ« poshtĂ«. Vini re se çdo rresht qĂ« ka njĂ« koment tĂ« tipit # ĐĐŸĐŒĐ”Ń€, ka njĂ« shpjegim tĂ« dhĂ«nĂ« mĂ« poshtĂ« kodit. Dhe po ashtu do tĂ« analizojmĂ« edhe fragmente 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-ja, në të cilën kryhet kërkesa POST. Supozohet se në këtë adresë ndodhet aplikacioni që pret kërkesa të tilla.

2.Trupi i kërkesës, i dërguar në aplikacion. Ja një shembull i trupit të kërkesës:

{
    sentence: "I like yogobella!"
}

3.Kur marrim pĂ«rgjigje ndaj kĂ«rkesĂ«s, pĂ«rditĂ«sohet gjendja e komponentit. Kjo shkakton rinovimin e komponentit. NĂ«se marrim tĂ« dhĂ«na (dmth — njĂ« objekt JSON qĂ« pĂ«rmban tĂ« dhĂ«nat e futura dhe vlerĂ«simin e llogaritur tĂ« tekstit), ne do ta nxjerrim komponentin Polarity, pasi do tĂ« pĂ«rmbushen kushtet pĂ«rkatĂ«se. Ja si e pĂ«rshkruajmĂ« komponentin:

const polarityComponent = this.state.polarity !== undefined ?
    <Polarity sentence={this.state.sentence} 
              polarity={this.state.polarity}/> :
    null;

Kodi, siç duket, duket krejt funksional. ÇfarĂ« po shkon keq? NĂ«se mendoni se nĂ« adresĂ«n ku aplikacioni tenton tĂ« dĂ«rgojĂ« kĂ«rkesĂ«n POST, nuk ka asgjĂ« qĂ« mund ta pranojĂ« dhe ta pĂ«rpunojĂ« atĂ«, do tĂ« jeni plotĂ«sisht tĂ« drejtĂ«. Pra, pĂ«r tĂ« trajtuar kĂ«rkesat qĂ« vijnĂ« nĂ« adresĂ«n http://localhost:8080/sentiment, na nevojitet tĂ« nisim njĂ« aplikacion web, tĂ« bazuar nĂ« Spring.

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Na nevojitet një aplikacion Spring, i aftë të pranojë kërkesën POST

▍Konfigurimi i Aplikacionit Web, tĂ« Bazuar nĂ« Spring

PĂ«r tĂ« nisur njĂ« aplikacion Spring, do t’ju nevojitet JDK8 dhe Maven dhe variablat e duhura mjedisi tĂ« konfiguruara. Pasi tĂ« keni instaluar tĂ« gjitha kĂ«to, mund tĂ« vazhdoni me projektin tonĂ«.

▍Grumbullimi i Aplikacionit nĂ« njĂ« skedar jar

Kaloni, me anë të terminalit, në dosjen sa-webapp dhe shkruani komandën e mëposhtme:

mvn install

Pas ekzekutimit të kësaj komande, në dosjen sa-webapp do të krijohet një direktorium target. Këtu do të gjeni aplikacionin Java, të paketuar në një skedar jar, të paraqitur nga skedari sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍Nisja e Aplikacionit Java

Kaloni në dosjen target dhe nisni aplikacionin me komandën e mëposhtme:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar

Gjatë ekzekutimit të kësaj komande, do të ndodhi një gabim. Për të filluar rregullimin e tij, mund ta analizojmë informacionin për përjashtimin në të dhënat e gjurmës së stack-ut:

Error creating bean with name 'sentimentController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'sa.logic.api.url' in value "${sa.logic.api.url}"

Për ne, ajo që ka më shumë rëndësi është përmendja e pamundësisë për të zbuluar vlerën sa.logic.api.url. Le të analizojmë kodin ku ndodh gabimi.

▍Analiza e kodit tĂ« aplikacionit Java

Ja nje fragment kodi ku 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 saj vendoset me pronën sa.logic.api.url.
  2. Vargu saLogicApiUrl e cila konkatenohet me vlerën /analyse/sentiment. Të dyja formojnë adresën për të realizuar thirrjen në mikrosherbimin 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 vetme për të caktuar vlerat e pronave. Këtë mund ta bëjmë edhe me një komandë të tillë:

java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URL

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

Duke e konfiguruar atë, i japim informacion aplikacionit web Spring se ku duhet të dergojë kërkesat për analizën e tekstit.

Për të mos e komplikuar situatën, do të vendosim që aplikacioni Python do të jetë në dispozicion në adresën localhost:5000 dhe do të përpiqemi të mos e harrojmë këtë. Ndërkohë, 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: aplikacione, mikroshërbime dhe konteinerë
Sistemi ynë u mungon aplikacioni Python

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

▍Konfigurimi i aplikacionit Python

Për të nisim aplikacionin Python, duhet të keni të instaluar Python 3 dhe Pip, dhe duhet që variablat përkatës të jenë të konfiguruar siç duhet.

▍Instalimi i varĂ«sive

Shkoni në dosjen e projektit sa-logic/sa dhe ekzekutoni komandat e mëposhtme:

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

▍Nisja e aplikacionit

Pas instalimit të varësive, jemi gati të nisim aplikacionin:

python sentiment_analysis.py

Pas ekzekutimit të kësaj komande do të na njoftojnë se:

* Duke funksionuar në http://0.0.0.0:5000/ (Shtypni CTRL+C për të dalë)

Kjo tregon se aplikacioni është nisur dhe pret kërkesa në adresën localhost:5000/

▍Hulumtimi i kodit

Le të shqyrtojmë kodin e aplikacionit Python për të kuptuar se si ai 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 kryerjen e POST-requests.
  3. Nxjerrja e pronës sentence nga trupi i kërkesës.
  4. Inicializimi i objektit anonim TextBlob dhe marrja e vlerës polarity për_SENTENCE_ që ka ardhur e para në trupin e kërkesës (në rastin tonë është një fjali e vetme që dërgohet për analizë).
  5. Kthimi i përgjigjes, në trupin e të cilës përfshihet teksti i fjalës dhe treguesi i llogaritur për të. polarity.
  6. Nisja e aplikacionit Flask, i cili do të jetë në dispozicion në adresën 0.0.0.0:5000 (mund ta kontaktoni edhe duke përdorur ndonjë strukturë si localhost:5000).

Tani mikrosherbimet, nga të cilat përbëhet aplikacioni, janë nisur. Ato janë konfiguruar për të bashkëpunuar me njëra-tjetrën. Këtu është si duket skema e aplikacionit në këtë fazë të funksionimit.

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Të gjitha mikrosherbimet, nga të cilat përbëhet aplikacioni, janë të gatshme për të punuar.

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

Në seksionin e ardhshëm do të flasim se si t'i nisni mikrosherbimet tona në konteinerë Docker. Kjo është e nevojshme për të përgatitur aplikacionin për nisje në klasterin Kubernetes.

Kontainerët Docker

Kubernetes — janĂ« njĂ« sistem pĂ«r automatizimin e shpĂ«rndarjes, shkallĂ«zimit dhe menaxhimit tĂ« aplikacioneve tĂ« kontenerizuara. Quhet gjithashtu "orchestrator i konteinerĂ«ve" (container orchestrator). NĂ«se Kubernetes punon me konteinerĂ«, na duhet qĂ« para se tĂ« pĂ«rdorim kĂ«tĂ« sistem, sĂ« pari tĂ« sigurojmĂ« kĂ«ta konteinerĂ«. Por fillimisht le tĂ« flasim se çfarĂ« janĂ« konteinerĂ«t. Mbase, pĂ«rgjigjja mĂ« e mirĂ« pĂ«r pyetjen se çfarĂ« Ă«shtĂ« kjo, mund tĂ« gjendet nĂ« dokumentacion nĂ« Docker:

Pamja e kontenierit është një paketë e lehtë, autonome dhe ekzekutueshme që përmban një aplikacion, e cila përfshin gjithçka të nevojshme për ta nisur atë: kodin e aplikacionit, mjedisin e ekzekutimit, mjetet dhe bibliotekat sistemike, si dhe konfigurimet. Programet e kontenierizuara mund të përdoren në mjedise Linux dhe Windows, dhe gjithmonë do të funksionojnë njësoj pavarësisht nga infrastruktura.

Kjo do të thotë se kontenierët mund të ekzekutohen në çdo kompjuter, përfshirë serverat e prodhimit, dhe në çdo mjedis aplikacionet e përfshira do të punojnë njësoj.

PĂ«r tĂ« eksploruar veçoritĂ« e kontenierĂ«ve dhe pĂ«r t’i krahasuar ato me metoda tĂ« tjera tĂ« ekzekutimit tĂ« aplikacioneve, le tĂ« shqyrtojmĂ« shembullin e shĂ«rbimit tĂ« njĂ« aplikacioni React duke pĂ«rdorur njĂ« makinĂ« virtuale dhe njĂ« kontenier.

▍ShĂ«rbimi i skedarĂ«ve statikĂ« tĂ« aplikacionit React me ndihmĂ«n e makinĂ«s virtuale

Duke u përpjekur të organizojmë shërbimin e skedarëve statikë përmes makinave virtuale, do të përballemi me këto mangësi:

  1. Përdorimi joefikas 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. Përmasime të ngadalta dhe kërkuese për burime për zgjidhjet e bazuara në makina virtuale.

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Serveri i uebit Nginx, që shërben skedarët statikë, i nisur në një makinë virtuale.

Nëse përdorim kontenierë për zgjidhjen e njëjtë, krahasuar me makinat virtuale, mund të vërehet kjo forcë e tyre:

  1. Përdorim efikas të burimeve: puna me sistemin operativ përmes Docker.
  2. Pavarësia nga platforma. Një kontenier që zhvilluesi mund ta nisë në kompjuterin e tij do të funksionojë kudo.
  3. Instalimi i lehtë për shkak të përdorimit të katërveçorive.

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Serveri i uebit Nginx, që shërben skedarët statikë, i nisur në një kontenier.

Ne kemi krahasuar makinat virtuale dhe kontenierët vetëm për disa pika, por edhe kjo është e mjaftueshme për të ndjerë forcat e kontenierëve. Këtu mund të gjeni detaje në lidhje me kontenierët Docker.

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

Blloku themelor i ndërtimit të kontenierit Docker është skedari Dockerfile. Në fillim të këtij skedari regjistrohet imazhi themelor të kontenierit, pastaj përfshihen një sërë udhëzimesh që tregojnë rendin e ndërtimit të kontenierit sipas nevojave të aplikacionit.

Para se të fillojmë punën me skedarin Dockerfile, le të kujtojmë se çfarë kemi bërë për të përgatitur skedarët e aplikacionit React për së bashku 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ë ndërto nga dosja e projektit sa-frontend në dosjen e serverit nginx/html.

Më poshtë do të shihni paralelet midis krijimit të kontenierit dhe veprimeve të mëparshme që janë kryer në kompjuterin lokal.

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

Udhëzimet që do të përmbahen në Dockerfile për aplikacionin SA-Frontend, përbëhen nga vetëm dy urdhra. Kjo është për shkak se grupi i zhvilluesve të Nginx kreu një bazë imazhi për Nginx, që ne do ta përdorim për të ndërtuar imazhin tonë. Ja dy hapat që na nevojiten për të përshkruar:

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

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

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

Siç e shihni, gjithçka është shumë e thjeshtë, ndërsa përmbajtja e skedarit duket madje edhe e lexueshme dhe e kuptueshme. Ky skedar i thotë sistemit se duhet të marrë imazhin nginx me gjithçka që ka brenda dhe të kopjojë përmbajtjen e drejtorisë ndërto në drejtorinë nginx/html.

KĂ«tu mund tĂ« keni njĂ« pyetje nĂ« lidhje me atĂ« se si e di se ku duhet tĂ« kopjohen skedarĂ«t nga dosja ndĂ«rto, dmth — nga erdhi rruga /usr/share/nginx/html. NĂ« tĂ« vĂ«rtetĂ«, asgjĂ« nuk Ă«shtĂ« e komplikuar. Informacionet pĂ«rkatĂ«se mund tĂ« gjenden nĂ« pĂ«rshkrimin imazhit.

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

Para se të mund të punojmë me imazhin e gatshëm, na nevojitet ta dërgojmë atë në repositorin e imazheve. Për këtë do të përdorim platformën falas të hapësirës për hostimin e imazheve Docker Hub. Në këtë fazë pune ju nevojitet të bëni si më poshtë:

  1. Instalo Docker.
  2. Regjistroni veten në faqen e internetit të Docker Hub.
  3. Hyni në llogari duke ekzekutuar në terminal komandën e mëposhtme:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

Tani duhet, përmes terminalit, të kaloni në drejtorinë sa-frontend dhe të ekzekutoni aty komandën e mëposhtme:

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

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

Në këtë rast, komanda mund të shkurtëzohet duke e hequr -f Dockerfile, pasi në dosjen 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 një komandë e tillë:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Pas ekzekutimit të saj, kontrolloni listën e depozita-ve tuaja në Docker Hub për të kuptuar nëse dërgimi i imazhit në ruajtjen në cloud ishte i suksesshëm.

▍Nisja e kontejnerit

Tani, çdokush mund të shkarkohet dhe të nisë imazhin e njohur si $DOCKER_USER_ID/sentiment-analysis-frontend. Për ta bërë këtë, duhet të ekzekutoni rendin e komandave si më poshtë:

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

Tani kontejneri është i nisur, dhe ne mund të vazhdojmë punën duke krijuar imazhe të tjera të nevojshme për ne. Por përpara se të vazhdojmë, le të kuptojmë strukturën 80:80, e cila shfaqet në komandën e nisjes së imazhit dhe mund të duket e paqartë.

  • Numri i parĂ« 80 Ă«shtĂ« numri i portĂ«s sĂ« hostit (dmth kompjuteri lokal).
  • Numri i dytĂ« 80 Ă«shtĂ« porta e kontejnerit nĂ« tĂ« cilin duhet tĂ« redirektohet kĂ«rkesa.

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

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Redirektimi i porteve

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

Pasi porta 80 është e hapur në kompjuterin lokal, mund të aksesoni aplikacionin nga ky komputer në adresën localhost:80. Nëse sistemi juaj nuk mbështet Docker, aplikacioni mund të niset në një makinë virtuale Docker, adresa e të cilës do të jetë diçka si :80. Për të gjetur adresën IP të makinës virtuale Docker, mund të përdorni komandën docker-machine ip.

Në këtë pikë, pas nisjes së suksesshme të kontejnerit të aplikacionit frontend, duhet të keni mundësinë ta hapni faqen e saj në shfletues.

▍Skedari .dockerignore

Duke e ndërtuar imazhin e aplikacionit SA-Frontend, mund të kemi vërejtur që ky proces rezulton të jetë shumë i ngadalshëm. Kjo ndodh sepse demonit Docker i duhet të dërgohet konteksti i ndërtimit të imazhit. Direktoria që përfaqëson kontekstin e ndërtimit caktohet si argumenti i fundit i komandës docker build. Në rastin tonë, në fund të kësaj komande është pika. Kjo bën që struktura e ndërtimit të përfshijë:

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

Por, nga të gjitha dosjet e pranishme këtu, na nevojitet vetëm dosja ndërto. Ngarkimi i çfarëdo gjëje tjetër është një humbje e kotë kohe. Procesi i ndërtimit mund të përshpejtohet duke e udhëzuar Docker-in se cilat direktori mund të injorohen. Pikërisht për këtë arsye kemi nevojë për skedarin .dockerignore. Nëse jeni të njohur me skedarin .gitignore, struktura e këtij skedari sigurisht që do t'ju duket e njohur. Ai përmban një listë të direktoreve që sistemi i ndërtimit të imazhit mund të injorojë. Në rastin tonë, përmbajtja e këtij skedari duket kështu:

node_modules
src
public

Skedari .dockerignore duhet të jetë në të njëjtën dosje si skedari 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 çfarë, ju tashmë keni studiuar gjithçka të nevojshme për krijimin e imazheve të kontejnerëve. 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 përmbajtjen e këtij skedari, do të takoni vetëm dy konstrukte të reja, të cilat fillojnë me fjalët kyçe ENV dhe EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000


EXPOSE 8080

Fjala kyçe ENV lejon shpalljen e variablave të mjedisit brenda kontejnerëve Docker. Në veçanti, në rastin tonë, ajo lejon të caktohet URL për aksesin në API-në e aplikacionit që kryen analizën e tekstit.

Fjala kyçe EXPOSE lejon Docker-in të dijë se çfarë porte duhet të hapë. Ne do ta përdorim këtë port gjatë punës me aplikacionin. Këtu mund të vëreni që në Dockerfile për aplikacionin SA-Frontend nuk ka një komandë të tillë. Kjo është e nevojshme vetëm për qëllime dokumentimi, me fjalë të tjera, ky konstruktion është për ata që do ta 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 të sigurt për aftësitë tuaja, komandat përkatëse mund të gjenden 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 aty. Komandat për ndërtimin e imazhit dhe dërgimin e tij në depo gjithashtu duhet të jenë tashmë të njohura për ju, por ato, ashtu si në rastet e tjera të aplikacioneve tona, mund të gjenden në skedarin README.md në dosjen sa-logic.

▍Testimi i aplikacioneve tĂ« kontenjerizuar

A mund të besosh diçka që nuk e ke testuar? Edhe unë nuk mundem. Le të testojmë kontenjerët tanë.

  1. Le të nisim kontenjerin 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ë nisim kontenjerin e aplikacionit sa-webapp dhe ta konfigurojmë atë për të dëgjuar në portin 8080. Gjithashtu, na nevojitet të konfigurojmë portin në të cilin aplikacioni Python do të presë kërkesat nga aplikacioni Java, duke rimarrë variablin e mjedisit 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 si të gjejmë adresën IP të kontenjerit ose makinerisë virtuale Docker - referojuni skedarit README.

Le të nisim kontenjerin 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 për të testuar aplikacionin.

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

Këtu është se si duket skema e aplikacionit tonë tani.

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë
Mikrosherbime funksionojnë në kontenjerë

Përmbledhje: pse na nevojitet klusteri Kubernetes?

Sapo studiuam skedarĂ«t Dockerfile, folĂ«m pĂ«r si tĂ« ndĂ«rtojmĂ« imazhe dhe t'i dĂ«rgojmĂ« ato nĂ« repozitorinĂ« Docker. Gjithashtu, mĂ«suam si tĂ« pĂ«rshpejtojmĂ« ndĂ«rtimin e imazheve duke pĂ«rdorur skedarin .dockerignore. Si rezultat, mikrosherbimet tona tani funksionojnĂ« nĂ« kontenjerĂ« Docker. KĂ«tu mund t’ju vijĂ« njĂ« pyetje e arsyeshme: pse na nevojitet Kubernetes? Pjesa e dytĂ« e kĂ«tij materiali do t’i kushtohet kĂ«tij pyetje. NdĂ«rkohĂ«, mendoni pĂ«r pyetjen e mĂ«poshtme:
Supozoni se aplikacioni ynĂ« web pĂ«r analizĂ«n e teksteve Ă«shtĂ« bĂ«rĂ« popullor nĂ« mbarĂ« botĂ«n. Çdo minutĂ«, miliona kĂ«rkesa i vijnĂ« atij. Kjo do tĂ« thotĂ« se mikrosherbimet sa-webapp dhe sa-logic do tĂ« jenĂ« nĂ«n njĂ« ngarkesĂ« tĂ« madhe. Si ta shkallĂ«zojmĂ« kontenjerĂ«t nĂ« tĂ« cilat funksionojnĂ« mikrosherbimet?

Udhëzuesi për Kubernetes, pjesa 1: aplikacione, mikroshërbime dhe konteinerë

Burimi: habr.com

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