{"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\/es\/blog\/administrirovanie\/production-ready-images-for-k8s","title":{"rendered":"Im\u00e1genes listas para producci\u00f3n para k8s","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Esta historia trata sobre c\u00f3mo utilizamos contenedores en un entorno de producci\u00f3n, especialmente bajo Kubernetes. El art\u00edculo se dedica a la recolecci\u00f3n de m\u00e9tricas y registros de los contenedores, as\u00ed como a la construcci\u00f3n de im\u00e1genes.<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para 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 \/>\nSomos de la empresa fintech Exness, que se dedica al desarrollo de servicios para el trading en l\u00ednea y productos fintech para B2B y B2C. En nuestro departamento de I+D hay muchos equipos diferentes, y en el departamento de desarrollo hay m\u00e1s de 100 empleados.<\/p>\n<p>Representamos al equipo responsable de la plataforma para el recopilado y ejecuci\u00f3n de c\u00f3digo de nuestros desarrolladores. En particular, somos responsables de la recopilaci\u00f3n, almacenamiento y provisi\u00f3n de m\u00e9tricas, registros y eventos de las aplicaciones. Actualmente, operamos aproximadamente tres mil contenedores Docker en un entorno de producci\u00f3n, mantenemos nuestro almac\u00e9n de big data de 50 TB y ofrecemos soluciones arquitect\u00f3nicas que se construyen alrededor de nuestra infraestructura: Kubernetes, Rancher y varios proveedores de nube p\u00fablica.\u00a0<\/p>\n<h1>Nuestra motivaci\u00f3n<\/h1>\n<p>\n\u00bfQu\u00e9 est\u00e1 en llamas? Nadie puede responder. \u00bfD\u00f3nde est\u00e1 el foco? Dif\u00edcil de comprender. \u00bfCu\u00e1ndo comenz\u00f3 el incendio? Se puede averiguar, pero no de inmediato.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/3ca2271caf1d02ba14937680cd89d65d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00bfPor qu\u00e9 algunos contenedores se detienen y otros caen? \u00bfQu\u00e9 contenedor es el responsable? Porque por fuera los contenedores son iguales, pero por dentro cada uno tiene su propio Neo.<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/f971583f21e363244f9ea754da2a1f4c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nNuestros desarrolladores son chicos competentes. Hacen buenos servicios que generan beneficios para la empresa. Pero a veces hay fallos, cuando los contenedores de aplicaciones se dispersan. Un contenedor consume demasiada CPU, otro la red, otro operaciones de entrada\/salida, y un cuarto no est\u00e1 claro qu\u00e9 hace con los sockets. Todo esto se desmorona y el barco se hunde.\u00a0<\/p>\n<h1>Agentes<\/h1>\n<p>\nPara entender qu\u00e9 sucede por dentro, decidimos colocar agentes directamente en los contenedores.<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/cc9eb47d1250bb866ec9452181479df4.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEstos agentes son programas de control que mantienen los contenedores en un estado tal que no se rompan entre s\u00ed. Los agentes est\u00e1n estandarizados, lo que permite estandarizar el enfoque para el mantenimiento de los contenedores.\u00a0<\/p>\n<p>En nuestro caso, los agentes deben proporcionar registros en un formato est\u00e1ndar, etiquetados y con limitaci\u00f3n de frecuencia. Tambi\u00e9n deben proporcionarnos m\u00e9tricas estandarizadas, ampliables desde el punto de vista de las aplicaciones de negocio.<\/p>\n<p>Los agentes tambi\u00e9n se refieren a utilidades para la explotaci\u00f3n y mantenimiento, capaces de trabajar en diferentes sistemas de orquestaci\u00f3n, y que soporten diferentes im\u00e1genes (Debian, Alpine, Centos, etc.).<\/p>\n<p>Finalmente, los agentes deben mantener un CI\/CD simple que incluya archivos Docker. De lo contrario, el barco se desmoronar\u00e1 porque los contenedores comenzar\u00e1n a entregarse por rieles \"torcidos\".<\/p>\n<h1>El proceso de construcci\u00f3n y la creaci\u00f3n de la imagen objetivo<\/h1>\n<p>\nPara que todo est\u00e9 estandarizado y gestionable, es necesario seguir alg\u00fan proceso est\u00e1ndar de construcci\u00f3n. Por lo tanto, decidimos construir contenedores utilizando otros contenedores \u2014 una especie de recursividad.<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/708715af05bf79ce1eb9c2a8ce2aeca6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqu\u00ed los contenedores se presentan como contornos s\u00f3lidos. Adem\u00e1s, decidimos incluir distribuciones en ellos para que \"la vida no parezca tan sencilla\". A continuaci\u00f3n explicaremos por qu\u00e9 se hizo esto.<br \/>\n\u00a0<br \/>\nComo resultado, se cre\u00f3 una herramienta de construcci\u00f3n: un contenedor de una versi\u00f3n espec\u00edfica que se refiere a versiones espec\u00edficas de distribuciones y versiones espec\u00edficas de scripts.<\/p>\n<p>\u00bfC\u00f3mo lo aplicamos? Tenemos Docker Hub, donde reside el contenedor. Lo duplicamos dentro de nuestro sistema para eliminar dependencias externas. Result\u00f3 un contenedor marcado en color amarillo. Creamos una plantilla para instalar todas las distribuciones y scripts necesarios en el contenedor. Despu\u00e9s de eso, construimos una imagen lista para la producci\u00f3n: los desarrolladores colocan su c\u00f3digo y algunas dependencias especiales.\u00a0<\/p>\n<p>\u00bfCu\u00e1l es la ventaja de este enfoque?\u00a0<\/p>\n<ul>\n<li>En primer lugar, control de versi\u00f3n completo de las herramientas de construcci\u00f3n: contenedor de construcci\u00f3n, versiones de scripts y distribuciones.\u00a0<\/li>\n<li>En segundo lugar, hemos logrado estandarizaci\u00f3n: creamos plantillas, im\u00e1genes intermedias y listas para la producci\u00f3n de manera uniforme.\u00a0<\/li>\n<li>En tercer lugar, los contenedores nos proporcionan portabilidad. Hoy usamos Gitlab, y ma\u00f1ana podemos pasar a TeamCity o Jenkins y, de igual manera, podemos ejecutar nuestros contenedores.\u00a0<\/li>\n<li>En cuarto lugar, minimizaci\u00f3n de dependencias. No es por azar que colocamos distribuciones en el contenedor, ya que esto evita descargarlas cada vez de Internet.\u00a0<\/li>\n<li>En quinto lugar, se ha aumentado la velocidad de construcci\u00f3n: la existencia de copias locales de im\u00e1genes permite no perder tiempo en descargas, ya que hay una imagen local disponible.\u00a0<\/li>\n<\/ul>\n<p>\nEn otras palabras, hemos logrado un proceso de construcci\u00f3n controlado y flexible. Utilizamos las mismas herramientas para construir cualquier contenedor con un versionado completo.\u00a0<\/p>\n<h1>\u00bfC\u00f3mo funciona nuestro procedimiento de construcci\u00f3n?<\/h1>\n<p>\n<img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/22b9a8546005e289f79962188dbb0659.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa compilaci\u00f3n se inicia con un solo comando, el proceso se ejecuta en la imagen (resaltada en rojo). El desarrollador tiene un archivo Docker (resaltado en amarillo), lo rendersamos, reemplazando las variables con valores. Y al mismo tiempo, a\u00f1adimos encabezados y pies de p\u00e1gina: estos son nuestros agentes.\u00a0<\/p>\n<p>El encabezado agrega distribuciones de las im\u00e1genes correspondientes. Y el pie de p\u00e1gina inserta nuestros servicios, configura el inicio de la carga de trabajo, la registraci\u00f3n y otros agentes, reemplaza el entrypoint, etc.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/4004e57dc45771479e535921a839716d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEstuvimos pensando mucho si deb\u00edamos implementar un supervisor. Al final, decidimos que lo necesit\u00e1bamos. Elegimos S6. El supervisor proporciona gesti\u00f3n del contenedor: permite conectarse a \u00e9l en caso de que el proceso principal falle y proporciona control manual del contenedor sin necesidad de recrearlo. Los registros y m\u00e9tricas son procesos que se ejecutan dentro del contenedor. Tambi\u00e9n necesitamos controlarlos, y lo hacemos usando el supervisor. Finalmente, S6 se encarga de realizar tareas de mantenimiento, gestionar se\u00f1ales y otras tareas.<\/p>\n<p>Dado que aplicamos diferentes sistemas de orquestaci\u00f3n, despu\u00e9s de la compilaci\u00f3n y el inicio, el contenedor debe entender en qu\u00e9 entorno se encuentra y actuar en consecuencia. Por ejemplo:<br \/>\nEsto nos permite crear una sola imagen y ejecutarla en diferentes sistemas de orquestaci\u00f3n, adapt\u00e1ndose a las especificaciones de dicho sistema de orquestaci\u00f3n.<\/p>\n<p>\u00a0<img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/6e76396afedbbf0e71d44a7fbb8521da.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara un mismo contenedor obtenemos diferentes \u00e1rboles de procesos en Docker y Kubernetes:<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/83f9d23876192930ffebafcdd549915e.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nLa carga \u00fatil se ejecuta bajo el supervisor S6. Tenga en cuenta el collector y events: estos son nuestros agentes responsables de los registros y m\u00e9tricas. No est\u00e1n en Kubernetes, pero s\u00ed en Docker. \u00bfPor qu\u00e9?\u00a0<\/p>\n<p>Si miramos la especificaci\u00f3n del 'pod' (de aqu\u00ed en adelante \u2013 Kubernetes pod), veremos que el contenedor events se ejecuta en el pod, donde hay un contenedor collector separado que realiza la funci\u00f3n de recopilar m\u00e9tricas y registros. Podemos aprovechar las capacidades de Kubernetes: iniciar contenedores en un mismo pod, en un espacio de proceso y\/o red \u00fanico. De hecho, implementar nuestros propios agentes y realizar ciertas funciones. Y si este mismo contenedor se inicia en Docker, obtendr\u00e1 las mismas capacidades, lo que significa que podr\u00e1 enviar registros y m\u00e9tricas, ya que los agentes se ejecutar\u00e1n internamente.\u00a0<\/p>\n<h1>M\u00e9tricas y registros<\/h1>\n<p>\nLa entrega de m\u00e9tricas y registros es una tarea complicada. La soluci\u00f3n implica varios aspectos.<br \/>\nLa infraestructura se crea para la ejecuci\u00f3n de cargas \u00fatiles, no para la entrega masiva de logs. Es decir, este proceso debe llevarse a cabo con requisitos m\u00ednimos de recursos para los contenedores. Nos esforzamos por ayudar a nuestros desarrolladores: \u00abTomen un contenedor de Docker Hub, inicien, y podremos entregar los logs\u00bb.\u00a0<\/p>\n<p>El segundo aspecto es la limitaci\u00f3n del volumen de logs. Si en varios contenedores ocurre una situaci\u00f3n de picos en el volumen de logs (una aplicaci\u00f3n en un bucle emite stack-trace), aumenta la carga en la CPU, los canales de comunicaci\u00f3n, el sistema de procesamiento de logs, y esto afecta el funcionamiento del host en general y de otros contenedores en el host, lo que a veces puede llevar a la \u00abca\u00edda\u00bb del host.\u00a0<\/p>\n<p>El tercer aspecto es la necesidad de soportar, de manera est\u00e1ndar, tantas metodolog\u00edas de recolecci\u00f3n de m\u00e9tricas como sea posible. Desde la lectura de archivos y la consulta del endpoint de Prometheus hasta el uso de protocolos espec\u00edficos de aplicaciones.<\/p>\n<p>Y el \u00faltimo aspecto es la necesidad de minimizar el consumo de recursos.<\/p>\n<p>Hemos elegido una soluci\u00f3n de c\u00f3digo abierto en Go llamada Telegraf. Este es un conector vers\u00e1til que admite m\u00e1s de 140 tipos de entradas (input plugins) y 30 tipos de salidas (output plugins). Lo hemos modificado y ahora contaremos c\u00f3mo se utiliza con nosotros en el ejemplo de Kubernetes.\u00a0<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/9635d571c852e5f9358458874c58d7b0.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSupongamos que un desarrollador despliega una carga de trabajo, y Kubernetes recibe una solicitud para crear un pod. En ese momento, para cada pod se crea autom\u00e1ticamente un contenedor llamado Collector (usamos un webhook de mutaci\u00f3n). Collector es nuestro agente. Al iniciar, este contenedor se configura para trabajar con Prometheus y el sistema de recolecci\u00f3n de logs.<\/p>\n<ul>\n<li>Para ello utiliza anotaciones del pod, y dependiendo de su contenido, crea, digamos, un endpoint final de Prometheus;\u00a0\n<\/li>\n<li>Con base en la especificaci\u00f3n del pod y configuraciones espec\u00edficas de los contenedores, decide c\u00f3mo entregar los logs.\n<\/li>\n<\/ul>\n<p>\nRecolectamos logs a trav\u00e9s de la API de Docker: a los desarrolladores solo les basta con colocarlos en stdout o stderr, y luego Collector se encarga de ello. Los logs se recopilan por fragmentos con un cierto retraso para prevenir una posible sobrecarga del host.\u00a0<\/p>\n<p>Las m\u00e9tricas se recolectan por instancias de carga de trabajo (procesos) en contenedores. Todo se etiqueta: namespace, pod y as\u00ed sucesivamente, y luego se convierte al formato de Prometheus \u2013 y se vuelve accesible para la recolecci\u00f3n (adem\u00e1s de los logs). Tambi\u00e9n, enviamos logs, m\u00e9tricas y eventos a Kafka y posteriormente:<\/p>\n<ul>\n<li>Los logs est\u00e1n disponibles en Graylog (para an\u00e1lisis visual);\n<\/li>\n<li>Los logs, m\u00e9tricas y eventos se env\u00edan a Clickhouse para almacenamiento a largo plazo.\n<\/li>\n<\/ul>\n<p>\nAs\u00ed es como funciona en AWS, solo que sustituimos Graylog con Kafka por Cloudwatch. Enviamos los logs all\u00ed, y todo resulta muy conveniente: queda claro a qu\u00e9 cl\u00faster y contenedor pertenecen. Lo mismo es cierto para Google Stackdriver. Es decir, nuestro esquema funciona tanto en on-premise con Kafka como en la nube.\u00a0<\/p>\n<p>Sin embargo, si no tenemos Kubernetes con pods, el esquema se vuelve un poco m\u00e1s complicado, pero funciona bajo los mismos principios.<\/p>\n<p><img decoding=\"async\" alt=\"Im\u00e1genes listas para producci\u00f3n para k8s\" src=\"\/wp-content\/uploads\/2020\/05\/dd8efb33c5c74433a2767cb00caeec2d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDentro del contenedor se ejecutan los mismos procesos, orquestados con S6. Todos esos mismos procesos se ejecutan dentro de un solo contenedor.<\/p>\n<h1>En resumen<\/h1>\n<p>\nHemos creado una soluci\u00f3n integral para la construcci\u00f3n y despliegue de im\u00e1genes, con opciones para recopilar y entregar logs y m\u00e9tricas:<\/p>\n<ul>\n<li>Desarrollamos un enfoque estandarizado para la construcci\u00f3n de im\u00e1genes, sobre el cual dise\u00f1amos plantillas de CI;\n<\/li>\n<li>Los agentes para la recopilaci\u00f3n de datos son nuestras extensiones Telegraf. Los hemos probado bien en producci\u00f3n;\n<\/li>\n<li>Utilizamos un webhook de mutaci\u00f3n para implementar contenedores con agentes en pods;\u00a0\n<\/li>\n<li>Nos hemos integrado en el ecosistema de Kubernetes\/Rancher;\n<\/li>\n<li>Podemos ejecutar contenedores id\u00e9nticos en diferentes sistemas de orquestaci\u00f3n y obtener los resultados esperados;\n<\/li>\n<li>Creamos una configuraci\u00f3n completamente din\u00e1mica para la gesti\u00f3n de contenedores.\u00a0\n<\/li>\n<\/ul>\n<p>\nCoautor: <b>Ilya Prudnikov<\/b><br \/>\n<br \/>Fuente: <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 - 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\/es\/blog\/administrirovanie\/production-ready-images-for-k8s\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\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\/es\/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\udd47Im\u00e1genes listas para producci\u00f3n para k8s | ProHoster","description":"Esta es la historia de c\u00f3mo utilizamos contenedores en un entorno de producci\u00f3n, especialmente en Kubernetes.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/production-ready-images-for-k8s","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/81173","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=81173"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/81173\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/81174"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=81173"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=81173"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=81173"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}