{"id":35006,"date":"2019-10-31T22:01:47","date_gmt":"2019-10-31T19:01:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\/"},"modified":"2019-10-31T22:01:47","modified_gmt":"2019-10-31T19:01:47","slug":"5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","title":{"rendered":"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Las aplicaciones \"nativas de la nube\" o simplemente \"en la nube\" est\u00e1n dise\u00f1adas espec\u00edficamente para funcionar en infraestructuras de nube. Por lo general, se construyen como un conjunto de microservicios d\u00e9bilmente acoplados, empaquetados en contenedores, que son gestionados por una plataforma de nube. Estas aplicaciones est\u00e1n preparadas para fallos por defecto, lo que significa que funcionan de manera fiable y pueden escalar incluso ante fallos significativos a nivel de infraestructura. La contrapartida es un conjunto de restricciones (contratos) que la plataforma de nube impone sobre las aplicaciones en contenedores para poder gestionarlas de manera autom\u00e1tica.<\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/1f4af6f356ed36d3fbd8adef333501fa.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBien conscientes de la necesidad y la importancia de la transici\u00f3n a aplicaciones en la nube, muchas organizaciones a\u00fan no saben por d\u00f3nde empezar. En esta publicaci\u00f3n, abordaremos una serie de principios cuyo cumplimiento en el desarrollo de aplicaciones en contenedores permitir\u00e1 aprovechar el potencial de las plataformas en la nube y lograr un funcionamiento y escalabilidad fiables de las aplicaciones, incluso ante fallos significativos en la infraestructura de TI. El objetivo final de los principios expuestos aqu\u00ed es aprender a crear aplicaciones que puedan ser gestionadas autom\u00e1ticamente por plataformas de nube como Kubernetes.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Principios de dise\u00f1o de software<\/h3>\n<p>\nEn el mundo de la programaci\u00f3n, los principios se entienden como reglas generales que deben seguirse al desarrollar software. Pueden aplicarse al trabajar con cualquier lenguaje de programaci\u00f3n. Cada principio tiene sus propios objetivos, que generalmente son alcanzados mediante patrones y pr\u00e1cticas. Tambi\u00e9n existe un conjunto de principios fundamentales para la creaci\u00f3n de software de calidad, de los cuales derivan todos los dem\u00e1s. A continuaci\u00f3n, presentaremos ejemplos de principios fundamentales:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/KISS_(%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF)\">KISS<\/a><\/noindex> (Keep it simple, stupid) \u2013 no complicar;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/Don%E2%80%99t_repeat_yourself\">DRY<\/a><\/noindex> (Don\u2019t repeat yourself) \u2013 no repetir;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/YAGNI\">YAGNI<\/a><\/noindex> (You aren\u2019t gonna need it) \u2013 no crear lo que no se necesita de inmediato;<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\">SoC<\/a><\/noindex> (Separation of concerns) \u2013 separar responsabilidades.<\/li>\n<\/ul>\n<p>\nComo se puede ver, estos principios no establecen reglas concretas, sino que pertenecen a la categor\u00eda de consideraciones de sentido com\u00fan basadas en la experiencia pr\u00e1ctica, que comparten muchos desarrolladores y que ellos mismos citan con regularidad.<br \/>\nAdem\u00e1s, existe <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\">SOLID<\/a><\/noindex> \u2013 conjunto de los cinco primeros principios de la programaci\u00f3n orientada a objetos y dise\u00f1o, formulados por Robert C. Martin. SOLID incluye principios complementarios que son generalizables y abiertos a interpretaci\u00f3n, los cuales, si se aplican en conjunto, ayudan a crear sistemas de software de mayor calidad y a mantenerlos mejor a largo plazo.<\/p>\n<p>Los principios SOLID se refieren al \u00e1mbito de la POO y se formulan en el lenguaje de conceptos como clases, interfaces y herencia. Por analog\u00eda, para las aplicaciones en la nube tambi\u00e9n se pueden formular principios de desarrollo, donde el elemento b\u00e1sico ya no ser\u00e1 la clase, sino el contenedor. Siguiendo estos principios, se pueden crear aplicaciones en contenedores que se alineen mejor con los objetivos y metas de plataformas en la nube como Kubernetes.<\/p>\n<h3>Contenedores orientados a la nube: enfoque de Red Hat<\/h3>\n<p>\nHoy en d\u00eda, es relativamente f\u00e1cil empaquetar pr\u00e1cticamente cualquier aplicaci\u00f3n en contenedores. Sin embargo, para que las aplicaciones se automaticen y orquesten de manera efectiva en una plataforma en la nube como Kubernetes, se requiere un esfuerzo adicional.<br \/>\nLa base de las ideas expuestas a continuaci\u00f3n es la metodolog\u00eda <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/SOLID_(%D0%BE%D0%B1%D1%8A%D0%B5%D0%BA%D1%82%D0%BD%D0%BE-%D0%BE%D1%80%D0%B8%D0%B5%D0%BD%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5)\">La Aplicaci\u00f3n de Doce Factores<\/a><\/noindex> y numerosos otros trabajos sobre diversos aspectos de la creaci\u00f3n de aplicaciones web, desde la gesti\u00f3n del c\u00f3digo fuente hasta los modelos de escalabilidad. Los principios descritos se refieren solo al desarrollo de aplicaciones en contenedores, que est\u00e1n basadas en microservicios y dise\u00f1adas para plataformas en la nube como Kubernetes. El elemento b\u00e1sico en nuestras consideraciones es la imagen del contenedor, y el entorno de ejecuci\u00f3n objetivo de los contenedores se entiende como la plataforma de orquestaci\u00f3n de contenedores. El objetivo de los principios propuestos es crear contenedores para los cuales en la mayor\u00eda de las plataformas de orquestaci\u00f3n se puedan automatizar las tareas de programaci\u00f3n (scheduling - selecci\u00f3n de host para ejecutar una instancia del contenedor), escalabilidad y monitoreo. Los principios se exponen en orden arbitrario.<\/p>\n<h3>Principio de responsabilidad \u00fanica (Single Concern Principle, SCP)<\/h3>\n<p>\nEste principio es muy similar al principio de responsabilidad \u00fanica (Single Responsibility Principle, <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%B5%D0%B4%D0%B8%D0%BD%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D0%B9_%D0%BE%D1%82%D0%B2%D0%B5%D1%82%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D0%BE%D1%81%D1%82%D0%B8\">SRP<\/a><\/noindex>), que forma parte del conjunto SOLID y establece que cada objeto debe tener una \u00fanica responsabilidad, y esa responsabilidad debe estar completamente encapsulada en la clase. La esencia del SRP es que cada responsabilidad es una raz\u00f3n para los cambios, y la clase debe tener una sola raz\u00f3n para cambiar.<\/p>\n<p>En SCP, en lugar de la palabra \u00abresponsabilidad\u00bb (responsibility), utilizamos la palabra \u00abtarea\u00bb (concern) para indicar un nivel m\u00e1s alto de abstracci\u00f3n y un prop\u00f3sito m\u00e1s amplio del contenedor en comparaci\u00f3n con una clase de OOP. Y si el objetivo del SRP es tener solo una raz\u00f3n para los cambios, SCP est\u00e1 impulsado por el deseo de extender la capacidad de reutilizaci\u00f3n y reemplazo de los contenedores. Al seguir el SRP y crear un contenedor que resuelva una \u00fanica tarea y lo haga de manera funcionalmente completa, aumentas las posibilidades de reutilizar ese contenedor en diferentes contextos de aplicaci\u00f3n.<\/p>\n<p>El principio SCP establece que cada contenedor debe resolver una \u00fanica tarea y hacerlo bien. Adem\u00e1s, en el mundo de los contenedores se logra m\u00e1s f\u00e1cilmente SCP que SRP en el \u00e1mbito de OOP, ya que los contenedores generalmente realizan un \u00fanico proceso y, la mayor parte del tiempo, ese proceso se encarga de una \u00fanica tarea.<\/p>\n<p>Si alg\u00fan microservicio en contenedor debe resolver m\u00faltiples tareas, se puede descomponer en contenedores de una sola tarea y agruparlos dentro de un mismo pod (unidad de despliegue en la plataforma de contenedores) utilizando plantillas sidecar y contenedores init. Adem\u00e1s, SCP facilita la sustituci\u00f3n de un contenedor viejo (por ejemplo, un servidor web o un corredor de mensajes) por uno nuevo que resuelva la misma tarea pero que tenga funcionalidades ampliadas o que escale mejor.<\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/a029e1ca36ace66550c94087e4aecc8e.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>El principio de alta observabilidad (High Observability Principle, HOP)<\/h3>\n<p>\nAl utilizar contenedores como una forma unificada de empaquetar y ejecutar aplicaciones, las aplicaciones mismas se consideran como una \"caja negra\". Sin embargo, si se trata de contenedores en la nube, deben proporcionar a su entorno de ejecuci\u00f3n API especiales para controlar la integridad de los contenedores y tomar las medidas adecuadas cuando sea necesario. Sin esto, no se podr\u00e1 unificar la automatizaci\u00f3n de la actualizaci\u00f3n de contenedores y la gesti\u00f3n de su ciclo de vida, lo que, a su vez, deteriorar\u00e1 la resiliencia y la facilidad de uso del sistema de software.<\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/7df1320108d9b635c10c6cf41d5dfef6.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nEn la pr\u00e1ctica, una aplicaci\u00f3n en contenedor debe, como m\u00ednimo, tener una API para varios tipos de comprobaciones de integridad: pruebas de actividad (liveness) y pruebas de preparaci\u00f3n (readiness). Si la aplicaci\u00f3n reclama m\u00e1s, tambi\u00e9n debe proporcionar otros medios para controlar su estado. Por ejemplo, registrando eventos importantes a trav\u00e9s de STDERR y STDOUT para la agregaci\u00f3n de registros utilizando Fluentd, Logstash y otras herramientas similares. As\u00ed como integrar con bibliotecas de trazado y recolecci\u00f3n de m\u00e9tricas, como OpenTracing, Prometheus, etc.<\/p>\n<p>En general, una aplicaci\u00f3n a\u00fan puede considerarse como una \"caja negra\", pero debe estar equipada con todas las API necesarias para que la plataforma pueda monitorearla y gestionarla de la mejor manera posible.<\/p>\n<h3>Principio de conformidad con el ciclo de vida (Life-cycle Conformance Principle, LCP)<\/h3>\n<p>\nLCP es la ant\u00edtesis de HOP. Mientras que HOP establece que un contenedor debe proporcionar a la plataforma interfaces API para la lectura, LCP exige que la aplicaci\u00f3n tenga la capacidad de recibir informaci\u00f3n de la plataforma. Adem\u00e1s, el contenedor no solo debe recibir eventos, sino tambi\u00e9n adaptarse, es decir, reaccionar a ellos. De ah\u00ed el nombre del principio, que puede considerarse como un requerimiento para proporcionar a la plataforma interfaces API para la escritura.<\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/f32f5d133597ae3905206badc6677f92.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nLas plataformas tienen diferentes tipos de eventos que ayudan a gestionar el ciclo de vida del contenedor. Pero decidir cu\u00e1les de ellos recibir y c\u00f3mo reaccionar debe ser responsabilidad de la propia aplicaci\u00f3n.<\/p>\n<p>Es evidente que algunos eventos son m\u00e1s importantes que otros. Por ejemplo, si una aplicaci\u00f3n maneja mal el cierre inesperado, debe aceptar los mensajes signal: terminate (SIGTERM) e iniciar su procedimiento de cierre lo m\u00e1s r\u00e1pido posible, para conseguirlo antes de recibir el signal: kill (SIGKILL), que llega despu\u00e9s de SIGTERM.<\/p>\n<p>Adem\u00e1s, para el ciclo de vida de la aplicaci\u00f3n, pueden ser importantes eventos como PostStart y PreStop. Por ejemplo, despu\u00e9s del inicio, la aplicaci\u00f3n puede necesitar un tiempo de \"calentamiento\" antes de poder responder a las solicitudes. O la aplicaci\u00f3n debe liberar recursos de una manera especial al cerrarse.<\/p>\n<h3>Principio de inmutabilidad de la imagen del contenedor (Image Immutability Principle, IIP)<\/h3>\n<p>\nSe acepta generalmente que las aplicaciones en contenedores deben permanecer invariables despu\u00e9s de la construcci\u00f3n, incluso si se ejecutan en diferentes entornos. De aqu\u00ed surge la necesidad de externalizar el almacenamiento de datos en tiempo de ejecuci\u00f3n (en otras palabras, utilizar herramientas externas para esto), as\u00ed como confiar en configuraciones externas, adaptadas a un entorno de ejecuci\u00f3n espec\u00edfico, en lugar de modificar o crear contenedores \u00fanicos para cada entorno. Despu\u00e9s de cualquier cambio en la aplicaci\u00f3n, la imagen del contenedor debe ser reconstruida y desplegada en todos los entornos utilizados. Por cierto, en la gesti\u00f3n de sistemas de TI se utiliza un principio similar, conocido como el principio de inmutabilidad de los servidores y la infraestructura. <\/p>\n<p>El objetivo del IIP es prevenir la creaci\u00f3n de im\u00e1genes de contenedores separadas para diferentes entornos de ejecuci\u00f3n y utilizar la misma imagen en todas partes, junto con la configuraci\u00f3n apropiada para un entorno espec\u00edfico. Seguir este principio permite implementar pr\u00e1cticas importantes para la automatizaci\u00f3n de sistemas en la nube, como el retroceso (roll-back) y la implementaci\u00f3n (roll-forward) de actualizaciones de la aplicaci\u00f3n.<\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/86b93724830b37f82bf289b797407480.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Principio de desechabilidad de procesos (Process Disposability Principle, PDP)<\/h3>\n<p>\nUna de las caracter\u00edsticas m\u00e1s importantes de un contenedor es su efimeridad: una instancia de contenedor se puede crear f\u00e1cilmente y destruirse f\u00e1cilmente, por lo que en cualquier momento se puede reemplazar f\u00e1cilmente por otra instancia. Hay muchas razones para tal reemplazo: fallo en la prueba de integridad, escalado de la aplicaci\u00f3n, migraci\u00f3n a otro host, agotamiento de recursos de la plataforma u otras situaciones. <\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/858287b23c276363313e35cf18b81190.jpg\" style=\"display:block;margin: 0 auto;\" \/> <br \/>\nComo resultado, las aplicaciones en contenedores deben mantener su estado utilizando alg\u00fan medio externo, o usar esquemas distribuidos internos con redundancia. Adem\u00e1s, la aplicaci\u00f3n debe iniciarse r\u00e1pidamente y finalizar su ejecuci\u00f3n con agilidad, as\u00ed como estar preparadas para un fallo fatal inesperado del hardware.<\/p>\n<p>Una de las pr\u00e1cticas que ayuda a implementar este principio es crear contenedores de tama\u00f1o peque\u00f1o. Los entornos en la nube pueden seleccionar autom\u00e1ticamente el anfitri\u00f3n para ejecutar una instancia del contenedor, por lo que cuanto m\u00e1s peque\u00f1o sea el tama\u00f1o del contenedor, m\u00e1s r\u00e1pido se iniciar\u00e1; simplemente se copia m\u00e1s r\u00e1pidamente en el anfitri\u00f3n de destino a trav\u00e9s de la red.<\/p>\n<h3>Principio de autosuficiencia (Self-containment Principle, S-CP)<\/h3>\n<p>\nDe acuerdo con este principio, en la etapa de construcci\u00f3n se incluyen todos los componentes necesarios en el contenedor. El contenedor debe construirse asumiendo que en el sistema solo hay un n\u00facleo Linux limpio, por lo que todas las bibliotecas adicionales necesarias deben estar dentro del propio contenedor. Tambi\u00e9n deben incluirse cosas como el entorno de ejecuci\u00f3n para el lenguaje de programaci\u00f3n correspondiente, la plataforma de aplicaciones (si es necesario) y otras dependencias que ser\u00e1n necesarias durante la ejecuci\u00f3n de la aplicaci\u00f3n en contenedor. <\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/ecc7425510d63e4914c0c9a7e90b02a6.jpg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Las excepciones solo se hacen para configuraciones que var\u00edan de un entorno a otro y deben proporcionarse en la etapa de ejecuci\u00f3n, por ejemplo, a trav\u00e9s de Kubernetes ConfigMap.<\/p>\n<p>La aplicaci\u00f3n puede incluir varios componentes en contenedores, como un contenedor de base de datos separado en una aplicaci\u00f3n web en contenedor. Seg\u00fan el principio S-CP, estos contenedores no deben combinarse en uno solo, sino que el contenedor de la base de datos debe contener todo lo necesario para el funcionamiento de la base de datos, mientras que el contenedor de la aplicaci\u00f3n web debe incluir todo lo necesario para el funcionamiento de la aplicaci\u00f3n web, incluido el servidor web. Como resultado, durante la ejecuci\u00f3n, el contenedor de la aplicaci\u00f3n web depender\u00e1 del contenedor de la base de datos y se comunicar\u00e1 con \u00e9l seg\u00fan sea necesario.<\/p>\n<h3>Principio de confinamiento en tiempo de ejecuci\u00f3n (Runtime Confinement Principle, RCP)<\/h3>\n<p>\nEl principio S-CP define c\u00f3mo debe ensamblarse un contenedor y qu\u00e9 debe contener el archivo binario de la imagen. Pero un contenedor no es solo una \"caja negra\" que tiene una sola caracter\u00edstica: el tama\u00f1o del archivo. Durante la ejecuci\u00f3n, el contenedor adquiere otras dimensiones: el volumen de memoria utilizada, el tiempo de CPU y otros recursos del sistema.<\/p>\n<p><img decoding=\"async\" alt=\"5 principios de sentido com\u00fan para crear aplicaciones nativas en la nube\" src=\"\/wp-content\/uploads\/2019\/06\/a52e6a656892e57479ac014a3e6f4316.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nY aqu\u00ed es donde entra en juego el principio RCP, de acuerdo al cual el contenedor debe desacoplar sus requisitos de recursos del sistema y transmitirlos a la plataforma. Con los perfiles de recursos de cada contenedor (cu\u00e1ntos recursos de CPU, memoria, red y sistema de disco necesita), la plataforma puede realizar la programaci\u00f3n y el escalado autom\u00e1tico de manera \u00f3ptima, gestionar las capacidades de TI y mantener los niveles SLA para los contenedores.<\/p>\n<p>Adem\u00e1s de satisfacer los requisitos de recursos del contenedor, la aplicaci\u00f3n tambi\u00e9n es importante para no sobrepasar los l\u00edmites que ella misma ha definido. De lo contrario, en caso de escasez de recursos, la plataforma tendr\u00e1 m\u00e1s probabilidades de incluirla en la lista de aplicaciones que deben ser detenidas o migradas.<\/p>\n<p>Hablando de orientaci\u00f3n hacia la nube, nos referimos principalmente a la forma de trabajar. <br \/>\nHemos formulado anteriormente una serie de principios generales que establecen la base metodol\u00f3gica para construir aplicaciones de contenedores de calidad para entornos en la nube.<\/p>\n<p>Cabe destacar que adem\u00e1s de estos principios generales, tambi\u00e9n necesitar\u00e1 m\u00e9todos y t\u00e9cnicas avanzadas adicionales para trabajar con contenedores. Adem\u00e1s, tenemos algunas recomendaciones breves que son de car\u00e1cter m\u00e1s espec\u00edfico y deben aplicarse (o no aplicarse) seg\u00fan la situaci\u00f3n:<\/p>\n<ul>\n<li>Intente reducir el tama\u00f1o de las im\u00e1genes: elimine archivos temporales y no instale paquetes innecesarios; cuanto menor sea el tama\u00f1o del contenedor, m\u00e1s r\u00e1pido se ensamblar\u00e1 y copiar\u00e1 en el host de destino a trav\u00e9s de la red.<\/li>\n<li>Ap\u00e9guese a un User-ID arbitrario: no utilice el comando sudo o ning\u00fan userid especial para ejecutar sus contenedores.<\/li>\n<li>Etiquete puertos importantes: los n\u00fameros de puerto se pueden definir tambi\u00e9n durante la ejecuci\u00f3n, pero es mejor especificarlos mediante el comando EXPOSE; ser\u00e1 m\u00e1s f\u00e1cil para otros usuarios y programas utilizar sus im\u00e1genes. <\/li>\n<li>Almacene datos persistentes en vol\u00famenes: los datos que deben permanecer despu\u00e9s de la eliminaci\u00f3n del contenedor deben escribirse en vol\u00famenes.<\/li>\n<li>Escriba los metadatos de la imagen: las etiquetas, marcas y anotaciones facilitan el uso de im\u00e1genes; otros desarrolladores se lo agradecer\u00e1n.<\/li>\n<li>Sincronice el host y las im\u00e1genes: algunas aplicaciones de contenedores requieren la sincronizaci\u00f3n del contenedor con el host en ciertos atributos, como la hora o el identificador de la m\u00e1quina.<\/li>\n<li>Para concluir, compartimos plantillas y mejores pr\u00e1cticas que ayudar\u00e1n a implementar de manera m\u00e1s efectiva los principios mencionados anteriormente:<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.slideshare.net\/luebken\/container-patterns\">www.slideshare.net\/luebken\/container-patterns<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/engine\/userguide\/eng-image\/dockerfile_best-practices\">docs.docker.com\/engine\/userguide\/eng-image\/dockerfile_best-practices<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"http:\/\/docs.projectatomic.io\/container-best-practices\">docs.projectatomic.io\/container-best-practices<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/docs.openshift.com\/enterprise\/3.0\/creating_images\/guidelines.html\">docs.openshift.com\/enterprise\/3.0\/creating_images\/guidelines.html<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/system\/files\/conference\/hotcloud16\/hotcloud16_burns.pdf\">www.usenix.org\/system\/files\/conference\/hotcloud16\/hotcloud16_burns.pdf<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/leanpub.com\/k8spatterns\/\">leanpub.com\/k8spatterns<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/12factor.net\/\">12factor.net<\/a><\/noindex><\/li>\n<\/ul>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?intcmp=701f20000012s47AAA&amp;PKFormID=0x5789474c4\"><b>Webinar sobre la nueva versi\u00f3n de OpenShift Container Platform \u2013 4<\/b><\/a><\/noindex><br \/>\n11 de junio a las 11:00<\/p>\n<p>Lo que aprender\u00e1:<\/p>\n<ul>\n<li>Red Hat Enterprise Linux CoreOS Inmutable<\/li>\n<li>Malla de servicios OpenShift<\/li>\n<li>Marco de operadores<\/li>\n<li>Marco de Knative<\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/455024\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445. \u041e\u0431\u044b\u0447\u043d\u043e \u043e\u043d\u0438 \u0441\u0442\u0440\u043e\u044f\u0442\u0441\u044f \u043a\u0430\u043a \u043d\u0430\u0431\u043e\u0440 \u0441\u043b\u0430\u0431\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439. \u0422\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0433\u043e\u0442\u043e\u0432\u044b \u043a \u0441\u0431\u043e\u044f\u043c, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043d\u0430\u0434\u0435\u0436\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0438 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u0436\u0435 \u043f\u0440\u0438 \u0441\u0435\u0440\u044c\u0435\u0437\u043d\u044b\u0445 \u043e\u0442\u043a\u0430\u0437\u0430\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043d\u043e\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f. \u041e\u0431\u0440\u0430\u0442\u043d\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043c\u0435\u0434\u0430\u043b\u0438 \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":26340,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[702],"tags":[],"class_list":["post-35006","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.\" \/>\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\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\" \/>\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\udd475 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f cloud-native apps | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps\" \/>\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=\"2019-10-31T19:01:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:01:47+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\udd475 principios de sentido com\u00fan para crear aplicaciones nativas de la nube | ProHoster","description":"Las aplicaciones \"nativas de la nube\" o simplemente \"en la nube\" est\u00e1n dise\u00f1adas espec\u00edficamente para funcionar en infraestructuras de nube.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","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\udd475 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u043e\u0432 \u0437\u0434\u0440\u0430\u0432\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f cloud-native apps | ProHoster","og:description":"\u00ab\u041e\u0431\u043b\u0430\u0447\u043d\u043e-\u043e\u0440\u0438\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435\u00bb (cloud native) \u0438\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u00ab\u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0435\u00bb \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u044e\u0442\u0441\u044f \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430\u0445.","og:url":"https:\/\/prohoster.info\/es\/blog\/news\/5-printsipov-zdravogo-smysla-dlya-sozdaniya-cloud-native-apps","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":"2019-10-31T19:01:47+00:00","article:modified_time":"2019-10-31T19:01:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"35006","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":"2026-01-21 21:27:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 02:11:30","updated":"2026-01-21 21:27:19","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\/35006","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=35006"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/35006\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/26340"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=35006"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=35006"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=35006"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}