PÄ vÄr begÀran skapade Habr en hub och vi Àr glada att publicera det första inlÀgget dÀr. Prenumerera!
Kubernetes Àr enkelt. Varför betalar banker mig dÄ stora summor för att arbeta inom detta omrÄde, nÀr vem som helst kan lÀra sig denna teknik pÄ bara nÄgra timmar?
Om du tvivlar pĂ„ att Kubernetes kan lĂ€ras sĂ„ snabbt â försök att göra det sjĂ€lv. Genom att bemĂ€stra detta material kan du starta en applikation som bygger pĂ„ mikrotjĂ€nster i en Kubernetes-kluster. Jag kan garantera detta, eftersom det Ă€r just den metodik som anvĂ€nds hĂ€r som jag utbildar vĂ„ra kunder i Kubernetes. Vad skiljer denna handbok frĂ„n andra? Faktum Ă€r att det Ă€r mycket. De flesta liknande material börjar med att förklara enkla saker â koncepten i Kubernetes och funktionerna i kommandot kubectl. Författarna till dessa material anser att deras lĂ€sare Ă€r bekanta med applikationsutveckling, mikrotjĂ€nster och Docker-containrar. Vi kommer att ta en annan vĂ€g. Först kommer vi att berĂ€tta hur man startar en applikation som bygger pĂ„ mikrotjĂ€nster pĂ„ datorn. Sedan kommer vi att se pĂ„ byggandet av containerbilder för varje mikrotjĂ€nst. Och först dĂ€refter ska vi lĂ€ra oss om Kubernetes och granska utrullningen av en applikation som bygger pĂ„ mikrotjĂ€nster i en Kubernetes-styrd kluster.
Denna metod, med en gradvis nÀrmanden till Kubernetes, ger en djup förstÄelse för vad som hÀnder, vilket Àr nödvÀndigt för en vanlig person för att förstÄ hur enkelt allt Àr strukturerat i Kubernetes. Kubernetes Àr utan tvekan en enkel teknologi, förutsatt att den som vill bemÀstra den vet var och hur den anvÀnds.
Nu, utan fler ord, lÄt oss börja arbetet och tala om applikationen vi kommer att arbeta med.
Experimentell applikation
VÄr applikation kommer att utföra en enda funktion. Den tar som indata en mening, och efter det, med hjÀlp av textanalysverktyg, genomför den en analys av kÀnslomÀssig ton (sentiment analysis) av den meningen, vilket ger en bedömning av författarens kÀnslomÀssiga förhÄllande till ett visst objekt.
SÄ hÀr ser huvudfönstret för denna applikation ut.

Webbapplikation för analys av texters kÀnslomÀssig ton
Ur teknisk synvinkel bestÄr applikationen av tre mikrotjÀnster, var och en löser ett specifikt uppsÀttning av uppgifter:
- SA-Frontend â en Nginx-webbserver som hanterar statiska React-filer.
- SA-WebApp â ett webbprogram skrivet i Java som hanterar förfrĂ„gningar frĂ„n frontend.
- SA-Logic â en Python-applikation som utför textanalys.
Det Àr viktigt att notera att mikrotjÀnsterna inte existerar isolerat. De realiserar idén om "arbetsdelning", men behöver ocksÄ interagera med varandra.

Datastreamar i applikationen
I diagrammet ovan kan man se de numrerade stegen i systemets arbete, som illustrerar datastreamarna i applikationen. LÄt oss gÄ igenom dem:
- WebblÀsaren begÀr en fil frÄn servern
index.html(som i sin tur laddar React-applikationspaketet). - AnvÀndaren interagerar med applikationen, vilket orsakar en begÀran till webbapplikationen, baserad pÄ Spring.
- Webbapplikationen vidarebefordrar begÀran för textanalys till Python-applikationen.
- Python-applikationen utför textanalysen och returnerar resultatet som svar pÄ begÀran.
- Spring-applikationen skickar svaret till React-applikationen (som i sin tur visar textanalysens resultat för anvÀndaren).
Koden för alla dessa applikationer kan hittas . Jag rekommenderar att du omedelbart kopierar detta repository till dig, eftersom vi har mÄnga intressanta experiment framför oss.
Kör applikationen, baserad pÄ mikrotjÀnster, pÄ din lokala dator
För att applikationen ska fungera behöver vi starta alla tre mikrotjĂ€nster. LĂ„t oss börja med den mest attraktiva av dem â frontend-applikationen.
âKonfigurera React för lokal utveckling
För att köra React-applikationen behöver du installera Node.js och NPM pÄ din dator. NÀr du har installerat allt detta, gÄ in i projektmappen med hjÀlp av terminalen sa-frontend och kör följande kommando:
npm install Genom att köra detta kommando kommer beroenden för React-applikationen att laddas ner i mappen node_modules , vars poster finns i filen package.json. Efter att beroendena har laddats ner, kör följande kommando i samma mapp:
npm start Det Àr allt. Nu har React-applikationen startats och kan nÄs genom att gÄ till följande adress i webblÀsaren localhost:3000. Du kan Àndra nÄgot i dess kod. Effekten av dessa Àndringar kommer du att se direkt i webblÀsaren. Detta Àr möjligt tack vare den sÄ kallade "heta" modulbytet. Med detta gör frontendutveckling till en enkel och trevlig upplevelse.
âFörbereda React-applikationen för produktion
För verkligt anvÀndande av React-applikationen behöver vi omvandla den till en uppsÀttning statiska filer och leverera dem till kunderna via en webbserver.
För att bygga React-applikationen, Äterigen anvÀnda terminalen, gÄ till mappen sa-frontend och kör följande kommando:
npm run build Detta kommer att skapa en mapp i projektmappen build. Denna mapp kommer att innehÄlla alla statiska filer som behövs för att React-applikationen ska fungera.
âUnderhĂ„lla statiska filer med Nginx
Först mÄste du installera och starta webbservern Nginx. du kan ladda ner den och hitta installations- och startinstruktioner. DÀrefter mÄste du kopiera innehÄllet i mappen sa-frontend/build till mappen [your_nginx_installation_dir]/html.
Med detta tillvÀgagÄngssÀtt kommer filen som genereras under byggprocessen av React-applikationen index.html att vara tillgÀnglig pÄ adressen [your_nginx_installation_dir]/html/index.html. Detta Àr den fil som Nginx-servern som standard returnerar nÀr den anropas. Servern Àr konfigurerad att lyssna pÄ port 80, men den kan konfigureras sÄ som du vill genom att redigera filen [your_nginx_installation_dir]/conf/nginx.conf.
Nu öppnar du webblÀsaren och gÄr till adressen localhost:80. Du kommer att se sidan av React-applikationen.

React-applikation som hanteras av Nginx-servern
Om du nu skriver nĂ„got i fĂ€ltet Type your sentence och trycker pĂ„ knappen Send â kommer inget att hĂ€nda. Men om du kollar i konsolen kan du se felmeddelanden. För att förstĂ„ var dessa fel intrĂ€ffar, ska vi analysera kodens struktur.
âAnalys av frontendapplikationens kod
Genom att titta pĂ„ koden i filen App.js, kan vi se att ett tryck pĂ„ knappen Send anropar metoden analyzeSentence(). Koden för denna metod ges nedan. Observera att varje rad som har en kommentar av typen # ĐĐŸĐŒĐ”Ń, har en förklaring som följer efter koden. PĂ„ liknande sĂ€tt kommer vi att analysera andra kodfragment.
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: den adress som POST-förfrÄgan skickas till. Det antas att det finns en applikation pÄ den hÀr adressen som vÀntar pÄ sÄdana förfrÄgningar.
2.Kroppen av förfrÄgan som skickas till applikationen. HÀr Àr ett exempel pÄ kropp:
{
   sentence: "I like yogobella!"
} 3.NÀr svaret pÄ förfrÄgan tas emot uppdateras komponentens tillstÄnd. Detta orsakar en omrendering av komponenten. Om vi fÄr data (det vill sÀga en JSON-objekt som innehÄller inmatade data och det berÀknade textvÀrdet), visar vi komponenten Polarity, eftersom lÀmpliga villkor kommer att uppfyllas. HÀr Àr hur vi beskriver komponenten:
const polarityComponent = this.state.polarity !== undefined ?
   :
   null; Koden verkar vara fullt fungerande. Vad Àr det som Àr fel hÀr dÄ? Om du antar att det inte finns nÄgot pÄ den adress dÀr applikationen försöker skicka POST-förfrÄgan som kan ta emot och behandla denna förfrÄgan, sÄ har du helt rÀtt. Specifikt, för att hantera förfrÄgningar som kommer till adressen http://localhost:8080/sentiment, behöver vi köra en webbapplikation baserad pÄ Spring.

Vi behöver en Spring-applikation som kan ta emot POST-förfrÄgningar.
âInstĂ€llning av webapplikationen baserad pĂ„ Spring
För att distribuera en Spring-applikation behöver du JDK8 och Maven samt korrekt instÀllda miljövariabler. NÀr du har installerat allt detta kan du fortsÀtta arbeta med vÄrt projekt.
âPaketera applikationen i en jar-fil
AnvÀnd terminalen för att gÄ till mappen sa-webapp och skriv in följande kommando:
mvn install Efter att detta kommando har körts kommer en katalog att skapas i mappen sa-webapp . HĂ€r kommer Java-applikationen, paketenerad i en jar-fil, att ligga, representerad av filen targetsentiment-analysis-web-0.0.1-SNAPSHOT.jar âKör Java-applikationen.
GĂ„ till mappen
och starta applikationen med följande kommando: target java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar
Under körningen av detta kommando kommer ett fel att uppstÄ. För att börja ÄtgÀrda det kan vi analysera undantagsinformationen i stackspÄrningsdata:NÀr denna kommandon körs kommer ett fel att intrÀffa. För att börja ÄtgÀrda detta kan vi analysera informationen om undantaget i stackspÄren:
Ett fel vid skapandet av bean med namnet 'sentimentController': Injektion av autowired beroenden misslyckades; nÀstlad undantag Àr java.lang.IllegalArgumentException: Kunde inte lösa platshÄllaren 'sa.logic.api.url' i vÀrdet "${sa.logic.api.url}" För oss Àr det viktigaste hÀr nÀmnandet av oförmÄgan att faststÀlla vÀrdet sa.logic.api.url. Vi analyserar koden dÀr felet intrÀffar.
âAnalys av Java-applikationens kod
HÀr Àr en kodsnutt dÀr felet intrÀffar.
@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();
}
}- I S
entimentControllerfinns ett fÀltsaLogicApiUrl. Dess vÀrde sÀtts av egenskapensa.logic.api.url. - StrÀng
saLogicApiUrlkonkateneras med vÀrdet/analyse/sentiment. Tillsammans bildar de adressen för att utföra anropet till mikrotjÀnsten som utför textanalys.
âSĂ€tta vĂ€rdet av egenskapen
I Spring Àr den standardkÀlla för egenskapsvÀrden en fil application.properties, som kan hittas pÄ platsen sa-webapp/src/main/resources. Men dess anvÀndning Àr inte det enda sÀttet att ange egenskapsvÀrden. Det kan ocksÄ göras med hjÀlp av ett kommando av följande typ:
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=WHAT.IS.THE.SA.LOGIC.API.URLVÀrdet pÄ denna egenskap mÄste peka pÄ adressen till vÄr Python-applikation.
Genom att konfigurera det informerar vi Spring-webbapplikationen om vart den ska vÀnda sig för att utföra textanalysanrop.
För att underlÀtta för oss sjÀlva bestÀmmer vi att Python-applikationen kommer att vara tillgÀnglig pÄ adressen localhost:5000 och vi ska försöka komma ihÄg det. Som ett resultat kommer kommandot för att starta Spring-applikationen att se ut sÄ hÀr:
java -jar sentiment-analysis-web-0.0.1-SNAPSHOT.jar --sa.logic.api.url=http://localhost:5000 
I vÄrt system saknas Python-applikationen.
Nu ÄterstÄr det bara att starta Python-applikationen sÄ att systemet fungerar som förvÀntat.
âKonfiguration av Python-applikationen
För att starta Python-applikationen mÄste du ha Python 3 och Pip installerat, och relevanta miljövariabler mÄste vara korrekt konfigurerade.
âInstallation av beroenden
GÄ till projektmappen sa-logic/sa och kör följande kommandon:
python -m pip install -r requirements.txt
python -m textblob.download_corporaâStarta applikationen
Efter installation av beroenden Àr vi redo att köra applikationen:
python sentiment_analysis.pyEfter att ha kört detta kommando fÄr vi följande meddelande:
* Kör pÄ http://0.0.0.0:5000/ (Tryck CTRL+C för att avsluta) Detta innebÀr att applikationen Àr igÄng och vÀntar pÄ förfrÄgningar pÄ adressen localhost:5000/
âKodstudie
LÄt oss titta pÄ koden för Python-applikationen för att förstÄ hur den reagerar pÄ förfrÄgningar:
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- Initiering av objekt
Flask. - Angivelse av adressen för att utföra POST-förfrÄgningar till det.
- Utdrag av egenskap
sentencefrÄn förfrÄgningskroppen. - Initiering av anonymt objekt
TextBloboch hĂ€mta vĂ€rdetpolarityför den första meningen som kom in i förfrĂ„gningskroppen (i vĂ„rt fall Ă€r det en enda mening som skickas för analys). - Ă
terlÀmning av ett svar vars kropp innehÄller texten i meningen och det berÀknade vÀrdet för den
polarity. - Starta Flask-applikationen som kommer att vara tillgÀnglig pÄ adressen
0.0.0.0:5000(den kan nÄs med en struktur av typenlocalhost:5000).
Nu har mikrotjÀnsterna som applikationen bestÄr av startats. De Àr instÀllda för att interagera med varandra. SÄ hÀr ser applikationens schema ut vid detta arbetsskedet.

Alla mikrotjÀnster som applikationen bestÄr av har satts i drift
Innan vi fortsĂ€tter, öppna React-applikationen i webblĂ€saren och försök att analysera en mening med den. Om allt görs rĂ€tt â efter att ha tryckt pĂ„ knappen Send ser du analysresultaten under textfĂ€ltet.
I nÀsta avsnitt ska vi prata om hur man kör vÄra mikrotjÀnster i Docker-containrar. Detta Àr nödvÀndigt för att förbereda applikationen för körning i en Kubernetes-kluster.
Docker-containrar
Àr ett system för automatisering av distribution, skalning och hantering av containeriserade applikationer. Det kallas Àven "containerorkestrator" (container orchestrator). Om Kubernetes arbetar med containrar, behöver vi först skaffa oss dessa containrar innan vi kan anvÀnda systemet. Men lÄt oss först prata om vad containrar Àr. Kanske det bÀsta svaret pÄ frÄgan om vad det Àr, finns i Docker:
En containerbild Àr ett lÀttviktigt, autonomt, exekverbart paket som innehÄller en applikation och allt som behövs för att köra den: applikationskoden, körmiljön, systemverktyg och bibliotek, konfigurationer. Containeriserade program kan anvÀndas i Linux- och Windows-miljöer, och de kommer alltid att fungera pÄ samma sÀtt oavsett infrastruktur.
Det innebÀr att containrar kan köras pÄ alla datorer, inklusive produktionsservrar, och i alla miljöer kommer de applikationer som de innehÄller att fungera pÄ samma sÀtt.
För att utforska egenskaperna hos containrar och jÀmföra dem med andra sÀtt att köra applikationer, ska vi titta pÄ ett exempel dÀr vi underhÄller en React-applikation med hjÀlp av en virtuell maskin och en container.
âUnderhĂ„ll av statiska filer i en React-applikation med hjĂ€lp av en virtuell maskin
NÀr vi försöker organisera underhÄllet av statiska filer med hjÀlp av virtuella maskiner, kommer vi att stöta pÄ följande nackdelar:
- Ineffektiv resursanvÀndning, eftersom varje virtuell maskin representerar ett fullstÀndigt operativsystem.
- Plattformsberoende. Det som fungerar pÄ en viss lokal dator kanske inte fungerar pÄ en produktionsserver.
- LÄngsam och resurskrÀvande skalning av en lösning baserad pÄ virtuella maskiner.

Webbservern Nginx som tjÀnar statiska filer, körs pÄ en virtuell maskin
Om vi dÀremot anvÀnder containrar för att lösa samma uppgift, kan vi, jÀmfört med virtuella maskiner, notera följande styrkor:
- Effektiv resursanvÀndning: arbete med operativsystemet med hjÀlp av Docker.
- Oberoende av plattform. En container som utvecklaren kan köra pÄ sin dator kommer att fungera var som helst.
- LÀttviktig distribution genom anvÀndning av bildlager.

Webbservern Nginx, som serverar statiska filer, körs i en container.
Vi har jÀmfört virtuella maskiner och containrar utifrÄn bara nÄgra punkter, men Àven det Àr tillrÀckligt för att kÀnna av containrarnas styrkor. Du kan hitta detaljinformation om Docker-containrar.
âBygga en containerbild för ett React-program
Den grundlÀggande byggstenen för Docker-containern Àr en fil Dockerfile. I början av denna fil anges basbilden för containern, följt av en sekvens av instruktioner som anger i vilken ordning containern ska byggas för att passa behovet hos en viss applikation.
Innan vi gÄr vidare med att arbeta med filen Dockerfile, lÄt oss pÄminna oss om vad vi gjorde för att förbereda filerna för React-applikationen för att distribueras pÄ Nginx-servern:
- Bygga paketet för React-applikationen (
npm run build). - Köra Nginx-servern.
- Kopiera innehÄllet i katalogen
buildfrÄn projektmappensa-frontendtill serverkatalogennginx/html.
Nedan kan du se paralleller mellan skapandet av en container och de ovan nÀmnda ÄtgÀrder som utförs pÄ den lokala datorn.
âFörbereda Dockerfile för SA-Frontend-applikationen
Instruktionerna som kommer att finnas i Dockerfile för applikationen SA-Frontend, bestÄr endast av tvÄ kommandon. Anledningen Àr att en grupp utvecklare frÄn Nginx har förberett en grundlÀggande för Nginx, som vi kommer att anvÀnda för att skapa vÄr bild. HÀr Àr de tvÄ stegen som vi behöver beskriva:
- Basbilden ska vara Nginx-bilden.
- InnehÄllet i mappen
sa-frontend/buildska kopieras till bildmappennginx/html.
Om vi gÄr frÄn denna beskrivning till filen Dockerfile, kommer den att se ut sÄ hÀr:
FROM nginx
COPY build /usr/share/nginx/html Som du ser Àr allt hÀr vÀldigt enkelt och innehÄllet i filen Àr faktiskt ganska lÀsbart och begripligt. Den hÀr filen sÀger till systemet att den ska ta bilden nginx med allt som redan finns i den och kopiera innehÄllet i katalogen build till katalogen nginx/html.
HÀr kan du stÀlla dig frÄgan om hur jag vet var filerna frÄn mappen build, alltsÄ var sökvÀgen /usr/share/nginx/html, kommer ifrÄn. Egentligen Àr det inget svÄrt med det. Det finns relevant information i av bilden.
âBygg en bild och ladda upp den till ett repository
Innan vi kan arbeta med den fÀrdiga bilden mÄste vi skicka den till ett bildrepository. För detta kommer vi att anvÀnda den kostnadsfria molnplattformen för att hosta bilder, Docker Hub. Vid den hÀr tidpunkten behöver du göra följande:
- Installera .
- Registrera dig pÄ Docker Hub.
- Logga in pÄ ditt konto genom att köra följande kommando i terminalen:
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
Nu mÄste du, med hjÀlp av terminalen, navigera till katalogen sa-frontend och köra dÀr kommandot av följande typ:
docker build -f Dockerfile -t $DOCKER_USER_ID/sentiment-analysis-frontend . HÀr och framöver i liknande kommandon $DOCKER_USER_ID mÄste bytas ut mot ditt anvÀndarnamn pÄ Docker Hub. Till exempel kan denna del av kommandot se ut sÄ hÀr: rinormaloku/sentiment-analysis-frontend.
Detta kommando kan ocksÄ förkortas genom att ta bort -f Dockerfile, eftersom denna fil redan finns i mappen dÀr vi kör detta kommando.
För att skicka den fÀrdiga bilden till repositoryt kommer vi att behöva följande kommando:
docker push $DOCKER_USER_ID/sentiment-analysis-frontendEfter att ha kört detta, kontrollera listan över dina repositories pÄ Docker Hub för att se om bilden har skickats till det molnbaserade lagret framgÄngsrikt.
âKöra en container
Nu kan vem som helst ladda ner och köra bilden som Àr kÀnd som $DOCKER_USER_ID/sentiment-analysis-frontend. För att göra detta behöver du köra följande sekvens av kommandon:
docker pull $DOCKER_USER_ID/sentiment-analysis-frontend
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend Nu Àr containern igÄng och vi kan fortsÀtta vÄrt arbete med att skapa andra nödvÀndiga bilder. Men innan vi fortsÀtter, lÄt oss gÄ igenom konstruktionen 80:80, som förekommer i kommandot för att starta bilden och kan verka förvirrande.
- Det första numret
80Àr portnumret för vÀrden (dvs. den lokala datorn). - Det andra numret
80Àr porten för containern som förfrÄgan ska omdirigeras till.
LÄt oss titta pÄ följande illustration.

Omdirigering av portar
Systemet omdirigerar förfrÄgningar frÄn port <hostPort> till port <containerPort>. Det vill sÀga, en förfrÄgan till porten 80 pÄ datorn omdirigeras till porten 80 för containern.
Eftersom porten 80 Àr öppen pÄ den lokala datorn, kan applikationen nÄs frÄn denna dator pÄ adressen localhost:80. Om ditt system inte stöder Docker kan du starta applikationen pÄ en Docker-virtuell maskin, vars IP-adress kommer att synas som :80. För att ta reda pÄ IP-adressen för den virtuella Docker-maskinen kan du anvÀnda kommandot docker-machine ip.
Vid detta steg, efter att container för frontend-applikationen framgÄngsrikt har startats, bör du kunna öppna dess sida i webblÀsaren.
âFil .dockerignore
NÀr vi bygger applikationsbilden SA-Frontend, mÀrkte vi att processen kan vara ganska lÄngsam. Detta beror pÄ att Docker-demonen mÄste ta emot byggkontexten. Katalogen som representerar byggkontexten anges som det sista argumentet i kommandot docker build. I vÄrt fall stÄr det en punkt i slutet av detta kommando. Detta gör att följande struktur inkluderas i byggkontexten:
sa-frontend:
| Â Â .dockerignore
| Â Â Dockerfile
| Â Â package.json
| Â Â README.md
+---build
+---node_modules
+---public
---src Men vi behöver endast mappen build. Att ladda nÄgot annat Àr bara slöseri med tid. Bygget kan pÄskyndas genom att ange för Docker vilka kataloger som kan ignoreras. Det Àr just dÀrför vi behöver filen .dockerignore. Om du Àr bekant med filen .gitignore, kommer strukturen i denna fil sÀkert att verka bekant. Den listar kataloger som byggsystemet kan ignorera. InnehÄllet i denna fil ser i vÄr situation ut sÄ hÀr:
node_modules
src
public Fil .dockerignore mÄste finnas i samma mapp som filen Dockerfile. Nu kommer byggandet av bilden att ta nÄgra sekunder.
LÄt oss nu gÄ vidare till bilden för Java-applikationen.
âBygg av containern för Java-applikationen
Vet du vad, du har faktiskt redan lÀrt dig allt som behövs för att skapa containerbilder. DÀrför kommer detta avsnitt att bli ganska kort.
Ăppna filen Dockerfile, som finns i projektkatalogen sa-webapp. Om du lĂ€ser texten i denna fil kommer du att stöta pĂ„ endast tvĂ„ nya konstruktioner som börjar med nyckelorden ENV och EXPOSE:
ENV SA_LOGIC_API_URL http://localhost:5000
âŠ
EXPOSE 8080 Nyckelordet ENV tillÄter att deklarera miljövariabler inom Docker-containrar. I synnerhet tillÄter det i vÄrt fall att ange URL:en för att fÄ tillgÄng till API:t för textanalysapplikationen.
Nyckelordet EXPOSE lÄter Docker veta att porten behöver öppnas. Vi kommer att anvÀnda denna port under arbetet med applikationen. HÀr kan man mÀrka att i Dockerfile för applikationen SA-Frontend sÄdan kommandon inte finns. Detta Àr endast för dokumentationsÀndamÄl, med andra ord, denna konstruktion Àr avsedd för den som kommer att lÀsa Dockerfile.
Byggandet av en bild och sĂ€ndning av den till ett repository ser exakt ut som i föregĂ„ende exempel. Om du fortfarande inte Ă€r helt sĂ€ker pĂ„ dina förmĂ„gor â motsvarande kommandon kan hittas i filen README.md i mappen sa-webapp.
âByggnad av en containerbild för Python-applikation
Om du tittar pÄ innehÄllet i filen Dockerfile i mappen sa-logic, sÄ hittar du inget nytt dÀr. Kommandon för att bygga en bild och skicka den till repositoryt bör ocksÄ vara bekanta för dig, men deras, precis som i fallet med vÄra andra applikationer, kan hittas i filen README.md i mappen sa-logic.
âTestning av containeriserade applikationer
Kan du lita pÄ nÄgot som du inte har testat? Jag kan inte heller. LÄt oss testa vÄra containrar.
- LÄt oss köra applikationens container
sa-logicoch stÀlla in den för att lyssna pÄ porten5050:docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic - LÄt oss köra applikationens container
sa-webappoch stÀlla in den för att lyssna pÄ porten8080. Dessutom mÄste vi stÀlla in den port dÀr Python-applikationen kommer att vÀnta pÄ förfrÄgningar frÄn Java-applikationen genom att omdefiniera miljövariabelnSA_LOGIC_API_URL:$ docker run -d -p 8080:8080 -e SA_LOGIC_API_URL='http://:5000' $DOCKER_USER_ID/sentiment-analysis-web-app
För att ta reda pĂ„ hur man tar reda pĂ„ IP-adressen för containern eller Docker-virtuella maskinen â se filen .
LÄt oss köra applikationens container sa-frontend:
docker run -d -p 80:80 $DOCKER_USER_ID/sentiment-analysis-frontend Nu Àr allt klart för att gÄ till webblÀsaren pÄ adressen localhost:80 och testa applikationen.
Observera att om du har Àndrat porten för sa-webapp, eller om du arbetar med en Docker-virtuell maskin, behöver du redigera filen App.js frÄn mappen sa-frontend, genom att byta IP-adress eller portnummer i metoden analyzeSentence(), genom att sÀtta in aktuella uppgifter istÀllet för de förÄldrade. Efter detta mÄste du bygga om bilden och anvÀnda den.
SÄ hÀr ser schemat för vÄr applikation ut nu.

MikrotjÀnster körs i containrar
Sammanfattning: varför behöver vi en Kubernetes-kluster?
Nyss har vi studerat filerna Dockerfile, pratat om hur man bygger bilder och skickar dem till Docker-repository. Dessutom har vi lÀrt oss att pÄskynda byggandet av bilder med hjÀlp av filen .dockerignore. Som ett resultat körs vÄra mikrotjÀnster nu i Docker-containrar. HÀr kan du rimligtvis frÄga dig varför vi behöver Kubernetes. Svaret pÄ denna frÄga kommer att behandlas i den andra delen av detta material. Under tiden, tÀnk pÄ följande frÄga:
LÄt oss anta att vÄr webbapplikation för textanalys har blivit vÀrldsomspÀnnande populÀr. Varje minut kommer miljoner förfrÄgningar till den. Det betyder att mikrotjÀnsterna sa-webapp och sa-logic kommer att utsÀttas för enorm belastning. Hur skalas containrarna dÀr mikrotjÀnsterna körs?
KĂ€lla: habr.com
