Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо

Бо дархости мо, Ҳабр як марказ таъсис дод Кубернитель ва мо аз он хушнудем, ки аввалин нашри онро дар он ҷойгир кунем. Обуна шавед!

Kubernetes осон аст. Чаро бонкҳо барои кор дар ин соҳа ба ман пули зиёд медиҳанд, дар ҳоле ки ҳар кас метавонад дар тӯли чанд соат ин технологияро азхуд кунад?

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо

Агар шумо шубҳа дошта бошед, ки Кубернетесро ин қадар зуд омӯхтан мумкин аст, ман тавсия медиҳам, ки онро худатон санҷед. Махз, пас аз азхуд кардани ин мавод, шумо метавонед як барномаро дар асоси микросервисҳо дар кластери Kubernetes иҷро кунед. Ман инро кафолат дода метавонам, зеро маҳз ҳамон методологияест, ки дар ин ҷо истифода мешавад, ки ман ба мизоҷони худ кор бо Кубернетесро таълим медиҳам. Ин дастур аз дигарон чӣ фарқ дорад? Дар асл, чизҳои зиёде мавҷуданд. Ҳамин тариқ, аксари ин маводҳо бо шарҳи чизҳои оддӣ - мафҳумҳои Кубернетес ва хусусиятҳои фармони kubectl оғоз мешаванд. Муаллифони ин маводҳо тахмин мезананд, ки хонандагони онҳо бо таҳияи барномаҳо, хидматҳои микросервис ва контейнерҳои Docker шиносанд. Мо бо роҳи дигар меравем. Аввалан, мо дар бораи чӣ гуна иҷро кардани барнома дар асоси микросервисҳо дар компютер сӯҳбат мекунем. Сипас, мо ба сохтани тасвирҳои контейнер барои ҳар як микросервис назар хоҳем кард. Ва баъд аз он, мо бо Kubernetes шинос мешавем ва ба ҷойгиркунии замима дар асоси микросервисҳо дар кластере, ки аз ҷониби Kubernetes идора мешавад, дида мебароем.

Ин равиш, бо равиши тадриҷан ба Кубернетес, амиқи фаҳмиши он чизе, ки барои одами оддӣ зарур аст, медиҳад, то бифаҳмад, ки ҳама чиз дар Кубернетес чӣ гуна оддӣ кор мекунад. Kubernetes бешубҳа технологияи оддӣ аст, ба шарте ки онҳое, ки мехоҳанд онро омӯзанд, бидонанд, ки он дар куҷо ва чӣ гуна истифода мешавад.

Акнун, бидуни тафсири бештар, биёед оғоз кунем ва дар бораи барномае, ки мо бо он кор хоҳем кард, сӯҳбат кунем.

Аризаи таҷрибавӣ

Замимаи мо танҳо як вазифаро иҷро мекунад. Ба сифати вуруд як ҷумларо мегирад ва баъд аз он бо истифода аз воситаҳои таҳлили матн, таҳлили эҳсосии ин ҷумларо анҷом дода, баҳодиҳии муносибати эмотсионалии муаллифи ҷумларо ба объекти муайян мекунад.

Равзанаи асосии ин барнома чунин аст.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Барномаи веб барои таҳлили эҳсосоти матнҳо

Аз нуқтаи назари техникӣ, барнома аз се микросервис иборат аст, ки ҳар яки онҳо маҷмӯи мушаххаси вазифаҳоро ҳал мекунанд:

  • SA-Frontend веб-сервери Nginx мебошад, ки ба файлҳои статикии React хизмат мерасонад.
  • SA-WebApp як барномаи вебест, ки дар Java навишта шудааст, ки дархостҳоро аз интерфейс коркард мекунад.
  • SA-Logic як барномаи Python аст, ки таҳлили эҳсосотро дар матн анҷом медиҳад.

Қайд кардан муҳим аст, ки хидматрасонии хурд дар алоҳидагӣ вуҷуд надоранд. Онҳо идеяи "ҷудо кардани масъулият" -ро амалӣ мекунанд, аммо дар айни замон онҳо бояд бо ҳамдигар ҳамкорӣ кунанд.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Ҷараёни маълумот дар барнома

Дар диаграммаи боло, шумо метавонед марҳилаҳои рақамии системаро бинед, ки ҷараёни маълумотро дар барнома нишон медиҳад. Биёед ба онҳо назар андозем:

  1. Браузер файлро аз сервер дархост мекунад index.html (ки дар навбати худ бастаи замимаҳои React-ро зеркашӣ мекунад).
  2. Истифодабаранда бо барнома ҳамкорӣ мекунад, ин боиси занг ба веб замимаи баҳорӣ мегардад.
  3. Барномаи веб дархостро барои анҷом додани таҳлили матн ба барномаи Python мефиристад.
  4. Замимаи Python таҳлили эҳсосоти матнро анҷом медиҳад ва натиҷаро ҳамчун посух ба дархост бармегардонад.
  5. Замимаи Spring ба замимаи React посух мефиристад (ки дар навбати худ натиҷаи таҳлили матнро ба корбар нишон медиҳад).

Рамзи ҳамаи ин барномаҳоро пайдо кардан мумкин аст дар ин ҷо. Ман тавсия медиҳам, ки шумо ҳоло ин анборро барои худ нусхабардорӣ кунед, зеро дар пеш таҷрибаҳои ҷолибе ҳастанд.

Иҷро кардани барномаи микросервисҳо дар мошини маҳаллии шумо

Барои он ки барнома кор кунад, мо бояд ҳар се микросервисро оғоз кунем. Биёед аз ҳама зеботаринашон оғоз кунем - барномаи пешрафта.

▍React-ро барои рушди маҳаллӣ таъсис диҳед

Барои иҷро кардани барномаи React, шумо бояд платформаи Node.js ва NPM-ро дар компютери худ насб кунед. Пас аз он ки шумо ҳамаи инро насб кардаед, терминалро барои гузаштан ба ҷузвдони лоиҳаи худ истифода баред sa-frontend ва фармони зеринро иҷро кунед:

npm install

Бо иҷро кардани ин фармон дар ҷузвдон node_modules вобастагии замимаи React бор карда мешавад, ки сабтҳои онҳо дар файл ҳастанд package.json. Пас аз зеркашии вобастагӣ дар як ҷузвдон, фармони зеринро иҷро кунед:

npm start

Ҳамааш ҳамин. Ҳоло барномаи React кор мекунад, шумо метавонед ба он тавассути рафтан ба суроғаи зерин дар браузери худ дастрасӣ пайдо кунед: localhost:3000. Шумо метавонед чизеро дар рамзи он тағир диҳед. Шумо фавран таъсири ин тағиротро дар браузер хоҳед дид. Ин ба шарофати ба ном «гарм» иваз кардани модулҳо имконпазир аст. Ин рушди пешрафтаро як таҷрибаи оддӣ ва ҷолиб месозад.

▍Таҳияи барномаи React барои истеҳсолот

Бо мақсади истифодаи воқеан барномаи React, мо бояд онро ба маҷмӯи файлҳои статикӣ табдил диҳем ва онҳоро бо истифода аз веб-сервер ба мизоҷон хидмат расонем.

Барои сохтани барномаи React, боз бо истифода аз терминал, ба ҷузвдон гузаред sa-frontend ва фармони зеринро иҷро кунед:

npm run build

Ин дар папкаи лоиҳа директория эҷод мекунад build. Он дорои ҳама файлҳои статикӣ барои кор кардани замимаи React мебошад.

▍Истифодаи файлҳои статикӣ бо истифода аз Nginx

Аввал ба шумо лозим аст, ки веб-сервери Nginx-ро насб кунед ва идора кунед. Ин аст, шумо метавонед онро зеркашӣ кунед ва дастурҳоро дар бораи чӣ гуна насб кардан ва иҷро кардани онро пайдо кунед. Пас шумо бояд мундариҷаи ҷузвдонро нусхабардорӣ кунед sa-frontend/build ба папка [your_nginx_installation_dir]/html.

Бо ин равиш, файле, ки дар ҷараёни сохтани барномаи React тавлид мешавад index.html дастрас мешавад [your_nginx_installation_dir]/html/index.html. Ин файлест, ки ба таври нобаёнӣ сервери Nginx ҳангоми дастрасӣ ба он тавлид мекунад. Сервер барои гӯш кардани порт танзим карда шудааст 80, аммо онро бо роҳи таҳрири файл ба таври лозимӣ танзим кардан мумкин аст [your_nginx_installation_dir]/conf/nginx.conf.

Акнун браузери худро кушоед ва ба он равед localhost:80. Шумо саҳифаи барномаи React -ро хоҳед дид.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Замимаи React, ки аз ҷониби сервери Nginx хидмат мекунад

Агар шумо ҳоло ба майдон чизе ворид кунед Type your sentence ва тугмаро пахш кунед Send — хеч чиз намешавад. Аммо, агар шумо ба консол нигоҳ кунед, шумо метавонед дар он ҷо паёмҳои хатогиро бинед. Барои фаҳмидани он ки ин хатогиҳо дар куҷо рух медиҳанд, биёед рамзи барномаро таҳлил кунем.

▍Таҳлили коди барномаҳо

Бо назардошти рамзи файл App.js, мо мебинем, ки пахшкунии тугма Send усулро даъват мекунад analyzeSentence(). Рамзи ин усул дар зер оварда шудааст. Лутфан қайд кунед, ки барои ҳар як сатр, ки шарҳи шакл дорад # Номер, аст, тавзеҳоти дар поён рамзи дода. Мо дигар порчаҳои кодро низ ҳамин тавр таҳлил мекунем.

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, ки ба он дархости POST дода мешавад. Тахмин меравад, ки дар ин суроға аризае мавҷуд аст, ки чунин дархостҳоро интизор аст.

2.Органи дархост ба ариза фиристода шуд. Дар ин ҷо як мақоми дархост намуна аст:

{
    sentence: "I like yogobella!"
}

3.Вақте ки посух ба дархост гирифта мешавад, ҳолати компонент нав карда мешавад. Ин боиси аз нав намоиш додани компонент мегардад. Агар мо маълумот гирем (яъне объекти JSON дорои маълумоти воридотӣ ва холҳои матнии ҳисобшуда), мо компонентро мебарорем Polarity, зеро шартхои дахлдор мухайё карда мешаванд. Мо компонентро ин тавр тавсиф мекунем:

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

Чунин ба назар мерасад, ки код хеле хуб кор мекунад. Ба ҳар ҳол, ин чӣ бадӣ дорад? Агар шумо гумон кунед, ки дар суроғае, ки барнома ба он дархости POST ирсол карданӣ мешавад, то ҳол чизе вуҷуд надорад, ки ин дархостро қабул ва коркард кунад, шумо комилан дуруст хоҳед буд. Маҳз, барои коркарди дархостҳои дар http://localhost:8080/sentiment, ба мо лозим аст, ки веб-барномаеро дар асоси Spring кор кунем.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Ба мо як барномаи Spring лозим аст, ки метавонад дархости POST-ро қабул кунад

▍Ташкили веб-барнома дар асоси Spring

Барои ҷойгиркунии барномаи Spring, ба шумо JDK8 ва Maven ва тағирёбандаҳои муҳити дуруст танзимшуда лозиманд. Пас аз он ки шумо ҳамаи инҳоро насб кардаед, шумо метавонед корро дар лоиҳаи мо идома диҳед.

▍Бастабандии барнома ба файли jar

Бо истифода аз терминал ба ҷузвдон ҳаракат кунед sa-webapp ва фармони зеринро ворид кунед:

mvn install

Пас аз иҷро кардани ин фармон дар папка sa-webapp директория сохта мешавад target. Дар ин ҷо барномаи Java ҷойгир карда мешавад, ки дар як файли кӯза бастабандишуда, ки бо файл муаррифӣ мешавад sentiment-analysis-web-0.0.1-SNAPSHOT.jar.

▍Иҷро кардани барномаи Java

Ба папка равед target ва барномаро бо фармони зерин иҷро кунед:

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

Ҳангоми иҷрои ин фармон хатогӣ рӯй медиҳад. Барои оғози ислоҳи он, мо метавонем тафсилоти истисноро дар маълумоти пайгирии стек таҳлил кунем:

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

Дар ин чо барои мо аз хама му-химтар зикри имконнопазирии равшан кардани маъно аст sa.logic.api.url. Биёед кодеро, ки дар он хатогӣ рух медиҳад, таҳлил кунем.

▍Таҳлили рамзи барномаи Java

Дар ин ҷо пораи рамз аст, ки дар он хатогӣ рух медиҳад.

@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. Дар СentimentController майдон мавҷуд аст saLogicApiUrl. Арзиши он аз ҷониби амвол муайян карда мешавад sa.logic.api.url.
  2. Стринг saLogicApiUrl бо арзиш пайваст мешавад /analyse/sentiment. Якҷоя онҳо суроғаро барои занг задан ба микросервис, ки таҳлили матнро анҷом медиҳад, ташкил медиҳанд.

▍Қимати амволро таъин кунед

Дар фасли баҳор, манбаи стандартии арзишҳои амвол файл аст application.properties, ки дар он ёфтан мумкин аст sa-webapp/src/main/resources. Аммо истифодаи он ягона роҳи муқаррар кардани арзишҳои амвол нест. Инро инчунин бо истифода аз фармони зерин иҷро кардан мумкин аст:

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

Арзиши ин амвол бояд ба суроғаи барномаи Python-и мо ишора кунад.

Бо танзим кардани он, мо ба веб-барномаи Spring мегӯем, ки он барои иҷрои дархостҳои таҳлили матн ба куҷо бояд равад.

Барои он ки ҳаёти моро душвор накунад, мо қарор медиҳем, ки барномаи Python дар он дастрас бошад localhost:5000 ва кушиш кунем, ки инро фаромуш накунем. Дар натиҷа, фармон барои оғози барномаи Spring чунин хоҳад буд:

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

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Системаи мо барномаи Python надорад

Ҳоло танҳо мо бояд кор кунем, ки барномаи Python -ро иҷро кунем ва система тавре кор хоҳад кард.

▍Ташкили барномаи Python

Барои иҷро кардани барномаи Python, шумо бояд Python 3 ва Pip насб карда бошед ва тағирёбандаҳои муҳити мувофиқ бояд дуруст танзим карда шаванд.

▍Насб кардани вобастагӣ

Ба папкаи лоиҳаи худ равед sa-logic/sa ва фармонҳои зеринро иҷро кунед:

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

▍Барномаро оғоз кунед

Пас аз насб кардани вобастагӣ, мо омодаем барномаро иҷро кунем:

python sentiment_analysis.py

Пас аз иҷро кардани ин фармон ба мо чунин гуфта мешавад:

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

Ин маънои онро дорад, ки барнома кор мекунад ва интизори дархостҳо дар он аст localhost:5000/

▍Тадқиқоти код

Биёед ба рамзи барномаи Python назар кунем, то бифаҳмем, ки он ба дархостҳо чӣ гуна ҷавоб медиҳад:

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. Оғоз кардани объект Flask.
  2. Муайян кардани суроға барои иҷрои дархостҳои POST ба он.
  3. Гирифтани амвол sentence аз мақоми дархост.
  4. Оғоз кардани объекти номаълум TextBlob ва ба даст овардани арзиш polarity барои чумлаи аввалине, ки дар матни дархост гирифта шудааст (дар мавриди мо ин ягона чумлаест, ки барои тахлил фиристода шудааст).
  5. Баргардонидани посухе, ки дар таркиби он матни ҷумла ва нишондиҳандаи ҳисобшуда барои он мавҷуд аст polarity.
  6. Замимаи Flask-ро оғоз кунед, ки дар он дастрас мешавад 0.0.0.0:5000 (шумо инчунин метавонед ба он бо истифода аз сохтани форма дастрасӣ пайдо кунед localhost:5000).

Микросервисҳое, ки барномаро ташкил медиҳанд, ҳоло кор мекунанд. Онҳо барои муошират бо ҳамдигар мувофиқанд. Диаграммаи барнома дар ин марҳилаи кор чунин аст.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Ҳама хидматҳои хурд, ки барномаро ташкил медиҳанд, ба ҳолати корӣ оварда шудаанд

Ҳоло, пеш аз идома додан, барномаи React-и худро дар браузер кушоед ва кӯшиш кунед, ки бо он як ҷумларо таҳлил кунед. Агар ҳама чиз дуруст анҷом дода шавад - пас аз пахш кардани тугма Send шумо натиҷаҳои таҳлилро дар зери майдони матн хоҳед дид.

Дар фасли оянда, мо дар бораи чӣ гуна идора кардани микросервисҳои мо дар контейнерҳои Docker сӯҳбат хоҳем кард. Ин барои омода кардани барнома барои кор дар кластери Kubernetes зарур аст.

Контейнерҳои Docker

Кубернитель системаи автоматикунонии ҷойгиркунӣ, миқёс ва идоракунии барномаҳои контейнерӣ мебошад. Онро "оркестри контейнер" низ меноманд. Агар Kubernetes бо контейнерҳо кор кунад, пас пеш аз истифодаи ин система мо бояд аввал ин контейнерҳоро ба даст орем. Аммо аввал биёед дар бораи чӣ гуна контейнерҳо сӯҳбат кунем. Шояд беҳтарин ҷавобро ба саволи он, ки он чӣ аст, пайдо кардан мумкин аст хуччатхо ба Docker:

Тасвири контейнерӣ як бастаи сабук, мустақил ва иҷрошаванда мебошад, ки дорои замима мебошад, ки ҳама чизҳои заруриро барои иҷро кардани он дар бар мегирад: рамзи барнома, муҳити иҷро, асбобҳои система ва китобхонаҳо, танзимот. Барномаҳои контейнериро дар муҳитҳои Linux ва Windows истифода бурдан мумкин аст ва онҳо новобаста аз инфрасохтор ҳамеша як хел кор мекунанд.

Ин маънои онро дорад, ки контейнерҳоро дар ҳама гуна компютерҳо, аз ҷумла серверҳои истеҳсолӣ иҷро кардан мумкин аст ва замимаҳои дар онҳо мавҷудбуда дар ҳама муҳит як хел кор хоҳанд кард.

Барои омӯхтани хусусиятҳои контейнерҳо ва муқоисаи онҳо бо роҳҳои дигари иҷро кардани барномаҳо, биёед мисоли хидматрасонии барномаи React бо истифода аз мошини виртуалӣ ва контейнерро дида бароем.

▍Хизматрасонии файлҳои статикии барномаи React бо истифода аз мошини виртуалӣ

Ҳангоми кӯшиши ташкили хидмати файлҳои статикӣ бо истифода аз мошинҳои виртуалӣ, мо ба камбудиҳои зерин дучор мешавем:

  1. Истифодаи бесамар аз захираҳо, зеро ҳар як мошини виртуалӣ як системаи оператсионии мукаммал аст.
  2. Вобастагии платформа. Он чизе, ки дар компютери маҳаллӣ кор мекунад, метавонад дар сервери истеҳсолӣ кор накунад.
  3. Миқёси оҳиста ва аз ҷиҳати захираҳо пуршиддати ҳалли як мошини виртуалӣ.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Веб-сервери Nginx, ки ба файлҳои статикӣ, ки дар мошини виртуалӣ кор мекунанд, хидмат мерасонад

Агар контейнерҳо барои ҳалли мушкилоти шабеҳ истифода шаванд, пас дар муқоиса бо мошинҳои виртуалӣ, ҷиҳатҳои зеринро метавон қайд кард:

  1. Истифодаи самараноки захираҳо: кор бо системаи оператсионӣ бо истифода аз Docker.
  2. Платформа мустақил. Контейнере, ки таҳиягар метавонад дар компютери худ кор кунад, дар ҳама ҷо кор мекунад.
  3. Ҷойгиркунии сабук тавассути истифодаи қабатҳои тасвир.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Веб-сервери Nginx, ки ба файлҳои статикӣ дар як контейнер хидмат мекунад

Мо танҳо мошинҳои виртуалӣ ва контейнерҳоро дар чанд нуқта муқоиса кардем, аммо ҳатто ин барои ҳис кардани ҷиҳатҳои тавонои контейнерҳо кофӣ аст. Ин аст, Шумо метавонед тафсилотро дар бораи контейнерҳои Docker пайдо кунед.

▍Сохтани тасвири контейнер барои барномаи React

Блоки асосии сохтани контейнери Docker файл аст Dockerfile. Дар ибтидои ин файл аз тасвири асосии контейнер сабт карда мешавад, пас пайдарпаии дастурҳо мавҷуд аст, ки чӣ тавр сохтани контейнерро, ки ба ниёзҳои як барномаи муайян мувофиқат мекунад, нишон медиҳад.

Пеш аз он ки мо бо файл кор кунем Dockerfile, биёед дар хотир дорем, ки мо барои омода кардани файлҳои замимаи React барои боргузорӣ ба сервери Nginx чӣ кор кардем:

  1. Сохтани бастаи барномаҳои React (npm run build).
  2. Оғози сервери Nginx.
  3. Нусхабардории мундариҷаи директория build аз папкаи лоиҳа sa-frontend ба папкаи сервер nginx/html.

Дар зер шумо метавонед муқоисаи эҷоди контейнер ва қадамҳои дар боло дар компютери маҳаллии шумо иҷрошударо бинед.

▍Тайёр кардани файли Докер барои замимаи SA-Frontend

Дастурҳое, ки дар он оварда мешаванд Dockerfile барои ариза SA-Frontend, танхо аз ду команда иборат аст. Гап дар он аст, ки дастаи таҳияи Nginx як асосиро омода кардааст тасвир барои Nginx, ки мо онро барои эҷоди симои худ истифода хоҳем кард. Ин ду қадамест, ки мо бояд тавсиф кунем:

  1. Асоси тасвир бояд тасвири Nginx бошад.
  2. Мундариҷаи папка sa-frontend/build ба ҷузвдони тасвирҳо нусхабардорӣ кардан лозим аст nginx/html.

Агар шумо аз ин тавсиф ба файл гузаред Dockerfile, он гоҳ он чунин хоҳад буд:

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

Тавре ки шумо мебинед, ҳама чиз дар ин ҷо хеле содда аст ва мундариҷаи файл ҳатто хондан ва фаҳмо мегардад. Ин файл ба система мегӯяд, ки тасвирро бигирад nginx бо ҳама чизе, ки аллакай дар он аст, ва мундариҷаи директорияро нусхабардорӣ кунед build ба директория nginx/html.

Дар ин ҷо шумо метавонед саволе дошта бошед, ки чӣ гуна ман медонам, ки шумо бояд файлҳоро аз ҷузвдон дар куҷо нусхабардорӣ кунед build, яъне рох аз кучо пайдо шуд /usr/share/nginx/html. Дарвоқеъ, дар ин ҷо низ ҳеҷ чизи мураккаб нест. Гап дар он аст, ки маълумоти дахлдорро дар тавсиф тасвир.

▍Сохтани тасвир ва бор кардани он ба анбор

Пеш аз он ки мо бо тасвири тайёр кор кунем, мо бояд онро ба анбори тасвир тела диҳем. Барои ин, мо платформаи хостинги тасвири абрии ройгони Docker Hub -ро истифода хоҳем бурд. Дар ин марҳилаи кор шумо бояд корҳои зеринро иҷро кунед:

  1. Насб кунед Доктор.
  2. Дар вебсайти Docker Hub сабти ном кунед.
  3. Бо иҷро кардани фармони зерин дар терминал ба ҳисоби худ ворид шавед:
    docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"

Акнун шумо бояд терминалро барои рафтан ба директория истифода баред sa-frontend ва дар он ҷо фармони зеринро иҷро кунед:

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

Дар ин ҷо ва минбаъд дар фармонҳои шабеҳ $DOCKER_USER_ID бояд бо номи корбарии Docker Hub иваз карда шавад. Масалан, ин қисми фармон метавонад чунин бошад: rinormaloku/sentiment-analysis-frontend.

Дар ин ҳолат, ин фармонро тавассути хориҷ кардан аз он кӯтоҳ кардан мумкин аст -f Dockerfile, зеро ин файл аллакай дар ҷузвдоне мавҷуд аст, ки дар он мо ин фармонро иҷро мекунем.

Барои фиристодани тасвири тайёр ба анбор, ба мо фармони зерин лозим аст:

docker push $DOCKER_USER_ID/sentiment-analysis-frontend

Пас аз анҷом додани он, рӯйхати анборҳои худро дар Docker Hub тафтиш кунед, то бифаҳмед, ки боргузории тасвир ба анбори абр муваффақ аст ё не.

▍Идораи контейнер

Акнун ҳар кас метавонад тасвири маъруфро зеркашӣ ва иҷро кунад $DOCKER_USER_ID/sentiment-analysis-frontend. Барои ин, шумо бояд пайдарпайии зерини фармонҳоро иҷро кунед:

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

Ҳоло контейнер кор мекунад, мо метавонем корро тавассути эҷоди тасвирҳои дигаре, ки ба мо лозим аст, идома диҳем. Аммо пеш аз он ки мо идома диҳем, биёед тарҳро фаҳмем 80:80, ки дар фармони оғози тасвир пайдо мешавад ва метавонад печида ба назар расад.

  • Шумораи аввал 80 — ин рақами порти мизбон аст (яъне компютери маҳаллӣ).
  • Шумораи дуюм 80 бандари контейнер аст, ки дархост бояд ба он фиристода шавад.

Мисоли зеринро дида мебароем.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Интиқоли порт

Система дархостҳоро аз порт равона мекунад <hostPort> ба бандар <containerPort>. Яъне, дастрасӣ ба порт 80 компютер ба порт равона карда мешавад 80 контейнер.

Аз бандар 80 дар компютери маҳаллӣ кушода мешавад, пас шумо метавонед ба барнома аз ин компютер дар суроға дастрас шавед localhost:80. Агар системаи шумо Docker-ро дастгирӣ накунад, барномаро метавон дар мошини виртуалии Docker иҷро кард, ки суроғаи он ба монанди он хоҳад буд. <docker-machine ip>:80. Барои фаҳмидани суроғаи IP-и мошини виртуалии Docker, шумо метавонед фармонро истифода баред docker-machine ip.

Дар ин лаҳза, пас аз бомуваффақият оғоз кардани контейнери барнома, шумо бояд саҳифаи онро дар браузер кушоед.

▍Файли .dockerignore

Ҷамъоварии тасвири барнома SA-Frontend, мо метавонистем дидем, ки ин раванд хеле суст мегузарад. Ин аз он сабаб рӯй медиҳад, ки контексти сохтани тасвир бояд ба демони Docker фиристода шавад. Директорияе, ки контексти сохтмонро ифода мекунад, ҳамчун далели охирини фармон муайян карда мешавад docker build. Дар ҳолати мо дар охири ин фармон нуқта мавҷуд аст. Ин боиси он мегардад, ки сохтори зерин ба контексти сохтмон дохил карда шавад:

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

Аммо аз ҳамаи ҷузвдонҳое, ки дар ин ҷо мавҷуданд, ба мо танҳо ҷузвдон лозим аст build. Бор кардани ягон чизи дигар вақти беҳуда аст. Шумо метавонед ба Docker бигӯед, ки кадом директорияҳоро сарфи назар кунед, сохтмонро суръат диҳед. Барои ин ба мо файл лозим аст .dockerignore. Шумо, агар шумо бо файл шинос бошед .gitignore, сохтори ин файл эҳтимол шинос менамояд. Он феҳристҳоро номбар мекунад, ки системаи сохтани тасвир онҳоро нодида гирифта метавонад. Дар ҳолати мо, мундариҷаи ин файл чунин аст:

node_modules
src
public

файл .dockerignore бояд дар ҳамон ҷузвдон бо файл бошад Dockerfile. Акнун сохтани тасвир чанд сонияро мегирад.

Акнун биёед дар болои тасвири барномаи Java кор кунем.

▍Сохтани тасвири контейнерӣ барои барномаи Java

Шумо медонед, ки шумо аллакай ҳама чизеро омӯхтед, ки барои сохтани тасвирҳои контейнер донед. Аз ин рӯ, ин қисмат хеле кӯтоҳ хоҳад буд.

Файлро кушоед Dockerfileки дар папкаи лоиха мебошад sa-webapp. Агар шумо матни ин файлро хонед, шумо дар он танҳо ду сохтори навро мебинед, ки аз калимаҳои калидӣ сар карда мешавад ENV и EXPOSE:

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

Калимаи калидӣ ENV Ба шумо имкон медиҳад, ки тағирёбандаҳои муҳити атрофро дар дохили контейнерҳои Docker эълон кунед. Аз ҷумла, дар ҳолати мо, он ба шумо имкон медиҳад, ки URL-ро барои дастрасӣ ба API-и барномае, ки таҳлили матнро анҷом медиҳад, муайян кунед.

Калимаи калидӣ EXPOSE ба шумо имкон медиҳад, ки ба Docker бигӯед, ки портро кушояд. Мо ин портро ҳангоми иҷро кардани барнома истифода мебарем. Дар ин ҷо шумо метавонед онро дар Dockerfile барои ариза SA-Frontend чунин фармон нест. Ин танҳо барои ҳуҷҷатгузорӣ аст, ба ибораи дигар, ин сохтмон барои касе, ки хонад, пешбинӣ шудааст Dockerfile.

Сохтани тасвир ва тела додани он ба анбор айнан ҳамон тавре ки дар мисоли қаблӣ ба назар мерасад. Агар шумо ҳанӯз ба қобилиятҳои худ боварӣ надоред, фармонҳои мувофиқро дар файл пайдо кардан мумкин аст README.md дар ҷузвдон sa-webapp.

▍Сохтани тасвири контейнер барои замимаи Python

Агар шумо ба мазмуни файл назар андозед Dockerfile дар ҷузвдон sa-logic, он гоҳ шумо дар он ҷо барои худ чизи нав намеёбед. Фармонҳо оид ба сохтани тасвир ва фиристодани он ба анбор низ бояд ба шумо аллакай шинос бошанд, аммо мисли дигар замимаҳои мо онҳоро дар файл пайдо кардан мумкин аст. README.md дар ҷузвдон sa-logic.

▍Санҷиши барномаҳои контейнерӣ

Оё шумо метавонед ба чизе бовар кунед, ки шумо озмоиш накардаед? Ман ҳам наметавонам. Биёед контейнерҳои худро санҷем.

  1. Биёед контейнери барномаро оғоз кунем sa-logic ва онро барои гӯш кардани порт танзим кунед 5050:
    docker run -d -p 5050:5000 $DOCKER_USER_ID/sentiment-analysis-logic
  2. Биёед контейнери барномаро оғоз кунем sa-webapp ва онро барои гӯш кардани порт танзим кунед 8080. Илова бар ин, мо бояд портеро танзим кунем, ки дар он барномаи Python дархостҳои замимаи Javaро тавассути таъини тағирёбандаи муҳити зист гӯш мекунад 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

Барои омӯхтани суроғаи IP-и контейнери Docker ё мошини виртуалӣ, ба файл муроҷиат кунед README.

Биёед контейнери барномаро оғоз кунем sa-frontend:

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

Ҳоло ҳама чиз барои рафтан ба суроғаи браузер омода аст localhost:80 ва барномаро санҷед.

Лутфан қайд кунед, ки агар шумо портро барои sa-webapp, ё агар шумо мошини виртуалии Docker-ро иҷро кунед, ба шумо лозим меояд, ки файлро таҳрир кунед App.js аз папка sa-frontendбо тағир додани суроғаи IP ё рақами порт дар усул analyzeSentence(), иваз кардани маълумоти ҷорӣ ба ҷои маълумоти кӯҳна. Пас аз ин, шумо бояд тасвирро дубора ҷамъ кунед ва онро истифода баред.

Диаграммаи аризаи мо ҳоло чунин аст.

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо
Микросервисҳо дар контейнерҳо кор мекунанд

Хулоса: чаро ба мо кластери Kubernetes лозим аст?

Мо танҳо файлҳоро тафтиш кардем Dockerfile, дар бораи чӣ гуна сохтани тасвирҳо ва тела додани онҳо ба анбори Docker сӯҳбат кард. Илова бар ин, мо фаҳмидем, ки чӣ тавр бо истифода аз файл суръат бахшидан ба васлкунии тасвирҳоро суръат бахшем .dockerignore. Дар натиҷа, микросервисҳои мо ҳоло дар контейнерҳои Docker кор мекунанд. Дар ин ҷо шумо метавонед саволи комилан асоснок дошта бошед, ки чаро ба мо Кубернетес лозим аст. Қисми дуюми ин мавод ба ҷавоб ба ин савол бахшида мешавад. Дар айни замон, саволи зеринро баррасӣ кунед:
Фарз мекунем, ки веб-барномаи мо барои таҳлили матн дар саросари ҷаҳон маъмул шудааст. Ҳар дақиқа ба ӯ миллионҳо дархост меоянд. Ин маънои онро дорад, ки microservices sa-webapp и sa-logic дар зери бори бузург хохад буд. Чӣ тавр миқёси контейнерҳоро, ки микросервисҳоро иҷро мекунанд?

Дарси Kubernetes Қисми 1: Барномаҳо, хидматҳои микросервисҳо ва контейнерҳо

Манбаъ: will.com

Илова Эзоҳ