{"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 \u00e8 la storia di come utilizziamo i container in un ambiente di prodotto, in particolare con Kubernetes. L'articolo \u00e8 dedicato alla raccolta di metriche e log dai container, oltre alla creazione di 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, un'azienda fintech che sviluppa servizi per il trading online e prodotti fintech per B2B e B2C. Nel nostro R&amp;D ci sono diverse squadre, con oltre 100 dipendenti nel reparto sviluppo.<\/p>\n<p>Rappresentiamo il team responsabile della piattaforma per raccogliere e lanciare il codice dai nostri sviluppatori. In particolare, ci occupiamo della raccolta, conservazione e fornitura di metriche, log ed eventi dalle applicazioni. Attualmente gestiamo circa tremila container Docker in un ambiente di produzione, supportiamo il nostro magazzino big data da 50 Tb e forniamo soluzioni architetturali che ruotano attorno alla nostra infrastruttura: Kubernetes, Rancher e vari fornitori di cloud pubblici.\u00a0<\/p>\n<h1>La nostra motivazione<\/h1>\n<p>\nCosa brucia? Nessuno pu\u00f2 rispondere. Dove \u00e8 il focolaio? \u00c8 difficile capire. Quando \u00e8 scoppiato? Si pu\u00f2 scoprire, 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 contenitori si fermano mentre altri crollano? Quale contenitore ne \u00e8 la causa? Esternamente, i contenitori sembrano identici, ma all'interno ognuno ha il proprio 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 professionisti capaci. Creano buoni servizi che portano profitto all'azienda. Tuttavia, ci sono anche inconvenienti, quando i contenitori delle applicazioni si comportano in modo anomalo. Un contenitore consuma troppa CPU, un altro la rete, un terzo si occupa di operazioni di input\/output, mentre un quarto non si capisce affatto cosa faccia con i socket. Tutto questo causa problemi e la nave affonda.\u00a0<\/p>\n<h1>Agenti<\/h1>\n<p>\nPer capire cosa succede all'interno, abbiamo deciso di inserire agenti direttamente nei contenitori.<\/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 supporto che mantengono i contenitori in uno stato tale da non danneggiarsi a vicenda. Gli agenti sono standardizzati, il che consente di uniformare l'approccio alla gestione dei contenitori.\u00a0<\/p>\n<p>Nel nostro caso, gli agenti devono fornire log in un formato standard, etichettati e con throttling. Devono inoltre fornire metriche standardizzate, espandibili per quanto riguarda le applicazioni aziendali.<\/p>\n<p>Con gli agenti si intendono anche strumenti per l'implementazione e la manutenzione, capaci di operare in diversi sistemi di orchestrazione e supportare diverse immagini (Debian, Alpine, CentOS, ecc.).<\/p>\n<p>Infine, gli agenti devono supportare una semplice CI\/CD, che comprenda file Docker. Altrimenti, la nave si disintegrer\u00e0, poich\u00e9 i contenitori cominceranno a essere forniti su binari \"storti\".<\/p>\n<h1>Il processo di build e la realizzazione dell'immagine di destinazione<\/h1>\n<p>\nPer garantire che tutto sia standardizzato e gestibile, \u00e8 necessario seguire un processo di build standard. Pertanto, abbiamo deciso di costruire contenitori con contenitori - 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 contenitori sono presentati come contorni solidi. Abbiamo anche deciso di includere distribuzioni in essi, per rendere la \"vita pi\u00f9 dolce\". Spiegheremo pi\u00f9 avanti il motivo di questa scelta.<br \/>\n\u00a0<br \/>\nIl risultato \u00e8 stato uno strumento per la costruzione: un contenitore di una certa versione che fa riferimento a specifiche versioni di distribuzioni e a specifiche versioni di script.<\/p>\n<p>Come lo utilizziamo? Abbiamo un Docker Hub in cui si trova il contenitore. Lo specchiamo all'interno del nostro sistema per eliminare le dipendenze esterne. \u00c8 stato creato un contenitore contrassegnato in giallo. Creiamo un template per installare nel contenitore tutte le distribuzioni e gli script necessari. Dopo di che, assemblamo un'immagine pronta per l'uso: gli sviluppatori vi inseriscono il codice e le loro specifiche dipendenze.\u00a0<\/p>\n<p>Quali sono i vantaggi di questo approccio?\u00a0<\/p>\n<ul>\n<li>Innanzitutto, il completo controllo delle versioni degli strumenti di assemblaggio \u2013 contenitore di assemblaggio, versioni degli script e delle distribuzioni.\u00a0<\/li>\n<li>In secondo luogo, abbiamo raggiunto la standardizzazione: creiamo template, immagini intermedie e pronte all'uso in modo uniforme.\u00a0<\/li>\n<li>In terzo luogo, i contenitori ci assicurano la portabilit\u00e0. Oggi utilizziamo Gitlab, e domani possiamo passare a TeamCity o Jenkins e mantenere la stessa capacit\u00e0 di eseguire i nostri contenitori.\u00a0<\/li>\n<li>In quarto luogo, minimizzazione delle dipendenze. Non abbiamo inserito per caso le distribuzioni nel contenitore, poich\u00e9 ci\u00f2 consente di non doverle scaricare ogni volta da Internet.\u00a0<\/li>\n<li>In quinto luogo, \u00e8 aumentata la velocit\u00e0 di assemblaggio: la presenza di copie locali delle immagini consente di risparmiare tempo nelle scaricamenti, dato che \u00e8 disponibile un'immagine locale.\u00a0<\/li>\n<\/ul>\n<p>\nIn altre parole, abbiamo raggiunto un processo di assemblaggio controllato e flessibile. Utilizziamo gli stessi strumenti per assemblare qualsiasi contenitore con versioning completo.\u00a0<\/p>\n<h1>Come funziona la nostra procedura di assemblaggio<\/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 \/>\nL'assemblaggio inizia con un solo comando, e il processo si svolge all'interno di un'immagine (evidenziato in rosso). Lo sviluppatore ha un file Docker (evidenziato in giallo), lo renderizziamo sostituendo le variabili con i valori. Nel frattempo, aggiungiamo header e footer: questi sono i nostri agenti.\u00a0<\/p>\n<p>L'header aggiunge i pacchetti dai relativi immagini. Il footer installa i nostri servizi, configura l'avvio del carico di lavoro, della registrazione e altri agenti, e 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 \/>\nCi abbiamo pensato a lungo se implementare un supervisore. Alla fine, abbiamo deciso che ci serviva. Abbiamo scelto S6. Il supervisore gestisce il contenitore: permette di collegarsi ad esso in caso di crash del processo principale e offre una gestione manuale del contenitore senza doverlo ricreare. 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 della gestione della manutenzione, dell'elaborazione dei segnali e di altre attivit\u00e0.<\/p>\n<p>Poich\u00e9 utilizziamo diversi sistemi di orchestrazione, dopo la costruzione e l'avvio, il contenitore deve capire in quale ambiente si trova e agire di conseguenza. Ad esempio:<br \/>\nQuesto ci consente di creare un'unica immagine e di eseguirla in diversi sistemi di orchestrazione, tenendo conto delle 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 events: sono i nostri agenti che si occupano di log e metriche. In Kubernetes non ci sono, mentre in Docker ci sono. Perch\u00e9?\u00a0<\/p>\n<p>Se si guarda la specifica del \"pod\" (qui e oltre \u2013 pod di Kubernetes), si vedr\u00e0 che il contenitore events viene eseguito in un pod, che ha un contenitore separato collector, incaricato di raccogliere metriche e log. Possiamo sfruttare le capacit\u00e0 di Kubernetes: eseguire contenitori all'interno dello stesso pod, nello stesso spazio di processo e\/o di rete. Infatti, \u00e8 possibile implementare i propri agenti e svolgere determinate funzioni. E se lo stesso contenitore fosse avviato in Docker, avrebbe le stesse capacit\u00e0, vale a dire, sarebbe in grado di inviare log e metriche, poich\u00e9 gli agenti saranno 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 soluzione comporta diversi aspetti.<br \/>\nL'infrastruttura \u00e8 creata per eseguire carichi di lavoro utili, non per la massiccia consegna di log. Questo processo deve dunque essere eseguito con il minimo impatto sulle risorse dei contenitori. Ci impegniamo ad aiutare i nostri sviluppatori: \"Prendete un contenitore da Docker Hub, avviatelo e saremo in grado di consegnare i log.\"\u00a0<\/p>\n<p>Il secondo aspetto \u00e8 la limitazione del volume dei log. Se in pi\u00f9 container si verifica una situazione di picco nel volume dei log (l'applicazione genera continuamente stack-trace), aumenta il carico sulla CPU, sui canali di comunicazione e sul sistema di elaborazione dei log, e ci\u00f2 influisce sul funzionamento dell'host nel suo complesso e su altri container nello stesso host, portando talvolta a un \"crash\" dell'host.\u00a0<\/p>\n<p>Il terzo aspetto \u00e8 la necessit\u00e0 di supportare out-of-the-box il maggior numero possibile di metodologie per la raccolta delle metriche. Dalla lettura dei file e l'interrogazione del Prometheus-endpoint fino all'utilizzo di protocolli specifici delle applicazioni.<\/p>\n<p>E l'ultimo aspetto \u00e8 la necessit\u00e0 di minimizzare il consumo delle risorse.<\/p>\n<p>Abbiamo scelto una soluzione open-source basata su Go chiamata Telegraf. Questo \u00e8 un connettore versatile che supporta oltre 140 tipi di canali di input (input plugins) e 30 tipi di output (output plugins). Lo abbiamo modificato e ora vi mostreremo come viene utilizzato da noi attraverso l'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 riceva una richiesta per creare un pod. In quel momento, 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 loro contenuto, crea, ad esempio, un endpoint di Prometheus;\u00a0\n<\/li>\n<li>Sulla base della specifica del pod e delle impostazioni specifiche dei contenitori, decide come inviare 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 Collector si occuper\u00e0 del resto. I log vengono raccolti a chunk con un certo ritardo, per prevenire un possibile sovraccarico dell'host.\u00a0<\/p>\n<p>Le metriche vengono raccolte per le istanze di carico di lavoro (processi) nei contenitori. Tutto \u00e8 etichettato: namespace, pod e cos\u00ec via, e poi convertito nel formato di Prometheus \u2013 e diventa disponibile per la raccolta (eccetto i log). Inoltre, log, metriche ed eventi vengono inviati a Kafka e oltre:<\/p>\n<ul>\n<li>I log sono disponibili in Graylog (per analisi visiva);\n<\/li>\n<li>I log, le metriche e gli eventi vengono inviati a Clickhouse per una conservazione a lungo termine.\n<\/li>\n<\/ul>\n<p>\nAllo stesso modo, tutto funziona in AWS, solo che sostituiamo Graylog con Kafka con Cloudwatch. Inviamo i log l\u00ec, e risulta molto conveniente: \u00e8 immediatamente 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. Tutti gli stessi processi sono avviati all'interno di un unico contenitore.<\/p>\n<h1>In conclusione<\/h1>\n<p>\nAbbiamo creato una soluzione integrata per la costruzione e il rilascio delle immagini in produzione, con opzioni di raccolta e consegna di log e metriche:<\/p>\n<ul>\n<li>Abbiamo sviluppato un approccio standardizzato per la costruzione delle immagini, basato sul quale abbiamo creato modelli CI;\n<\/li>\n<li>Gli agenti per la raccolta dei dati sono le nostre estensioni Telegraf. Le abbiamo testate con successo in produzione;\n<\/li>\n<li>Utilizziamo un webhook di mutazione per l'inserimento dei contenitori con agenti nei pod;\u00a0\n<\/li>\n<li>Ci siamo integrati nell'ecosistema Kubernetes\/Rancher;\n<\/li>\n<li>Possiamo eseguire contenitori identici in diversi sistemi di orchestrazione e ottenere i risultati attesi;\n<\/li>\n<li>Abbiamo creato una configurazione di gestione dei container completamente dinamica.\u00a0\n<\/li>\n<\/ul>\n<p>\nCoautore: <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.0.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.0.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 container nell'ambiente di produzione, in particolare su 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}]}}