Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici

Habr je na naš zahtjev napravio hub Kubernetes i sa zadovoljstvom u njemu postavljamo prvu publikaciju. Pretplatite se!

Kubernetes je jednostavan. Zašto mi banke plaćaju puno novca za rad u ovom području, a svatko može savladati ovu tehnologiju u samo nekoliko sati?

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici

Ako sumnjate da se Kubernetes može tako brzo naučiti, predlažem da to pokušate učiniti sami. Naime, svladavanjem ovog gradiva moći ćete pokrenuti aplikaciju temeljenu na mikroservisima u Kubernetes klasteru. To mogu jamčiti jer u istoj metodologiji koju ovdje koristim podučavam naše klijente kako raditi s Kubernetesom. Po čemu se ovaj vodič razlikuje od ostalih? Zapravo, mnogo toga. Dakle, većina ovih materijala počinje objašnjenjem jednostavnih stvari - koncepata Kubernetesa i značajki naredbe kubectl. Autori ovih članaka pretpostavljaju da je njihov čitatelj upoznat s razvojem aplikacija, mikroservisima i Docker spremnicima. Ići ćemo drugim putem. Prvo, razgovarajmo o tome kako pokrenuti aplikaciju temeljenu na mikroservisima na računalu. Zatim ćemo pogledati slike spremnika izgradnje za svaku mikroservis. A nakon toga ćemo se upoznati s Kubernetesom i analizirati implementaciju aplikacije temeljene na mikroservisima u klasteru kojim upravlja Kubernetes.

Ovakav pristup, uz postupno približavanje Kubernetesu, dat će dubinu razumijevanja onoga što se događa koja je potrebna prosječnom čovjeku da shvati koliko je jednostavno sve posloženo u Kubernetesu. Kubernetes je svakako jednostavna tehnologija, pod uvjetom da onaj tko je želi svladati zna gdje se i kako koristi.

Sada, bez daljnjeg odlaganja, krenimo na posao i razgovarajmo o aplikaciji s kojom ćemo raditi.

Eksperimentalna aplikacija

Naša aplikacija će obavljati samo jednu funkciju. Kao ulaz uzima jednu rečenicu, nakon čega pomoću alata za analizu teksta vrši sentimentalnu analizu te rečenice, dobivajući procjenu emocionalnog stava autora rečenice prema određenom objektu.

Ovako izgleda glavni prozor ove aplikacije.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Web aplikacija za analizu raspoloženja

S tehničkog gledišta, aplikacija se sastoji od tri mikroservisa od kojih svaki rješava određeni skup zadataka:

  • SA-Frontend je Nginx web poslužitelj koji poslužuje React statičke datoteke.
  • SA-WebApp je web aplikacija napisana u Javi koja obrađuje zahtjeve iz sučelja.
  • SA-Logic je Python aplikacija koja provodi analizu sentimenta teksta.

Važno je napomenuti da mikroservisi ne postoje izolirani. Oni provode ideju "odvajanja dužnosti", ali u isto vrijeme moraju komunicirati jedni s drugima.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Protok podataka u aplikaciji

Na gornjem dijagramu možete vidjeti numerirane stupnjeve sustava koji ilustriraju tokove podataka u aplikaciji. Razdvojimo ih:

  1. Preglednik traži datoteku od poslužitelja index.html (što zauzvrat učitava paket aplikacije React).
  2. Korisnik stupa u interakciju s aplikacijom, što uzrokuje poziv web aplikaciji temeljenoj na Springu.
  3. Web aplikacija prosljeđuje zahtjev za analizu teksta Python aplikaciji.
  4. Python aplikacija analizira sentiment teksta i vraća rezultat kao odgovor na zahtjev.
  5. Aplikacija Spring šalje odgovor aplikaciji React (koja, pak, korisniku prikazuje rezultat raščlanjenog teksta).

Kod za sve ove aplikacije može se pronaći здесь. Preporučam da odmah kopirate ovo spremište sebi jer je pred nama mnogo zanimljivih eksperimenata s njim.

Pokretanje aplikacije temeljene na mikroservisima na lokalnom računalu

Da bi aplikacija radila potrebno je pokrenuti sva tri mikroservisa. Počnimo s najljepšom od njih - front-end aplikacijom.

▍Postavljanje Reacta za lokalni razvoj

Kako biste pokrenuli React aplikaciju, trebate instalirati Node.js okvir i NPM na svoje računalo. Nakon što sve ovo instalirate, idite pomoću terminala u mapu projekta sa-frontend i pokrenite sljedeću naredbu:

npm install

Izvođenjem ove naredbe u mapi node_modules učitat će se ovisnosti React aplikacije čiji se zapisi nalaze u datoteci package.json. Nakon preuzimanja ovisnosti u istoj mapi, pokrenite sljedeću naredbu:

npm start

To je sve. Aplikacija React je sada pokrenuta i može joj se pristupiti navigacijom do adrese preglednika localhost:3000. Možete promijeniti nešto u njegovom kodu. Odmah ćete vidjeti učinak ovih promjena u pregledniku. To je moguće zahvaljujući takozvanoj "vrućoj" zamjeni modula. Zahvaljujući tome, front-end razvoj pretvara se u jednostavno i ugodno iskustvo.

▍Priprema React aplikacije za proizvodnju

U svrhu stvarnog korištenja React aplikacije, moramo je pretvoriti u skup statičkih datoteka i poslužiti ih klijentima koji koriste web poslužitelj.

Za izradu aplikacije React, opet pomoću terminala, idite do mape sa-frontend i pokrenite sljedeću naredbu:

npm run build

Ovo će stvoriti direktorij u mapi projekta build. Sadržat će sve statičke datoteke potrebne za rad aplikacije React.

▍Posluživanje statičkih datoteka s Nginxom

Prvo morate instalirati i pokrenuti Nginx web poslužitelj. Ovdje možete ga preuzeti i pronaći upute za instaliranje i pokretanje. Zatim trebate kopirati sadržaj mape sa-frontend/build u mapu [your_nginx_installation_dir]/html.

S ovim pristupom, datoteka generirana tijekom sklapanja React aplikacije index.html bit će dostupan na [your_nginx_installation_dir]/html/index.html. Ovo je datoteka koju, prema zadanim postavkama, Nginx poslužitelj izdaje kada joj pristupa. Poslužitelj je konfiguriran za slušanje na portu 80, ali je možete prilagoditi kako želite uređivanjem datoteke [your_nginx_installation_dir]/conf/nginx.conf.

Sada otvorite svoj preglednik i idite na localhost:80. Vidjet ćete stranicu aplikacije React.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
React aplikacija koju poslužuje Nginx poslužitelj

Ako sada unesete nešto u polje Type your sentence i pritisnite tipku Send - ništa se neće dogoditi. No, ako pogledate konzolu, tamo možete vidjeti poruke o pogrešci. Kako bismo razumjeli gdje se točno pojavljuju te pogreške, analizirajmo kod aplikacije.

▍Analiza koda front-end aplikacije

Gledajući kod datoteke App.js, to možemo vidjeti klikom na gumb Send poziva metodu analyzeSentence(). Kôd za ovu metodu prikazan je u nastavku. Pritom obratite pozornost na to da za svaki redak na koji se nalazi komentar obrasca # Номер, nalazi se objašnjenje ispod koda. Na isti način analizirat ćemo ostale fragmente koda.

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 na koji je upućen POST zahtjev. Pretpostavlja se da je ova adresa aplikacija koja čeka takve zahtjeve.

2.Tijelo zahtjeva poslano aplikaciji. Evo primjera tijela zahtjeva:

{
    sentence: "I like yogobella!"
}

3.Kada se primi odgovor na zahtjev, stanje komponente se ažurira. To uzrokuje ponovno iscrtavanje komponente. Ako primimo podatke (tj. JSON objekt koji sadrži unesene podatke i izračunati rezultat teksta), ispisat ćemo komponentu Polaritysve dok su ispunjeni uvjeti. Evo kako opisujemo komponentu:

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

Čini se da kod radi prilično dobro. Što ovdje uopće nije u redu? Ako pretpostavite da na adresi na koju aplikacija pokušava poslati POST zahtjev još uvijek ne postoji ništa što može prihvatiti i obraditi ovaj zahtjev, tada ćete biti potpuno u pravu. Naime, za obradu zahtjeva koji stižu na adresu http://localhost:8080/sentiment, moramo pokrenuti web aplikaciju temeljenu na Springu.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Trebamo Spring aplikaciju koja može prihvatiti POST zahtjev

▍Postavljanje web aplikacije temeljene na Springu

Kako biste implementirali Spring aplikaciju, potrebni su vam JDK8 i Maven te pravilno konfigurirane varijable okruženja. Nakon što sve ovo instalirate, možete nastaviti s radom na našem projektu.

▍Pakiranje aplikacije u jar datoteku

Koristeći terminal, dođite do mape sa-webapp i unesite sljedeću naredbu:

mvn install

Nakon izvršenja ove naredbe u mapi sa-webapp kreirat će se imenik target. Ovdje će se nalaziti Java aplikacija, zapakirana u jar datoteku, koju predstavlja datoteka sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍Pokretanje Java aplikacije

Idite u mapu target i pokrenite aplikaciju sljedećom naredbom:

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

Dogodit će se pogreška prilikom izvršavanja ove naredbe. Kako bismo to počeli popravljati, možemo raščlaniti pojedinosti iznimke u podacima praćenja stoga:

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}"

Za nas je ovdje najvažnije spominjanje nemogućnosti razjašnjenja značenja sa.logic.api.url. Analizirajmo kôd u kojem se pojavljuje greška.

▍Analiza koda Java aplikacije

Ovdje je isječak koda gdje se pojavljuje pogreška.

@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. U SentimentController postoji polje saLogicApiUrl. Njegova vrijednost je određena svojstvom sa.logic.api.url.
  2. red saLogicApiUrl povezuje s vrijednošću /analyse/sentiment. Zajedno čine adresu za upućivanje poziva mikroservisu koji vrši analizu teksta.

▍Postavljanje vrijednosti svojstva

U Springu, zadani izvor vrijednosti svojstava je datoteka application.properties, koji se može pronaći na sa-webapp/src/main/resources. Ali njegovo korištenje nije jedini način postavljanja vrijednosti svojstava. To možete učiniti i sljedećom naredbom:

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

Vrijednost ovog svojstva trebala bi ukazivati ​​na adresu naše Python aplikacije.

Njegovom konfiguracijom kažemo web-aplikaciji Spring kamo treba ići da bi uputila zahtjeve za raščlanjivanjem teksta.

Kako si ne bismo zakomplicirali život, odlučit ćemo da Python aplikacija bude dostupna na localhost:5000 i pokušaj ne zaboraviti na to. Kao rezultat toga, naredba za pokretanje Spring aplikacije izgledat će ovako:

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

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Našem sustavu nedostaje Python aplikacija

Sada još samo moramo pokrenuti Python aplikaciju i sustav će raditi kako se očekuje.

▍Postavljanje Python aplikacije

Kako biste pokrenuli Python aplikaciju, morate imati instaliran Python 3 i Pip te morate imati ispravno postavljene odgovarajuće varijable okruženja.

▍Instalirajte ovisnosti

Idite u mapu projekta sa-logic/sa i pokrenite sljedeće naredbe:

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

▍Pokretanje aplikacije

S instaliranim ovisnostima, spremni smo za pokretanje aplikacije:

python sentiment_analysis.py

Nakon izvršenja ove naredbe, bit će nam rečeno sljedeće:

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)

To znači da je aplikacija pokrenuta i čeka zahtjeve na localhost:5000/

▍Istraživanje koda

Pogledajmo programski kod Pythona kako bismo razumjeli kako odgovara na zahtjeve:

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. Inicijalizacija objekta Flask.
  2. Određivanje adrese za slanje POST zahtjeva na nju.
  3. Dohvaćanje nekretnine sentence od tijela zahtjeva.
  4. Inicijalizacija anonimnog objekta TextBlob i dobivanje vrijednosti polarity za prvi prijedlog zaprimljen u tijelu zahtjeva (u našem slučaju to je jedini prijedlog dostavljen na analizu).
  5. Vraćanje odgovora čije tijelo sadrži tekst ponude i za nju izračunati indikator polarity.
  6. Pokretanje aplikacije Flask koja će biti dostupna na 0.0.0.0:5000 (također mu možete pristupiti pomoću konstrukcije obrasca localhost:5000).

Sada su pokrenuti mikroservisi koji čine aplikaciju. Postavljeni su za međusobnu interakciju. Evo kako izgleda dijagram primjene u ovoj fazi rada.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Svi mikroservisi koji čine aplikaciju dovedeni su u ispravno stanje

Sada, prije nego što nastavimo, otvorite aplikaciju React u pregledniku i pokušajte s njom analizirati neku rečenicu. Ako je sve učinjeno ispravno - nakon pritiska na gumb Send vidjet ćete rezultate analize ispod tekstualnog okvira.

U sljedećem ćemo odjeljku govoriti o tome kako pokrenuti naše mikroservise u Docker spremnicima. Ovo je neophodno kako bi se aplikacija pripremila za rad u Kubernetes klasteru.

Docker kontejneri

Kubernetes je sustav za automatizaciju postavljanja, skaliranja i upravljanja kontejnerskim aplikacijama. Također se naziva "kontejner orkestrator". Ako Kubernetes radi sa spremnicima, onda prije korištenja ovog sustava prvo moramo nabaviti te spremnike. Ali prvo, razgovarajmo o tome što su spremnici. Možda najbolji odgovor na pitanje što je to može se naći u dokumentacija Dockeru:

Slika spremnika je lagani, samostalni, izvršni paket koji sadrži aplikaciju, koja uključuje sve što je potrebno za njezino pokretanje: kod aplikacije, okruženje za izvođenje, sistemske alate i biblioteke, postavke. Kontejnerski programi mogu se koristiti u Linux i Windows okruženjima i uvijek će raditi isto bez obzira na infrastrukturu.

To znači da se spremnici mogu pokretati na bilo kojem računalu, uključujući proizvodne poslužitelje, iu bilo kojem okruženju, aplikacije sadržane u njima radit će na isti način.

Kako bismo istražili značajke spremnika i usporedili ih s drugim načinima pokretanja aplikacija, pogledajmo primjer posluživanja React aplikacije pomoću virtualnog stroja i spremnika.

▍Posluživanje statičkih datoteka React aplikacije pomoću virtualnog stroja

Pokušavajući organizirati održavanje statičkih datoteka pomoću virtualnih strojeva, naići ćemo na sljedeće nedostatke:

  1. Neučinkovito korištenje resursa, budući da je svaki virtualni stroj cjeloviti operativni sustav.
  2. Ovisnost o platformi. Ono što radi na nekom lokalnom računalu možda neće raditi na proizvodnom poslužitelju.
  3. Sporo i resursno intenzivno skaliranje rješenja virtualnog stroja.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Nginx web poslužitelj koji poslužuje statične datoteke koje se izvode na virtualnom računalu

Ako se spremnici koriste za rješavanje sličnog problema, tada se, u usporedbi s virtualnim strojevima, mogu uočiti sljedeće prednosti:

  1. Učinkovito korištenje resursa: rad s operativnim sustavom pomoću Dockera.
  2. Neovisnost o platformi. Kontejner koji programer može pokrenuti na vlastitom računalu radit će bilo gdje.
  3. Lagana implementacija korištenjem slojeva slike.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Nginx web poslužitelj koji poslužuje statične datoteke koje se izvode u spremniku

Usporedili smo virtualne strojeve i spremnike samo u nekoliko točaka, ali i to je dovoljno da dobijete osjećaj o prednostima spremnika. Ovdje Možete pronaći detalje o Docker spremnicima.

▍Izrada slike spremnika za React aplikaciju

Osnovni građevni element Docker spremnika je datoteka Dockerfile. Na početku ove datoteke snimljena je osnovna slika spremnika, zatim je uključen niz uputa koje pokazuju kako stvoriti spremnik koji će zadovoljiti potrebe aplikacije.

Prije nego počnemo raditi s datotekom Dockerfile, sjetite se što smo napravili kako bismo pripremili datoteke React aplikacije za upload na Nginx poslužitelj:

  1. Izrada paketa aplikacije React (npm run build).
  2. Pokretanje Nginx poslužitelja.
  3. Kopiranje sadržaja imenika build iz mape projekta sa-frontend u mapu poslužitelja nginx/html.

Dolje možete vidjeti paralele između stvaranja spremnika i gornjih radnji izvedenih na lokalnom računalu.

▍Priprema Dockerfile za SA-Frontend aplikaciju

Upute koje treba uključiti Dockerfile za primjenu SA-Frontend, sastoji se od samo dva tima. Činjenica je da je Nginx razvojni tim pripremio osnovnu sliku za Nginx, koji ćemo koristiti za izgradnju naše slike. Evo dva koraka koja trebamo opisati:

  1. Morate napraviti Nginx sliku kao osnovu slike.
  2. Sadržaj mape sa-frontend/build potrebno je kopirati u mapu slika nginx/html.

Ako prijeđemo s ovog opisa na datoteku Dockerfile, tada će izgledati ovako:

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

Kao što vidite, ovdje je sve vrlo jednostavno, dok se sadržaj datoteke čak čini prilično čitljivim i razumljivim. Ova datoteka govori sustavu da snimi sliku nginx sa svime što već ima i kopirajte sadržaj imenika build u imenik nginx/html.

Ovdje možete imati pitanje o tome kako znam gdje točno kopirati datoteke iz mape build, tj. odakle je došao put /usr/share/nginx/html. Zapravo, ni ovdje nema ništa komplicirano. Činjenica je da se relevantne informacije mogu naći u opis slika.

▍Sastavljanje slike i njezino učitavanje u spremište

Prije nego što možemo raditi s dovršenom slikom, moramo je poslati u repozitorij slika. Da bismo to učinili, koristit ćemo besplatnu platformu za hosting slika u oblaku Docker Hub. U ovoj fazi rada morate učiniti sljedeće:

  1. uspostaviti Lučki radnik.
  2. Registrirajte se na stranici Docker Hub.
  3. Prijavite se na svoj račun pokretanjem sljedeće naredbe na terminalu:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

Sada trebate, koristeći terminal, otići u imenik sa-frontend i tamo pokrenite sljedeću naredbu:

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

Ovdje i dolje u sličnim naredbama $DOCKER_USER_ID treba zamijeniti vašim korisničkim imenom na Docker Hubu. Na primjer, ovaj dio naredbe može izgledati ovako: rinormaloku/sentiment-analysis-frontend.

U tom slučaju, ova se naredba može skratiti uklanjanjem iz nje -f Dockerfile, jer mapa u kojoj izvršavamo ovu naredbu već ima ovu datoteku.

Kako bismo poslali gotovu sliku u repozitorij, potrebna nam je sljedeća naredba:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Nakon što ga dovršite, provjerite svoj popis spremišta na Docker Hubu da vidite je li slika uspješno prebačena u pohranu u oblaku.

▍Pokretanje spremnika

Sada svatko može preuzeti i pokrenuti sliku poznatu kao $DOCKER_USER_ID/sentiment-analysis-frontend. Da biste to učinili, morate pokrenuti sljedeći niz naredbi:

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

Spremnik sada radi i možemo nastaviti s radom stvaranjem drugih slika koje su nam potrebne. Ali prije nego nastavimo, shvatimo dizajn 80:80, koji se nalazi u naredbi za pokretanje slike i može djelovati zbunjujuće.

  • Prvi broj 80 je broj porta glavnog računala (to jest, lokalnog računala).
  • Drugi broj 80 je port spremnika na koji treba preusmjeriti zahtjev.

Razmotrite sljedeću ilustraciju.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Port Forwarding

Sustav prosljeđuje zahtjeve s priključka <hostPort> do luke <containerPort>. Odnosno pristup luci 80 računalo je preusmjereno na port 80 spremnik.

Budući da luka 80 otvoren na lokalnom računalu, aplikaciji možete pristupiti s ovog računala na adresi localhost:80. Ako vaš sustav ne podržava Docker, možete pokrenuti aplikaciju na Docker virtualnom računalu, čija će adresa izgledati ovako <docker-machine ip>:80. Da biste saznali IP adresu Docker virtualnog stroja, možete koristiti naredbu docker-machine ip.

U ovom trenutku, kada se spremnik prednje aplikacije uspješno pokrene, trebali biste moći otvoriti njegovu stranicu u pregledniku.

▍.dockerignore datoteka

Izgradnja slike aplikacije SA-Frontend, mogli smo primijetiti da je taj proces izuzetno spor. To je zato što se kontekst izgradnje slike mora poslati Docker demonu. Direktorij koji predstavlja kontekst izgradnje dan je kao zadnji argument naredbe docker build. U našem slučaju na kraju ove naredbe stoji točka. To rezultira uključivanjem sljedeće strukture u kontekst sklopa:

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

Ali od svih ovdje prisutnih mapa, trebamo samo mapu build. Preuzimanje bilo čega drugog je gubljenje vremena. Možete ubrzati izgradnju tako da Dockeru kažete koje direktorije da zanemari. Da bismo to učinili, potrebna nam je datoteka .dockerignore. Vi, ako ste upoznati s datotekom .gitignore, struktura ove datoteke vjerojatno će izgledati poznato. Navodi direktorije koje sustav za izradu slika može zanemariti. U našem slučaju, sadržaj ove datoteke izgleda ovako:

node_modules
src
public

datoteka .dockerignore mora biti u istoj mapi kao i datoteka Dockerfile. Sada će sastavljanje slike trajati nekoliko sekundi.

Pozabavimo se sada slikom za Java aplikaciju.

▍Izrada slike spremnika za Java aplikaciju

Znate što, a već ste naučili sve što vam je potrebno za izradu slika spremnika. Zato će ovaj dio biti vrlo kratak.

Otvorite datoteku Dockerfile, koji se nalazi u mapi projekta sa-webapp. Ako pročitate tekst ove datoteke, tada ćete u njoj susresti samo dvije nove konstrukcije koje počinju ključnim riječima ENV и EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000
…
EXPOSE 8080

Ključna riječ ENV omogućuje vam da deklarirate varijable okoline unutar Docker spremnika. Konkretno, u našem slučaju, omogućuje postavljanje URL-a za pristup API-ju aplikacije koja provodi analizu teksta.

Ključna riječ EXPOSE omogućuje vam da kažete Dockeru da otvori port. Koristit ćemo ovaj port dok radimo s aplikacijom. Ovdje to možete vidjeti u Dockerfile za primjenu SA-Frontend ne postoji takva naredba. Ovo je samo u svrhu dokumentacije, drugim riječima, ova konstrukcija je za čitatelja Dockerfile.

Izrada slike i njezino guranje u repozitorij izgleda točno kao prethodni primjer. Ako još niste baš sigurni u svoje sposobnosti, odgovarajuće naredbe možete pronaći u datoteci README.md u mapi sa-webapp.

▍Izrada slike spremnika za Python aplikaciju

Ako pogledate sadržaj datoteke Dockerfile u mapi sa-logictamo nećete naći ništa novo. Naredbe za izradu slike i njezino guranje u repozitorij trebale bi vam već biti poznate, ali, kao i u slučaju naših drugih aplikacija, mogu se pronaći u datoteci README.md u mapi sa-logic.

▍Testiranje kontejnerskih aplikacija

Možete li vjerovati nečemu što niste testirali? Ne mogu ni ja. Testirajmo naše spremnike.

  1. Pokrenimo spremnik aplikacije sa-logic i konfigurirajte ga da sluša na portu 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. Pokrenimo spremnik aplikacije sa-webapp i konfigurirajte ga da sluša na portu 8080. Osim toga, moramo postaviti port na kojem će Python aplikacija slušati zahtjeve Java aplikacije ponovnom dodjelom varijable okruženja SA_LOGIC_API_URL:
    $ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://<container_ip or docker machine ip>:5000' $DOCKER_USER_ID/sentiment-analysis-web-app

Da biste saznali kako saznati IP adresu spremnika ili Docker VM, pogledajte datoteku README.

Pokrenimo spremnik aplikacije sa-frontend:

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

Sada je sve spremno za navigaciju u pregledniku do adrese localhost:80 i testirati aplikaciju.

Imajte na umu da ako promijenite priključak za sa-webapp, ili ako koristite Docker VM, morat ćete urediti datoteku App.js iz mape sa-frontendpromjenom IP adrese ili broja porta u metodi analyzeSentence()zamjenom trenutnih informacija umjesto zastarjelih podataka. Nakon toga trebate ponovno sastaviti sliku i koristiti je.

Ovako sada izgleda naš dijagram primjene.

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici
Mikroservisi rade u spremnicima

Sažetak: zašto nam treba Kubernetes klaster?

Upravo smo pregledali datoteke Dockerfile, govorio je o tome kako izraditi slike i gurnuti ih u Docker repozitorij. Osim toga, naučili smo kako ubrzati sastavljanje slika pomoću datoteke .dockerignore. Kao rezultat toga, naše mikrousluge sada rade u Docker spremnicima. Ovdje možete imati sasvim opravdano pitanje zašto nam treba Kubernetes. Odgovor na ovo pitanje bit će posvećen drugom dijelu ovog materijala. U međuvremenu, razmotrite sljedeće pitanje:
Pretpostavimo da je naša web aplikacija za analizu teksta postala popularna diljem svijeta. Svake minute dolaze mu milijuni zahtjeva. To znači da mikroservisi sa-webapp и sa-logic bit će pod ogromnim stresom. Kako skalirati spremnike koji pokreću mikroservise?

Vodič za Kubernetes, 1. dio: Aplikacije, mikroservisi i spremnici

Izvor: www.habr.com

Dodajte komentar