{"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\/ro\/blog\/administrirovanie\/production-ready-images-for-k8s","title":{"rendered":"Imagini preg\u0103tite pentru produc\u021bie pentru k8s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Aceast\u0103 poveste vorbe\u0219te despre modul \u00een care folosim containere \u00een mediul de produc\u021bie, \u00een special sub Kubernetes. Articolul este dedicat colect\u0103rii metricalor \u0219i jurnalelor de la containere, precum \u0219i construirii imaginilor.<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru 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 \/>\nSuntem din compania fintech Exness, care dezvolt\u0103 servicii pentru tranzac\u021bionarea online \u0219i produse fintech pentru B2B \u0219i B2C. \u00cen R&amp;D-ul nostru sunt multe echipe diferite, iar \u00een departamentul de dezvoltare sunt peste 100 de angaja\u021bi.<\/p>\n<p>Reprezent\u0103m echipa care se ocup\u0103 de platforma pentru colectarea \u0219i lansarea codului de c\u0103tre dezvoltatorii no\u0219tri. \u00cen special, r\u0103spundem de colectarea, stocarea \u0219i furnizarea de metrici, jurnale \u0219i evenimente din aplica\u021bii. \u00cen prezent, oper\u0103m aproximativ trei mii de containere Docker \u00een mediul de produc\u021bie, sus\u021binem stocarea noastr\u0103 de big data de 50 TB \u0219i oferim solu\u021bii arhitecturale construite \u00een jurul infrastructurii noastre: Kubernetes, Rancher \u0219i diferi\u021bi furnizori publici de cloud.\u00a0<\/p>\n<h1>Motiva\u021bia noastr\u0103<\/h1>\n<p>\nCe arde? Nimeni nu poate r\u0103spunde. Unde este focul? Este greu de \u00een\u021beles. C\u00e2nd a \u00eenceput? Se poate afla, dar nu imediat.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/3ca2271caf1d02ba14937680cd89d65d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDe ce unele containere stau pe loc, iar altele au c\u0103zut? Care container a cauzat asta? De\u0219i din exterior containerele sunt identice, fiecare are propriul s\u0103u Neo \u00een interior.<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/f971583f21e363244f9ea754da2a1f4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDezvoltatorii no\u0219tri sunt oameni competen\u021bi. Ei fac servicii bune care aduc profit companiei. Dar exist\u0103 \u0219i probleme, c\u00e2nd containerele cu aplica\u021bii devin haotice. Un container consum\u0103 prea mult CPU, altul consum\u0103 l\u0103\u021bime de band\u0103, al treilea efectueaz\u0103 opera\u021biuni de intrare-ie\u0219ire, iar al patrulea face lucruri ciudate cu socket-urile. Toate acestea se pr\u0103bu\u0219esc \u0219i vasul se scufund\u0103.\u00a0<\/p>\n<h1>Agenti<\/h1>\n<p>\nPentru a \u00een\u021belege ce se \u00eent\u00e2mpl\u0103 \u00een interior, am decis s\u0103 instal\u0103m agen\u021bi direct \u00een containere.<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/cc9eb47d1250bb866ec9452181479df4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAce\u0219ti agen\u021bi sunt programe de control care men\u021bin containerele \u00eentr-o stare astfel \u00eenc\u00e2t s\u0103 nu se deteriorizeze reciproc. Agen\u021bii sunt standardiza\u021bi, ceea ce permite standardizarea abord\u0103rilor \u00een \u00eentre\u021binerea containerelor.\u00a0<\/p>\n<p>\u00cen cazul nostru, agen\u021bii trebuie s\u0103 furnizeze jurnale \u00eentr-un format standard, etichetate \u0219i cu throttling. De asemenea, trebuie s\u0103 ne ofere metrici standardizate, extinsibil sub aspectul aplica\u021biilor de afaceri.<\/p>\n<p>Agen\u021bii implic\u0103 \u0219i utilitare pentru exploatare \u0219i \u00eentre\u021binere, capabile s\u0103 func\u021bioneze \u00een diferite sisteme de orchestrare, sus\u021bin\u00e2nd diferite imagini (Debian, Alpine, Centos etc.).<\/p>\n<p>\u00cen cele din urm\u0103, agen\u021bii trebuie s\u0103 sus\u021bin\u0103 un CI\/CD simplu, care s\u0103 includ\u0103 fi\u0219iere Docker. Altfel, sistemul va colapsa, deoarece containerele vor \u00eencepe s\u0103 fie livrate pe \u0219ine \u201estr\u00e2mbe\u201d.<\/p>\n<h1>Procesul de construire \u0219i configurarea imaginii \u021bint\u0103<\/h1>\n<p>\nPentru a avea totul standardizat \u0219i gestionabil, este necesar s\u0103 respect\u0103m un proces standard de construire. De aceea, am decis s\u0103 construim containere cu ajutorul altor containere \u2014 o astfel de recursivitate.<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/708715af05bf79ce1eb9c2a8ce2aeca6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAici, containerele sunt reprezentate prin contururi solide. De asemenea, am decis s\u0103 includem \u00een ele distribu\u021biile, pentru a nu face \u201evia\u021ba prea u\u0219oar\u0103\u201d. Motivele pentru care am f\u0103cut acest lucru le vom explica mai jos.<br \/>\n\u00a0<br \/>\nCa rezultat, am ob\u021binut un instrument pentru construire \u2014 un container de o anumit\u0103 versiune, care face referire la anumite versiuni ale distribu\u021biilor \u0219i la anumite versiuni ale scripturilor.<\/p>\n<p>Cum \u00eel utiliz\u0103m? Avem un Docker Hub, unde este stocat containerul. \u00cel replic\u0103m \u00een sistemul nostru pentru a sc\u0103pa de dependen\u021bele externe. A rezultat un container, marcat cu galben. Cre\u0103m un \u0219ablon pentru a instala \u00een container toate distribu\u021biile \u0219i scripturile necesare. Dup\u0103 aceea, construim o imagine gata de exploatare: dezvoltatorii \u00eei \u00eencarc\u0103 codul \u0219i anumite dependen\u021be specifice.\u00a0<\/p>\n<p>Care sunt avantajele acestei abord\u0103ri?\u00a0<\/p>\n<ul>\n<li>\u00cen primul r\u00e2nd, control complet al versiunilor instrumentelor de construire \u2013 containerul de construire, versiunile scripturilor \u0219i ale distribu\u021biilor.\u00a0<\/li>\n<li>\u00cen al doilea r\u00e2nd, am ob\u021binut standardizare: cre\u0103m \u0219abloane, imagini intermediare \u0219i gata de exploatare \u00eentr-un mod uniform.\u00a0<\/li>\n<li>\u00cen al treilea r\u00e2nd, containerele ne ofer\u0103 portabilitate. Ast\u0103zi folosim Gitlab, iar m\u00e2ine vom trece la TeamCity sau Jenkins \u0219i exact la fel vom putea rula containerele noastre.\u00a0<\/li>\n<li>\u00cen al patrulea r\u00e2nd, minimizarea dependen\u021belor. Nu este \u00eent\u00e2mpl\u0103tor c\u0103 am inclus distribu\u021biile \u00een container, deoarece acest lucru ne permite s\u0103 nu le desc\u0103rc\u0103m de fiecare dat\u0103 de pe internet.\u00a0<\/li>\n<li>\u00cen al cincilea r\u00e2nd, rapiditatea construirei a crescut \u2013 av\u00e2nd copii locale ale imaginilor, nu pierdem timp cu desc\u0103rcarea, deoarece avem imagini locale.\u00a0<\/li>\n<\/ul>\n<p>\nCu alte cuvinte, am realizat un proces de construire controlat \u0219i flexibil. Folosim acelea\u0219i instrumente pentru construirea oric\u0103ror containere, av\u00e2nd un versionare complet\u0103.\u00a0<\/p>\n<h1>Cum func\u021bioneaz\u0103 procedura noastr\u0103 de construire?<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/22b9a8546005e289f79962188dbb0659.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nConstruirea \u00eencepe cu o singur\u0103 comand\u0103, procesul se desf\u0103\u0219oar\u0103 \u00een imagine (eviden\u021biat cu ro\u0219u). Dezvoltatorul are un fi\u0219ier Docker (eviden\u021biat cu galben), pe care \u00eel redimension\u0103m, \u00eenlocuind variabilele cu valorile corespunz\u0103toare. \u00cen acela\u0219i timp, ad\u0103ug\u0103m header-uri \u0219i footer-uri \u2014 acestea sunt agen\u021bii no\u0219tri.\u00a0<\/p>\n<p>Header-ul adaug\u0103 distribu\u021biile din imaginile corespunz\u0103toare. Iar footer-ul instaleaz\u0103 servicii \u00een interior, configur\u00e2nd lansarea sarcinii de lucru, logarea \u0219i al\u021bi agen\u021bi, \u00eenlocuind entrypoint-ul etc.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/4004e57dc45771479e535921a839716d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAm reflectat mult dac\u0103 s\u0103 implement\u0103m un supervizor. \u00cen cele din urm\u0103, am decis c\u0103 avem nevoie de el. Am ales S6. Supervizorul asigur\u0103 gestionarea containerului: permite conectarea la acesta \u00een caz de c\u0103dere a procesului principal \u0219i ofer\u0103 gestionarea manual\u0103 a containerului f\u0103r\u0103 a \u00eel recrea. Jurnalele \u0219i metricile sunt procese care se desf\u0103\u0219oar\u0103 \u00een interiorul containerului. Trebuie s\u0103 le control\u0103m de asemenea, \u0219i facem acest lucru prin intermediul supervizorului. \u00cen cele din urm\u0103, S6 se ocup\u0103 de housekeeping, procesarea semnalelor \u0219i alte sarcini.<\/p>\n<p>Dat fiind c\u0103 utiliz\u0103m diferite sisteme de orchestrare, dup\u0103 construirea \u0219i lansarea containerului, acesta trebuie s\u0103 \u00een\u021beleag\u0103 \u00een ce mediu se afl\u0103 \u0219i s\u0103 ac\u021bioneze corespunz\u0103tor. De exemplu:<br \/>\nAcest lucru ne permite s\u0103 construim o singur\u0103 imagine \u0219i s\u0103 o lans\u0103m \u00een diferite sisteme de orchestrare, av\u00e2nd \u00een vedere specificitatea acestor sisteme.<\/p>\n<p>\u00a0<img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/6e76396afedbbf0e71d44a7fbb8521da.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPentru acela\u0219i container ob\u021binem diferite arbori de procese \u00een Docker \u0219i Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/83f9d23876192930ffebafcdd549915e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSarcina util\u0103 se desf\u0103\u0219oar\u0103 sub supervizorul S6. Observa\u021bi collector \u0219i events \u2014 ace\u0219tia sunt agen\u021bii no\u0219tri, responsabili pentru jurnale \u0219i metrici. \u00cen Kubernetes nu sunt, dar \u00een Docker sunt. De ce?\u00a0<\/p>\n<p>Dac\u0103 ne uit\u0103m la specifica\u021bia \u201epod-ului\u201d (de aici \u00eenainte - Kubernetes pod), vom vedea c\u0103 containerul events se desf\u0103\u0219oar\u0103 \u00een pod-ul \u00een care exist\u0103 un container separat collector, care \u00eendepline\u0219te func\u021bia de colectare a metricilor \u0219i jurnalele. Putem utiliza capacit\u0103\u021bile Kubernetes: lansarea containerelor \u00eentr-un singur pod, \u00een acela\u0219i spa\u021biu de proces \u0219i\/sau re\u021bea. Practic, putem implementa agen\u021bi proprii \u0219i \u00eendeplini anumite func\u021bii. \u0218i dac\u0103 acela\u0219i container va fi lansat \u00een Docker, el va ob\u021bine acelea\u0219i capacit\u0103\u021bi, adic\u0103 va putea livra jurnale \u0219i metrici, deoarece agen\u021bii vor fi rula\u021bi \u00een interior.\u00a0<\/p>\n<h1>Metrici \u0219i jurnale<\/h1>\n<p>\nLivrarea metricilor \u0219i jurnalele \u2014 o sarcin\u0103 complex\u0103. Solu\u021bionarea acesteia este legat\u0103 de mai multe aspecte.<br \/>\nInfrastructura este creat\u0103 pentru a executa sarcini utile, nu pentru livrarea \u00een mas\u0103 a jurnalelor. Adic\u0103, acest proces ar trebui s\u0103 se desf\u0103\u0219oare cu cerin\u021be minime de resurse pentru containere. Ne str\u0103duim s\u0103 ajut\u0103m dezvoltatorii no\u0219tri: \u201eLua\u021bi un container din Docker Hub, porni\u021bi-l \u0219i vom putea livra jurnalele\u201d.\u00a0<\/p>\n<p>Al doilea aspect \u2013 limitarea volumului de jurnale. Dac\u0103 \u00een mai multe containere apare o situa\u021bie de v\u00e2rf \u00een volumul de jurnale (aplica\u021bia \u00een bucl\u0103 afi\u0219eaz\u0103 stack-trace), cre\u0219te \u00eenc\u0103rc\u0103tura pe CPU, canalele de comunicare, sistemul de procesare a jurnalelor \u0219i aceasta afecteaz\u0103 func\u021bionarea host-ului \u00een ansamblu \u0219i a altor containere de pe host, ceea ce uneori duce la \u201ep\u0103durea\u201d host-ului.\u00a0<\/p>\n<p>Al treilea aspect \u2013 trebuie s\u0103 suport\u0103m din cutie c\u00e2t mai multe metode de colectare a metricilor. De la citirea fi\u0219ierelor \u0219i interogarea punctelor de finalizare Prometheus p\u00e2n\u0103 la utilizarea protocoalelor specifice ale aplica\u021biilor.<\/p>\n<p>\u0218i ultimul aspect \u2013 trebuie s\u0103 minimiz\u0103m consumul de resurse.<\/p>\n<p>Am ales o solu\u021bie open-source pe Go numit\u0103 Telegraf. Acesta este un conectator versatil care suport\u0103 peste 140 de tipuri de canale de intrare (input plugins) \u0219i 30 de tipuri de ie\u0219ire (output plugins). L-am adaptat \u0219i acum vom explica cum este utilizat de noi prin intermediul Kubernetes.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/9635d571c852e5f9358458874c58d7b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nS\u0103 presupunem c\u0103 un dezvoltator desf\u0103\u0219oar\u0103 o sarcin\u0103 \u0219i Kubernetes prime\u0219te o cerere de creare a unui pod. \u00cen acel moment, pentru fiecare pod se creeaz\u0103 automat un container numit Collector (folosim mutation webhook). Collector este agentul nostru. La start, acest container se configureaz\u0103 pentru a lucra cu Prometheus \u0219i sistemul de colectare a jurnalelor.<\/p>\n<ul>\n<li>Pentru aceasta, el folose\u0219te anota\u021bii ale pod-ului \u0219i, \u00een func\u021bie de con\u021binutul acesteia, creeaz\u0103, s\u0103 zicem, un punct de finalizare Prometheus;\u00a0\n<\/li>\n<li>Pe baza specifica\u021biei pod-ului \u0219i a set\u0103rilor specifice ale containerelor, decide cum s\u0103 livreze jurnalele.\n<\/li>\n<\/ul>\n<p>\nJurnalele sunt colectate prin Docker API: dezvoltatorii trebuie doar s\u0103 le plaseze \u00een stdout sau stderr, iar apoi Collector se va ocupa de ele. Jurnalele sunt colectate \u00een blocuri cu o oarecare \u00eent\u00e2rziere, pentru a preveni o posibil\u0103 supra\u00eenc\u0103rcare a host-ului.\u00a0<\/p>\n<p>Metricile sunt colectate pe instan\u021bele sarcinii de lucru (procese) din containere. Totul este marcat cu etichete: namespace, pod \u0219i a\u0219a mai departe, \u0219i apoi convertit \u00een format Prometheus \u2013 \u0219i devine disponibil pentru colectare (cu excep\u021bia jurnalelor). De asemenea, jurnalele, metricile \u0219i evenimentele sunt trimise \u00een Kafka \u0219i mai departe:<\/p>\n<ul>\n<li>Jurnalele sunt disponibile \u00een Graylog (pentru analiz\u0103 vizual\u0103);\n<\/li>\n<li>Jurnalele, metricele \u0219i evenimentele sunt trimise \u00een Clickhouse pentru stocare pe termen lung.\n<\/li>\n<\/ul>\n<p>\nExact \u00een acela\u0219i mod func\u021bioneaz\u0103 totul \u00een AWS, doar c\u0103 \u00eenlocuim Graylog cu Kafka cu Cloudwatch. Trimitem jurnalele acolo, iar totul devine foarte convenabil: este clar cui \u00eei apar\u021bine clusterul \u0219i containerul. Acela\u0219i lucru este valabil \u0219i pentru Google Stackdriver. A\u0219adar, schema noastr\u0103 func\u021bioneaz\u0103 at\u00e2t on-premise cu Kafka, c\u00e2t \u0219i \u00een cloud.\u00a0<\/p>\n<p>Dac\u0103 nu avem Kubernetes cu pod-uri, schema devine pu\u021bin mai complicat\u0103, dar func\u021bioneaz\u0103 pe acelea\u0219i principii.<\/p>\n<p><img decoding=\"async\" alt=\"Imagini preg\u0103tite pentru produc\u021bie pentru k8s\" src=\"\/wp-content\/uploads\/2020\/05\/dd8efb33c5c74433a2767cb00caeec2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00cen interiorul containerului se execut\u0103 acelea\u0219i procese, orchestrate cu ajutorul S6. Toate acelea\u0219i procese sunt lansate \u00een interiorul unui singur container.<\/p>\n<h1>\u00cen concluzie<\/h1>\n<p>\nAm creat o solu\u021bie integrat\u0103 pentru construirea \u0219i lansarea imaginilor \u00een produc\u021bie, cu op\u021biuni de colectare \u0219i livrare a jurnalelor \u0219i metricelor:<\/p>\n<ul>\n<li>Am dezvoltat o abordare standardizat\u0103 pentru construirea imaginilor, pe baza c\u0103reia am dezvoltat \u0219abloane CI;\n<\/li>\n<li>Agentele pentru colectarea datelor sunt extensiile noastre Telegraf. Le-am testat bine \u00een produc\u021bie;\n<\/li>\n<li>Aplic\u0103m webhook-uri de muta\u021bie pentru implementarea containerelor cu agen\u021bi \u00een pod-uri;\u00a0\n<\/li>\n<li>Ne-am integrat \u00een ecosistemul Kubernetes\/Rancher;\n<\/li>\n<li>Putem rula acelea\u0219i containere \u00een diferite sisteme de orchestrare \u0219i ob\u021bine rezultatul dorit;\n<\/li>\n<li>Am creat o configura\u021bie complet dinamic\u0103 pentru gestionarea containerelor.\u00a0\n<\/li>\n<\/ul>\n<p>\nCoautor: <b>Ilia Prudnikov<\/b><br \/>\n<br \/>Sursa: <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.2.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\/ro\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"ro_RO\" \/>\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\/ro\/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\udd47Imagini preg\u0103tite pentru produc\u021bie pentru k8s | ProHoster","description":"Aceast\u0103 poveste este despre cum folosim containere \u00een mediul de produc\u021bie, \u00een special sub Kubernetes.","canonical_url":"https:\/\/prohoster.info\/ro\/blog\/administrirovanie\/production-ready-images-for-k8s","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"ro_RO","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\/ro\/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\/ro\/wp-json\/wp\/v2\/posts\/81173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/comments?post=81173"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/posts\/81173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media\/81174"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/media?parent=81173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/categories?post=81173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/ro\/wp-json\/wp\/v2\/tags?post=81173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}