Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri

Na naš zahtjev, Habr je napravio čvorište Kubernet i zadovoljstvo nam je da u njega postavimo prvu publikaciju. Pretplatite se!

Kubernetes je lak. Zašto mi banke plaćaju mnogo novca da radim u ovoj oblasti, a svako može savladati ovu tehnologiju za samo nekoliko sati?

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri

Ako sumnjate da se Kubernetes može naučiti tako brzo, predlažem da to pokušate sami. Naime, savladavši ovaj materijal, moći ćete pokrenuti aplikaciju baziranu na mikroservisima u Kubernetes klasteru. To mogu garantovati, jer na istoj metodologiji koju koristim ovdje učim naše klijente kako da rade sa Kubernetesom. Po čemu se ovaj vodič razlikuje od ostalih? Zapravo, mnogo stvari. Dakle, većina ovih materijala počinje objašnjenjem jednostavnih stvari - koncepta Kubernetesa i karakteristika kubectl komande. Autori ovih članaka pretpostavljaju da je njihov čitalac upoznat sa razvojem aplikacija, mikroservisima i Docker kontejnerima. Idemo drugim putem. Prvo, hajde da pričamo o tome kako pokrenuti aplikaciju zasnovanu na mikroservisima na računaru. Zatim ćemo pogledati izgradnju slika kontejnera za svaki mikroservis. A nakon toga ćemo se upoznati sa Kubernetesom i analizirati implementaciju aplikacije zasnovane na mikroservisima u klasteru kojim upravlja Kubernetes.

Ovaj pristup, sa postepenim pristupom Kubernetesu, daće dubinu razumevanja dešavanja koja je potrebna prosečnoj osobi da bi razumela kako je sve jednostavno raspoređeno u Kubernetesu. Kubernetes je svakako jednostavna tehnologija, pod uslovom da ko želi da je savlada zna gde i kako se koristi.

Sada, bez daljeg odlaganja, bacimo se 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, koristeći alate za analizu teksta, vrši analizu sentimenta ove rečenice, dobijajući procjenu emocionalnog stava autora rečenice prema određenom objektu.

Ovako izgleda glavni prozor ove aplikacije.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Web aplikacija za analizu raspoloženja

Sa tehničke strane, aplikacija se sastoji od tri mikroservisa, od kojih svaki rješava određeni skup zadataka:

  • SA-Frontend je Nginx web server koji opslužuje React statičke datoteke.
  • SA-WebApp je web aplikacija napisana u Javi koja obrađuje zahtjeve sa frontenda.
  • SA-Logic je Python aplikacija koja vrši analizu sentimenta teksta.

Važno je napomenuti da mikroservis ne postoji izolovano. Oni provode ideju "razdvajanja dužnosti", ali u isto vrijeme moraju međusobno komunicirati.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Tokovi podataka u aplikaciji

U gornjem dijagramu možete vidjeti numerisane faze sistema, ilustrirajući tokove podataka u aplikaciji. Hajde da ih raščlanimo:

  1. Pretraživač traži datoteku od servera index.html (što zauzvrat učitava React paket aplikacije).
  2. Korisnik stupa u interakciju s aplikacijom, što uzrokuje poziv web aplikaciji zasnovanoj na Springu.
  3. Web aplikacija prosljeđuje zahtjev za raščlanjivanje teksta u Python aplikaciju.
  4. Python aplikacija analizira sentiment teksta i vraća rezultat kao odgovor na zahtjev.
  5. Spring aplikacija šalje odgovor React aplikaciji (koja, zauzvrat, korisniku pokazuje rezultat raščlanjenog teksta).

Kod za sve ove aplikacije možete pronaći ovdje. Preporučujem da odmah kopirate ovo spremište sebi, jer je pred nama mnogo zanimljivih eksperimenata s njim.

Pokretanje aplikacije zasnovane na mikroservisima na lokalnom računaru

Da bi aplikacija radila, moramo pokrenuti sva tri mikroservisa. Počnimo s najljepšim od njih - front-end aplikacijom.

▍Postavljanje React-a za lokalni razvoj

Da biste pokrenuli React aplikaciju, potrebno je da instalirate Node.js framework i NPM na vašem računaru. Nakon što sve ovo instalirate, idite pomoću terminala u direktorij projekta sa-frontend i pokrenite sljedeću naredbu:

npm install

Izvršavanjem ove naredbe u folderu node_modules će se učitati zavisnosti React aplikacije, čiji se zapisi nalaze u datoteci package.json. Nakon preuzimanja zavisnosti u istom folderu, pokrenite sljedeću naredbu:

npm start

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

▍Priprema React aplikacije za proizvodnju

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

Da biste napravili React aplikaciju, ponovo koristeći terminal, idite do mape sa-frontend i pokrenite sljedeću naredbu:

npm run build

Ovo će kreirati direktorij u folderu projekta build. Sadržat će sve statičke datoteke potrebne za funkcioniranje React aplikacije.

▍Posluživanje statičkih datoteka sa Nginxom

Prvo morate instalirati i pokrenuti Nginx web server. to je možete ga preuzeti i pronaći upute za instalaciju i pokretanje. Zatim morate kopirati sadržaj foldera sa-frontend/build u folder [your_nginx_installation_dir]/html.

Sa ovim pristupom, fajl generisan tokom sastavljanja React aplikacije index.html bit će dostupan na [your_nginx_installation_dir]/html/index.html. Ovo je datoteka koju Nginx server po defaultu izdaje prilikom pristupa. Server je konfigurisan da sluša na portu 80, ali možete ga prilagoditi onako kako želite uređujući datoteku [your_nginx_installation_dir]/conf/nginx.conf.

Sada otvorite svoj pretraživač i idite na localhost:80. Vidjet ćete stranicu aplikacije React.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
React aplikacija koju servira Nginx server

Ako sada unesete nešto u polje Type your sentence i pritisnite dugme Send - ništa se neće desiti. Ali, ako pogledate konzolu, tamo možete vidjeti poruke o grešci. Da bismo razumjeli gdje se tačno ove greške pojavljuju, analizirajmo kod aplikacije.

▍Analiza koda front-end aplikacije

Gledajući kod datoteke App.js, to možemo vidjeti klikom na dugme Send poziva metodu analyzeSentence(). Kod za ovu metodu je prikazan ispod. Istovremeno, obratite pažnju na činjenicu da za svaki red na koji postoji komentar obrasca # Номер, postoji objašnjenje dato ispod koda. Na isti način ćemo analizirati 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 se šalje POST zahtjev. Pretpostavlja se da je ova adresa aplikacija koja čeka takve zahtjeve.

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

{
    sentence: "I like yogobella!"
}

3.Kada se primi odgovor na zahtjev, stanje komponente se ažurira. Ovo uzrokuje da se komponenta ponovo renderira. Ako primimo podatke (tj. JSON objekat koji sadrži unesene podatke i izračunati rezultat teksta), ispisaćemo komponentu Polaritysve dok su uslovi ispunjeni. 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. Šta uopšte nije u redu? Ako pretpostavite da na adresi na koju aplikacija pokušava poslati POST zahtjev još ne postoji ništa što može prihvatiti i obraditi ovaj zahtjev, onda ćete biti potpuno u pravu. Naime, za obradu zahtjeva koji dolaze na adresu http://localhost:8080/sentiment, trebamo pokrenuti web aplikaciju zasnovanu na Springu.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Potrebna nam je Spring aplikacija koja može prihvatiti POST zahtjev

▍Postavljanje web aplikacije zasnovane na Springu

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

▍Pakovanje aplikacije u jar fajl

Idite, koristeći terminal, do foldera sa-webapp i unesite sljedeću naredbu:

mvn install

Nakon izvršenja ove naredbe u folderu sa-webapp će biti kreiran direktorij target. Ovo je mjesto gdje će se nalaziti Java aplikacija, upakovana u jar datoteku, koju predstavlja datoteka sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍Pokretanje Java aplikacije

Idite u folder target i pokrenite aplikaciju sa sljedećom naredbom:

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

Doći će do greške prilikom izvršavanja ove naredbe. Da bismo to počeli popravljati, možemo raščlaniti detalje izuzetaka u podacima praćenja steka:

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šnjavanja značenja sa.logic.api.url. Analizirajmo kod gdje se greška javlja.

▍Analiza koda Java aplikacije

Evo isječka koda u kojem se javlja greš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. Njegovu vrijednost postavlja svojstvo sa.logic.api.url.
  2. Gudački saLogicApiUrl spaja se sa vrednošću /analyse/sentiment. Zajedno formiraju adresu za pozivanje mikroservisa koji vrši analizu teksta.

▍Postavljanje vrijednosti svojstva

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

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

Vrijednost ovog svojstva treba da ukazuje na adresu naše Python aplikacije.

Konfigurirajući ga, mi govorimo Spring web aplikaciji gdje treba ići da izvrši zahtjeve za raščlanjivanje teksta.

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

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

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Našem sistemu nedostaje Python aplikacija

Sada samo treba da pokrenemo Python aplikaciju i sistem će raditi kako se očekuje.

▍Podešavanje Python aplikacije

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

▍Instalirajte zavisnosti

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

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

▍Pokretanje aplikacije

Sa instaliranim zavisnostima, spremni smo za pokretanje aplikacije:

python sentiment_analysis.py

Nakon izvršenja ove naredbe, bić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 na zahtjeve na localhost:5000/

▍ Istraživanje koda

Pogledajmo kod Python aplikacije kako bismo razumjeli kako on 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 upućivanje POST zahtjeva za njega.
  3. Preuzimanje svojstva sentence od tijela zahtjeva.
  4. Inicijalizacija anonimnog objekta TextBlob i dobijanje vrednosti polarity za prvi prijedlog primljen u tijelu zahtjeva (u našem slučaju, ovo je jedini prijedlog koji je dostavljen na analizu).
  5. Vraćanje odgovora, čije tijelo sadrži tekst ponude i indikator izračunat za nju polarity.
  6. Pokretanje aplikacije Flask, koja će biti dostupna na 0.0.0.0:5000 (možete mu pristupiti i pomoću konstrukcije obrasca localhost:5000).

Sada se pokreću mikroservise koje čine aplikaciju. Oni su postavljeni za interakciju jedni s drugima. Evo kako izgleda dijagram aplikacije u ovoj fazi rada.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Sve mikroservise koje čine aplikaciju dovedene su u zdravo stanje

Sada, prije nego što nastavimo, otvorite aplikaciju React u pregledniku i pokušajte raščlaniti neku rečenicu s njom. Ako je sve urađeno kako treba - nakon pritiska na dugme Send videćete rezultate analize ispod okvira za tekst.

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

Docker kontejneri

Kubernet je sistem za automatizaciju implementacije, skaliranja i upravljanja kontejnerskim aplikacijama. Naziva se i "kontejnerski orkestrator". Ako Kubernetes radi sa kontejnerima, onda prije korištenja ovog sistema, prvo moramo nabaviti te kontejnere. Ali prvo, hajde da razgovaramo o tome šta su kontejneri. Možda najbolji odgovor na pitanje šta je to dokumentaciju za Docker:

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

To znači da se kontejneri mogu pokrenuti na bilo kojem računaru, uključujući i proizvodne servere, iu bilo kojem okruženju, aplikacije koje su u njima zatvorene će raditi na isti način.

Da bismo istražili karakteristike kontejnera i uporedili ih sa drugim načinima pokretanja aplikacija, pogledajmo primer posluživanja React aplikacije pomoću virtuelne mašine i kontejnera.

▍Posluživanje statičkih datoteka React aplikacije pomoću virtuelne mašine

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

  1. Neefikasno korišćenje resursa, jer je svaka virtuelna mašina kompletan operativni sistem.
  2. Zavisnost od platforme. Ono što radi na nekom lokalnom računaru možda neće raditi na proizvodnom serveru.
  3. Sporo i resursno intenzivno skaliranje rješenja virtualne mašine.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Nginx web server koji opslužuje statičke fajlove koji rade na virtuelnoj mašini

Ako se kontejneri koriste za rješavanje sličnog problema, tada se, u poređenju s virtualnim mašinama, mogu uočiti sljedeće prednosti:

  1. Efikasno korišćenje resursa: rad sa operativnim sistemom koristeći Docker.
  2. Nezavisnost od platforme. Kontejner koji programer može pokrenuti na svom računaru pokrenut će se bilo gdje.
  3. Lagana implementacija kroz korištenje slojeva slike.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Nginx web server koji opslužuje statičke fajlove koji rade u kontejneru

Uporedili smo virtuelne mašine i kontejnere samo u nekoliko tačaka, ali čak i to je dovoljno da steknemo utisak o prednostima kontejnera. to je Možete pronaći detalje o Docker kontejnerima.

▍Izrada slike kontejnera za React aplikaciju

Osnovni gradivni blok Docker kontejnera je datoteka Dockerfile. Na početku ove datoteke snima se osnovna slika kontejnera, a zatim je uključen niz instrukcija koje pokazuju kako kreirati kontejner koji će zadovoljiti potrebe aplikacije.

Prije nego počnemo raditi s fajlom Dockerfile, sjetite se šta smo uradili kako bismo pripremili datoteke React aplikacije za upload na Nginx server:

  1. Izrada paketa aplikacije React (npm run build).
  2. Pokretanje Nginx servera.
  3. Kopiranje sadržaja direktorija build iz fascikle projekta sa-frontend u folder servera nginx/html.

U nastavku možete vidjeti paralele između kreiranja kontejnera i gore navedenih radnji koje se izvode na lokalnom računalu.

▍Priprema Dockerfile-a za SA-Frontend aplikaciju

Instrukcije koje treba uključiti Dockerfile za prijavu SA-Frontend, sastoji se od samo dvije naredbe. Činjenica je da je razvojni tim Nginxa pripremio osnovnu slika za Nginx, koji ćemo koristiti za izgradnju našeg imidža. Evo dva koraka koja moramo opisati:

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

Ako pređemo sa ovog opisa na fajl 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 ispostavlja prilično čitljivim i razumljivim. Ova datoteka govori sistemu da snimi sliku nginx sa svime što već ima i kopirajte sadržaj direktorija build u imenik nginx/html.

Ovdje možete imati pitanje kako da znam gdje tačno da kopiram fajlove iz foldera build, odnosno odakle je došao put /usr/share/nginx/html. U stvari, ni tu nema ništa komplikovano. Činjenica je da se relevantne informacije mogu pronaći u opis slika.

▍Sklapanje slike i postavljanje u spremište

Prije nego što budemo mogli raditi sa završenom slikom, moramo je poslati u spremište slika. Da bismo to uradili, koristićemo besplatnu platformu za hostovanje slika u oblaku Docker Hub. U ovoj fazi rada potrebno je da uradite sledeće:

  1. Instalacija doker.
  2. Registrirajte se na web lokaciji Docker Hub.
  3. Prijavite se na svoj račun tako što ćete pokrenuti sljedeću naredbu u terminalu:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

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

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

Ovdje i ispod 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 ovom slučaju, ova naredba se može skratiti uklanjanjem iz nje -f Dockerfile, pošto fascikla u kojoj izvršavamo ovu naredbu već ima ovu datoteku.

Da bismo gotovu sliku poslali u spremište, potrebna nam je sljedeća naredba:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Nakon što ga dovršite, provjerite svoju listu spremišta na Docker Hub-u da vidite da li je slika uspješno prenesena u pohranu u oblaku.

▍Pokretanje kontejnera

Sada svako može preuzeti i pokrenuti sliku poznatu kao $DOCKER_USER_ID/sentiment-analysis-frontend. Da biste to učinili, potrebno je 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

Sada je kontejner pokrenut i možemo nastaviti s radom kreiranjem drugih slika koje su nam potrebne. Ali prije nego što nastavimo, razumijemo dizajn 80:80, koji se nalazi u naredbi za pokretanje slike i može izgledati zbunjujuće.

  • Prvi broj 80 je broj porta hosta (odnosno lokalnog računara).
  • Drugi broj 80 je port kontejnera na koji bi zahtjev trebao biti preusmjeren.

Razmotrite sljedeću ilustraciju.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Port Forwarding

Sistem prosljeđuje zahtjeve sa porta <hostPort> do luke <containerPort>. Odnosno, pristup portu 80 računar se preusmjerava na port 80 kontejner.

Od luke 80 otvorena na lokalnom računaru, možete pristupiti aplikaciji sa ovog računara na adresi localhost:80. Ako vaš sistem ne podržava Docker, možete pokrenuti aplikaciju na Docker virtuelnoj mašini, čija će adresa izgledati ovako <docker-machine ip>:80. Da biste saznali IP adresu Docker virtuelne mašine, možete koristiti naredbu docker-machine ip.

U ovom trenutku, nakon što se front-end kontejner aplikacije uspješno pokrene, trebali biste biti u mogućnosti da otvorite njegovu stranicu u pretraživaču.

▍.dockerignore fajl

Izgradnja slike aplikacije SA-Frontend, mogli smo primijetiti da je ovaj proces izuzetno spor. To je zato što kontekst izgradnje slike mora biti poslan Docker demonu. Direktorij koji predstavlja kontekst izgradnje je dan kao posljednji argument naredbi docker build. U našem slučaju, postoji tačka na kraju ove komande. Ovo rezultira sljedećom strukturom koja je uključena u kontekst montaže:

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

Ali od svih fascikli prisutnih ovde, potreban nam je samo folder build. Preuzimanje bilo čega drugog je gubljenje vremena. Možete ubrzati izgradnju tako što ćete reći Docker-u koje direktorije treba zanemariti. Da bismo to uradili, potreban nam je fajl .dockerignore. Vi, ako ste upoznati sa fajlom .gitignore, struktura ove datoteke će vjerovatno izgledati poznato. Navodi direktorije koje sistem za izgradnju slike može zanemariti. U našem slučaju sadržaj ove datoteke izgleda ovako:

node_modules
src
public

fajl .dockerignore mora biti u istom folderu kao i datoteka Dockerfile. Sada će sastavljanje slike potrajati nekoliko sekundi.

Hajde da se sada pozabavimo slikom za Java aplikaciju.

▍Izrada slike kontejnera za Java aplikaciju

Znate šta, i već ste naučili sve što vam je potrebno za kreiranje slika kontejnera. Zbog toga će ovaj dio biti vrlo kratak.

Otvorite fajl Dockerfile, koji se nalazi u fascikli 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ćava vam da deklarirate varijable okruženja unutar Docker kontejnera. Konkretno, u našem slučaju vam omogućava da postavite URL za pristup API-ju aplikacije koja vrši analizu teksta.

Ključna riječ EXPOSE omogućava vam da kažete Dockeru da otvori port. Koristićemo ovaj port dok radimo sa aplikacijom. Ovde se to može videti u Dockerfile za prijavu SA-Frontend ne postoji takva komanda. Ovo je samo u svrhu dokumentacije, drugim riječima, ova konstrukcija je za čitaoca Dockerfile.

Izgradnja slike i guranje u spremište izgleda baš kao u prethodnom primjeru. Ako još niste sigurni u svoje sposobnosti, odgovarajuće komande možete pronaći u datoteci README.md u folderu sa-webapp.

▍Izrada slike kontejnera za Python aplikaciju

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

▍Testiranje kontejnerskih aplikacija

Možete li vjerovati nečemu što niste testirali? Ne mogu ni ja. Hajde da testiramo naše kontejnere.

  1. Pokrenimo kontejner 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 kontejner 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 iz Java aplikacije tako što ćemo ponovo dodijeliti varijablu 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 da saznate IP adresu kontejnera ili Docker VM, pogledajte datoteku README.

Pokrenimo kontejner aplikacije sa-frontend:

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

Sada je sve spremno za navigaciju u pretraživaču do adrese localhost:80 i testirajte aplikaciju.

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

Ovako sada izgleda naš dijagram aplikacije.

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri
Mikroservise rade u kontejnerima

Rezime: zašto nam treba Kubernetes klaster?

Upravo smo pregledali fajlove Dockerfile, govorio je o tome kako napraviti slike i prebaciti ih u Docker spremište. Osim toga, naučili smo kako da ubrzamo sastavljanje slika pomoću datoteke .dockerignore. Kao rezultat toga, naše mikroservise sada rade u Docker kontejnerima. Ovdje možda imate sasvim opravdano pitanje zašto nam je potreban Kubernetes. Odgovoru na ovo pitanje bit će posvećen drugi dio ovog materijala. U međuvremenu razmislite o sljedećem pitanju:
Pretpostavimo da je naša web aplikacija za analizu teksta postala popularna širom svijeta. Svakog minuta mu stižu milioni zahtjeva. To znači da mikroservis sa-webapp и sa-logic biće pod ogromnim stresom. Kako skalirati kontejnere koji pokreću mikroservise?

Kubernetes Tutorial, 1. dio: Aplikacije, mikrousluge i kontejneri

izvor: www.habr.com

Dodajte komentar