Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Kubernetes-ga joylashtirishning birinchi bosqichi ilovangizni konteynerga joylashtirishdir. Ushbu seriyada biz kichik, xavfsiz konteyner tasvirini qanday yaratishni ko'rib chiqamiz.
Docker tufayli konteyner tasvirlarini yaratish hech qachon oson bo'lmagan. Asosiy rasmni belgilang, o'zgartirishlaringizni qo'shing va konteyner yarating.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Ushbu uslub boshlash uchun ajoyib bo'lsa-da, standart asosiy tasvirlardan foydalanish zaifliklarga to'la katta tasvirlar bilan xavfli ishlashga olib kelishi mumkin.

Bundan tashqari, Docker-dagi aksariyat tasvirlar asosiy tasvir uchun Debian yoki Ubuntu-dan foydalanadi va bu mukammal moslik va qulay sozlashni ta'minlasa-da (Docker fayli faqat ikki qator kodni oladi), asosiy tasvirlar konteyneringizga yuzlab megabayt qo'shimcha yuk qo'shishi mumkin. Masalan, Go "salom dunyo" ilovasi uchun oddiy node.js fayli taxminan 700 megabaytni tashkil qiladi, sizning haqiqiy ilovangiz esa bir necha megabayt hajmda.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Shunday qilib, bu qo'shimcha ish yukining barchasi raqamli makonni isrof qilish va xavfsizlik zaifliklari va xatolar uchun ajoyib yashirish joyidir. Shunday qilib, konteyner tasvirining hajmini kamaytirishning ikkita usulini ko'rib chiqaylik.

Birinchisi, kichik asosiy tasvirlardan foydalanish, ikkinchisi - Builder Pattern-dan foydalanish. Kichikroq asosiy tasvirlardan foydalanish, ehtimol, konteyneringiz hajmini kamaytirishning eng oson yo'li. Katta ehtimol bilan siz foydalanayotgan til yoki stek standart tasvirdan ancha kichikroq original ilova tasvirini taqdim etadi. Keling, node.js konteynerimizni ko'rib chiqaylik.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Docker-da sukut bo'yicha, tugun: 8 asosiy tasvir hajmi 670 MB, tugun: 8-alp tasvir hajmi esa atigi 65 MB, ya'ni 10 baravar kichik. Kichikroq Alp tog'larining asosiy tasviridan foydalanib, siz idishingiz hajmini sezilarli darajada kamaytirasiz. Alpine - bu Docker foydalanuvchilari orasida juda mashhur bo'lgan kichik va engil Linux distribyutsiyasi, chunki u konteynerlarni kichik saqlash bilan birga ko'plab ilovalar bilan mos keladi. Standart Docker "tugun" tasviridan farqli o'laroq, "tugun: alp" ko'plab xizmat fayllari va dasturlarini o'chirib tashlaydi va faqat ilovangizni ishga tushirish uchun etarli bo'lganlarini qoldiradi.

Kichikroq asosiy tasvirga o'tish uchun yangi asosiy tasvir bilan ishlashni boshlash uchun Dockerfile-ni yangilang:

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Endi, eski qurilgan tasvirdan farqli o'laroq, siz kodingizni konteynerga nusxalashingiz va har qanday bog'liqlikni o'rnatishingiz kerak. Yangi Dockerfile'da konteyner tugun:alp tog'lari tasviri bilan boshlanadi, keyin kod uchun katalog yaratadi, NPM paket menejeri yordamida bog'liqliklarni o'rnatadi va nihoyat server.js ni ishga tushiradi.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Ushbu yangilanish hajmi 10 baravar kichikroq konteynerga olib keladi. Agar dasturlash tilingiz yoki stekingiz tasvirni qisqartirish funksiyasiga ega bo'lmasa, Alpine Linux-dan foydalaning. Shuningdek, u konteyner tarkibini to'liq boshqarish imkoniyatini beradi. Kichkina asosiy tasvirlardan foydalanish kichik konteynerlarni tezda yaratishning ajoyib usuli hisoblanadi. Ammo Builder Pattern yordamida yanada kattaroq qisqartirishga erishish mumkin.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Interpretatsiya qilingan tillarda dastlabki kod avval tarjimonga uzatiladi va keyin bevosita bajariladi. Kompilyatsiya qilingan tillarda dastlabki kod dastlab kompilyatsiya qilingan kodga aylantiriladi. Biroq, kompilyatsiya ko'pincha kodni ishga tushirish uchun kerak bo'lmagan vositalardan foydalanadi. Bu shuni anglatadiki, siz ushbu asboblarni oxirgi idishdan butunlay olib tashlashingiz mumkin. Buning uchun Builder Pattern dan foydalanishingiz mumkin.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Kod birinchi konteynerda yaratiladi va kompilyatsiya qilinadi. Keyin kompilyatsiya qilingan kod ushbu kodni kompilyatsiya qilish uchun zarur bo'lgan kompilyatorlar va asboblarsiz yakuniy konteynerga qadoqlanadi. Keling, bu jarayon orqali Go ilovasini ishga tushiramiz. Birinchidan, biz o'rnatilgan tasvirdan Alpine Linux-ga o'tamiz.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Yangi Dockerfile-da konteyner golang:alp tog'lari tasviri bilan boshlanadi. Keyin u kod uchun katalog yaratadi, uni manba kodiga ko'chiradi, ushbu manba kodini yaratadi va dasturni ishga tushiradi. Bu konteyner o'rnatilgan konteynerdan ancha kichikroq, lekin u hali ham kompilyator va bizga kerak bo'lmagan boshqa Go vositalarini o'z ichiga oladi. Shunday qilib, kompilyatsiya qilingan dasturni chiqarib, uni o'z konteyneriga joylashtiramiz.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Ushbu Docker faylida g'alati narsani ko'rishingiz mumkin: u ikkita FROM qatorini o'z ichiga oladi. Birinchi 4 qatorli bo'lim avvalgi Dockerfile bilan bir xil ko'rinadi, bundan tashqari u ushbu bosqichni nomlash uchun AS kalit so'zidan foydalanadi. Keyingi bo'limda yangi tasvirni boshlash uchun yangi FROM qatori mavjud, bu erda golang:alp tog'lari tasviri o'rniga biz asosiy rasm sifatida Raw alp tog'idan foydalanamiz.

Raw Alpine Linux-da hech qanday SSL sertifikatlari o'rnatilmagan, bu HTTPS orqali ko'pgina API qo'ng'iroqlari muvaffaqiyatsizlikka olib keladi, shuning uchun ba'zi ildiz CA sertifikatlarini o'rnatamiz.

Endi qiziqarli qism keladi: tuzilgan kodni birinchi konteynerdan ikkinchisiga nusxalash uchun siz shunchaki ikkinchi bo'limning 5-qatorida joylashgan COPY buyrug'idan foydalanishingiz mumkin. U faqat bitta dastur faylidan nusxa oladi va Go yordamchi dasturlariga ta'sir qilmaydi. Yangi ko'p bosqichli Docker fayli 12 megabayt bo'lgan asl konteyner tasviriga nisbatan atigi 700 megabayt hajmdagi konteyner tasvirini o'z ichiga oladi, bu katta farq!
Shunday qilib, kichik asosiy tasvirlar va Builder Pattern-dan foydalanish ko'p ishlamasdan ancha kichikroq konteynerlarni yaratishning ajoyib usuli hisoblanadi.
Ilovalar to'plamiga qarab, tasvir va konteyner hajmini kamaytirishning qo'shimcha usullari mavjud bo'lishi mumkin, ammo kichik konteynerlarning haqiqatan ham o'lchanadigan foydasi bormi? Keling, kichik konteynerlar juda samarali bo'lgan ikkita sohani ko'rib chiqaylik - ishlash va xavfsizlik.

Ishlashning o'sishini baholash uchun konteynerni yaratish, uni ro'yxatga olish kitobiga kiritish (surish) va keyin uni u yerdan olish (tortishish) jarayonining davomiyligini ko'rib chiqing. Kichikroq idish kattaroq idishga nisbatan aniq afzalliklarga ega ekanligini ko'rishingiz mumkin.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Docker qatlamlarni keshlaydi, shuning uchun keyingi tuzilmalar juda tez bo'ladi. Biroq, konteynerlarni qurish va sinovdan o'tkazish uchun ishlatiladigan ko'plab CI tizimlari qatlamlarni keshlashmaydi, shuning uchun vaqtni sezilarli darajada tejash mumkin. Ko'rib turganingizdek, mashinangizning kuchiga qarab, katta idishni qurish vaqti 34 dan 54 sekundgacha, Builder Pattern yordamida konteynerdan foydalanganda esa 23 dan 28 soniyagacha qisqartiriladi. Bunday turdagi operatsiyalar uchun unumdorlik 40-50% ni tashkil qiladi. Shunday qilib, kodingizni necha marta yaratganingiz va sinab ko'rishingiz haqida o'ylang.

Konteyner qurilgandan so'ng, siz uni Kubernetes klasteringizda ishlatishingiz uchun uning tasvirini (konteyner tasvirini) konteyner reestriga surishingiz kerak. Men Google Container Registry-dan foydalanishni tavsiya qilaman.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Google Container Registry (GCR) yordamida siz faqat xom ashyoni saqlash va tarmoqqa ulanish uchun toʻlaysiz va konteynerlarni boshqarish uchun qoʻshimcha toʻlovlar olinmaydi. Bu shaxsiy, xavfsiz va juda tez. GCR tortish jarayonini tezlashtirish uchun ko'plab fokuslardan foydalanadi. Ko'rib turganingizdek, go:onbuild yordamida Docker Container Image konteynerini kiritish kompyuterning ishlashiga qarab 15 dan 48 soniyagacha davom etadi va kichikroq konteyner bilan bir xil operatsiya 14 dan 16 soniyagacha, unumdorligi past bo'lgan mashinalar uchun esa davom etadi. ish tezligidagi afzallik 3 barobar ortadi. Kattaroq mashinalar uchun vaqt taxminan bir xil, chunki GCR umumiy tasvirlar bazasi uchun global keshdan foydalanadi, ya'ni ularni umuman yuklashingiz shart emas. Kam quvvatli kompyuterda protsessor darboğazdir, shuning uchun kichik konteynerlardan foydalanishning afzalligi bu erda ancha katta.

Agar siz GCR dan foydalanayotgan bo'lsangiz, men qurish tizimingizning bir qismi sifatida Google Container Builder (GCB) dan foydalanishni tavsiya qilaman.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Ko'rib turganingizdek, undan foydalanish Build+Push operatsiyasining davomiyligini qisqartirishda hatto unumli mashinaga qaraganda ancha yaxshi natijalarga erishish imkonini beradi - bu holda konteynerlarni qurish va xostga jo'natish jarayoni deyarli 2 baravar tezlashadi. . Bundan tashqari, siz har kuni 120 bepul qurish daqiqasiga ega bo'lasiz, bu ko'p hollarda konteyner qurish ehtiyojlarini qoplaydi.

Keyinchalik eng muhim ishlash ko'rsatkichi keladi - konteynerlarni olish yoki yuklab olish tezligi. Va agar siz surish operatsiyasiga sarflangan vaqtga unchalik ahamiyat bermasangiz, unda tortish jarayonining uzunligi tizimning umumiy ishlashiga jiddiy ta'sir qiladi. Aytaylik, sizda uchta tugunli klaster mavjud va ulardan biri muvaffaqiyatsiz tugadi. Agar siz Google Kubernetes Engine kabi boshqaruv tizimidan foydalansangiz, u avtomatik ravishda o'lik tugunni yangisiga almashtiradi. Biroq, bu yangi tugun butunlay bo'sh bo'ladi va u ishlay boshlashi uchun barcha konteynerlaringizni unga sudrab o'tishingiz kerak bo'ladi. Agar tortish jarayoni etarlicha uzoq davom etsa, sizning klasteringiz butun vaqt davomida pastroq ishlashda ishlaydi.

Bu sodir bo'lishi mumkin bo'lgan ko'plab holatlar mavjud: klasterga yangi tugun qo'shish, tugunlarni yangilash yoki hatto joylashtirish uchun yangi konteynerga o'tish. Shunday qilib, tortishish vaqtini minimallashtirish asosiy omilga aylanadi. Kichkina konteyner kattasidan ko'ra tezroq yuklanishini inkor etib bo'lmaydi. Agar siz Kubernetes klasterida bir nechta konteyner ishlatsangiz, vaqtni tejash sezilarli bo'lishi mumkin.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Ushbu taqqoslashni ko'rib chiqing: kichik konteynerlarda tortish operatsiyasi go:onbuild yordamida bir xil operatsiyaga qaraganda mashinaning kuchiga qarab 4-9 barobar kamroq vaqt oladi. Birgalikda, kichik konteynerli tasvirlardan foydalanish yangi Kubernetes tugunlarini joylashtirish va onlayn bo'lish vaqtini va tezligini sezilarli darajada tezlashtiradi.

Keling, xavfsizlik masalasini ko'rib chiqaylik. Kichikroq konteynerlar kattaroqlarga qaraganda ancha xavfsizroq hisoblanadi, chunki ular kichikroq hujum yuzasiga ega. Haqiqatan ham shundaymi? Google Container Registry-ning eng foydali xususiyatlaridan biri bu sizning konteynerlaringizni zaifliklar uchun avtomatik skanerlash qobiliyatidir. Bir necha oy oldin men o'rnatilgan va ko'p bosqichli konteynerlarni yaratdim, shuning uchun u erda zaifliklar bor-yo'qligini bilib olaylik.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Natija hayratlanarli: kichik konteynerda atigi 3 ta o‘rta darajadagi zaifliklar, katta konteynerda esa 16 ta muhim va 376 ta boshqa zaifliklar aniqlangan. Agar biz katta konteyner tarkibini ko'rib chiqsak, xavfsizlik muammolarining aksariyati bizning ilovamizga hech qanday aloqasi yo'qligini, lekin biz foydalanmayotgan dasturlar bilan bog'liqligini ko'rishimiz mumkin. Shunday qilib, odamlar katta hujum yuzasi haqida gapirganda, ular nimani anglatadi.

Kubernetesning eng yaxshi amaliyotlari. Kichik konteynerlarni yaratish

Olib ketish aniq: kichik konteynerlar yarating, chunki ular tizimingizga haqiqiy ishlash va xavfsizlik afzalliklarini beradi.

Kubernetesning eng yaxshi amaliyotlari. Nomlar maydoni bilan Kubernetesni tashkil qilish

Ba'zi reklamalar 🙂

Biz bilan qolganingiz uchun tashakkur. Bizning maqolalarimiz sizga yoqdimi? Ko'proq qiziqarli tarkibni ko'rishni xohlaysizmi? Buyurtma berish yoki do'stlaringizga tavsiya qilish orqali bizni qo'llab-quvvatlang, 4.99 dollardan boshlab ishlab chiquvchilar uchun bulutli VPS, Siz uchun biz tomonidan ixtiro qilingan boshlang'ich darajadagi serverlarning noyob analogi: VPS (KVM) E5-2697 v3 (6 yadroli) 10GB DDR4 480GB SSD 1Gbps 19 dollardan yoki serverni qanday almashish haqida butun haqiqat? (RAID1 va RAID10, 24 tagacha yadro va 40 Gb gacha DDR4 bilan mavjud).

Amsterdamdagi Equinix Tier IV ma'lumotlar markazida Dell R730xd 2 baravar arzonmi? Faqat shu yerda 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 televizor 199 dollardan Gollandiyada! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 dollardan! Haqida o'qing Infratuzilma korporatsiyasini qanday qurish kerak. bir tiyinga 730 evroga teng Dell R5xd E2650-4 v9000 serverlaridan foydalanish bilan sinf?

Manba: www.habr.com

a Izoh qo'shish