Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar

PÄ vÄr begÀran skapade Habr en hub Kubernetes 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?

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar

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.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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:

  1. WebblÀsaren begÀr en fil frÄn servern index.html (som i sin tur laddar React-applikationspaketet).
  2. AnvÀndaren interagerar med applikationen, vilket orsakar en begÀran till webbapplikationen, baserad pÄ Spring.
  3. Webbapplikationen vidarebefordrar begÀran för textanalys till Python-applikationen.
  4. Python-applikationen utför textanalysen och returnerar resultatet som svar pÄ begÀran.
  5. 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 hÀr. 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. HÀr 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.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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();
    }
}

  1. I SentimentController finns ett fÀlt saLogicApiUrl. Dess vÀrde sÀtts av egenskapen sa.logic.api.url.
  2. StrÀng saLogicApiUrl konkateneras 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.URL

VÀ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

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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.py

Efter 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

  1. Initiering av objekt Flask.
  2. Angivelse av adressen för att utföra POST-förfrÄgningar till det.
  3. Utdrag av egenskap sentence frÄn förfrÄgningskroppen.
  4. Initiering av anonymt objekt TextBlob och hÀmta vÀrdet polarity fö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).
  5. ÅterlĂ€mning av ett svar vars kropp innehĂ„ller texten i meningen och det berĂ€knade vĂ€rdet för den polarity.
  6. Starta Flask-applikationen som kommer att vara tillgÀnglig pÄ adressen 0.0.0.0:5000 (den kan nÄs med en struktur av typen localhost: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.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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

Kubernetes À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 dokumentationen 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:

  1. Ineffektiv resursanvÀndning, eftersom varje virtuell maskin representerar ett fullstÀndigt operativsystem.
  2. Plattformsberoende. Det som fungerar pÄ en viss lokal dator kanske inte fungerar pÄ en produktionsserver.
  3. LÄngsam och resurskrÀvande skalning av en lösning baserad pÄ virtuella maskiner.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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:

  1. Effektiv resursanvÀndning: arbete med operativsystemet med hjÀlp av Docker.
  2. Oberoende av plattform. En container som utvecklaren kan köra pÄ sin dator kommer att fungera var som helst.
  3. LÀttviktig distribution genom anvÀndning av bildlager.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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. HÀr 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:

  1. Bygga paketet för React-applikationen (npm run build).
  2. Köra Nginx-servern.
  3. Kopiera innehÄllet i katalogen build frÄn projektmappen sa-frontend till serverkatalogen nginx/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 bild 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:

  1. Basbilden ska vara Nginx-bilden.
  2. InnehÄllet i mappen sa-frontend/build ska kopieras till bildmappen nginx/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 beskrivningen 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:

  1. Installera Docker.
  2. Registrera dig pÄ Docker Hub.
  3. 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-frontend

Efter 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.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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.

  1. LÄt oss köra applikationens container sa-logic och stÀlla in den för att lyssna pÄ porten 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. LÄt oss köra applikationens container sa-webapp och stÀlla in den för att lyssna pÄ porten 8080. 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övariabeln SA_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 README.

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.

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar
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?

Kubernetes-handbok, del 1: applikationer, mikrotjÀnster och containrar

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster