Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Kubernetes қолданбасын орналастырудың бірінші қадамы - қолданбаңызды контейнерге орналастыру. Бұл серияда біз кішкентай, қауіпсіз контейнер кескінін қалай жасауға болатынын қарастырамыз.
Docker арқасында контейнер кескіндерін жасау ешқашан оңай болған емес. Негізгі кескінді көрсетіңіз, өзгертулеріңізді қосыңыз және контейнер жасаңыз.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Бұл әдіс бастау үшін тамаша болғанымен, әдепкі негізгі кескіндерді пайдалану осалдықтарға толы үлкен кескіндермен қауіпті жұмыс істеуге әкелуі мүмкін.

Сонымен қатар, Docker қолданбасындағы кескіндердің көпшілігі негізгі кескін үшін Debian немесе Ubuntu пайдаланады және бұл тамаша үйлесімділік пен оңай теңшеуді қамтамасыз еткенімен (Docker файлы кодтың екі жолын ғана алады), негізгі кескіндер контейнерге жүздеген мегабайт қосымша жүктеме қоса алады. Мысалы, Go "сәлем-әлем" бағдарламасына арналған қарапайым node.js файлы шамамен 700 мегабайтты құрайды, ал сіздің нақты қолданбаңыздың өлшемі бірнеше мегабайт.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Сонымен, осы қосымша жұмыс жүктемесінің барлығы цифрлық кеңістікті ысырап ету және қауіпсіздіктің осалдықтары мен қателері үшін тамаша жасырыну орны болып табылады. Сонымен, контейнер кескінінің өлшемін азайтудың екі әдісін қарастырайық.

Біріншісі - кішігірім негізгі кескіндерді пайдалану, екіншісі - Builder Pattern пайдалану. Кішірек негізгі кескіндерді пайдалану, мүмкін, контейнер өлшемін азайтудың ең оңай жолы. Сірә, сіз қолданып жатқан тіл немесе стек әдепкі кескіннен әлдеқайда кішірек түпнұсқа қолданба кескінін береді. Node.js контейнерімізді қарастырайық.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Docker бағдарламасында әдепкі бойынша, түйін: 8 негізгі кескін өлшемі 670 МБ, ал түйін: 8-альпілік кескін өлшемі небәрі 65 МБ, яғни 10 есе аз. Кішірек Альпі негізгі кескінін пайдалану арқылы сіз контейнердің өлшемін айтарлықтай азайтасыз. Alpine - бұл Docker пайдаланушылары арасында өте танымал болып табылатын шағын және жеңіл Linux дистрибутиві, өйткені ол контейнерлерді шағын сақтай отырып, көптеген қолданбалармен үйлесімді. Стандартты Docker «түйінінің» кескінінен айырмашылығы, «түйін: альпі» көптеген қызметтік файлдар мен бағдарламаларды жояды, тек қолданбаны іске қосу үшін жеткілікті файлдарды қалдырады.

Кішірек негізгі кескінге көшу үшін жаңа негізгі кескінмен жұмыс істеуді бастау үшін Dockerfile файлын жаңартыңыз:

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Енді ескі құрастырылған кескіннен айырмашылығы, кодты контейнерге көшіріп, кез келген тәуелділіктерді орнату керек. Жаңа Dockerfile файлында контейнер node:alpine кескінінен басталады, содан кейін код үшін каталог жасайды, NPM бума менеджерін пайдаланып тәуелділіктерді орнатады және соңында server.js іске қосады.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Бұл жаңарту көлемі жағынан 10 есе кішірек контейнерге әкеледі. Бағдарламалау тіліңізде немесе стекіңізде негізгі кескінді азайту функциясы болмаса, Alpine Linux пайдаланыңыз. Ол сонымен қатар контейнердің мазмұнын толығымен басқару мүмкіндігін береді. Шағын негізгі кескіндерді пайдалану - шағын контейнерлерді жылдам жасаудың тамаша тәсілі. Бірақ одан да үлкен азайтуға Builder Pattern көмегімен қол жеткізуге болады.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Түсіндірілетін тілдерде бастапқы код алдымен аудармашыға беріледі, содан кейін тікелей орындалады. Құрастырылған тілдерде бастапқы код алдымен құрастырылған кодқа түрлендіріледі. Дегенмен, компиляция көбінесе кодты іске қосу үшін қажет емес құралдарды пайдаланады. Бұл бұл құралдарды соңғы контейнерден толығымен алып тастауға болатынын білдіреді. Ол үшін Builder Pattern пайдалана аласыз.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Код бірінші контейнерде жасалады және құрастырылады. Содан кейін құрастырылған код осы кодты құрастыруға қажетті компиляторлар мен құралдарсыз соңғы контейнерге оралады. Осы процесс арқылы Go қолданбасын іске қосайық. Біріншіден, біз орнатылған кескіннен Alpine Linux жүйесіне көшеміз.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Жаңа Dockerfile файлында контейнер голанг: альпі кескінінен басталады. Содан кейін ол код үшін каталог жасайды, оны бастапқы кодқа көшіреді, сол бастапқы кодты құрастырады және қолданбаны іске қосады. Бұл контейнер орнатылған контейнерден әлдеқайда аз, бірақ ол әлі де компиляторды және бізге қажет емес басқа Go құралдарын қамтиды. Сонымен, құрастырылған бағдарламаны шығарып, оны өз контейнеріне салайық.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Бұл Docker файлында біртүрлі нәрсені байқауыңыз мүмкін: ол екі FROM жолын қамтиды. Алғашқы 4 жол бөлімі алдыңғы Dockerfile сияқты көрінеді, тек бұл кезеңді атау үшін AS кілт сөзін пайдаланады. Келесі бөлімде жаңа кескінді бастау үшін жаңа FROM сызығы бар, мұнда голанг: альпі кескінінің орнына негізгі кескін ретінде Raw alpine қолданамыз.

Raw Alpine Linux жүйесінде SSL сертификаттары орнатылмаған, бұл HTTPS арқылы API қоңырауларының көпшілігі сәтсіз аяқталады, сондықтан кейбір түбірлік CA сертификаттарын орнатайық.

Енді қызықты бөлік келеді: құрастырылған кодты бірінші контейнерден екіншісіне көшіру үшін екінші бөлімнің 5-жолында орналасқан COPY пәрменін қолдануға болады. Ол тек бір қолданба файлын көшіреді және Go утилитасының құралдарына әсер етпейді. Жаңа көп сатылы Docker файлында 12 мегабайт болатын бастапқы контейнер кескінімен салыстырғанда өлшемі небәрі 700 мегабайт болатын контейнер кескіні болады, бұл үлкен айырмашылық!
Сонымен, кішігірім негізгі кескіндерді және Builder Pattern пайдалану - көп жұмыссыз әлдеқайда кішірек контейнерлерді жасаудың тамаша тәсілі.
Қолданбалар стекіне байланысты кескін мен контейнер өлшемін азайтудың қосымша жолдары болуы мүмкін, бірақ шағын контейнерлердің шынымен өлшенетін пайдасы бар ма? Шағын контейнерлер өте тиімді болатын екі саланы қарастырайық - өнімділік пен қауіпсіздік.

Өнімділік артуын бағалау үшін контейнер жасау, оны тізілімге енгізу (басу), содан кейін оны сол жерден шығарып алу (тарту) процесінің ұзақтығын қарастырыңыз. Кішірек контейнердің үлкенірек контейнерден артықшылығы бар екенін көруге болады.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Docker қабаттарды кэштейді, сондықтан кейінгі құрастырулар өте жылдам болады. Дегенмен, контейнерлерді құру және сынау үшін пайдаланылатын көптеген CI жүйелері қабаттарды кэштемейді, сондықтан уақытты айтарлықтай үнемдейді. Көріп отырғаныңыздай, машинаңыздың қуатына байланысты үлкен контейнерді салу уақыты 34-тен 54 секундқа дейін, ал Builder Pattern көмегімен контейнерді пайдалану кезінде 23-тен 28 секундқа дейін қысқарады. Мұндай операциялар үшін өнімділік 40-50% артады. Сондықтан кодты қанша рет құрастырып, сынайтыныңызды ойлаңыз.

Контейнер салынғаннан кейін оны Kubernetes кластерінде пайдалануға болатындай етіп оның кескінін (контейнер суретін итеру) контейнер тізіліміне итеру керек. Мен Google Container Registry пайдалануды ұсынамын.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Google Container Registry (GCR) көмегімен сіз тек шикізатты сақтау және желі үшін төлейсіз және контейнерлерді басқару үшін қосымша ақы алынбайды. Бұл жеке, қауіпсіз және өте жылдам. GCR тарту әрекетін жылдамдату үшін көптеген амалдарды пайдаланады. Как видите, вставка образа контейнера Docker Container Image при использовании go:onbuild в зависимости от производительности компьютера займет от 15 до 48с, а та же операция с контейнером меньшего размера – от 14 до 16с, причем для менее производительных машин преимущество в скорости операции увеличивается в 3 рет. Үлкенірек машиналар үшін уақыт шамамен бірдей, өйткені GCR суреттердің ортақ дерекқоры үшін жаһандық кэшті пайдаланады, яғни оларды мүлде жүктеудің қажеті жоқ. Төмен қуатты компьютерде процессор қиыншылық болып табылады, сондықтан шағын контейнерлерді пайдаланудың артықшылығы мұнда әлдеқайда көп.

GCR пайдалансаңыз, құрастыру жүйеңіздің бөлігі ретінде Google Container Builder (GCB) пайдалануды ұсынамын.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Көріп отырғаныңыздай, оны пайдалану тіпті өнімді машинаға қарағанда Build+Push операциясының ұзақтығын қысқарту бойынша әлдеқайда жақсы нәтижелерге қол жеткізуге мүмкіндік береді - бұл жағдайда контейнерлерді құру және хостқа жіберу процесі 2 есеге жуық жылдамдатады. . Сонымен қатар, сіз күн сайын 120 тегін құрастыру минутын аласыз, бұл көп жағдайда контейнер салу қажеттіліктерін жабады.

Әрі қарай ең маңызды өнімділік көрсеткіші келеді – контейнерлерді алу немесе жүктеп алу жылдамдығы. Ал егер сіз итеру операциясына жұмсалған уақытқа көп мән бермесеңіз, онда тарту процесінің ұзақтығы жалпы жүйе өнімділігіне қатты әсер етеді. Сізде үш түйіннен тұратын кластер бар және олардың біреуі сәтсіз аяқталды делік. Google Kubernetes Engine сияқты басқару жүйесін пайдалансаңыз, ол автоматты түрде өлі түйінді жаңасымен ауыстырады. Дегенмен, бұл жаңа түйін толығымен бос болады және ол жұмыс істей бастау үшін оған барлық контейнерлеріңізді сүйреп апаруыңыз керек. Тарту әрекеті жеткілікті ұзақ уақытқа созылса, кластер барлық уақытта төмен өнімділікпен жұмыс істейді.

Бұл орын алуы мүмкін көптеген жағдайлар бар: кластерге жаңа түйін қосу, түйіндерді жаңарту немесе тіпті орналастыру үшін жаңа контейнерге ауысу. Осылайша, тарту уақытын азайту негізгі факторға айналады. Кішкентай контейнер үлкенге қарағанда әлдеқайда жылдам жүктелетіні даусыз. Kubernetes кластерінде бірнеше контейнерлерді іске қосып жатсаңыз, уақытты үнемдеу айтарлықтай болуы мүмкін.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Мына салыстыруды қараңыз: шағын контейнерлердегі тарту операциясы go:onbuild көмегімен бірдей операцияға қарағанда машинаның қуатына байланысты 4-9 есе аз уақыт алады. Ортақ, шағын контейнерлік суреттерді пайдалану жаңа Kubernetes түйіндерін орналастыруға және желіге қосылуға болатын уақыт пен жылдамдықты айтарлықтай жылдамдатады.

Қауіпсіздік мәселесін қарастырайық. Кішігірім контейнерлер үлкеніректерге қарағанда әлдеқайда қауіпсіз болып саналады, өйткені олардың шабуылдау беті кішірек. Шынымен солай ма? Google Container Registry бағдарламасының ең пайдалы мүмкіндіктерінің бірі - контейнерлерде осалдықтарды автоматты түрде сканерлеу мүмкіндігі. Бірнеше ай бұрын мен құрастырылған және көп сатылы контейнерлерді жасадым, сондықтан ол жерде осалдықтардың бар-жоғын көрейік.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Нәтиже таңқаларлық: шағын контейнерде тек 3 орташа осалдық, ал үлкен контейнерде 16 маңызды және 376 басқа осалдықтар анықталды. Егер біз үлкен контейнердің мазмұнына қарасақ, қауіпсіздік мәселелерінің көпшілігі біздің қолданбаға ешқандай қатысы жоқ, бірақ біз тіпті пайдаланбайтын бағдарламаларға қатысты екенін көреміз. Сондықтан адамдар үлкен шабуыл беті туралы сөйлескенде, олар мұны білдіреді.

Kubernetes үздік тәжірибелері. Шағын контейнерлерді жасау

Алып кетудің мәні анық: шағын контейнерлер жасаңыз, өйткені олар сіздің жүйеңізге нақты өнімділік пен қауіпсіздік артықшылықтарын береді.

Kubernetes үздік тәжірибелері. Атау кеңістігі бар Кубернеттерді ұйымдастыру

Кейбір жарнамалар 🙂

Бізбен бірге болғандарыңызға рахмет. Сізге біздің мақалалар ұнайды ма? Қызықты мазмұнды көргіңіз келе ме? Тапсырыс беру немесе достарыңызға ұсыну арқылы бізге қолдау көрсетіңіз, әзірлеушілерге арналған бұлтты VPS $4.99, Сіз үшін біз ойлап тапқан бастапқы деңгейдегі серверлердің бірегей аналогы: VPS (KVM) E5-2697 v3 (6 ядросы) 10 ГБ DDR4 480 ГБ SSD 1 Гбит/с 19 доллардан немесе серверді қалай бөлісуге болатыны туралы барлық шындық? (RAID1 және RAID10, 24 ядроға дейін және 40 ГБ DDR4 дейін қол жетімді).

Dell R730xd Амстердамдағы Equinix Tier IV деректер орталығында 2 есе арзан ба? Тек осында 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6 ГГц 14C 64 ГБ DDR4 4x960 ГБ SSD 1 Гбит/с 100 теледидар 199 доллардан бастап Нидерландыда! Dell R420 - 2x E5-2430 2.2 ГГц 6C 128 ГБ DDR3 2x960 ГБ SSD 1 Гбит/с 100 ТБ - 99 доллардан бастап! туралы оқыңыз Инфрақұрылымдық корпорацияны қалай құруға болады. бір тиынға 730 еуро тұратын Dell R5xd E2650-4 v9000 серверлерін қолданатын класс?

Ақпарат көзі: www.habr.com

пікір қалдыру