{"id":81173,"date":"2020-05-11T13:42:51","date_gmt":"2020-05-11T11:42:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/production-ready-images-for-k8s"},"modified":"2020-05-11T13:42:51","modified_gmt":"2020-05-11T11:42:51","slug":"production-ready-images-for-k8s","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/production-ready-images-for-k8s","title":{"rendered":"Immagini pronte per la produzione per k8s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Questa storia riguarda come utilizziamo i container in un ambiente di produzione, in particolare su Kubernetes. L'articolo \u00e8 dedicato alla raccolta di metriche e log dai container, oltre alla creazione delle immagini.<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/c7e8df02d845138e489c09c55cd616e6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nSiamo di Exness, una societ\u00e0 fintech che sviluppa servizi per il trading online e prodotti fintech per B2B e B2C. Nel nostro R&amp;D ci sono molti team diversi, con oltre 100 dipendenti nel dipartimento di sviluppo.<\/p>\n<p>Rappresentiamo il team responsabile della piattaforma per la raccolta e l'esecuzione del codice dei nostri sviluppatori. In particolare, ci occupiamo della raccolta, archiviazione e fornitura di metriche, log ed eventi delle applicazioni. Attualmente operiamo con circa tremila container Docker in un ambiente di produzione, supportiamo il nostro magazzino di big data da 50 TB e forniamo soluzioni architetturali costruite attorno alla nostra infrastruttura: Kubernetes, Rancher e vari fornitori di cloud pubblici.\u00a0<\/p>\n<h1>La nostra motivazione<\/h1>\n<p>\nCosa sta bruciando? Nessuno pu\u00f2 rispondere. Dove si trova il fuoco? \u00c8 difficile da capire. Quando \u00e8 scoppiato? \u00c8 possibile scoprirlo, ma non subito.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/3ca2271caf1d02ba14937680cd89d65d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPerch\u00e9 alcuni container funzionano, mentre altri crollano? Quale container ha causato il problema? Infatti, esternamente i container sono identici, ma all'interno ognuno ha il suo Neo.<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/f971583f21e363244f9ea754da2a1f4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI nostri sviluppatori sono bravi professionisti. Creano ottimi servizi che portano profitto all'azienda. Ma ci sono dei fallimenti quando i container con le applicazioni si disordinano. Un container consuma troppo CPU, un altro la rete, un terzo le operazioni di I\/O, e il quarto non si capisce nemmeno cosa faccia con i socket. Tutto questo crolla e la nave affonda.\u00a0<\/p>\n<h1>Agenti<\/h1>\n<p>\nPer capire cosa succede all'interno, abbiamo deciso di installare agenti direttamente nei container.<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/cc9eb47d1250bb866ec9452181479df4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQuesti agenti sono programmi di controllo che mantengono i container in uno stato tale da non rompere l'uno con l'altro. Gli agenti sono standardizzati, e questo ci consente di uniformare l'approccio alla manutenzione dei container.\u00a0<\/p>\n<p>Nel nostro caso, gli agenti devono fornire log in formato standard, etichettati e con throttling. Devono anche fornirci metriche standardizzate, espandibili dal punto di vista delle applicazioni aziendali.<\/p>\n<p>Per agenti si intendono anche utilit\u00e0 per l'operazione e la manutenzione, in grado di funzionare in diversi sistemi di orchestrazione, supportando diverse immagini (Debian, Alpine, Centos, ecc.).<\/p>\n<p>Infine, gli agenti devono supportare un semplice CI\/CD, che includa file Docker. Altrimenti, la nave si sgretoler\u00e0, poich\u00e9 i container inizieranno a essere consegnati su binari \"storti\".<\/p>\n<h1>Il processo di costruzione e la creazione dell'immagine di destinazione<\/h1>\n<p>\nAffinch\u00e9 tutto sia standardizzato e gestibile, \u00e8 necessario seguire un qualche processo di costruzione standard. Pertanto, abbiamo deciso di costruire container con container: una sorta di ricorsione.<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/708715af05bf79ce1eb9c2a8ce2aeca6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nQui i container sono rappresentati da contorni solidi. Abbiamo anche deciso di inserire in essi i pacchetti per non farci mancare nulla. Spiegheremo perch\u00e9 \u00e8 stato fatto ci\u00f2 pi\u00f9 avanti.<br \/>\n\u00a0<br \/>\nNe \u00e8 risultato uno strumento di costruzione: un container di una certa versione, che fa riferimento a determinate versioni di pacchetti e a specifiche versioni di script.<\/p>\n<p>Come lo utilizziamo? Abbiamo Docker Hub, dove si trova il container. Lo mirroriamo all'interno del nostro sistema per liberarci delle dipendenze esterne. \u00c8 risultato un container contrassegnato in giallo. Creiamo un modello per installare nel container tutti i pacchetti e gli script necessari. Dopo di che, costruiamo un'immagine pronta per l'uso: gli sviluppatori vi inseriscono il codice e alcune delle loro dipendenze specifiche.\u00a0<\/p>\n<p>Quali sono i vantaggi di questo approccio?\u00a0<\/p>\n<ul>\n<li>In primo luogo, pieno controllo delle versioni degli strumenti di costruzione \u2013 container di costruzione, versioni di script e pacchetti.\u00a0<\/li>\n<li>In secondo luogo, abbiamo raggiunto la standardizzazione: creiamo modelli, intermedie e immagini pronte per l'uso in modo identico.\u00a0<\/li>\n<li>In terzo luogo, i container ci garantiscono portabilit\u00e0. Oggi utilizziamo Gitlab, e domani passeremo a TeamCity o Jenkins e potremo eseguire i nostri container allo stesso modo.\u00a0<\/li>\n<li>In quarto luogo, minimizzazione delle dipendenze. Non abbiamo messo per caso i pacchetti nel container, poich\u00e9 questo ci consente di non doverli scaricare ogni volta da Internet.\u00a0<\/li>\n<li>In quinto luogo, \u00e8 aumentata la velocit\u00e0 di costruzione: la presenza di copie locali delle immagini consente di risparmiare tempo su download, poich\u00e9 c'\u00e8 un'immagine locale.\u00a0<\/li>\n<\/ul>\n<p>\nIn altre parole, abbiamo raggiunto un processo di costruzione controllato e flessibile. Utilizziamo gli stessi strumenti per costruire qualsiasi container con pieno versioning.\u00a0<\/p>\n<h1>Come funziona la nostra procedura di costruzione<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/22b9a8546005e289f79962188dbb0659.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa costruzione viene avviata con un comando, il processo si svolge all'interno dell'immagine (evidenziata in rosso). Lo sviluppatore dispone di un file Docker (evidenziato in giallo), lo rendiamo sostituendo le variabili con i valori. E nel frattempo aggiungiamo header e footer: sono i nostri agenti.\u00a0<\/p>\n<p>L'header aggiunge i package dai rispettivi image. Il footer installa i nostri servizi all'interno, configura l'avvio del carico di lavoro, del logging e di altri agenti, sostituisce l'entrypoint, ecc.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/4004e57dc45771479e535921a839716d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAbbiamo a lungo discusso se installare un supervisore. Alla fine abbiamo deciso che ci serviva. Abbiamo scelto S6. Il supervisore gestisce il contenitore: consente di connettersi ad esso in caso di caduta del processo principale e fornisce gestione manuale del contenitore senza ricrearlo. I log e le metriche sono processi eseguiti all'interno del contenitore. Anche questi devono essere monitorati, e lo facciamo tramite il supervisore. Infine, S6 si occupa delle operazioni di housekeeping, dell'elaborazione dei segnali e di altri compiti.<\/p>\n<p>Poich\u00e9 utilizziamo diversi sistemi di orchestrazione, dopo la costruzione e l'avvio, il contenitore deve comprendere in quale ambiente si trova e agire di conseguenza. Ad esempio:<br \/>\nQuesto ci permette di costruire un'unica immagine e di eseguirla in diversi sistemi di orchestrazione, tenendo conto della specificit\u00e0 di ciascun sistema di orchestrazione.<\/p>\n<p>\u00a0<img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/6e76396afedbbf0e71d44a7fbb8521da.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPer lo stesso contenitore otteniamo diversi alberi di processo in Docker e Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/83f9d23876192930ffebafcdd549915e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIl payload viene eseguito sotto il supervisore S6. Nota il collector e gli events: sono i nostri agenti responsabili dei log e delle metriche. In Kubernetes non ci sono, mentre in Docker ci sono. Perch\u00e9?\u00a0<\/p>\n<p>Se guardiamo la specifica del \"pod\" (qui e oltre - Kubernetes pod), vedremo che il contenitore events viene eseguito nel pod, in cui c'\u00e8 un contenitore collector separato che esegue la funzione di raccolta di metriche e log. Possiamo utilizzare le funzionalit\u00e0 di Kubernetes: esecuzione di contenitori nello stesso pod, in uno spazio di processo e\/o rete unificato. In effetti, implementare i nostri agenti e svolgere determinate funzioni. E se lo stesso contenitore viene avviato in Docker, ricever\u00e0 in uscita tutte le stesse capacit\u00e0, cio\u00e8 potr\u00e0 fornire log e metriche, poich\u00e9 gli agenti verranno eseguiti all'interno.\u00a0<\/p>\n<h1>Metriche e log<\/h1>\n<p>\nLa consegna di metriche e log \u00e8 un compito complesso. La sua risoluzione \u00e8 legata a diversi aspetti.<br \/>\nL'infrastruttura \u00e8 creata per eseguire carichi utili, non per la consegna massiva di log. Cio\u00e8, questo processo deve essere eseguito con requisiti minimi per le risorse dei contenitori. Ci sforziamo di aiutare i nostri sviluppatori: \u00abPrendete un contenitore da Docker Hub, avviatelo e saremo in grado di consegnare i log\u00bb.\u00a0<\/p>\n<p>Il secondo aspetto \u00e8 il problema della limitazione del volume dei log. Se in pi\u00f9 contenitori si verifica un picco nel volume dei log (l'applicazione stampa stack-trace in un ciclo), aumenta il carico sulla CPU, sulle linee di comunicazione, sul sistema di elaborazione dei log, e questo influisce sul funzionamento dell'host in generale e su altri contenitori sull'host, a volte portando al \u00abcrollo\u00bb dell'host.\u00a0<\/p>\n<p>Il terzo aspetto \u00e8 che \u00e8 necessario supportare il maggior numero possibile di metodologie di raccolta delle metriche out of the box. Dalla lettura dei file e dal polling del endpoint Prometheus all'uso di protocolli specifici delle applicazioni.<\/p>\n<p>E l'ultimo aspetto \u00e8 che \u00e8 necessario minimizzare il consumo delle risorse.<\/p>\n<p>Abbiamo scelto una soluzione open-source in Go chiamata Telegraf. \u00c8 un connettore universale che supporta oltre 140 tipi di ingressi (input plugin) e 30 tipi di uscite (output plugin). Lo abbiamo migliorato e ora vi parleremo di come viene utilizzato da noi nell'esempio di Kubernetes.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/9635d571c852e5f9358458874c58d7b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSupponiamo che uno sviluppatore distribuisca un carico, e Kubernetes riceve una richiesta per creare un pod. A questo punto, per ogni pod viene automaticamente creato un contenitore chiamato Collector (utilizziamo un webhook di mutazione). Collector \u00e8 il nostro agente. All'avvio, questo contenitore si configura per lavorare con Prometheus e il sistema di raccolta dei log.<\/p>\n<ul>\n<li>Per questo utilizza le annotazioni del pod, e a seconda del suo contenuto, crea, ad esempio, un endpoint Prometheus;\u00a0\n<\/li>\n<li>In base alle specifiche del pod e alle impostazioni specifiche dei contenitori, decide come consegnare i log.\n<\/li>\n<\/ul>\n<p>\nI log vengono raccolti attraverso l'API di Docker: gli sviluppatori devono semplicemente scriverli in stdout o stderr, e poi il Collector si occuper\u00e0 del resto. I log vengono raccolti a chunk con un certo ritardo, per prevenire possibili sovraccarichi dell'host.\u00a0<\/p>\n<p>Le metriche vengono raccolte per istanze di carico di lavoro (processi) nei contenitori. Tutto \u00e8 etichettato: namespace, pod e cos\u00ec via, e poi viene convertito nel formato Prometheus \u2013 diventando disponibile per la raccolta (a parte i log). Inoltre, i log, le metriche e gli eventi vengono inviati a Kafka e oltre:<\/p>\n<ul>\n<li>I log sono disponibili in Graylog (per analisi visive);\n<\/li>\n<li>I log, le metriche e gli eventi vengono inviati a Clickhouse per la conservazione a lungo termine.\n<\/li>\n<\/ul>\n<p>\nFunziona nello stesso modo in AWS, solo che sostituiamo Graylog con Kafka con Cloudwatch. Inviamo i log l\u00ec, ed \u00e8 tutto molto comodo: \u00e8 subito chiaro a quale cluster e contenitore appartengono. Lo stesso vale per Google Stackdriver. Quindi il nostro schema funziona sia on-premise con Kafka che nel cloud.\u00a0<\/p>\n<p>Se non abbiamo Kubernetes con i pod, lo schema diventa un po' pi\u00f9 complesso, ma funziona secondo gli stessi principi.<\/p>\n<p><img decoding=\"async\" alt=\"Immagini pronte per la produzione per k8s\" src=\"\/wp-content\/uploads\/2020\/05\/dd8efb33c5c74433a2767cb00caeec2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAll'interno del contenitore vengono eseguiti gli stessi processi, orchestrati con S6. Gli stessi processi sono avviati all'interno di un unico contenitore.<\/p>\n<h1>In definitiva<\/h1>\n<p>\nAbbiamo creato una soluzione integrata per l'assemblaggio e l'avvio delle immagini in produzione, con opzioni per la raccolta e la consegna di log e metriche:<\/p>\n<ul>\n<li>Abbiamo sviluppato un approccio standardizzato per l'assemblaggio delle immagini, sulla base del quale abbiamo sviluppato modelli CI;\n<\/li>\n<li>Gli agenti per la raccolta dei dati sono le nostre estensioni Telegraf. Li abbiamo testati con successo in produzione;\n<\/li>\n<li>Utilizziamo un webhook di mutazione per integrare i contenitori con gli agenti nei pod;\u00a0\n<\/li>\n<li>Ci siamo integrati nell'ecosistema Kubernetes\/Rancher;\n<\/li>\n<li>Possiamo eseguire gli stessi contenitori in diversi sistemi di orchestrazione e ottenere il risultato previsto;\n<\/li>\n<li>Abbiamo creato una configurazione di gestione dei contenitori completamente dinamica.\u00a0\n<\/li>\n<\/ul>\n<p>\nCo-autore: <b>Il'ja Prudnikov<\/b><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/exness\/blog\/488392\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes. \u0421\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0441\u0431\u043e\u0440\u0443 \u043c\u0435\u0442\u0440\u0438\u043a \u0438 \u043b\u043e\u0433\u043e\u0432 \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0438\u043b\u0434\u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u041c\u044b \u0438\u0437 \u0444\u0438\u043d\u0442\u0435\u0445-\u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 Exness, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0434\u043b\u044f \u043e\u043d\u043b\u0430\u0439\u043d-\u0442\u0440\u0435\u0439\u0434\u0438\u043d\u0433\u0430 \u0438 \u0444\u0438\u043d\u0442\u0435\u0445-\u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432 \u0434\u043b\u044f B2B \u0438 \u04122\u0421. \u0412 \u043d\u0430\u0448\u0435\u043c R&amp;D \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434, \u0432 \u043e\u0442\u0434\u0435\u043b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 100 + \u0441\u043e\u0442\u0440\u0443\u0434\u043d\u0438\u043a\u043e\u0432. [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":81174,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-81173","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Production-ready images for k8s | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-11T11:42:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-11T11:42:51+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Immagini pronte per la produzione per k8s | ProHoster","description":"Questa \u00e8 la storia di come utilizziamo i contenitori in un ambiente di produzione, in particolare sotto Kubernetes.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/production-ready-images-for-k8s","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Production-ready images for k8s | ProHoster","og:description":"\u042d\u0442\u0430 \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0432 \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u043e\u0432\u043e\u0439 \u0441\u0440\u0435\u0434\u0435, \u0432 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0434 Kubernetes.","og:url":"https:\/\/prohoster.info\/it\/blog\/administrirovanie\/production-ready-images-for-k8s","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-11T11:42:51+00:00","article:modified_time":"2020-05-11T11:42:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"81173","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:03:22","updated":"2022-09-28 06:12:17","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/81173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=81173"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/81173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media\/81174"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=81173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=81173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=81173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}