Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri

Pēc mūsu pieprasījuma Habrs izveidoja centru Kubernetes un mēs esam priecīgi tajā ievietot pirmo publikāciju. Abonējiet!

Kubernetes ir viegli. Kāpēc bankas man maksā lielu naudu, lai strādātu Å”ajā jomā, kamēr ikviens var apgÅ«t Å”o tehnoloÄ£iju tikai dažu stundu laikā?

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri

Ja Å”aubāties, ka Kubernetes var tik ātri apgÅ«t, iesaku pamēģināt paÅ”am. Proti, apgÅ«stot Å”o materiālu, varēsi palaist uz mikropakalpojumiem balstÄ«tu aplikāciju Kubernetes klasterÄ«. Es to varu garantēt, jo tieÅ”i ar to paÅ”u metodiku, kas tiek izmantota Å”eit, es mācu mÅ«su klientiem strādāt ar Kubernetes. Ar ko Ŕī rokasgrāmata atŔķiras no citām? PatiesÄ«bā ir daudz lietu. Tātad lielākā daļa Å”o materiālu sākas ar vienkārÅ”u lietu skaidrojumu - Kubernetes jēdzieniem un komandas kubectl iezÄ«mēm. Å o materiālu autori pieņem, ka viņu lasÄ«tāji pārzina lietojumprogrammu izstrādi, mikropakalpojumus un Docker konteinerus. Mēs iesim citu ceļu. Pirmkārt, mēs runāsim par to, kā datorā palaist lietojumprogrammu, kuras pamatā ir mikropakalpojumi. Pēc tam apskatÄ«sim katra mikropakalpojuma konteinera attēlu izveidi. Un pēc tam mēs iepazÄ«simies ar Kubernetes un apskatÄ«sim uz mikropakalpojumiem balstÄ«tas lietojumprogrammas izvietoÅ”anu Kubernetes pārvaldÄ«tajā klasterÄ«.

Å Ä« pieeja ar pakāpenisku pieeju Kubernetes sniegs notiekoŔā izpratnes dziļumu, kas nepiecieÅ”ams vidusmēra cilvēkam, lai saprastu, kā Kubernetes vienkārÅ”i viss darbojas. Kubernetes noteikti ir vienkārÅ”a tehnoloÄ£ija, ja tie, kas vēlas to apgÅ«t, zina, kur un kā tā tiek izmantota.

Tagad, bez papildu piepūles, sāksim un runāsim par lietojumprogrammu, ar kuru mēs strādāsim.

Eksperimentāls pielietojums

MÅ«su lietojumprogramma veiks tikai vienu funkciju. Par ievadi tiek ņemts viens teikums, pēc kura, izmantojot teksta analÄ«zes rÄ«kus, tiek veikta Ŕī teikuma sentimenta analÄ«ze, iegÅ«stot novērtējumu teikuma autora emocionālajai attieksmei pret noteiktu objektu.

Šādi izskatās Ŕīs lietojumprogrammas galvenais logs.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Tīmekļa lietojumprogramma tekstu sentimenta analīzei

No tehniskā viedokļa lietojumprogramma sastāv no trim mikropakalpojumiem, no kuriem katrs atrisina noteiktu problēmu kopumu:

  • SA-Frontend ir Nginx tÄ«mekļa serveris, kas apkalpo statiskus React failus.
  • SA-WebApp ir Java valodā rakstÄ«ta tÄ«mekļa lietojumprogramma, kas apstrādā pieprasÄ«jumus no priekÅ”gala.
  • SA-Logic ir Python lietojumprogramma, kas veic teksta sentimenta analÄ«zi.

Ir svarÄ«gi atzÄ«mēt, ka mikropakalpojumi nepastāv atseviŔķi. Viņi Ä«steno ideju par "pienākumu nodalÄ«Å”anu", bet tajā paŔā laikā viņiem ir jāsadarbojas vienam ar otru.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Datu plūsmas lietojumprogrammā

IepriekÅ” redzamajā diagrammā var redzēt numurētos sistēmas posmus, kas ilustrē datu plÅ«smas lietojumprogrammā. ApskatÄ«sim tos:

  1. Pārlūkprogramma pieprasa failu no servera index.html (kas savukārt lejupielādē React lietojumprogrammas pakotni).
  2. Lietotājs mijiedarbojas ar lietojumprogrammu, un tas izraisa izsaukumu uz pavasara tīmekļa lietojumprogrammu.
  3. Tīmekļa lietojumprogramma pārsūta pieprasījumu veikt teksta analīzi Python lietojumprogrammai.
  4. Python lietojumprogramma veic teksta sentimenta analīzi un atgriež rezultātu kā atbildi uz pieprasījumu.
  5. Lietojumprogramma Spring nosūta atbildi uz React aplikāciju (kas savukārt parāda lietotājam teksta analīzes rezultātu).

Visu Å”o lietojumprogrammu kodu var atrast Å”eit. Es iesaku jums tÅ«lÄ«t nokopēt Å”o krātuvi, jo mums ar to ir daudz interesantu eksperimentu.

Uz mikropakalpojumiem balstÄ«tas lietojumprogrammas palaiÅ”ana vietējā datorā

Lai lietojumprogramma darbotos, mums ir jāstartē visi trÄ«s mikropakalpojumi. Sāksim ar jaukāko no tiem ā€” priekÅ”gala lietojumprogrammu.

ā–Izveidojiet React vietējai attÄ«stÄ«bai

Lai palaistu React lietojumprogrammu, datorā jāinstalē platforma Node.js un NPM. Kad tas viss ir instalēts, izmantojiet termināli, lai pārietu uz savu projekta mapi sa-frontend un palaidiet Ŕādu komandu:

npm install

Palaižot Å”o komandu mapē node_modules tiks ielādētas React aplikācijas atkarÄ«bas, kuru ieraksti atrodas failā package.json. Kad atkarÄ«bas ir lejupielādētas tajā paŔā mapē, palaidiet Å”o komandu:

npm start

Tas ir viss. Tagad darbojas lietojumprogramma React, tai varat piekļūt, pārlÅ«kprogrammā dodoties uz Å”o adresi: localhost:3000. JÅ«s varat kaut ko mainÄ«t tā kodā. JÅ«s uzreiz redzēsit Å”o izmaiņu ietekmi pārlÅ«kprogrammā. Tas ir iespējams, pateicoties tā sauktajai ā€œkarstoā€ moduļu nomaiņai. Tas padara priekÅ”gala izstrādi par vienkārÅ”u un patÄ«kamu pieredzi.

ā–React pieteikuma sagatavoÅ”ana ražoÅ”anai

Lai faktiski izmantotu React lietojumprogrammu, mums tā ir jāpārvērÅ” par statisku failu kopu un jāpasniedz klientiem, izmantojot tÄ«mekļa serveri.

Lai izveidotu lietojumprogrammu React, vēlreiz izmantojot termināli, dodieties uz mapi sa-frontend un palaidiet Ŕādu komandu:

npm run build

Tādējādi projekta mapē tiks izveidots direktorijs build. Tajā bÅ«s visi statiskie faili, kas nepiecieÅ”ami, lai programma React darbotos.

ā–Statisko failu apkalpoÅ”ana, izmantojot Nginx

Vispirms jums jāinstalē un jāpalaiž Nginx tīmekļa serveris. Šeit varat to lejupielādēt un atrast instrukcijas, kā to instalēt un palaist. Pēc tam jums ir jākopē mapes saturs sa-frontend/build uz mapi [your_nginx_installation_dir]/html.

Izmantojot Å”o pieeju, fails tiek Ä£enerēts lietojumprogrammas React veidoÅ”anas procesā index.html bÅ«s pieejams plkst [your_nginx_installation_dir]/html/index.html. Å is ir fails, ko pēc noklusējuma Nginx serveris rada, piekļūstot tam. Serveris ir konfigurēts, lai klausÄ«tos portā 80, taču to var pielāgot vajadzÄ«gajā veidā, rediģējot failu [your_nginx_installation_dir]/conf/nginx.conf.

Tagad atveriet pārlūkprogrammu un dodieties uz localhost:80. Jūs redzēsit React pieteikuma lapu.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Reaģēt lietojumprogrammu, ko apkalpo Nginx serveris

Ja tagad kaut ko ievadÄ«si laukā Type your sentence un nospiediet pogu Send - nekas nenotiks. Bet, ja paskatās uz konsoli, jÅ«s varat redzēt kļūdu ziņojumus. Lai saprastu, kur tieÅ”i rodas Ŕīs kļūdas, analizēsim lietojumprogrammas kodu.

ā– PriekŔējās lietojumprogrammas koda analÄ«ze

Apskatiet faila kodu App.js, mēs to redzam, nospiežot pogu Send sauc metodi analyzeSentence(). Å Ä«s metodes kods ir norādÄ«ts zemāk. LÅ«dzu, ņemiet vērā, ka katrai rindai, kurā ir veidlapas komentārs # ŠŠ¾Š¼ŠµŃ€, zem koda ir sniegts paskaidrojums. Tādā paŔā veidā mēs analizēsim citus koda fragmentus.

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, uz kuru tiek nosÅ«tÄ«ts POST pieprasÄ«jums. Tiek pieņemts, ka Å”ajā adresē ir pieteikums, kas gaida Ŕādus pieprasÄ«jumus.

2.Pieprasījuma iestāde nosūtīta pieteikumam. Šeit ir pieprasījuma pamatteksta piemērs:

{
    sentence: "I like yogobella!"
}

3.Kad tiek saņemta atbilde uz pieprasÄ«jumu, komponenta stāvoklis tiek atjaunināts. Tas izraisa komponenta atkārtotu renderÄ“Å”anu. Ja mēs saņemam datus (tas ir, JSON objektu, kurā ir ievades dati un aprēķinātais teksta rezultāts), mēs izvadÄ«sim komponentu Polarity, jo tiks izpildÄ«ti attiecÄ«gie nosacÄ«jumi. Šādi mēs aprakstām komponentu:

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

Å Ä·iet, ka kods darbojas diezgan labi. Kas ar to ir nepareizi? Ja pieņemat, ka adresē, uz kuru aplikācija mēģina nosÅ«tÄ«t POST pieprasÄ«jumu, vēl nekas nevar pieņemt un apstrādāt Å”o pieprasÄ«jumu, tad jums bÅ«s pilnÄ«ga taisnÄ«ba. Proti, lai apstrādātu pieprasÄ«jumus, kas saņemti plkst http://localhost:8080/sentiment, mums ir jāpalaiž tÄ«mekļa lietojumprogramma, kuras pamatā ir pavasaris.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Mums ir nepiecieÅ”ama pavasara lietojumprogramma, kas var pieņemt POST pieprasÄ«jumu

ā– PavasarÄ« balstÄ«tas tÄ«mekļa lietojumprogrammas iestatÄ«Å”ana

Lai izvietotu Spring lietojumprogrammu, jums bÅ«s nepiecieÅ”ami JDK8 un Maven un pareizi konfigurēti vides mainÄ«gie. Kad tas viss ir instalēts, varat turpināt darbu pie mÅ«su projekta.

ā–Lietojumprogrammas iesaiņoÅ”ana jar failā

Izmantojot termināli, dodieties uz mapi sa-webapp un ievadiet Ŕādu komandu:

mvn install

Pēc Ŕīs komandas palaiÅ”anas mapē sa-webapp tiks izveidots direktorijs target. Å eit atradÄ«sies Java lietojumprogramma, kas ir iepakota jar failā, ko attēlo fails sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

ā–Palaižot Java lietojumprogrammu

Dodieties uz mapi target un palaidiet lietojumprogrammu ar Ŕādu komandu:

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

Å Ä«s komandas izpildes laikā radÄ«sies kļūda. Lai sāktu to labot, mēs varam analizēt izņēmuma informāciju steka izsekoÅ”anas datos:

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

Mums Å”eit vissvarÄ«gākā ir nozÄ«mes noskaidroÅ”anas neiespējamÄ«bas pieminÄ“Å”ana sa.logic.api.url. Analizēsim kodu, kurā rodas kļūda.

ā–Java lietojumprogrammas koda analÄ«ze

Šeit ir koda fragments, kurā rodas kļūda.

@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. In SentimentController ir lauks saLogicApiUrl. Tā vērtÄ«bu nosaka Ä«paÅ”ums sa.logic.api.url.
  2. String saLogicApiUrl savienojas ar vērtÄ«bu /analyse/sentiment. Kopā tie veido adresi zvanÄ«Å”anai uz mikropakalpojumu, kas veic teksta analÄ«zi.

ā–Iestatiet Ä«paÅ”uma vērtÄ«bu

PavasarÄ« standarta Ä«paÅ”uma vērtÄ«bu avots ir fails application.properties, ko var atrast vietnē sa-webapp/src/main/resources. Bet tā izmantoÅ”ana nav vienÄ«gais veids, kā noteikt Ä«paÅ”uma vērtÄ«bas. To var izdarÄ«t arÄ«, izmantojot Ŕādu komandu:

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

Å Ä« Ä«paÅ”uma vērtÄ«bai ir jānorāda uz mÅ«su Python lietojumprogrammas adresi.

Konfigurējot to, mēs norādām Spring tīmekļa lietojumprogrammai, kur tai ir jāiet, lai veiktu teksta analīzes pieprasījumus.

Lai neapgrūtinātu mūsu dzīvi, nolemsim, ka Python aplikācija būs pieejama plkst localhost:5000 un centīsimies par to neaizmirst. Rezultātā lietojumprogrammas Spring palaiŔanas komanda izskatīsies Ŕādi:

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

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Mūsu sistēmā trūkst Python lietojumprogrammas

Tagad atliek tikai palaist Python lietojumprogrammu, un sistēma darbosies kā paredzēts.

ā–Python lietojumprogrammas iestatÄ«Å”ana

Lai palaistu Python lietojumprogrammu, ir jābÅ«t instalētai Python 3 un Pip, kā arÄ« pareizi jāiestata atbilstoÅ”ie vides mainÄ«gie.

ā–AtkarÄ«bu instalÄ“Å”ana

Dodieties uz sava projekta mapi sa-logic/sa un palaidiet Ŕādas komandas:

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

ā–Palaidiet lietojumprogrammu

Pēc atkarÄ«bu instalÄ“Å”anas mēs esam gatavi palaist lietojumprogrammu:

python sentiment_analysis.py

Pēc Ŕīs komandas palaiÅ”anas mums tiks paziņots:

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

Tas nozīmē, ka lietojumprogramma darbojas un gaida pieprasījumus plkst localhost:5000/

ā–Koda izpēte

Apskatīsim Python lietojumprogrammas kodu, lai saprastu, kā tas reaģē uz pieprasījumiem:

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. Objekta inicializācija Flask.
  2. Adreses norādīŔana POST pieprasījumu veikŔanai tai.
  3. ÄŖpaÅ”uma izgÅ«Å”ana sentence no pieprasÄ«juma iestādes.
  4. AnonÄ«ma objekta inicializācija TextBlob un iegÅ«t vērtÄ«bu polarity par pirmo teikumu, kas saņemts pieprasÄ«juma pamattekstā (mÅ«su gadÄ«jumā Å”is ir vienÄ«gais teikums, kas nosÅ«tÄ«ts analÄ«zei).
  5. Atgriežot atbildi, kuras pamatteksts satur teikuma tekstu un tam aprēķināto rādītāju polarity.
  6. Palaidiet lietojumprogrammu Flask, kas būs pieejama vietnē 0.0.0.0:5000 (tai var piekļūt arī, izmantojot veidlapas konstrukciju localhost:5000).

Mikropakalpojumi, kas veido lietojumprogrammu, tagad darbojas. Viņi ir pielāgoti mijiedarbÄ«bai savā starpā. Šādi izskatās pielietojuma diagramma Å”ajā darba posmā.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Visi mikropakalpojumi, kas veido lietojumprogrammu, ir sakārtoti darba kārtībā

Tagad, pirms turpināt, atveriet savu React lietojumprogrammu pārlÅ«kprogrammā un mēģiniet ar to parsēt kādu teikumu. Ja viss ir izdarÄ«ts pareizi - pēc pogas nospieÅ”anas Send jÅ«s redzēsit analÄ«zes rezultātus zem teksta lauka.

Nākamajā sadaļā mēs runāsim par to, kā darbināt mÅ«su mikropakalpojumus Docker konteineros. Tas ir nepiecieÅ”ams, lai sagatavotu lietojumprogrammu darbam Kubernetes klasterÄ«.

Dokeru konteineri

Kubernetes ir sistēma konteinerizētu lietojumprogrammu izvietoÅ”anas, mērogoÅ”anas un pārvaldÄ«bas automatizÄ“Å”anai. To sauc arÄ« par "konteineru orÄ·estrētāju". Ja Kubernetes strādā ar konteineriem, tad pirms Ŕīs sistēmas lietoÅ”anas mums vispirms ir jāiegādājas Å”ie konteineri. Bet vispirms parunāsim par to, kas ir konteineri. Iespējams, ka vislabākā atbilde uz jautājumu, kas tas ir, ir atrodama dokumentācija uz Docker:

Konteinera attēls ir viegla, autonoma, izpildāma pakotne, kas satur lietojumprogrammu, kurā ietilpst viss nepiecieÅ”amais tās palaiÅ”anai: lietojumprogrammas kods, izpildes vide, sistēmas rÄ«ki un bibliotēkas, iestatÄ«jumi. Konteineru programmas var izmantot Linux un Windows vidēs, un tās vienmēr darbosies vienādi neatkarÄ«gi no infrastruktÅ«ras.

Tas nozÄ«mē, ka konteinerus var darbināt jebkurā datorā, arÄ« ražoÅ”anas serveros, un tajos esoŔās lietojumprogrammas darbosies vienādi jebkurā vidē.

Lai izpētÄ«tu konteineru funkcijas un salÄ«dzinātu tos ar citiem lietojumprogrammu palaiÅ”anas veidiem, apskatÄ«sim piemēru par React lietojumprogrammas apkalpoÅ”anu, izmantojot virtuālo maŔīnu un konteineru.

ā–React lietojumprogrammas statisko failu apkalpoÅ”ana, izmantojot virtuālo maŔīnu

Mēģinot organizēt statisko failu apkalpoÅ”anu, izmantojot virtuālās maŔīnas, mēs saskarsimies ar Ŕādiem trÅ«kumiem:

  1. NeefektÄ«va resursu izmantoÅ”ana, jo katra virtuālā maŔīna ir pilnvērtÄ«ga operētājsistēma.
  2. Platformas atkarība. Tas, kas darbojas lokālajā datorā, var nedarboties ražoŔanas serverī.
  3. Lēna un resursietilpÄ«ga uz virtuālās maŔīnas balstÄ«ta risinājuma mērogoÅ”ana.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Nginx tīmekļa serveris, kas apkalpo statiskus failus, kas darbojas virtuālajā maŔīnā

Ja lÄ«dzÄ«gas problēmas risināŔanai tiek izmantoti konteineri, tad, salÄ«dzinot ar virtuālajām maŔīnām, var atzÄ«mēt Ŕādas stiprās puses:

  1. EfektÄ«va resursu izmantoÅ”ana: darbs ar operētājsistēmu, izmantojot Docker.
  2. Platformas neatkarīga. Konteiners, ko izstrādātājs var darbināt savā datorā, darbosies jebkur.
  3. Viegla izvietoÅ”ana, izmantojot attēla slāņus.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Nginx tīmekļa serveris, kas apkalpo statiskus failus, kas darbojas konteinerā

Mēs salÄ«dzinājām virtuālās maŔīnas un konteinerus tikai dažos punktos, taču pat ar to pietiek, lai izjustu konteineru stiprās puses. Å eit JÅ«s varat atrast sÄ«kāku informāciju par Docker konteineriem.

ā–Konteinera attēla izveide React lietojumprogrammai

Docker konteinera pamatelements ir fails Dockerfile. Šī faila sākumā tiek izveidots konteinera pamattēla ieraksts, pēc tam seko instrukciju secība, kas norāda, kā izveidot konteineru, kas atbilstu noteiktas lietojumprogrammas vajadzībām.

Pirms sākam strādāt ar failu Dockerfile, atcerēsimies, ko mēs darÄ«jām, lai sagatavotu React lietojumprogrammas failus augÅ”upielādei Nginx serverÄ«:

  1. React lietojumprogrammas pakotnes izveide (npm run build).
  2. Nginx servera palaiŔana.
  3. Kataloga satura kopēŔana build no projekta mapes sa-frontend uz servera mapi nginx/html.

Tālāk varat redzēt paralēles starp konteinera izveidi un iepriekÅ” minētajām darbÄ«bām, kas veiktas jÅ«su lokālajā datorā.

ā–Dokera faila sagatavoÅ”ana SA-Frontend lietojumprogrammai

NorādÄ«jumi, kas tiks ietverti Dockerfile pieteikumam SA-Frontend, sastāv tikai no divām komandām. Fakts ir tāds, ka Nginx izstrādes komanda ir sagatavojusi pamata attēls priekÅ” Nginx, ko izmantosim sava tēla izveidoÅ”anai. Å Ä«s ir divas darbÄ«bas, kas mums jāapraksta:

  1. Attēla pamatā jābūt Nginx attēlam.
  2. Mapes saturs sa-frontend/build jākopē attēlu mapē nginx/html.

Ja pāriesit no Ŕī apraksta uz failu Dockerfile, tad tas izskatīsies Ŕādi:

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

Kā redzat, Å”eit viss ir ļoti vienkārÅ”i, un faila saturs pat izrādās diezgan lasāms un saprotams. Å is fails liek sistēmai uzņemt attēlu nginx ar visu, kas tajā jau atrodas, un kopējiet direktorijas saturu build uz direktoriju nginx/html.

Å eit jums var rasties jautājums par to, kā es zinu, kur tieÅ”i jums ir nepiecieÅ”ams kopēt failus no mapes build, tas ir, no kurienes nāca ceļŔ /usr/share/nginx/html. PatiesÄ«bā arÄ« Å”eit nav nekā sarežģīta. Fakts ir tāds, ka attiecÄ«go informāciju var atrast apraksts attēls.

ā–Izveidojiet attēlu un augÅ”upielādējiet to repozitorijā

Lai mēs varētu strādāt ar gatavo attēlu, mums tas ir jāievieto attēlu krātuvē. Lai to izdarÄ«tu, mēs izmantosim bezmaksas mākoņa attēlu mitināŔanas platformu Docker Hub. Å ajā darba posmā jums jāveic Ŕādas darbÄ«bas:

  1. Instalēt dokers.
  2. Reģistrējieties Docker Hub vietnē.
  3. Piesakieties savā kontā, terminālī izpildot Ŕādu komandu:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

Tagad jums ir jāizmanto terminālis, lai pārietu uz direktoriju sa-frontend un palaidiet tur Ŕādu komandu:

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

Å eit un tālāk lÄ«dzÄ«gās komandās $DOCKER_USER_ID jāaizstāj ar jÅ«su Docker Hub lietotājvārdu. Piemēram, Ŕī komandas daļa varētu izskatÄ«ties Ŕādi: rinormaloku/sentiment-analysis-frontend.

Å ajā gadÄ«jumā Å”o komandu var saÄ«sināt, noņemot no tās -f Dockerfile, jo Å”is fails jau pastāv mapē, kurā mēs izpildām Å”o komandu.

Lai gatavo attēlu nosÅ«tÄ«tu uz repozitoriju, mums ir nepiecieÅ”ama Ŕāda komanda:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Pēc tā pabeigÅ”anas pārbaudiet savu repozitoriju sarakstu Docker Hub, lai saprastu, vai attēla augÅ”upielāde mākoņa krātuvē bija veiksmÄ«ga.

ā–Palaižot konteineru

Tagad ikviens var lejupielādēt un palaist attēlu, kas pazÄ«stams kā $DOCKER_USER_ID/sentiment-analysis-frontend. Lai to izdarÄ«tu, jums ir jāpalaiž Ŕāda komandu secÄ«ba:

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

Tagad konteiners darbojas, mēs varam turpināt darbu, veidojot citus mums nepiecieÅ”amos attēlus. Bet pirms turpinām, sapratÄ«sim dizainu 80:80, kas parādās attēla palaiÅ”anas komandā un var Ŕķist mulsinoÅ”i.

  • Pirmais numurs 80 ā€” tas ir resursdatora porta numurs (tas ir, lokālā datora).
  • Otrais numurs 80 ir konteinera osta, uz kuru jānosÅ«ta pieprasÄ«jums.

Apsveriet tālāk sniegto ilustrāciju.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Portu pārsūtīŔana

Sistēma pāradresē pieprasījumus no porta <hostPort> uz ostu <containerPort>. Tas ir, pieeja ostai 80 dators tiek novirzīts uz portu 80 konteiners.

KopÅ” ostas 80 atvērts lokālajā datorā, varat piekļūt lietojumprogrammai no Ŕī datora vietnē localhost:80. Ja jÅ«su sistēma neatbalsta Docker, lietojumprogrammu var palaist Docker virtuālajā maŔīnā, kuras adrese izskatÄ«sies Ŕādi <docker-machine ip>:80. Lai uzzinātu Docker virtuālās maŔīnas IP adresi, varat izmantot komandu docker-machine ip.

Å ajā brÄ«dÄ« pēc veiksmÄ«gas priekÅ”gala lietojumprogrammas konteinera palaiÅ”anas jums vajadzētu bÅ«t iespējai pārlÅ«kprogrammā atvērt tā lapu.

ā–.dockerignore fails

Lietojumprogrammas attēla apkopoÅ”ana SA-Frontend, mēs varējām pamanÄ«t, ka Å”is process izrādās ārkārtÄ«gi lēns. Tas notiek tāpēc, ka attēla izveides konteksts ir jānosÅ«ta Docker dēmonam. Direktorijs, kas pārstāv bÅ«vÄ“Å”anas kontekstu, ir norādÄ«ts kā pēdējais komandas arguments docker build. MÅ«su gadÄ«jumā Ŕīs komandas beigās ir punkts. Tādējādi bÅ«vniecÄ«bas kontekstā tiek iekļauta Ŕāda struktÅ«ra:

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

Bet no visām Å”eit esoÅ”ajām mapēm mums ir nepiecieÅ”ama tikai mape build. Kaut ko citu ielādÄ“Å”ana ir laika izŔķieÅ”ana. Varat paātrināt veidoÅ”anu, norādot Docker, kurus direktorijus ignorēt. Lai to izdarÄ«tu, mums ir nepiecieÅ”ams fails .dockerignore. JÅ«s, ja esat iepazinies ar failu .gitignore, Ŕī faila struktÅ«ra, iespējams, ŔķitÄ«s pazÄ«stama. Tajā ir uzskaitÄ«ti direktoriji, kurus attēla veidoÅ”anas sistēma var ignorēt. MÅ«su gadÄ«jumā Ŕī faila saturs izskatās Ŕādi:

node_modules
src
public

fails .dockerignore jāatrodas tajā paŔā mapē, kur fails Dockerfile. Tagad attēla izveide prasÄ«s dažas sekundes.

Tagad strādāsim pie Java lietojumprogrammas attēla.

ā–Konteinera attēla izveide Java lietojumprogrammai

JÅ«s jau esat iemācÄ«juÅ”ies visu, kas jums jāzina, lai izveidotu konteinera attēlus. Tāpēc Ŕī sadaļa bÅ«s ļoti Ä«sa.

Atveriet failu Dockerfilekas atrodas projekta mapē sa-webapp. Izlasot Ŕī faila tekstu, tajā redzēsiet tikai divas jaunas konstrukcijas, sākot ar atslēgvārdiem ENV Šø EXPOSE:

ENV SA_LOGIC_API_URL http://localhost:5000
ā€¦
EXPOSE 8080

Atslēgvārds ENV Ä»auj deklarēt vides mainÄ«gos Docker konteineros. Jo Ä«paÅ”i mÅ«su gadÄ«jumā tas ļauj norādÄ«t URL, lai piekļūtu lietojumprogrammas API, kas veic teksta analÄ«zi.

Atslēgvārds EXPOSE ļauj norādÄ«t Docker atvērt portu. Lietojumprogrammas palaiÅ”anas laikā mēs izmantosim Å”o portu. Å eit jÅ«s to varat pamanÄ«t Dockerfile pieteikumam SA-Frontend tādas komandas nav. Tas ir tikai dokumentācijas nolÅ«kos, citiem vārdiem sakot, Ŕī konstrukcija ir paredzēta tam, kurÅ” lasÄ«s Dockerfile.

Attēla izveide un nosÅ«tÄ«Å”ana uz repozitoriju izskatās tieÅ”i tāpat kā iepriekŔējā piemērā. Ja vēl neesat ļoti pārliecināts par savām spējām, atbilstoŔās komandas var atrast failā README.md mapē sa-webapp.

ā–Konteinera attēla izveide Python lietojumprogrammai

Ja paskatās uz faila saturu Dockerfile mapē sa-logic, tad tur neko jaunu sev neatradÄ«si. Komandas attēla izveidei un nosÅ«tÄ«Å”anai uz krātuvi arÄ« jums jau ir zināmas, taču, tāpat kā ar citām mÅ«su lietojumprogrammām, tās var atrast failā README.md mapē sa-logic.

ā– Konteineru lietojumprogrammu testÄ“Å”ana

Vai varat uzticēties kaut kam, ko neesat pārbaudījis? Es arī nevaru. Pārbaudīsim savus konteinerus.

  1. Palaidīsim lietojumprogrammas konteineru sa-logic un konfigurējiet to, lai klausītos portā 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. PalaidÄ«sim lietojumprogrammas konteineru sa-webapp un konfigurējiet to, lai klausÄ«tos portā 8080. Turklāt mums ir jākonfigurē ports, kurā Python lietojumprogramma uzklausÄ«s pieprasÄ«jumus no Java lietojumprogrammas, atkārtoti pieŔķirot vides mainÄ«go 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

Lai uzzinātu, kā uzzināt Docker konteinera vai virtuālās maŔīnas IP adresi, skatiet failu README.

Palaidīsim lietojumprogrammas konteineru sa-frontend:

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

Tagad viss ir gatavs doties uz adresi pārlūkprogrammā localhost:80 un izmēģiniet lietojumprogrammu.

LÅ«dzu, ņemiet vērā, ka, ja mainÄ«jāt portu uz sa-webapp, vai, ja izmantojat Docker virtuālo maŔīnu, fails bÅ«s jārediģē App.js no mapes sa-frontendmainot IP adresi vai porta numuru metodē analyzeSentence(), aizstājot paÅ”reizējo informāciju novecojuÅ”o datu vietā. Pēc tam attēls ir jāsamontē un jāizmanto.

Tā tagad izskatās mūsu lietojumprogrammu diagramma.

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri
Mikropakalpojumi darbojas konteineros

Kopsavilkums: kāpēc mums ir nepiecieÅ”ams Kubernetes klasteris?

Mēs tikko izskatÄ«jām failus Dockerfile, runāja par to, kā izveidot attēlus un nosÅ«tÄ«t tos uz Docker repozitoriju. Turklāt mēs uzzinājām, kā paātrināt attēla montāžu, izmantojot failu .dockerignore. Rezultātā mÅ«su mikropakalpojumi tagad darbojas Docker konteineros. Å eit jums var rasties pilnÄ«gi pamatots jautājums par to, kāpēc mums ir nepiecieÅ”ams Kubernetes. Å Ä« materiāla otrā daļa bÅ«s veltÄ«ta atbildei uz Å”o jautājumu. Tikmēr apsveriet Ŕādu jautājumu:
Pieņemsim, ka mÅ«su tÄ«mekļa lietojumprogramma teksta analÄ«zei ir kļuvusi populāra visā pasaulē. Katru minÅ«ti viņam pienāk miljoniem pieprasÄ«jumu. Tas nozÄ«mē, ka mikropakalpojumi sa-webapp Šø sa-logic tiks pakļauta milzÄ«gai slodzei. Kā mērogot konteinerus, kuros darbojas mikropakalpojumi?

Kubernetes apmācÄ«bas 1. daļa: lietojumprogrammas, mikropakalpojumi un konteineri

Avots: www.habr.com

Pievieno komentāru