Kubernetesni 3 soat ichida o'rganing: konteynerlarni sozlash bo'yicha batafsil qo'llanma

Unsplashda Jozef Barrientos surati

Nega banklar menga Kubernetes singari oddiy narsalar uchun katta pul to'laydilar? Uch soat ichida kimdir - kimdir o'rganishi mumkinmi?

Agar siz menga shubha qilsangiz, uni sinab ko'rishingizni so'rayman! Ushbu maqolaning oxiriga kelib, Kubernetes klasterida siz Microservice asosidagi dasturni ishga tushira olasiz. Va men bunga kafolat beraman, chunki men o'z mijozlarimni Kubernetes bilan tanishtiraman.

Ushbu qo'llanma boshqa manbalardan nimasi bilan farq qiladi, Rinor?

Juda ko'p! Ko'p qo'llanmalar oddiy narsalar bilan boshlanadi: Kubernetes kontseptsiyalari va kubectl buyruqlari. Ushbu qo'llanmalar o'quvchi dasturlar, Microservices va Docker konteynerlari haqida bilishini taxmin qiladi.

Ushbu maqolada biz:

  1. Microservice asosida ishlaydigan dasturni kompyuteringizda ishga tushirish.
  2. Microservice dasturining har bir xizmati uchun konteyner rasmlarini yaratish.
  3. Kubernetesga kirish. Microservice asosida ishlaydigan dasturni Kubernetes tomonidan boshqariladigan klasterga joylashtirish.

Asta-sekin tiklanish Kubernetesning soddaligini anglash uchun oddiy bir inson uchun zarur bo'lgan chuqurlikni beradi. Ha, Kubernetes siz foydalanadigan kontekstni bilsangiz, bu juda oddiy. Keyingi reklamasiz biz nimani qurayotganimizni ko'rishingiz mumkin.

Ilova Demo

Ilova bitta funktsiyaga ega. Kirish sifatida bitta jumlani oladi. Matn tahlilidan foydalanib, jumlalarning his-tuyg'ularini hisoblab chiqadi.

1-rasm. Sentimentlarni tahlil qilish veb-ilovasi

Texnik nuqtai nazardan, dastur uchta mikroservislardan iborat. Ularning har biri bitta o'ziga xos funktsiyaga ega:

  • SA-Frontend: bizning ReactJS statik fayllarimizga xizmat ko'rsatadigan Nginx veb-server.
  • SA-WebApp: old tomondan buyurtmalarni bajaradigan Java veb-ilovasi.
  • SA-Logic: Sentiment tahlilini bajaradigan piton dasturi.

Mikroservislar yakka tartibda yashamasliklari, ular "tashvishlarni ajratish" imkoniyatini beradigan, ammo ular baribir bir-biri bilan o'zaro aloqada bo'lishlari kerakligini bilish muhimdir.

2-rasm. Sentiment Analysis WebApp-da ma'lumotlar oqimi

Ushbu o'zaro ta'sir eng yaxshi tarzda ular o'rtasida ma'lumotlar qanday oqishini ko'rsatib beradi:

  1. Mijoz dasturi index.html-ni talab qiladi (o'z navbatida ReactJS dasturining skriptlarini talab qiladi).
  2. Dastur bilan aloqada bo'lgan foydalanuvchi bahor WebApp-ga so'rovlarni qo'zg'atadi.
  3. Bahor WebApp Python dasturiga hissiyotlarni tahlil qilish uchun so'rovlarni yuboradi.
  4. Python ilovasi hissiyotlarni hisoblab chiqadi va natijani javob sifatida qaytaradi.
  5. Bahor WebApp React ilovasiga javobni qaytaradi. (Keyin foydalanuvchi ma'lumotni taqdim etadi.)

Ushbu ilovalarning barchasi uchun kodni ushbu omborda topish mumkin. Men darhol uni klonlashni maslahat beraman, chunki biz ajoyib narsalarni birgalikda qurmoqchimiz.

1. Microservice asosidagi dasturni kompyuteringizda ishga tushirish

Uchala xizmatni ishga tushirishimiz kerak. Keling, eng jozibali, oldingi ilovadan boshlaylik.

Mahalliy rivojlanish uchun reaktsiyani o'rnatish

React dasturini ishga tushirish uchun NodeJS va NPM kompyuteringizga o'rnatilishi kerak. O'rnatgandan so'ng, sizning terminalingiz bilan sa-frontend katalogiga o'ting. Quyidagi buyruqni kiriting:

npm o'rnatish

Bu React dasturining barcha Javascript bog'liqliklarini yuklab oladi va ularni node_modules papkasiga joylashtiradi. (Bog'lanish paketi.json faylida aniqlanadi). Barcha bog'liqliklar echilgandan so'ng, quyidagi buyruqni bajaring:

npm boshlanishi

Bo'ldi shu! Biz reaktsiya dasturimizni ishga tushirdik va odatiy holatga siz mahalliyhostda kirishingiz mumkin: 3000. Kodni o'zgartirish va darhol ta'sirni brauzerda ko'rish uchun o'zingizni bepul his eting. Bu modulni issiq almashtirish yordamida amalga oshiriladi. Bu oldingi rivojlanishni shabada qiladi!

Bizning reaktsiyamizni ishlab chiqarishni tayyor qilish

Ishlab chiqarish uchun biz o'z dasturimizni statik fayllarga yaratib, ularga veb-server yordamida xizmat ko'rsatishimiz kerak.

React dasturini yaratish uchun terminalingizda sa-frontend katalogiga o'ting. Keyin quyidagi buyruqni bajaring:

npm ishga tushirish

Bu sizning loyihangiz daraxtiga "build" nomli papkani yaratadi. Ushbu papkada bizning ReactJS dasturi uchun zarur bo'lgan barcha statik fayllar mavjud.

Nginx bilan statik fayllarga xizmat ko'rsatish

Nginx WebServer-ni o'rnating va ishga tushiring (qanday qilib). Keyin sa-frontend / build papkasini [your_nginx_installation_dir] / html-ga o'tkazing.

Shunday qilib, yaratilgan index.html fayliga [your_nginx_installation_dir] /html/index.html da kirish mumkin. Bu Nginx xizmat ko'rsatadigan standart fayl.

Sukut bo'yicha Nginx WebServer 80 portda tinglaydi. Siz [your_nginx_installation_dir] /conf/nginx.conf faylida server.listen xususiyatini yangilash orqali boshqa portni ko'rsatishingiz mumkin.

Brauzeringizni oching va localhost tugashini bosing: 80, ReactJS ilovasi paydo bo'lganiga qarang.

3-rasm. Nginx-dan olingan reaktiv dastur

Maydonga yozing: "Jumlangizni yozing." Va "Send" tugmachasini bosish 404 xato bilan tugaydi (siz buni brauzeringiz konsolida tekshirishingiz mumkin). Lekin nima uchun? Kodni ko'rib chiqaylik.

Kodni tekshirish

App.js faylida biz Yuborish tugmachasini bosish analyzSentence usulini ishga tushirganligini ko'rishimiz mumkin. Ushbu usulning kodi quyida ko'rsatilgan. (# Number bilan izohlangan har bir satr skript ostida tushuntiriladi):

analyzSentence () {
    qabul qilish ('http: // localhost: 8080 / his', {// # 1
        usul: 'POST',
        sarlavhalar: {
            'Kontent turi': 'dastur / json'
        },
        tanasi: JSON.stringify ({
                       jumla: this.textField.getValue ()}) // # 2
    })
        .then (javob => javob.json ())
        .then (data => this.setState (ma'lumotlar)); // №3
}

# 1: POST orqali qo'ng'iroq qilinadigan URL manzili. (Ilova o'sha URL manzilidagi qo'ng'iroqlarni tinglashi kerak).

# 2: So'rovning mazmuni quyida ko'rsatilgan tarzda ushbu arizaga yuborilgan:

{
    jumlasi: "menga yogobella yoqadi!"
}

# 3: Javob komponentning holatini yangilaydi. Bu komponentni qayta namoyish qilishni boshlaydi. Agar biz ma'lumotlarni qabul qilsak (ya'ni, jumlada yozilgan va kutupluluqni o'z ichiga olgan JSON ob'ekti), biz komponentni polarlikComponentni namoyish qilamiz, chunki shart bajariladi va biz komponentni aniqlaymiz:

const polarlikComponent = this.state.polarity! == aniqlanmagan?
    :
    null;

Hammasi to'g'ri ko'rinadi. Ammo biz nimani etishmayapmiz? Agar siz localhost-ni tinglash uchun biron bir narsani o'rnatmaganligimizni bilsangiz, 8080, unda siz haqsiz! Ushbu portni tinglash uchun bahor veb-ilovamizni ishga tushirishimiz kerak!

4-rasm. Bahorgi WebApp mikro-servisi yo'q

Bahor veb-ilovasini sozlash

Bahor dasturini ishga tushirish uchun siz JDK8 va Maven-ni o'rnatishingiz kerak. (ularning atrof-muhit parametrlarini ham sozlash kerak). Ularni o'rnatgandan so'ng keyingi qismga o'tishingiz mumkin.

Ilovani jarga qadoqlash

Terminalingizda sa-webapp katalogiga o'ting va quyidagi buyruqni kiriting:

mvn o'rnatish

Bu sa-webapp katalogida target deb nomlangan papkani yaratadi. Maqsadli papkada bizda Java dasturimiz bankaga joylashtirilgan: 'sentiment-analysis-web-0.0.1-SNAPSHOT.jar'

Java dasturimizni ishga tushirish

Maqsadli katalogga o'ting va buyruq bilan dasturni ishga tushiring:

java -jar hissiyot-tahlil-veb-0.0.1-SNAPSHOT.jar

Darn .. Xato qildik. Bizning dasturimiz boshlanganda muvaffaqiyatsiz tugadi va bizning yagona qo'rg'oshinimiz bu izdagi istisno:

"SentimentController" nomi bilan fasol yaratishda xato: avtomatik ravishda bog'langan bog'liqliklarni kiritib bo'lmadi; kiritilgan istisno java.lang.IllegalArgumentException: "$ {sa.logic.api.url}" qiymatidagi "sa.logic.api.url" to'ldiruvchisini hal qilib bo'lmadi.

Bu erda muhim ma'lumotlar "SentimentController" da sa.logic.api.url to'ldiruvchisidir. Buni tekshirib ko'raylik!

Kodni tekshirish

@CrossOrigin (kelib chiqishi = "*")
@RestController
jamoat sinfidagi "SentimentController {"
    @Value ("$ {sa.logic.api.url}") // # 1
    saLogicApiUrl shaxsiy qatori;
    @PostMapping ("/ hislar")
    jamoat SentimentDto sentimentAnalysis (
        @RestestBody CümlendiriciHukmDt)
    {
        RestTemplate restTemplate = yangi RestTemplate ();
        return restTemplate.postForEntity (
                saLogicApiUrl + "/ tahlil / mulohaza", // №2
                cümləDto, SentimentDto.class)
                .getBody ();
    }
}
  1. SentimentController-da saLogicApiUrl nomli maydon mavjud. Maydondagi maydon sa.logic.api.url xususiyati bilan aniqlanadi.
  2. SaLogicApiUrl satrlari "/ tahlil / mulohazalar" qiymati bilan bog'langan. Birgalikda ular fikrni tahlil qilish uchun so'rov yuborish uchun URL-ni yaratadilar.

Mulkni aniqlash

Bahorda standart mulk manbasi application.properties. (Sa-webapp / src / main / manbalarida joylashgan). Lekin bu mulkni aniqlashning yagona usuli emas, uni avvalgi buyruq yordamida ham bajarish mumkin:

java -jar hissiyot-tahlil-veb-0.0.1-SNAPSHOT.jar
     --sa.logic.api.url = WHAT.IS.THE.SA.LOGIC.API.URL

Mulk Python dasturimiz qayerda ishlayotganligini aniqlaydigan qiymat bilan boshlanishi kerak, shu bilan biz Bahor Veb-ilovamizga xabarlarni ishga tushirish vaqtida qaerga yo'naltirishimiz mumkinligini bilib olamiz.

Oddiyroq qilish uchun, biz pyton dasturini localhost-da ishga tushirishga qaror qilaylik: 5000. Shunchaki buni unutmaslikka imkon bering!

Quyidagi buyruqni bajaring va biz python dasturining so'nggi xizmatiga o'tishga tayyormiz.

java -jar hissiyot-tahlil-veb-0.0.1-SNAPSHOT.jar
     --sa.logic.api.url = http: // localhost: 5000

Python dasturini o'rnatish

Python dasturini ishga tushirish uchun Python3 va Pip dasturlarini o'rnatishimiz kerak. (Ularning atrof-muhit parametrlarini ham sozlash kerak).

Bog'lanishlarni o'rnatish

Terminalda sa-logic / sa (repo) katalogiga o'ting va quyidagi buyruqni kiriting:

python -m pip o'rnatish -r requirements.txt
python -m textblob.download_corpora

Ilovani ishga tushirish

Bog'lanishlarni o'rnatish uchun Pip-dan foydalangandan so'ng biz quyidagi buyruqni bajarib, dasturni ishga tushirishga tayyormiz:

python sentiment_analysis.py
* Http://0.0.0.0:5000000 da ishlamoqda (chiqish uchun CTRL + C tugmalarini bosing)

Bu shuni anglatadiki, bizning dasturimiz mahalliy serverda 5000 portda HTTP so'rovlarini tinglamoqda va tinglamoqda.

Kodni tekshirish

SA Logic python dasturida nima sodir bo'lganligini tushunish uchun kodni o'rganib chiqaylik.

textBlob-dan import qilish TextBlob
flask import Flask dan, so'rab, jsonify
ilova = Flask (__ nomi__) # 1
@ app.route ("/ tahlil / fikrlar", usullar = ['POST']) # 2
def analyse_sentiment ():
    cümlə = request.get_json () ['cümlə'] # 3
    kutupluluk = TextBlob (gap) .ententsiyalar [0] .polyariya № 4
    return jsonify (# 5)
        jumla = jumla,
        kutupluluk = kutupluluk
    )
agar __name__ == '__main__':
    app.run (host = '0.0.0.0', port = 5000) # 6
  1. Flask ob'ektini tezlang.
  2. POST so'rovini amalga oshirish mumkin bo'lgan yo'lni belgilaydi.
  3. So'rov organidan "jumla" mulkini chiqarib oling.
  4. Anonim TextBlob ob'ektini yarating va birinchi jumladan qutbni oling. (Bizda bittasi bor).
  5. Javobni jumlalar va qutblarni o'z ichiga olgan qo'ng'iroq qiluvchiga qaytaring.
  6. 0.0.0.0:5000 da so'rovlarni tinglash uchun shisha ob'ekti ilovasini ishga tushiring (localhost-ga qo'ng'iroqlar: 5000 ushbu dasturga etib boradi).

Xizmatlar bir-biri bilan aloqa o'rnatish uchun sozlangan. Localhost-da old tomonni qayta oching: 80 va davom etishdan oldin ularga harakat qilib ko'ring!

6-rasm. Mikroservis arxitekturasi qurildi

Keyingi bo'limda biz xizmatlarni Docker konteynerlarida qanday boshlashni ko'rib chiqamiz, chunki ularni Kubernetes klasterida ishlatish uchun zaruriy shartdir.

2. Har bir xizmat uchun konteyner rasmlarini yaratish

Kubernetes - konteyner orkestratori. Ularni tartibga solish uchun bizga idishlar kerakligi tushunarli. Ammo konteynerlar nima? Bu eng yaxshi tarzda dokerda joylashgan Hujjatlardan javob beradi.

Konteyner tasviri - bu dasturni ishga tushirish uchun zarur bo'lgan hamma narsani o'z ichiga olgan engil, mustaqil, bajariladigan dasturiy ta'minot to'plami: kod, ish vaqti, tizim vositalari, tizim kutubxonalari, sozlamalar. Linux va Windows asosidagi dasturlar uchun mavjud, konteynerli dastur atrof-muhitdan qat'iy nazar har doim bir xil ishlaydi.

Bu shuni anglatadiki, konteynerlar har qanday kompyuterda, hatto ishlab chiqarish serverida ham farqlarsiz ishlaydi.

Tasvirlash uchun Virtual Machine va konteyner yordamida bizning Reaktiv dasturimizga qanday xizmat ko'rsatilishini taqqoslaymiz.

VM-dan olingan reaktiv statik fayllarga xizmat ko'rsatish

Virtual mashinadan foydalanishning salbiy tomonlari:

  1. Resurs samarasiz, har bir VMda to'laqonli OS mavjud.
  2. Bu platformaga bog'liq. Kompyuteringizda ishlagan narsa ishlab chiqarish serverida ishlamasligi mumkin.
  3. Konteynerlar bilan solishtirganda og'ir va sekin tortish.
7-rasm. Vgin-da statik fayllarga ega Nginx veb-server

Konteynerdan reaktiv statik fayllarga xizmat ko'rsatish

Konteynerdan foydalanishning afzalliklari.

  1. Resurslardan samarali foydalaning, Docker yordamida Xost OS-dan foydalaning.
  2. Platforma mustaqil. Kompyuteringizda ishlaydigan konteyner har qanday joyda ishlaydi.
  3. Rasm qatlamlari yordamida engil.
8-rasm. Konteynerda statik fayllarga xizmat ko'rsatuvchi Nginx veb-server

Bular konteynerlardan foydalanishning eng muhim xususiyatlari va afzalliklari. Qo'shimcha ma'lumot uchun Docker hujjatlarini o'qishni davom eting.

React App uchun konteyner rasmini yaratish (Docker intro)

Docker konteyneri uchun asosiy qurilish bloki .dockerfile hisoblanadi. Dockerfile asosiy konteyner tasviridan boshlanadi va sizning ilovangiz ehtiyojlariga javob beradigan yangi konteyner rasmini qanday yaratish bo'yicha ko'rsatmalar ketma-ketligiga amal qiladi.

Dockerfile-ni aniqlashni boshlashdan oldin, nginx-dan foydalanib, statik fayllarni reaktsiyalashga xizmat qilganimizni eslaylik:

  1. Statik fayllarni yarating (npm run build)
  2. Nginx serverini ishga tushiring
  3. Yaratilgan papka tarkibini sa-frontend loyihangizdan nginx / html-ga nusxalash.

Keyingi bo'limda konteyner yaratish bizning mahalliy reaktsiyani sozlash paytida qilgan ishimizga o'xshashligi bilan o'xshashliklarni ko'rasiz.

SA-Frontend uchun Dockerfile-ni aniqlash

SA-Frontend uchun Dockerfile-dagi ko'rsatmalar faqat ikki bosqichli vazifadir. Buning sababi, Nginx jamoasi bizga Nginx uchun asosiy rasmni taqdim etdi, biz uni ustiga qurishda foydalanamiz. Ikki bosqich:

  1. Nginx Image bazasidan boshlang
  2. Sa-frontend / build katalogidan nginx / html konteyneriga nusxa oling.

Dockerfile-ga o'zgartirilgan:

FROM nginx
COPY qurish / usr / share / nginx / html

Ajablanarli emas, inson tomonidan o'qilishi ham mumkin, eslaylik.

Nginx rasmidan boshlang. (Yigitlar u erda nima qilishgan bo'lsa). Rasmdagi nginx / html katalogiga tuzish katalogidan nusxa ko'chiring. Bo'ldi shu!

Ehtimol siz hayron bo'lgandirsiz, qanday qilib fayllarni nusxalashni qaerdan bildim? ya'ni / usr / share / nginx / html. Juda oddiy: u Docker Hub-dagi nginx tasvirida hujjatlashtirilgan.

Idishni qurish va itarish

Tasvirimizni surishimizdan oldin, rasmlarimizni joylashtirish uchun konteyner registri kerak. Docker Hub - bu namoyish uchun foydalanadigan bepul bulutli konteyner xizmati. Davom etishdan oldin uchta vazifangiz bor:

  1. Docker CE-ni o'rnating
  2. Docker uyasiga ro'yxatdan o'ting.
  3. Terminalingizda quyidagi buyruqni bajarish bilan tizimga kiring:
dokerga kirish -u = "$ DOCKER_USERNAME" -p = "$ DOCKER_PASSWORD"

Yuqoridagi vazifalarni bajargandan so'ng sa-frontend katalogiga o'ting. Keyin quyidagi buyruqni bajaring ($ DOCKER_USER_ID-ni docker hub foydalanuvchi nomi bilan almashtiring. Masalan: rinormaloku / sentiment-analy-frontend)

docker build -f Dockerfile -t $ DOCKER_USER_ID / tuyg'u-tahlil-frontend.

Biz Dockerfile-ni tashlab yuborishimiz mumkin, chunki biz allaqachon Dockerfile-ni o'z ichiga olgan katalogda mavjudmiz.

Tasvirni surish uchun dokerni surish buyrug'idan foydalaning:

docker $ DOCKER_USER_ID / his-tuyg'ularni tahlil qilish-frontend

Docker uyingiz omborida rasm muvaffaqiyatli bosilganligini tekshiring.

Konteyner ishlamoqda

Endi $ DOCKER_USER_ID / sentiment-tahlil-frontend-dagi rasmni istalgan kishi tortishi va boshqarishi mumkin:

docker $ DOCKER_USER_ID / his-tahlil-frontend-ni tortadi
docker run -d -p 80:80 $ DOCKER_USER_ID / tuyg'u-tahlil-frontend

Bizning Docker konteynerimiz ishlamoqda!

Davom etishdan oldin, men chalkash deb hisoblaydigan 80:80 ni ishlab chiqishga ruxsat beramiz:

  • Birinchi 80 - bu mezbonning porti (ya'ni mening kompyuterim)
  • Ikkinchi 80 - bu qo'ng'iroqlar yo'naltirilishi kerak bo'lgan konteyner porti.
9-rasm. Xostni konteynerga port xaritasi

U -dan -ga xaritalarni joylashtiradi. 80-chi mezbonga qo'ng'iroq qilish, 9-rasmda ko'rsatilganidek, konteynerning 80 portiga solishtirilishi kerak.

Port 80-portda xostda (sizning kompyuteringizda) ishlaganligi sababli, unga localhost: 80 kirish kerak. Agar sizda mahalliy docker yordami bo'lmasa, dasturni : 80-da ochishingiz mumkin. Docker-machine ipingizni topish uchun docker-machine ip-ni bajaring

Buni sinab ko'ring! Reaksiya dasturiga shu nuqtada kirish huquqiga ega bo'lishingiz kerak.

Dockerignore

SA-Frontend uchun tasvirni yaratish juda sekin edi, kechirasiz, juda sekin. Docker Deamon-ga yuborilishi kerak bo'lgan kontekst tufayli bu shunday bo'ldi. To'liqroq qilib, kontekstni tuzish katalogi docker tuzish buyrug'idagi (oxirgi nuqta) oxirgi kontekstda, tuzilgan kontekstni belgilaydi. Va bizning holatlarimizda, u quyidagi papkalarni o'z ichiga oldi:

sa-frontend:
| .dockerignore
| Dockerfile
| paket.json
| README.md
+ --- qurish
+ --- tugun_modullar
+ --- ommaviy
\ --- src

Ammo bizga kerak bo'lgan yagona ma'lumot - bu tuzish papkasida. Boshqa biron bir narsani yuklash vaqtni behuda sarflashga olib keladi. Boshqa kataloglarni tashlab, biz vaqtni yaxshilashimiz mumkin. Bu erda .dockerignore o'ynaydi. Siz uchun tanish bo'ladi, chunki .gitignore kabi, ya'ni .dockerignore fayliga e'tibor bermaslik kerak bo'lgan barcha kataloglarni quyida ko'rsatilgandek qo'shing:

tugun_modullari
src
ommaviy

.Dockerignore fayli Dockerfile bilan bir xil papkada bo'lishi kerak. Endi rasmni yaratish bir necha soniya vaqtni oladi.

Java Application bilan davom etamiz.

Java dastur uchun konteyner rasmini yaratish

Nima deb o'ylaysan! Siz konteyner rasmlarini yaratish haqida deyarli hamma narsani bilib oldingiz! Shuning uchun bu qism juda qisqa.

Sa-webapp-da Dockerfile-ni oching va siz faqat ikkita yangi kalit so'zni topasiz:

ENV SA_LOGIC_API_URL http: // localhost: 5000
…
8080 YO'Q

ENV kalit so'zi docker konteynerining atrof-muhit o'zgarishini e'lon qiladi. Bu konteynerni ishga tushirganda Sentiment Analysis API uchun URL manzili bilan ta'minlaymiz.

Bundan tashqari, EXPOSE kalit so'zi keyinchalik kirishni xohlagan portni ochib beradi. Ammo hey !!! Biz buni SA-Frontend dockerfile-da qilmadik, yaxshi ovlash! Bu faqat hujjatlashtirish uchun mo'ljallangan, boshqacha aytganda, u Dockerfile-ni o'qiyotgan kishiga ma'lumot bo'lib xizmat qiladi.

Siz konteyner rasmini yaratish va surish bilan tanishishingiz kerak. Agar biron bir qiyinchilik tug'ilsa, sa-webapp katalogidagi README.md faylini o'qing.

Python ilovasi uchun konteyner rasmini yaratish

Sa-mantiqdagi Dockerfile-da yangi kalit so'zlar yo'q. Endi siz o'zingizni Docker-Master deb atashingiz mumkin.

Konteyner rasmini yaratish va surish uchun SA-logic katalogidagi README.md-ni o'qing.

Konteynerda ishlangan dasturni sinovdan o'tkazish

Siz sinovdan o'tmagan narsaga ishonasizmi? Men ham qila olmayman. Bu konteynerlarni sinab ko'raylik.

  1. Sa-mantiqiy idishni ishga tushiring va 5050 portini tinglashni sozlang:
docker run -d -p 5050: 5000 $ DOCKER_USER_ID / tuyg'u-tahlil-mantiq

2. Sa-webapp konteynerini ishga tushiring va 8080 portini tinglashni sozlang, qo'shimcha ravishda SA_LOGIC_API_URL atrof-muhit o'zgaruvchisiga e'tibor bermasdan, python ilovasi tinglaydigan portni o'zgartirishimiz kerak.

$ docker run -d -p 8080: 8080 -e SA_LOGIC_API_URL = 'http: // : 5000' $ DOCKER_USER_ID / tuyg'u-tahlil-veb-ilova

Konteynerni ip yoki dok mashinasi ipini qanday olish haqida README ni tekshiring.

3. Sa-frontend konteynerini ishga tushiring:

docker run -d -p 80:80 $ DOCKER_USER_ID / tuyg'u-tahlil-frontend

Biz tugadik. Localhost-da brauzeringizni oching: 80.

Diqqat: Agar siz sa-webapp uchun portni o'zgartirsangiz yoki docker-machine ip-dan foydalanayotgan bo'lsangiz, App.js faylini yangi IP yoki Port-dan olish uchun AnalSentence usulida sa-frontend-da yangilashingiz kerak. Keyinchalik siz yangilangan tasvirni yaratishingiz va undan foydalanishingiz kerak.

10-rasm. Konteynerlarda ishlaydigan mikroservislar

Miya tizeri - nima uchun Kubernetes?

Ushbu bo'limda biz Dockerfile haqida, uni rasmni yaratish uchun qanday ishlatish va Docker registriga o'tkazish buyruqlari haqida bilib oldik. Bundan tashqari, biz foydasiz fayllarni e'tiborsiz qoldirib, tuzilish kontekstiga yuborilgan fayllar sonini qanday kamaytirishni ko'rib chiqdik. Va oxirida, biz konteynerlardan ishlaydigan dasturni oldik. Xo'sh, nega Kubernetes? Keyingi maqolada biz buni chuqurroq o'rganamiz, ammo men sizga miyazizni qoldirmoqchiman.

  • Sentiment Analysis veb-ilovamiz dunyo miqyosidagi xitga aylandi va biz kutilmaganda daqiqada millionlab so'rovlarga javob beramiz va biz sa-webapp va sa-mantiqqa juda katta yuklarni his qilamiz. Idishlarni qanday o'lchashimiz mumkin?

Kubernetesga kirish

Men va'da beraman va mubolag'a qilmayman, maqolaning oxirida siz o'zingizdan: "Nega biz buni Supernet deb nomlamaymiz?".

11-rasm. Supernetlar

Agar siz ushbu maqolani boshidanoq kuzatsangiz, biz juda ko'p bilimlarni va bilimlarni qamrab olganmiz. Siz bu qiyin qism bo'ladi, deb xavotirlanishingiz mumkin, ammo, bu eng sodda. Kubernetesni o'rganish juda qo'rqinchli bo'lishining yagona sababi "hamma narsa" tufayli va biz buni juda yaxshi yoritdik.

Kubernetes nima

Microservices-ni konteynerlardan boshlaganimizdan so'ng, bizda bitta savol paydo bo'ldi, uni keyinroq savol-javob shaklida ko'rib chiqaylik:
Savol: Biz konteynerlarni qanday o'lchaymiz?
Javob: Biz boshqasini aylantiramiz.
Savol: Ular orasidagi yukni qanday taqsimlaymiz? Server allaqachon maksimal darajada ishlatilgan bo'lsa va bizning idishimizga boshqa server kerak bo'lsa nima bo'ladi? Eng yaxshi uskuna ishlatilishini qanday hisoblaymiz?
Javob: Ahm ... Ermm ... (menga google-ga ruxsat bering).
Savol: Hech narsa buzmasdan yangilanishlarni tarqatmoqchimisiz? Va agar shunday bo'lsa, qanday qilib ishlaydigan versiyaga qaytishimiz mumkin.

Kubernetes ushbu savollarning barchasini hal qiladi (va yana!). Kubernetesni bitta jumlada qisqartirishga urinishim quyidagicha bo'lar edi: "Kubernetes - konteyner orkestratori, u asosiy infratuzilmani abstrakt qiladi. (Konteynerlar ishlayotgan joyda) ”.

Konteyner orkestri haqida bizda xayol yo'q. Biz ushbu maqolaning davomida buni amalda ko'ramiz, lekin "asosiy infratuzilma haqida abstraktlar" haqida birinchi marta o'qiyapmiz. Keling, ushbu aniq zarbani olaylik.

Asosiy infratuzilmani mavhumlashtirish

Kubernetes asosiy infratuzilmani biz so'rov yuborishingiz mumkin bo'lgan oddiy API bilan ta'minlaydi. Ushbu so'rovlar Kubernetesni imkon qadar eng yaxshi sharoitda kutib olishga undaydi. Masalan, "Kubernetes x rasmining 4 ta idishini yig'moqda" deb so'rash kabi oddiy. Shunda Kubernetes foydalanilmay qolgan tugunlarni topib, u orqali yangi idishlarni aylantiradi (12-rasmga qarang).

Rasm 12. API serveriga so'rov

Bu ishlab chiquvchi uchun nimani anglatadi? U konteynerlar ishga tushadigan tugunlar soni va ular qanday bog'lanishlari haqida qayg'urmasligi kerak. U apparatni optimallashtirish bilan shug'ullanmaydi yoki tugunlar pastga tushishidan xavotirga tushmaydi (va ular Merfi qonunini buzadi), chunki Kubernetes klasteriga yangi tugunlar qo'shilishi mumkin. Shu vaqt ichida Kubernetes konteynerni boshqa ishlaydigan tugunlarga aylantiradi. Buni eng yaxshi imkoniyatlarda bajaradi.

12-rasmda biz bir nechta yangi narsalarni ko'rishimiz mumkin:

  • API Server: Klaster bilan ishlashning yagona usuli. Bu boshqa idishni (err * pods) boshlash yoki to'xtatish yoki joriy holatni, jurnallarni va boshqalarni tekshirish.
  • Kubelet: tugun ichidagi konteynerlarni (err * pods) kuzatib boradi va asosiy tugun bilan aloqa qiladi.
  • * Pods: Dastlab podlarni idish sifatida o'ylab ko'ring.

Va biz bu erda to'xtab qolamiz, chunki chuqurroq sho'ng'ish bizning diqqat markazimizni yo'qotadi va biz buni har doim qila olamiz, rasmiy hujjatlarni (qiyin yo'lni) o'rganish yoki Marko tomonidan Kubernetesning ajoyib kitobini o'qish kabi o'rganish uchun foydali manbalar mavjud. Luksha.

Cloud xizmatlarini etkazib beruvchilarni standartlashtirish

Kubernetesni uyga olib boradigan yana bir kuchli jihati shundaki, u Cloud Servis Provayderlarini (CSP) standartlashtiradi. Bu juda jasur bayon, lekin bir misol bilan o'ylab ko'raylik:

- Azure, Google Cloud Platform yoki boshqa CSP-ning mutaxassisi butunlay yangi CSP-da loyiha ustida ishlashni tugatadi va u bilan ishlash tajribasiga ega emas. Bu juda ko'p oqibatlarga olib kelishi mumkin, ba'zilarini nomlash kerak: u belgilangan muddatni o'tkazib yuborishi mumkin; kompaniyaga ko'proq resurslarni yollash kerak bo'lishi mumkin va hokazo.

Bunga javoban Kubernetes bilan bu umuman muammo emas. CSP qanday bo'lishidan qat'iy nazar siz API Serverga bir xil buyruqlarni bajardingiz. Siz deklarativ tarzda API serveridan o'zingiz xohlagan narsani talab qilasiz. Kubernetes tezislar olib boradi va CSP uchun qanday qilinishini muhokama qiladi.

Cho'kishga bir soniya bering - bu juda kuchli xususiyat. Kompaniya uchun bu ular CSP bilan bog'lanmaganligini anglatadi. Ular o'z xarajatlarini boshqa CSPda hisoblashadi va ular davom etishadi. Ular hali ham tajribaga ega, ular hali ham resurslarga ega va ular buni arzonroq qilishlari mumkin!

Bularning barchasini keyingi bo'limda biz Kubernetesni amaliyotga tatbiq etamiz.

Amaliyotda kubernetes - pods

Biz Microservices-ni konteynerlarda ishlash uchun o'rnatdik va bu juda qiyin jarayon edi, ammo u ishladi. Shuningdek, biz ushbu echim kengaytirib bo'lmaydigan yoki o'zgaruvchan emasligini va Kubernetes ushbu muammolarni hal qilishini aytib o'tdik. Ushbu maqolani davom ettirishda biz xizmatlarimizni 13-rasmda ko'rsatilgandek yakuniy natijaga o'tkazamiz, bu erda konteynerlar Kubernetes tomonidan boshqariladi.

13-rasm. Kubernetes tomonidan boshqariladigan klasterda ishlaydigan mikroservislar

Ushbu maqolada biz Minikube-ni mahalliy disk raskadrovka qilish uchun ishlatamiz, garchi taqdim etiladigan barcha narsalar Azure-da va Google Cloud Platform-da ishlaydi.

Minikube-ni o'rnatish va ishga tushirish

Minikube-ni o'rnatish uchun rasmiy hujjatlarga rioya qiling. Minikube-ni o'rnatish paytida siz shuningdek Kubectl-ni o'rnatasiz. Bu Kubernetes API serveriga so'rovlar yuborish uchun mijozdir.

Minikube-ni ishga tushirish uchun minikube start buyrug'ini bajaring va uni tugatgandan so'ng kubectl get tugunlarini bajaring va siz quyidagi natijalarni olishingiz kerak.

kubectl tugunlarni olish
NOMI STATUS ROLLAR YOSH VERSION
minikube Tayyor  11m v1.9.0

Minikube bizga faqat bitta tugunga ega bo'lgan Kubernetes klasterini taqdim etadi, ammo esda tutingki, bizda qancha tugun mavjudligi, Kubernetes uzoqda tezislar bor va biz uchun ahamiyatsiz bo'lgan Kubernetesni o'rganishimiz kerak. Keyingi bo'limda biz birinchi Kubernetes resursimizdan [DRUM ROLLS] Pod-ni boshlaymiz.

Podlar

Men konteynerlarni yaxshi ko'raman va hozirga qadar siz konteynerlarni ham yaxshi ko'rasiz. Xo'sh, nega Kubernetes eng kichik tarqatiladigan hisoblash birligi sifatida bizga Podlarni berishga qaror qildi? Pod nima qiladi? Podlar bir xil ijro muhitiga ega bo'lgan bitta yoki hatto bir nechta konteynerlardan iborat bo'lishi mumkin.

Ammo bitta podkada ikkita idishni ishlatishimiz kerakmi? Erm .. Odatda, siz faqat bitta idishni ishlatasiz va biz buni bizning misolimizda qilamiz. Ammo, masalan uchun ikkita konteyner hajmlarni baham ko'rishlari kerak yoki ular bir-biri bilan protsesslararo aloqadan foydalanadi yoki boshqa tarzda bir-biriga bog'lanadi, keyin Pods yordamida bu mumkin bo'ladi. Pods yaratishi mumkin bo'lgan yana bir xususiyat shundaki, biz Docker konteynerlariga bog'lanmaganmiz, agar xohlasak, masalan, boshqa texnologiyalardan foydalanishimiz mumkin. Rkt.

14-rasm. Pod xususiyatlari

Xulosa qilish uchun Podlarning asosiy xususiyatlari quyidagicha (14-rasmda ham ko'rsatilgan):

  1. Kubernetes klasterida har bir podda noyob IP-manzil mavjud
  2. Pod bir nechta idishga ega bo'lishi mumkin. Konteynerlar bir xil port maydonini ajratadilar, chunki ular mahalliyhost orqali bog'lanishlari mumkin (tushunarli, ular bir xil portdan foydalana olmaydilar) va boshqa podkastlarning konteynerlari bilan aloqa pod ip bilan birgalikda amalga oshirilishi kerak.
  3. Qutidagi konteynerlar bir xil hajmda *, bir xil ip, port maydoni, IPC nomlari oralig'ida bo'lishadi.

* Konteynerlarda alohida izolyatsiya qilingan fayl tizimlari mavjud, ammo ular Kubernetes resurs hajmlari yordamida ma'lumot almashish imkoniyatiga ega.

Bu biz davom ettirishimiz uchun etarli ma'lumotlardan ko'proq, ammo sizning qiziqishingizni qondirish uchun rasmiy hujjatlarni ko'rib chiqing.

Pod ta'rifi

Quyida biz birinchi pod sa-frontend uchun manifest faylini olamiz va keyin quyida biz hamma fikrlarni tushuntiramiz.

apiVersion: v1
tur: №1 Pod
meta-ma’lumotlar:
  nomi: sa-frontend # 2
misol: # 3
  konteynerlar:
    - rasm: rinormaloku / tuyg'u-tahlil-frontend # 4
      nomi: sa-frontend # 5
      portlar:
        - konteynerPort: 80 # 6
  1. Kind: biz yaratmoqchi bo'lgan Kubernetes Resurs turini belgilaydi. Bizning holatda, Pod.
  2. Ism: manba nomini belgilaydi. Biz uni sa-frontend deb nomladik.
  3. Spec - resurs uchun kerakli holatni belgilaydigan ob'ekt. Pods Specning eng muhim xususiyati konteynerlar qatori.
  4. Rasm biz ushbu podkastda boshlamoqchi bo'lgan konteyner tasviridir.
  5. Ism - bu podadagi konteyner uchun noyob nom.
  6. Konteyner porti - bu konteyner tinglayotgan port. Bu faqat o'quvchi uchun ko'rsatkichdir (portni tashlab kirish kirishni cheklamaydi).

SA Frontend podini yaratish

Yuqoridagi pod uchun faylni manba manifests / sa-frontend-pod.yaml-da topishingiz mumkin. Siz terminalda ushbu papkaga o'tasiz yoki buyruq satrida to'liq manzilni ko'rsatishingiz kerak. Keyin buyruqni bajaring:

kubectl yaratish -f sa-frontend-pod.yaml
pod "sa-frontend" yaratildi

Pod ishlayotganini tekshirish uchun quyidagi buyruqni bajaring:

kubectl pods olish
NOMIDA TAYYoR STATUS YOSH BOSHLANDI
sa-frontend 1/1 ishlaydigan 0 7s

Agar u KonteynerCreating-da bo'lsa, yuqoridagi buyruqni bajaring - Pod ishlayotganda ma'lumotni yangilash uchun - soat.

Ilovaga tashqi tomondan kirish

Ilovadan tashqariga chiqish uchun biz Kubernetes xizmat turini yaratamiz, bu bizning keyingi maqolamiz bo'ladi, bu to'g'ri amalga oshiriladi, ammo tezkor disk raskadrovka qilishda bizda boshqa imkoniyat mavjud va bu port-ekspeditsiya:

kubectl port-oldinga sa-frontend 88:80
127.0.0.1:88 -> 80 dan yo'naltirish

127.0.0.1:88-da brauzeringizni oching va siz reaksiya dasturiga o'tasiz.

Kattalashtirishning noto'g'ri usuli

Biz Kubernetesning asosiy xususiyatlaridan biri bu kengaytirilishi, bu boshqa podni ishlashiga imkon berishini aytdik. Buning uchun quyidagi ta'rif bilan boshqa pod-resurs yarating:

apiVersion: v1
turi: Pod
meta-ma’lumotlar:
  nomi: sa-frontend2 # Faqatgina o'zgarish
misol:
  konteynerlar:
    - rasm: rinormaloku / tuyg'u-tahlil-frontend
      nomi: sa-frontend
      portlar:
        - konteynerPort: 80

Quyidagi buyruqni bajarib yangi podni yarating:

kubectl yaratish -f sa-frontend-pod2.yaml
pod "sa-frontend2" yaratildi

Ikkinchi pod ishlayotganligini tekshiring:

kubectl pods olish
NOMIDA TAYYoR STATUS YOSH BOSHLANDI
sa-frontend 1/1 ishlaydigan 0 7s
sa-frontend2 1/1 ishlaydigan 0 7s

Endi bizda ikkita pods ishlaydi!

Diqqat: bu yakuniy echim emas va uning kamchiliklari ko'p. Biz buni Kubernetes resurs manbalarini joylashtirish uchun ushbu bo'limda yaxshilaymiz.

Pod xulosasi

Statik fayllarga ega Nginx veb-serveri ikki xil podda ishlaydi. Endi bizda ikkita savol bor:

  • URL orqali kirish uchun uni tashqi tomondan qanday ochib beramiz va va
  • Ular orasidagi muvozanatni qanday yuklaymiz?
15-rasm. Qovoqlar orasidagi yukni muvozanatlash

Kubernetes bizga xizmatlar manbasini taqdim etadi. Keling, keyingi bo'limda unga o'taylik.

Amaliyotda kubernetes - xizmatlar

Kubernetes Servis resursi bir xil funktsional xizmatni ta'minlaydigan podlar to'plamiga kirish nuqtasi sifatida ishlaydi. Ushbu manba 16-rasmda ko'rsatilgandek og'ir yuklarni ko'tarish, xizmatlarni kashf etish va ular o'rtasidagi yuklarni muvozanatlash bilan shug'ullanadi.

16-rasm. Kubernetes IP-manzillarini saqlash xizmati

Bizning Kubernetes klasterimizda turli xil funktsional xizmatlarga ega podlar bo'ladi. (Frontend, Spring WebApp va Flask Python ilovalari). Savol tug'iladi, qanday qilib xizmat qaysi podslarni maqsad qilishni biladi? I.e. u podkastlar uchun so'nggi nuqtalar ro'yxatini qanday yaratadi?

Bu yorliqlar yordamida amalga oshiriladi va bu ikki bosqichli jarayon:

  1. Bizning xizmatimiz maqsad qilgan va barcha podslarga yorliqni qo'llash
  2. Bizning xizmatimizga "selektor" ni qo'llaymiz, shunda qaysi pods nishonga olinishini belgilaydi.

Bu vizual jihatdan ancha sodda:

17-rasm. Yorliqli podlar va ularning ko'rinishlari

Biz ko'rishimiz mumkinki, podkastlar "app: sa-frontend" yorlig'i bilan ko'rsatilgan va xizmat shu yorliqli podkalarni mo'ljalga olgan.

Yorliqlar

Yorliqlar Kubernetes Resurslaringizni tashkil qilishning oddiy usulini taqdim etadi. Ular kalit-qiymat juftligini ifodalaydi va har bir manbaga qo'llanishi mumkin. 17-rasmda ko'rsatilgan namunaga mos keladigan podkastlar uchun manifentsiyalarni o'zgartiring.

O'zgarishlarni tugatgandan so'ng fayllarni saqlang va ularni quyidagi buyruq bilan qo'llang:

kubectl apply -f sa-frontend-pod.yaml
Ogohlantirish: kubectl create -save-config yoki kubectl apply-da yaratilgan manbada foydalanish kerak
pod "sa-frontend" sozlangan
kubectl apply -f sa-frontend-pod2.yaml
Ogohlantirish: kubectl create -save-config yoki kubectl apply-da yaratilgan manbada foydalanish kerak
pod "sa-frontend2" sozlangan

Biz ogohlantirish oldik (yaratishni o'rniga qo'llang, shunchaki hiyla-nayrang). Ikkinchi satrda biz "sa-frontend" va "sa-frontend2" podvallarini sozlanganligini ko'ramiz. Biz namoyish qilishni xohlagan podkastlarni filtrlash orqali podkastlarning yorliqlanganligini tekshirishimiz mumkin:

kubectl get pod -l app = sa-frontend
NOMIDA TAYYoR STATUS YOSH BOSHLANDI
sa-frontend 1/1 yugurish 0 2 soat
sa-frontend2 1/1 yugurish 0 2 soat

Bizning podkastlarimiz yorliqlanganligini tekshirishning yana bir usuli - bayroq - show-labels-ni yuqoridagi buyruqqa qo'shish. Bu har bir pod uchun barcha yorliqlarni ko'rsatadi.
Ajoyib! Bizning podkastlarimiz etiketlanadi va biz ularni Xizmatimiz yordamida nishonlashga tayyormiz. 18-rasmda ko'rsatilgan LoadBalancer turini aniqlashni boshlaylik.

18. rasm. LoadBalancer xizmati yordamida yuklarni muvozanatlash

Xizmatni aniqlash

Loadbalancer xizmatining YAML ta'rifi quyida ko'rsatilgan:

apiVersion: v1
turdagi: 1-xizmat
meta-ma’lumotlar:
  nomi: sa-frontend-lb
misol:
  turi: LoadBalancer # 2
  portlar:
  - port: 80 # 3
    protokol: TCP №4
    targetPort: 80 # 5
  tanlagich: №6
    ilova: sa-frontend # 7
  1. Turi: Xizmat.
  2. Turi: Xususiyat turi, biz podvallar orasidagi yukni muvozanatlashni xohlaganimiz uchun LoadBalancer-ni tanlaymiz.
  3. Port: Xizmat so'raladigan portni belgilaydi.
  4. Protokol: aloqani belgilaydi.
  5. TargetPort: Mavjud bo'lmagan so'rovlar yuboriladigan port.
  6. Selector: podlarni tanlash uchun xususiyatlarga ega ob'ekt.
  7. ilova: sa-frontend Qaysi pods maqsad qilinishini belgilaydi, faqat "ilova: sa-frontend" deb belgilangan yoriqlar.

Xizmatni yaratish uchun quyidagi buyruqni bajaring:

kubectl yaratish -f service-sa-frontend-lb.yaml
"sa-frontend-lb" xizmati yaratildi

Quyidagi buyruqni bajarib, xizmatning holatini bilib olishingiz mumkin:

kubectl olish svc
NOM TYPE CLUSTER-IP TASHRIFI-IP PORT (S) YOSH
sa-frontend-lb LoadBalancer 10.101.244.40  80: 30708 / TCP 7 m

Tashqi-IP kutish holatidadir (kutib turing, chunki u o'zgarmaydi). Bu faqat Minikube-dan foydalanayotganimiz sababli. Agar biz buni Azure yoki GCP kabi bulutli provayderda amalga oshirganimizda edi, biz dunyo bo'ylab xizmatlarimizga kirishni ta'minlaydigan Public IP-ni olamiz.

Shunga qaramay, Minikube mahalliy osongina tuzatish uchun foydali buyruq beradi, quyidagi buyruqni bajaramiz:

minikube xizmati sa-frontend-lb
Standart brauzerda kubernetes default / sa-frontend-lb xizmatini ochish ...

Bu sizning IP xizmatlariga ishora qiluvchi brauzeringizni ochadi. Xizmat so'rovni qabul qilgandan so'ng, qo'ng'iroq podkastlardan biriga yuboriladi (qaysi biri muhim emas). Ushbu abstraktsiya bizga kirish punkti sifatida xizmatdan foydalanib, bir nechta birliklarni ko'rib chiqish va ular bilan ishlashga imkon beradi.

Xizmat haqida qisqacha ma'lumot

Ushbu bo'limda biz xizmatlarda saralash vositalaridan foydalangan holda etiketkalash manbalarini yoritdik va LoadBalancer xizmatini aniqladik va yaratdik. Bu dasturni kirish nuqtasi sifatida foydalanib, dasturni kengaytirish (yangi yorliqli podlarni qo'shish) va podkastlar orasidagi balansni yuklash bo'yicha talablarimizga javob beradi.

Amaliyotda kubernetes - tarqatish

Kubernetes Deployment dasturlari har bir dastur hayotida bitta doimiy narsaga yordam beradi va bu o'zgaradi. Bundan tashqari, faqatgina o'zgartirilmaydigan ilovalar allaqachon o'lib ketgan dasturlardir, ammo yangi talablar paydo bo'ladi, ko'proq kod yuboriladi, paketlanadi va joylashtiriladi. Va bu jarayonning har bir bosqichida xatolarga yo'l qo'yilishi mumkin.

Deployment resursi dasturning bir versiyasidan ikkinchisiga o'tish jarayonini avtomatlashtiradi, ishlamay qolganda nol ishlamay qolsa, oldingi versiyaga tezda qaytib borishga imkon beradi.

Amaliyotda foydalanish

Ayni paytda bizda ikkita pods va ularni ochadigan xizmat mavjud va ular orasidagi yukni muvozanatlash (19-rasmga qarang). Qovoqlarni alohida-alohida joylashtirish juda yaxshi emasligini aytib o'tdik. Ularning har birini alohida boshqarish kerak (yaratish, yangilash, o'chirish va ularning sog'lig'ini kuzatish). Tez yangilanishlar va tezkor qaytarishlar haqida gap bo'lishi mumkin emas! Bu qabul qilinmaydi va Kubernetes Deployment resursi ushbu muammolarning har birini hal qiladi.

19-rasm. Hozirgi holat

Davom etishdan oldin biz nimaga erishmoqchi ekanligimizni bildiraylik, chunki bu bizga tarqatish manbai uchun aniq ta'rifni tushunishga imkon beradigan umumiy ma'lumot beradi. Biz xohlagan narsa:

  1. Rinormaloku / sentiment-tahlil-frontend tasvirining ikkita podasi
  2. Vaqtni nol darajaga tushirish,
  3. Ilova bilan belgilangan pods: sa-frontend, shunday qilib xizmatlar sa-frontend-lb xizmati tomonidan topiladi.

Keyingi bo'limda biz talablarni Deployment ta'rifiga tarjima qilamiz.

Joylashtirishni aniqlash

Yuqorida keltirilgan barcha narsalarga erishadigan YAML manba ta'rifi:

apiVersion: kengaytmalar / v1beta1
tur: №1-son
meta-ma’lumotlar:
  nomi: sa-frontend
misol:
  tanlagich: №2
    matchLabellar:
      ilova: sa-frontend
  nusxalari: 2 # 3
  minReadySekundlar: 15
  strategiya:
    turi: RollingUpdate # 4
    rollingUpdate:
      Maksimal mavjud: 1 # 5
      maxSurge: 1 # 6
  shablon: # 7
    meta-ma’lumotlar:
      yorliqlar:
        ilova: sa-frontend # 8
    misol:
      konteynerlar:
        - rasm: rinormaloku / tuyg'u-tahlil-frontend
          imagePullPolicy: Har doim # 9
          nomi: sa-frontend
          portlar:
            - konteynerPort: 80
  1. Turi: joylashtirish.
  2. Selektor: Selektorga mos keladigan podlar ushbu tarqatish boshqaruvi ostida qabul qilinadi.
  3. Replicas - bu necha podkalarni ishga tushirishimizni aniqlaydigan tarqatish Spec ob'ektidir. Shunday qilib, faqat 2.
  4. Type joriy versiyadan ikkinchisiga o'tish paytida ushbu joylashtirishda ishlatiladigan strategiyani belgilaydi. RollingUpdate strategiyasi Zero Downtime tarqatilishini ta'minlaydi.
  5. MaxUnavailable - bu RollingUpdate ob'ektining xususiyati bo'lib, prokladkalarni yangilashda ruxsat etilgan maksimal podslarni (kerakli holat bilan solishtirganda) belgilaydi. Ikki nusxadan iborat bizning joylashuvimiz uchun bitta Pod tugatilsa, biz yana bitta pod ishlaymiz va shu bilan bizning dasturimizga kirish mumkin bo'ladi.
  6. MaxSurge - bu RollingUpdate ob'ektining yana bir xususiyati bo'lib, u joylashtirishga qo'shilgan podalarning maksimal miqdorini (kerakli holat bilan solishtirganda) belgilaydi. Bizning joylashuvimiz uchun, bu yangi versiyaga o'tishda bitta podani bir vaqtning o'zida 3 tagacha qo'shib qo'yishimiz mumkin degan ma'noni anglatadi.
  7. Andoza: Deployment yangi podlarni yaratish uchun foydalanadigan pod-shablonni belgilaydi. Ehtimol Pods bilan o'xshashlik sizni darhol urib yubordi.
  8. Ilova: ushbu shablon yordamida yaratilgan podkastlar uchun yorliqni old tomonga joylashtiring.
  9. "Doim" ga o'rnatilganda ImagePullPolicy har bir qayta joylashtirishda konteyner rasmlarini tortib oladi.

Rostini aytsam, o'sha matn devori meni chalkashtirib yubordi, endi boshlamoqchiman.

kubectl apply -f sa-frontend-tarqatish.yaml
"sa-frontend" tarqatish yaratildi

Har doimgidek, hamma narsa reja bo'yicha ketayotganligini tekshirib ko'raylik:

kubectl pods olish
NOMIDA TAYYoR STATUS YOSH BOSHLANDI
sa-frontend 1/1 yugurish 0 2d
sa-frontend-5d5987746c-ml6m4 1/1 yugurish 0 1m
sa-frontend-5d5987746c-mzsgg 1/1 yugurish 0 1m
sa-frontend2 1/1 ishlaydigan 0 2d

Bizda 4 ta ishlaydigan pods bor, ikkitasi Deployment tomonidan yaratilgan va qolgan ikkitasi biz qo'lda yaratgan. Kubectl o'chirish pod buyrug'i yordamida biz yaratganlarni yo'q qiling.

Mashq: Joylashtirish ustunlaridan birini ham o'chirib tashlang va nima bo'lishini ko'ring. Quyidagi tushuntirishni o'qishdan oldin buning sababini o'ylab ko'ring.

Tushuntirish: Bitta podni o'chirish Joylashtirish xizmati joriy holati (1 pod ishlaydigan) istalgan holatdan (2 pod ishlayotgan) farq qilishi va shu bilan u boshqa podani boshlagani haqida xabar berdi.

Xo'sh, kerakli holatni saqlashdan tashqari, joylashtirishning nima yaxshi tomoni bor? Keling, imtiyozlardan boshlaylik.

Foydasi # 1: nolga tushish vaqtini tarqatish

Bizning mahsulot menejeri bizga yangi talab bilan keldi, mijozlarimiz old tomonda yashil tugmachaga ega bo'lishni xohlashadi. Ishlab chiquvchilar o'zlarining kodlarini yuborishdi va bizga kerak bo'lgan yagona narsa - konteyner tasviri rinormaloku / sentiment-analiz-frontend: yashil. Endi bizning navbatimiz, biz DevOps-larni nol-vaqtni qisqartirishga majbur qilishimiz kerak, og'ir ish oqlanadimi? Qani ko'raylik-chi!

Yangi rasmga murojaat qilish uchun konteyner rasmini o'zgartirib, sa-frontend-deploy.yaml faylini tahrirlang: rinormaloku / sentiment-analiz-frontend: yashil. O'zgarishlarni sa-frontend-deploy-green.yaml sifatida saqlang va quyidagi buyruqni bajaring:

kubectl apply -f sa-frontend-deploy-green.yaml - yozuv
"sa-frontend" tarqatish sozlangan

Quyidagi buyruq yordamida rolning holatini tekshirishimiz mumkin:

kubectl rolini joriy qilish holati sa-frontend
Jarayon tugashini kutish: 1 ta eski nusxalar tugatilishini kutmoqda ...
Jarayon tugashini kutish: 1 ta eski nusxalar tugatilishini kutmoqda ...
Jarayon tugashini kutish: 1 ta eski nusxalar tugatilishini kutmoqda ...
Jarayon tugashini kutish: 1 ta eski nusxalar tugatilishini kutmoqda ...
Jarayon tugashini kutish: 1 ta eski nusxalar tugatilishini kutmoqda ...
Jarayon tugashini kutish: 2 ta yangilangan replikalarning bittasi mavjud ...
"sa-frontend" tarqatish muvaffaqiyatli yakunlandi

Chiqarilgan natijaga ko'ra, tarqatish jarayoni yakunlandi. Bu shunday bajarilganki, nusxalar birma-bir almashtirildi. Bizning dasturimiz doimo yoqilgan degan ma'noni anglatadi. Oldinga o'tishdan oldin, yangilanish jonli ekanligiga ishonch hosil qiling.

Joylashtirishni tekshirish

Yangilanishlarni brauzerlarimizda jonli ko'raylik. Biz brauzerni ochadigan minikube service sa-frontend-lb oldin ishlatgan buyruqni bajaring. Tugma yangilanganligini ko'rishimiz mumkin.

20-rasm. Yashil tugma

"RollingUpdate" sahnasi ortida

Biz yangi joylashtirishni qo'llaganimizdan so'ng, Kubernetes yangi holatni eskisi bilan taqqoslaydi. Bizning holatlarimizda yangi davlat rinormaloku / sentiment-analiz-frontend tasviri bilan ikkita ustunni talab qiladi: yashil Bu hozirgi holatdan farq qiladi, shuning uchun u RollingUpdate-da ishlaydi.

21-rasm. RollingUpdate o'rnini bosadigan podalar

RollingUpdate biz belgilagan qoidalarga muvofiq ishlaydi, "maxUnavailable: 1 ″" va "maxSurge: 1 ″". Bu shuni anglatadiki, tarqatish faqat bitta podani tugatishi mumkin va faqat bitta podni boshlashi mumkin. Ushbu jarayon barcha podlar almashtirilguncha takrorlanadi (21-rasmga qarang).

2-raqam bilan davom etamiz.

Rad etish: O'yin-kulgi uchun, keyingi qismi roman sifatida yozilgan.

Foydasi # 2: oldingi holatga qaytarish

Mahsulot menejeri sizning ofisingizga kiradi va u inqirozga duch kelmoqda!

"Ilovada ISHLAB CHIQISH !! Darhol oldingi versiyaga qayting "- deb qichqiradi mahsulot menejeri.

U ichingizdagi salqinlikni ko'radi, bir ko'zni qisib emas. Siz sevimli terminalingizga murojaat qilasiz va quyidagini yozasiz:

kubectl reklama tarixini tarqatish sa-frontend
"sa-frontend" tarqatish
TEKShIRUVNI O'ZGARTIRISh-KO'RING
1 
2 kubectl.exe qo'llaniladi --filename = sa-frontend-deocation-green.yaml --record = true

Siz oldingi joylashtirishlarga qisqa nazar tashlaysiz. "So'nggi versiya xato, shu bilan oldingi versiya mukammal ishladimi?" - deb so'raysiz mahsulot menejeridan.

"Ha, sizlar ham meni tinglayapsizlarmi?" - qichqiradi mahsulot menejeri.

Siz unga e'tibor bermayapsiz, nima qilish kerakligini bilasiz, yozishni boshlaysiz:

kubectl rollout tarqatishni bekor qiling sa-frontend --to-revision = 1
tarqatish "sa-frontend" orqaga surildi

Siz sahifani yangilaysiz va o'zgarish bekor qilindi!

Mahsulot menejerlari jag 'tomchilari ochiq.

Siz kunni saqladingiz!

Tamom!

Ha ... bu zerikarli roman edi. Kubernetes paydo bo'lishidan oldin u juda yaxshi edi, biz ko'proq dramaga ega bo'ldik, yuqori intensivlik va uzoqroq vaqt davomida. Oh, yaxshi paytlar!

O'zingiz ishlashingiz kerak bo'lgan bitta tafsilotdan tashqari, buyruqlarning aksariyati o'z-o'zini tushuntirishdir. Nega birinchi versiyada

Agar siz yangi rasmni qo'llashda biz ishlatgan - yozuv bayrog'i tufayli degan xulosaga kelgan bo'lsangiz, unda siz mutlaqo to'g'risiz!

Keyingi bo'limda biz butun arxitekturani tugatish uchun shu paytgacha o'rganilgan tushunchalardan foydalanamiz.

Kubernetes va amaliyotdagi barcha narsalar

Biz arxitekturani tugatish uchun barcha manbalarni bilib oldik, shuning uchun bu qism tezda amalga oshiriladi. 22-rasmda biz qilishimiz kerak bo'lgan hamma narsani ochib berdik. Quyidan boshlaylik: sa-mantiqiy tarqatishni qo'llash.

22-rasm. Amaldagi holati

SA-Mantiqni joylashtirish

Terminalingizda manba-manzildagi papkaga o'ting va quyidagi buyruqni bajaring:

kubectl apply -f sa-logic-tarqatish.yaml --record
tarqatish "sa-logic" yaratildi

SA-Logic tarqatish uchta poddlarni yaratdi. (Bizning piton dasturimiz konteyneri ishlamoqda). Ularda ularni ilova: sa-logic bilan yorliqlashdi. Ushbu yorliq SA-Logic xizmatidagi selektor yordamida ularni maqsadli aniqlashimizga imkon beradi. Sa-logic-demissions.yaml faylini ochish uchun vaqt ajrating va tarkibini tekshiring.

Bu yana bir xil ishlatiladigan tushunchalar, keling yana bir manbaga o'taylik: SA-Logic xizmati.

Xizmat SA Mantiq

Nega bizga ushbu xizmat kerakligini aniqlab beramiz. Bizning Java dasturimiz (SA - WebApp dasturining podkastlarida ishlaydi) Python Application tomonidan amalga oshirilgan fikrlar tahliliga bog'liq. Ammo hozir biz hamma narsani mahalliy ravishda ishlata boshlaganimizdan farqli o'laroq, bitta piton dasturini bitta portni tinglay olmaymiz, bizda 2 ta pod bor va agar kerak bo'lsa, biz ko'proq narsaga ega bo'lishimiz mumkin.

Shuning uchun bizga "xuddi shu funktsional xizmatni taqdim etadigan podlar to'plamiga kirish nuqtasi bo'lib xizmat qiladigan" xizmat kerak. Bu biz SA-Logic-ning barcha SA-Logic podklariga kirish nuqtasi sifatida foydalanishimiz mumkin degan ma'noni anglatadi.

Buni qilaylik:

kubectl apply -f service-sa-logic.yaml
"sa-mantiq" xizmati yaratildi

Yangilangan dastur holati: Bizda 2 ta pod ((Python ilovasi mavjud) ishlaydi va bizda SA-WebApp pod'ezdlarida foydalaniladigan kirish nuqtasi sifatida SA-Logic xizmati mavjud.

23-rasm. Arizaning yangilangan holati

Endi biz tarqatish manbasidan foydalanib, SA-WebApp podlarini joylashtirishimiz kerak.

SA-WebApp joylashtirish

Biz tarqatishlardan xalos bo'lmoqdamiz, ammo bu yana bitta xususiyatga ega. Agar siz sa-web-app-demissions.yaml faylini ochsangiz, siz ushbu qismni yangi topasiz:

- rasm: rinormaloku / tuyg'u-tahlil-veb-ilova
  imagePullPolicy: Har doim
  nomi: sa-veb-ilova
  env:
    - nomi: SA_LOGIC_API_URL
      qiymati: "http: // sa-mantiq"
  portlar:
    - konteynerPort: 8080

Bizni qiziqtirgan birinchi narsa, env mulki nima qiladi? Bizning fikrimizcha, bu SA_LOGIC_API_URL atrof-muhit o'zgaruvchisini "bizning manzilimiz" ichidagi "http: // sa-logic" qiymati bilan e'lon qiladi. Ammo nega biz uni http: // sa-logic-ga boshlaymiz, sa-mantiq nima o'zi?

Kube-dns bilan tanishishga imkon beramiz.

KUBE-DNS

Kubernetesda kube-dns maxsus pod mavjud. Odatiy bo'lib, barcha Pods uni DNS Server sifatida ishlatadi. Kube-dns-ning muhim xususiyati shundaki, u har bir yaratilgan xizmat uchun DNS yozuvini yaratadi.

Bu xizmat sa-logikasini yaratishda IP-manzilga ega bo'lganligini anglatadi. Uning nomi yozuv sifatida (IP bilan birgalikda) kub-dns-da qo'shildi. Bu barcha podslarga sa-mantiqni SA-Logic xizmatlarining IP-manziliga tarjima qilish imkoniyatini beradi.

Yaxshi, endi quyidagilarni davom ettirishimiz mumkin:

SA WebApp-ni joylashtirish (davomi)

Buyruqni bajarish:

kubectl apply -f sa-web-app-tarqatish.yaml --record
"sa-web-app" tarqatish yaratildi

Bajarildi SA-WebApp podlarini tashqi tomondan, LoadBalancer xizmati yordamida fosh qilishga majburmiz. Bu bizning reaktsion dasturimizga SA-WebApp pod'ezdlariga kirish nuqtasi sifatida xizmat qiladigan httpga so'rovlar yuborish imkoniyatini beradi.

SA-WebApp xizmati

Service-sa-web-app-lb.yaml faylini oching, ko'rib turganingizdek, hamma sizga tanish.
Shunday qilib, keyingi buyruqni bajarmasdan:

kubectl apply -f service-sa-web-app-lb.yaml
"sa-web-app-lb" xizmati yaratildi

Arxitektura tugallandi. Ammo bitta bitta dissonansimiz bor. SA-Frontend podkastlarini joylashtirganimizda konteynerimizdagi rasm SA-WebApp-ga http: // localhost: 8080 / sentimentga ishora qilar edi. Ammo endi biz SA-WebApp Loadbalancer-ning IP-manzilini ko'rsatish uchun uni yangilashimiz kerak. (SA-WebApp pod'lariga kirish nuqtasi sifatida ishlaydi).

Ushbu dissonansni bartaraf etish, koddan tortib to tarqatishgacha bo'lgan barcha narsani yana bir bor o'z ichiga olish imkoniyatini beradi. (Quyidagi ko'rsatmaga rioya qilish o'rniga, buni o'zingiz amalga oshirsangiz yanada samaralidir). Qani boshladik:

  1. Quyidagi buyruqni bajarib, SA-WebApp Loadbalancer IP-ni oling:
minikube xizmatlarining ro'yxati
| ------------- | ---------------------- | ------------ ----------------- |
| NAMESPACE | NAME | URL |
| ------------- | ---------------------- | ------------ ----------------- |
| standart | kubernetes | Tugun porti yo'q |
| standart | sa-frontend-lb | http://192.168.99.100:30708 |
| standart | sa-mantiq | Tugun porti yo'q |
| standart | sa-web-app-lb | http://192.168.99.100:31691 |
| kub-tizim | kub-dns | Tugun porti yo'q |
| kub-tizim | kubernetes-asboblar paneli | http://192.168.99.100:30000 |
| ------------- | ---------------------- | ------------ ----------------- |

2. Quyidagi ko'rsatilgandek sa-frontend / src / App.js faylida SA-WebApp LoadBalancer IP-dan foydalaning:

analyzSentence () {
        olinadi ('http://192.168.99.100:31691/sentiment', {/ * qisqartirish uchun qisqartirildi * /})
            .then (javob => javob.json ())
            .then (data => this.setState (ma'lumotlar));
    }

3. npm run build statik fayllarini yarating (siz sa-frontend papkasiga o'tishingiz kerak)

4. Konteyner rasmini yarating:

docker build -f Dockerfile -t $ DOCKER_USER_ID / tuyg'u-tahlil-frontend: minikube.

5. Rasmni Docker uyasiga bosing.

docker push $ DOCKER_USER_ID / his-tahlil-frontend: minikube

6. Yangi rasmdan foydalanish uchun va-sa-frontend-demissions.yaml-ni tahrirlang

7. kubectl apply -f sa-frontend-deploy.yaml buyrug'ini bajaring

Brauzerni yangilang yoki agar siz oynani yopgan bo'lsangiz, minikube service sa-frontend-lb xizmatini bajaring. Jumla yozib ko'ring!

Maqolaning qisqacha mazmuni

Kubernetes jamoa uchun foydalidir, loyiha uchun joylashishni soddalashtiradi, kengayadi, moslashuvchan bo'ladi, bu har qanday asosiy infratuzilmani iste'mol qilishimizga imkon beradi va siz nima bilasiz? Bundan buyon uni Supernetlar deb ataymiz!

Ushbu seriyada biz nimani yoritdik:

  • ReactJS, Java va Python dasturlarini qurish / qadoqlash / ishga tushirish
  • Docker idishlari; Dockerfiles yordamida ularni qanday aniqlash va qurish,
  • Konteyner reestrlari; biz Docker uyasini konteynerlarimiz uchun omborxona sifatida ishlatdik.
  • Kubernetesning eng muhim qismlarini yoritdik.
  • Podlar
  • Xizmatlar
  • Joylashtirishlar
  • Nol-Downtime tarqatish kabi yangi tushunchalar
  • Kengaytiriladigan ilovalar yaratish
  • Va shu jarayon davomida biz mikroservis dasturini butun Kubernetes klasteriga o'tkazdik.

Men Rinor Malokuman va menga ushbu sayohatga qo'shilganingiz uchun sizga rahmat aytmoqchiman. Ushbu maqolani o'qiganingizdan beri, men sizga ushbu maqolani yaxshi ko'rganingizni va ko'proq qiziqish bildirishingizni bilaman. Men har 3 oyda yangi texnologiyalar uchun ushbu batafsil chuqurlikdagi maqolalarni yozaman. Siz har doim haqiqiy dasturni, amaliy tajribani va biron bir real loyihani amalga oshirish uchun kerakli vositalar va bilimlarni taqdim etadigan qo'llanmani kutishingiz mumkin.

Aloqada qolish va bironta maqolamni o'tkazib yubormaslik uchun mening byulletenimga obuna bo'ling, meni Twitterda kuzatib boring va rinormaloku.com sahifamni tekshirib ko'ring.