Kubernetes Best Practices. Creazione di Small Containers

Kubernetes Best Practices. Creazione di Small Containers

U primu passu di implementà in Kubernetes hè di mette a vostra applicazione in un containeru. In questa serie, guardemu cumu pudete creà una piccula maghjina di cuntainer sicura.
Grazie à Docker, a creazione d'imaghjini di cuntainer ùn hè mai statu più faciule. Specificate una maghjina di basa, aghjunghje i vostri cambiamenti è creanu un containeru.

Kubernetes Best Practices. Creazione di Small Containers

Mentre chì sta tecnica hè grande per principià, l'usu di l'imaghjini di basa predeterminati pò purtà à un travagliu inseguru cù grandi imagine pieni di vulnerabili.

Inoltre, a maiò parte di l'imaghjini in Docker utilizanu Debian o Ubuntu per l'imaghjini di basa, è mentre questu furnisce una cumpatibilità eccellente è una persunalizazione faciule (un schedariu Docker piglia solu duie linee di codice), l'imaghjini di basa ponu aghjunghje centinaie di megabyte di carica addiziale à u vostru containeru. Per esempiu, un schedariu node.js simplice per una applicazione Go "hello-world" hè di circa 700 megabyte, mentre chì a vostra applicazione attuale hè solu uni pochi megabyte in grandezza.

Kubernetes Best Practices. Creazione di Small Containers

Allora tutta sta carica di travagliu extra hè un perdu di spaziu digitale è un grande locu di nasconde per vulnerabilità di sicurezza è bug. Allora fighjemu dui modi per riduce a dimensione di una maghjina di cuntainer.

U primu hè l'usu di picculi imagine di basa, u sicondu hè l'usu di u Pattern Builder. Utilizà l'imaghjini di basa più chjuchi hè probabilmente u modu più faciule per riduce a dimensione di u vostru containeru. Hè assai prubabile, a lingua o a pila chì aduprate furnisce una maghjina di l'applicazione originale chì hè assai più chjuca di l'imagine predeterminata. Fighjemu un ochju à u nostru containeru node.js.

Kubernetes Best Practices. Creazione di Small Containers

Per automaticamente in Docker, u node: 8 a dimensione di l'imagine di basa hè 670 MB, è u node: 8-alpine image size hè solu 65 MB, vale à dì 10 volte più chjucu. Utilizendu l'imaghjini di basa Alpine più chjuca, riducerete significativamente a dimensione di u vostru containeru. Alpine hè una distribuzione Linux chjuca è ligera chì hè assai populari trà l'utilizatori di Docker perchè hè cumpatibile cù parechje applicazioni mentre mantene i cuntenituri chjuchi. A cuntrariu di l'imaghjini standard di "node" di Docker, "node: alpine" elimina assai schedarii è prugrammi di serviziu, lascendu solu quelli chì sò abbastanza per eseguisce a vostra applicazione.

Per passà à una maghjina di basa più chjuca, basta aghjurnà u Dockerfile per cumincià à travaglià cù a nova maghjina di basa:

Kubernetes Best Practices. Creazione di Small Containers

Avà, à u cuntrariu di l'antica imagine onbuild, avete bisognu di copià u vostru codice in u cuntinuu è installate ogni dependenza. In un novu Dockerfile, u cuntinuu principia cù un node: immagine alpina, poi crea un repertoriu per u codice, installate dipendenze cù u gestore di pacchetti NPM, è infine eseguisce server.js.

Kubernetes Best Practices. Creazione di Small Containers

Questa aghjurnazione si traduce in un containeru chì hè 10 volte più chjucu in dimensione. Se a vostra lingua di prugrammazione o pila ùn hà micca funziunalità di riduzzione di l'imaghjini di basa, utilizate Alpine Linux. Hè ancu furnisce a capacità di gestisce cumplettamente u cuntenutu di u cuntinuu. L'usu di picculi imaghjini di basa hè una bella manera di creà rapidamente cuntenituri chjuchi. Ma ancu una riduzzione più grande pò esse ottenuta cù u Pattern Builder.

Kubernetes Best Practices. Creazione di Small Containers

In e lingue interpretate, u codice fonte hè prima passatu à l'interprete è dopu eseguitu direttamente. In lingue compilate, u codice fonte hè prima cunvertitu in codice compilatu. Tuttavia, a compilazione spessu usa strumenti chì ùn sò micca veramente necessarii per eseguisce u codice. Questu significa chì pudete sguassate cumplettamente questi strumenti da u cuntinuu finali. Pudete aduprà Builder Pattern per questu.

Kubernetes Best Practices. Creazione di Small Containers

U codice hè creatu in u primu cuntinuu è compilatu. U codice compilatu hè allora imballatu in un cuntainer finali senza i compilatori è l'arnesi necessarii per cumpilà quellu codice. Facemu una applicazione Go attraversu stu prucessu. Prima, andemu da l'imagine onbuild à Alpine Linux.

Kubernetes Best Practices. Creazione di Small Containers

In u novu Dockerfile, u cuntinuu principia cù un golang: imagine alpine. Dopu crea un repertoriu per u codice, u copia in u codice fonte, custruisce quellu codice fonte, è eseguisce l'applicazione. Stu containeru hè assai più chjucu cà u containeru onbuild, ma cuntene ancu u compilatore è altri strumenti Go chì ùn avemu micca veramente bisognu. Allora andemu solu estrae u prugramma compilatu è mette in u so propiu containeru.

Kubernetes Best Practices. Creazione di Small Containers

Puderete nutà qualcosa strana in stu schedariu Docker: cuntene duie linee FROM. A prima sezione di linea 4 pari esattamente u listessu cum'è u Dockerfile precedente, salvu chì usa a chjave AS per nome di sta tappa. A prossima seccione hà una nova linea FROM per inizià una nova maghjina, induve invece di l'imagine golang:alpine useremu Raw alpine cum'è l'imaghjini di basa.

Raw Alpine Linux ùn hà micca un certificatu SSL installatu, chì pruvucarà a maiò parte di e chjama di l'API nantu à HTTPS per fallu, allora stallà certi certificati CA root.

Avà vene a parte divertente: per copià u codice compilatu da u primu containeru à u sicondu, pudete simpricimenti aduprà u cumandamentu COPY situatu in a linea 5 di a seconda sezione. Copià solu un schedariu di l'applicazione è ùn affetterà micca i strumenti di utilità Go. U novu schedariu Docker multi-stage cuntene una maghjina di cuntainer chì hè solu 12 megabyte in grandezza, cumparatu cù l'imaghjini di u containeru originale chì era 700 megabyte, chì hè una grande diferenza!
Allora l'usu di picculi imaghjini di basa è Builder Pattern sò grandi modi per creà cuntenituri assai più chjuchi senza assai travagliu.
Hè pussibule chì sicondu a pila di l'applicazioni, ci sò modi supplementari per riduce l'imaghjini è a dimensione di u containeru, ma i picculi cuntenituri anu veramente un benefiziu misurabile? Fighjemu dui spazii induve i cuntenituri chjuchi sò estremamente efficaci - prestazioni è sicurità.

Per valutà l'aumentu di u rendiment, cunzidira a durata di u prucessu di creazione di un containeru, inserisce in u registru (push), è poi ricuperà da quì (pull). Pudete vede chì un cuntinuu più chjucu hà un vantaghju distintu annantu à un cuntinuu più grande.

Kubernetes Best Practices. Creazione di Small Containers

Docker cacherà i strati in modu chì e custruzzioni successive saranu assai veloci. In ogni casu, parechji sistemi CI utilizati per custruisce è teste cuntenituri ùn cachenu micca strati in cache, cusì ci sò un risparmiu di tempu significativu. Comu pudete vede, u tempu di custruisce un grande cuntinuu, secondu a putenza di a vostra macchina, hè da 34 à 54 seconde, è quandu si usa un containeru ridutta cù u Pattern Builder - da 23 à 28 seconde. Per operazioni di stu tipu, l'aumentu di a produtividade serà 40-50%. Allora pensate à quante volte custruite è pruvate u vostru codice.

Dopu chì u cuntinuu hè custruitu, avete bisognu di spinghje a so maghjina (push container image) in u registru di u containeru per pudè aduprà in u vostru cluster Kubernetes. Vi cunsigliu d'utilizà Google Container Registry.

Kubernetes Best Practices. Creazione di Small Containers

Cù Google Container Registry (GCR), paghete solu per l'almacenamiento crudu è a rete, è ùn ci sò micca spese supplementari di gestione di container. Hè privatu, sicuru è assai veloce. GCR usa parechji trucchi per accelerà l'operazione di pull. Comu pudete vede, inserisce un containeru Docker Container Image cù go:onbuild duverà da 15 à 48 seconde, secondu u rendiment di l'urdinatore, è a stessa operazione cù un containeru più chjucu duverà da 14 à 16 seconde, è per e macchine menu produttive. u vantaghju in a velocità di funziunamentu aumenta da 3 volte. Per e macchine più grande, u tempu hè quasi u stessu, postu chì GCR usa una cache globale per una basa di dati sparta di l'imaghjini, chì significa chì ùn avete micca bisognu di carricà. In un computer di bassa putenza, u CPU hè u collu di buttiglia, cusì u vantaghju di utilizà cuntenituri chjuchi hè assai più grande quì.

Sè vo aduprate GCR, vi cunsigliu assai di utilizà Google Container Builder (GCB) cum'è parte di u vostru sistema di creazione.

Kubernetes Best Practices. Creazione di Small Containers

Comu pudete vede, u so usu permette di ottene risultati assai megliu in riducendu a durata di l'operazione Build + Push chì ancu una macchina produtiva - in questu casu, u prucessu di custruisce è mandà cuntenituri à l'ospite hè acceleratu da quasi 2 volte. . In più, uttene 120 minuti di costruzione gratuiti ogni ghjornu, chì copre i vostri bisogni di custruzzione di container in a maiò parte di i casi.

Dopu vene a metrica di prestazione più impurtante - a vitezza di ritruvà, o scaricamentu, Pull containers. È s'ellu ùn importa micca assai di u tempu passatu nantu à una operazione push, allora a durata di u prucessu di pull hà un impattu seriu nantu à u rendiment generale di u sistema. Diciamu chì avete un cluster di trè nodi è unu d'elli falla. Sè vo aduprate un sistema di gestione cum'è Google Kubernetes Engine, rimpiazzarà automaticamente u node mortu cù un novu. In ogni casu, stu novu nodu serà viotu cumplettamente è duverete trascinà tutti i vostri cuntenituri in ellu per cumincià à travaglià. Se l'operazione di pull dura abbastanza, u vostru cluster correrà à un rendimentu più bassu tuttu u tempu.

Ci hè parechje casi induve questu pò accade: aghjunghje un novu node à un cluster, aghjurnà i nodi, o ancu cambià à un novu containeru per a implementazione. Cusì, minimizzà u tempu di estrazione di pull diventa un fattore chjave. Hè innegabile chì un picculu cuntainer scarica assai più veloce cà un grande. Sè vo site cù parechje cuntenituri in un cluster Kubernetes, u risparmiu di tempu pò esse significativu.

Kubernetes Best Practices. Creazione di Small Containers

Fighjate à stu paragone: una operazione di pull in picculi cuntainer piglia 4-9 volte menu tempu, secondu a putenza di a macchina, chè a stessa operazione cù go:onbuild. L'usu di l'imaghjini di basa di cuntenituri spartuti, chjuchi, accelera significativamente u tempu è a velocità à quale i novi nodi Kubernetes ponu esse implementati è in linea.

Fighjemu u prublema di sicurità. I cuntenituri più chjuchi sò cunsiderati assai più sicuri chì i più grande perchè anu una superficia d'attaccu più chjuca. Hè veramente? Una di e funzioni più utili di Google Container Registry hè a capacità di scansà automaticamente i vostri cuntenituri per vulnerabilità. Uni pochi mesi fà aghju creatu cuntenituri onbuild è multistage, dunque vedimu s'ellu ci sò vulnerabili.

Kubernetes Best Practices. Creazione di Small Containers

U risultatu hè maravigghiusu: solu 3 vulnerabilità media sò state rilevate in un picculu cuntainer, è 16 critichi è 376 altre vulnerabili sò stati trovati in un grande cuntinuu. Se fighjemu u cuntenutu di un grande cuntinuu, pudemu vede chì a maiò parte di i prublemi di sicurezza ùn anu nunda di fà cù a nostra applicazione, ma sò ligati à i prugrammi chì ùn avemu mancu aduprà. Allora quandu a ghjente parla di una grande superficia d'attaccu, hè ciò chì volenu dì.

Kubernetes Best Practices. Creazione di Small Containers

A ripresa hè chjara: custruite cuntenituri chjuchi perchè furnisce prestazioni reali è prestazioni di sicurezza à u vostru sistema.

Kubernetes Best Practices. Organizazione Kubernetes cù u spaziu di nomi

Certi annunzii 🙂

Grazie per stà cun noi. Ti piace i nostri articuli ? Vulete vede più cuntenutu interessante? Supportaci facendu un ordine o ricumandendu à l'amichi, cloud VPS per sviluppatori da $ 4.99, un analogu unicu di servitori di livellu d'entrata, chì hè statu inventatu da noi per voi: Tutta a verità nantu à VPS (KVM) E5-2697 v3 (6 Cores) 10GB DDR4 480GB SSD 1Gbps da $ 19 o cumu si sparte un servitore? (dispunibule cù RAID1 è RAID10, finu à 24 core è finu à 40GB DDR4).

Dell R730xd 2 volte più prezzu in u centru di dati Equinix Tier IV in Amsterdam? Solu quì 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV da $ 199 in l'Olanda! Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - da $ 99! Leghje circa Cumu custruisce una infrastruttura corp. classa cù l'usu di i servitori Dell R730xd E5-2650 v4 valenu 9000 XNUMX euro per un centesimu?

Source: www.habr.com

Add a comment