{"id":24592,"date":"2026-09-16T14:44:28","date_gmt":"2026-09-16T14:44:28","guid":{"rendered":"https:\/\/www.mailgun.com\/blog\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/"},"modified":"2026-09-16T14:44:28","modified_gmt":"2026-09-16T14:44:28","slug":"creacion-de-entornos-de-desarrollo-con-kubernetes-devgun","status":"publish","type":"blog","link":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/","title":{"rendered":"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Cuando abordamos por primera vez el problema de crear entornos de desarrollo locales, recurrimos a herramientas comunes como vagrant. Pero, como ocurre con la mayor\u00eda de los entornos creados con vagrant, los tiempos de compilaci\u00f3n son largos. Esto significa que las im\u00e1genes de vagrant tienen una larga vida \u00fatil y tienden a desfasarse con el tiempo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nuestros servicios e infraestructura cambian constantemente, por lo que la compilaci\u00f3n de vagrant casi siempre fallaba. Quer\u00edamos evitar el tradicional \u201crito de iniciaci\u00f3n de las nuevas incorporaciones al equipo de desarrollo\u201d, que f\u00e1cilmente conlleva d\u00edas de trabajo para lograr que vagrant compile con \u00e9xito una nueva m\u00e1quina virtual de desarrollo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lo ideal es que el nuevo personal de desarrollo pueda ser productivo a las pocas horas de su contrataci\u00f3n, y no en d\u00edas o semanas.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A todo esto se sumaba el hecho de que tenemos muchos microservicios que deben ejecutarse en el entorno de desarrollo e integrarse a la perfecci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><b>Los objetivos del proyecto eran sencillos:<\/b><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Configurar y destruir un entorno de desarrollo r\u00e1pidamente y de forma reproducible.<\/li>\n\n\n\n<li>Configuraci\u00f3n y desmantelamiento del entorno de desarrollo en un solo paso.<\/li>\n\n\n\n<li>Iniciar y detener servicios, incluidas sus dependencias, a voluntad.<\/li>\n<\/ul>\n\n\n\r\n    <nav data-content-type=\"longform\" class=\"toc-block longform-spacings px-5 py-6 px-md-6 px-lg-7 py-md-7 bg-light fs-sm rounded-lg\" aria-labelledby=\"toc-title-2726\"><p class=\"h5 m-0\" id=\"toc-title-2726\">\u00cdndice<\/p><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">01<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#evaluacion-de-plataformas-de-orquestacion\">Evaluaci\u00f3n de plataformas de orquestaci\u00f3n<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">02<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#creacion-de-una-cli\">Creaci\u00f3n de una CLI<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">03<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#gestion-de-servicios-personalizados-y-de-terceros-con-una-especificacion\">Gesti\u00f3n de servicios personalizados y de terceros con una especificaci\u00f3n<\/a><\/div><\/div><div class=\"d-flex mt-3\"><div class=\"w-auto fw-bold text-accent d-flex me-2\">04<\/div><div class=\"d-flex flex-column\"><a class=\"fw-bold scrollme link-body-color text-accent\" href=\"#siguientes-pasos-trabajo-futuro\">Siguientes pasos: trabajo futuro<\/a><\/div><\/div><\/nav>\n\n\n<h2 class=\"wp-block-heading\">Evaluaci\u00f3n de plataformas de orquestaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como nuestros microservicios ya se ejecutaban en contenedores, sab\u00edamos que necesit\u00e1bamos elegir un sistema de orquestaci\u00f3n.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Varias personas de nuestro equipo de desarrollo estaban interesadas en\u00a0<a href=\"https:\/\/mesosphere.github.io\/marathon\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Mesos Marathon<\/a>, as\u00ed que lo probamos primero. Por desgracia, los requisitos de memoria y hardware necesarios para ejecutar marathon en un peque\u00f1o entorno de desarrollo local eran demasiado restrictivos para nuestros fines. En el momento de las pruebas, minimesos tampoco era capaz de conectar correctamente en red los contenedores de Marathon con la red local, un obst\u00e1culo importante para nuestro proyecto. <b>Estos problemas dejaron claro que Mesos resultar\u00eda poco pr\u00e1ctico para nuestras necesidades.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A continuaci\u00f3n, evaluamos Kubernetes y\u00a0<a href=\"https:\/\/kubernetes.io\/docs\/tasks\/tools\/install-minikube\/\" target=\"_tabs\" rel=\"noopener noreferrer\">Minikube<\/a>\u00a0ya que nos atra\u00eda la activa comunidad que rodeaba a estos proyectos. Descubrimos que el consumo de memoria era m\u00ednimo y que la conexi\u00f3n de red funcionaba a la perfecci\u00f3n. La mayor\u00eda de las funciones que nos interesaban funcionaban de forma predeterminada, y lograr que nuestras aplicaciones de terceros se ejecutaran en Minikube result\u00f3 m\u00e1s f\u00e1cil de lo esperado.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">As\u00ed que, con Minikube como plataforma elegida, pudimos avanzar en el proyecto r\u00e1pidamente y dedicar la mayor parte de nuestro tiempo a desarrollar lo que se convertir\u00eda en Devgun.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Creaci\u00f3n de una CLI<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Para alcanzar los objetivos de nuestro proyecto, decidimos crear una interfaz de l\u00ednea de comandos todo en uno escrita en Golang. Quer\u00edamos una CLI que se pudiera distribuir como un \u00fanico binario a nuestro equipo de desarrollo, as\u00ed que creamos una llamada Devgun.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" class=\"wp-image-4854\" width=\"800\" height=\"458\" src=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun.jpg\" alt=\"Minikube and Mailgun logos with plus symbol in between\" srcset=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun.jpg 800w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun-300x172.jpg 300w, https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/minikube-mailgun-devgun-768x440.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Devgun no da nada por sentado sobre el entorno de desarrollo. Descarga autom\u00e1ticamente todas las herramientas que necesita, incluidas Minikube, kubectl y herramientas espec\u00edficas de Mailgun, en el directorio\u00a0<code>\/.devgun\/bin<\/code>. <b>Lo \u00fanico que tienes que hacer es a\u00f1adir tu ruta tras completar la configuraci\u00f3n inicial. Instalar todo en un \u00fanico directorio hace que desinstalar sea tan sencillo como\u00a0<\/b><b><code>rm -rf ~\/devgun<\/code><\/b><b>.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Compilamos todos los archivos de manifiesto de kubernetes en el binario est\u00e1tico mediante el\u00a0<a href=\"http:\/\/github.com\/tmthrgd\/go-bindata\" target=\"_tabs\" rel=\"noopener noreferrer\">proyecto go-bindata<\/a>, lo que permite descargar y ejecutar un solo archivo para instalar un entorno de desarrollo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La ejecuci\u00f3n de Devgun es la siguiente:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    $ devgun startrnPulling kubectl                              [done]  rnPulling minikube                             [done]  rnWriting Minikube configuration               [done after 0.702698 seconds]  rnBooting Minikube environment                 [done after 77.297039 seconds]  rnWaiting for Kubernetes..                     [done]  rnINFO[0148] Setting up minikube routes -- enter your sudo password if prompted  rnModifying routes                             [done after 0.012867 seconds]  rnAdding kube-dns resolver entry               [done after 0.002070 seconds]  rnApplying kube-dns-external configuration     [done after 0.212881 seconds]  rnEnabling Heapster                            [done after 37.506335 seconds]  rn========================================================rnMinikube is now configured and running....rnrn# Set up path for our bin directory with dev toolsrnexport PATH=&quot;$PATH:\/Users\/thrawn\/.devgun\/bin&quot;rnrnNext you should choose a mailgun service to start using &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;devgun service start&lt;\/code&gt;rnrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;devgun service list&lt;\/code&gt; to see a list of services to startrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;devgun service start&lt;\/code&gt; to start a service and its dependenciesrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;kubectl get pods&lt;\/code&gt; to list running podsrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;kubectl describe pod &lt;pod-name&gt;&lt;\/code&gt; to inspect a pod and see the pod logrn* Use &lt;code data-enlighter-language=&quot;generic&quot; class=&quot;EnlighterJSRAW&quot;&gt;kubectl log &lt;pod-name&gt;&lt;\/code&gt; to see the container logsrn========================================================rn\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Adem\u00e1s de crear un entorno de Kubernetes, Devgun tambi\u00e9n a\u00f1ade algunas rutas de red a la m\u00e1quina local. Por ejemplo, en OS X se a\u00f1aden las siguientes rutas:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>route -n add 172.17.0.0\/16 <br>\nroute -n add 10.0.0.0\/24   <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Esto permite a nuestro equipo de desarrollo ejecutar y probar aplicaciones en sus m\u00e1quinas locales con conectividad total a los contenedores del cl\u00faster k8, como si se estuvieran ejecutando en el propio cl\u00faster. Tambi\u00e9n habilitamos la b\u00fasqueda de DNS mediante la funci\u00f3n de resoluci\u00f3n integrada en OS X. Creamos\u00a0<code>\/etc\/resolver\/local<\/code>\u00a0con el contenido:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>search cluster.local svc.cluster.local default.svc.cluster.local<br>\nnameserver 172.17.0.3  <\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">De este modo, se habilita la resoluci\u00f3n de DNS de los servicios de kubernetes.<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    $ devgun service start etcdrnStarting service: etcd                       [done after 7.084730 seconds]rnrn$ ping etcdrnPING etcd.default.svc.cluster.local (172.17.0.4): 56 data bytes  rn64 bytes from 172.17.0.4: icmp_seq=0 ttl=63 time=0.220 ms  rn^Crn--- etcd.default.svc.cluster.local ping statistics ---rn1 packets transmitted, 1 packets received, 0.0% packet loss  rnround-trip min\/avg\/max\/stddev = 0.220\/0.220\/0.220\/0.000 ms  \r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<h2 class=\"wp-block-heading\">Gesti\u00f3n de servicios personalizados y de terceros con una especificaci\u00f3n<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Como Devgun tiene que gestionar una combinaci\u00f3n de servicios personalizados y de terceros, desarrollamos un archivo de especificaci\u00f3n yaml personalizado que definimos para cada servicio. El archivo de especificaci\u00f3n tiene este aspecto:<\/p>\n\n\n    <div data-content-type=\"longform\" class=\"code-snippet longform-spacings rounded-lg overflow-hidden shadow \" data-count=\"1\">\r\n        <ul class=\"nav nav-buttons code-snippet__tabs longform-except position-relative d-flex gap-2 flex-wrap p-3\" role=\"tablist\">\r\n\r\n                            \r\n                    \r\n                        <li class=\"nav-item\" role=\"presentation\">\r\n                            <button class=\"nav-link active\" data-bs-toggle=\"tab\" data-bs-target=\"#code_0\" type=\"button\" role=\"tab\" aria-controls=\"code_0\" aria-selected=\"true\">\r\n                                PHP                            <\/button>\r\n                        <\/li>\r\n\r\n                    \r\n                            \r\n        <\/ul>\r\n        <div class=\"code-snippet__tab-content tab-content\">\r\n\r\n                            \r\n                    <div class=\"tab-pane show active\" id=\"code_0\" role=\"tabpanel\" aria-labelledby=\"code_0\">\r\n                        <div class=\"code-snippet__code-wrapper\">\r\n                            <div class=\"nav nav-buttons code-snippet__copy-wrapper\">\r\n                                <button type=\"button\" class=\"nav-link code-snippet__copy\" data-clipboard-target=\"#code_0_content\" data-clipboard-label=\"Copia al portapapeles\" data-clipboard-success-label=\"\u00a1Copiado!\" data-clipboard-error-label=\"No se ha podido copiar\" data-tooltip=\"Copia al portapapeles\" data-tooltip-placement=\"left\" role=\"tooltip\" aria-label=\"Copia al portapapeles\">\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--default\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/file-stack.svg\"><\/svg>\r\n                                    <svg class=\"code-snippet__copy-icon code-snippet__copy-icon--success\" width=\"24\" height=\"24\" aria-hidden=\"true\" data-url=\"https:\/\/www.mailgun.com\/wp-content\/plugins\/sinch-core\/assets\/icons\/sinch\/badge-check.svg\"><\/svg>\r\n                                <\/button>\r\n                            <\/div>\r\n                            <pre class=\"w-100 h-100 m-0 line-numbers language-PHP\">\r\n                                <code id=\"code_0_content\" class=\"language-PHP\">\r\n\r\n                                    ervice:  rn  name: scoutrn  resources:rn    &lt;&lt;: *k8s_deploy_resourcesrn  depends_on:rn  - name: vulcandrn  - name: cassandrarn  - name: kafka-pixyrn  - name: kafkarn  - name: etcdrn  - name: metricsrn  hooks:rn    pre:rn      start:rn        - exec: &gt;rn            cqlsh -e &quot;CREATE KEYSPACE IF NOT EXISTS scout WITH REPLICATION={&#039;class&#039;:&#039;SimpleStrategy&#039;,&#039;replication_factor&#039;:1}&quot; $POD_IPrn          where: service:cassandra:cassandra\r\n                                <\/code>\r\n                            <\/pre>\r\n                        <\/div>\r\n                    <\/div>\r\n                                    <\/div>\r\n    <\/div>\r\n\n\n\n<p class=\"wp-block-paragraph\">Define un servicio personalizado llamado \u201cscout\u201d que lee eventos de Kafka y registra anal\u00edticas sobre dichos eventos en Cassandra. La especificaci\u00f3n le indica a devgun de qu\u00e9 servicios personalizados y de terceros depende, y <b>qu\u00e9 hooks ejecutar en los distintos contenedores antes de iniciar el servicio scout.<\/b><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La clave\u00a0<code>resources<\/code>\u00a0hace referencia a los archivos de manifiesto de kubernetes, como mapas de configuraci\u00f3n, implementaciones y descripciones de servicios, definidos en otra parte del archivo de especificaci\u00f3n que devgun utiliza para iniciar los contenedores en K8.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Siguientes pasos: trabajo futuro<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cuando dise\u00f1amos Devgun, empezamos desde cero sin tener en cuenta las historias m\u00e1s amplias de desarrollo e implementaci\u00f3n. Ahora que hemos tenido tiempo de usar Devgun, nos preguntamos si hicimos bien las abstracciones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Empezamos a hacernos preguntas: \u00bfqu\u00e9 experiencia queremos que tenga nuestro equipo de desarrollo cuando se siente a crear e implementar un nuevo servicio? \u00bfD\u00f3nde terminan las responsabilidades del equipo de desarrollo y empiezan las de operaciones? \u00bfQu\u00e9 parte de las operaciones podemos automatizar y qu\u00e9 parte requiere interacci\u00f3n humana? \u00bfC\u00f3mo facilitamos la transmisi\u00f3n de informaci\u00f3n entre el equipo de desarrollo y el de operaciones?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hemos empezado a definir historias y perfiles que dar\u00e1n forma a <b>la evoluci\u00f3n de Devgun de cara al futuro<\/b>. En mi pr\u00f3xima publicaci\u00f3n, compartir\u00e9 parte de nuestro trabajo y reflexiones sobre c\u00f3mo podr\u00eda evolucionar la experiencia de desarrollo a medida que sigamos trabajando con Kubernetes y Devgun. No olvides suscribirte a nuestro blog para no perderte nada.<\/p>\n\n\n\r\n    <aside data-content-type=\"longform\"  class=\"banner-block longform-spacings rounded-lg shadow-lg px-5 py-6 px-md-6 py-md-7 p-lg-7 bg-light\" data-theme=\"dark\" aria-labelledby=\"banner-block-block_ee5d9c026a852b983c05769931143883\">\r\n                    <p class=\"text-uppercase section-caption text-body-color\">\r\n                Reg\u00edstrate            <\/p>\r\n                            <p class=\"h4 text-accent fw-bold\" id=\"banner-block-block_ee5d9c026a852b983c05769931143883\">\r\n                Empezar es facil\u00edsimo. Y gratis.            <\/p>\r\n                            <div class=\"mb-0 text-body-color\">\r\n                                    <div class=\"content-body mb-0 text-body-color\">Descubre todo lo que puedes lograr con la mejor plataforma de entrega de emails del mundo.<\/div>\r\n                            <\/div>\r\n        \r\n        <div class=\"text-start mt-5\"><a href=\"https:\/\/signup.mailgun.com\/new\/signup\"  class=\"btn btn-secondary\" >Get started<\/a><\/div>\r\n    <\/aside>\r\n\r\n","protected":false},"excerpt":{"rendered":"<p>Cuando abordamos por primera vez el problema de crear entornos de desarrollo locales, recurrimos a herramientas comunes como vagrant. Pero, como ocurre con la mayor\u00eda de los entornos creados con vagrant, los tiempos de compilaci\u00f3n son largos. Esto significa que las im\u00e1genes de vagrant tienen una larga vida \u00fatil y tienden a desfasarse con el tiempo.<\/p>\n","protected":false},"author":35,"featured_media":4843,"menu_order":0,"template":"","meta":{"_acf_changed":true,"footnotes":""},"blog_category":[23],"class_list":["post-24592","blog","type-blog","status-publish","has-post-thumbnail","hentry","blog_category-it-and-engineering"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes - Transactional Email API Service For Developers | Mailgun<\/title>\n<meta name=\"description\" content=\"La primera vez que abordamos el problema de crear entornos de desarrollo locales recurrimos a herramientas comunes, pero, para las necesidades de nuestro proyecto, descubrimos que Kubernetes se adaptaba mejor.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes - Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:description\" content=\"La primera vez que abordamos el problema de crear entornos de desarrollo locales recurrimos a herramientas comunes, pero, para las necesidades de nuestro proyecto, descubrimos que Kubernetes se adaptaba mejor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/\" \/>\n<meta property=\"og:site_name\" content=\"Transactional Email API Service For Developers | Mailgun\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png\" \/>\n\t<meta property=\"og:image:width\" content=\"720\" \/>\n\t<meta property=\"og:image:height\" content=\"448\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/\",\"name\":\"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes - Transactional Email API Service For Developers | Mailgun\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"datePublished\":\"2026-09-16T14:44:28+00:00\",\"description\":\"La primera vez que abordamos el problema de crear entornos de desarrollo locales recurrimos a herramientas comunes, pero, para las necesidades de nuestro proyecto, descubrimos que Kubernetes se adaptaba mejor.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/MG-Blog-IT-Engineering.png\",\"width\":720,\"height\":448},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/it-and-engineering\\\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Blog\",\"item\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#website\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"description\":\"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#organization\",\"name\":\"Transactional Email API Service For Developers | Mailgun\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"contentUrl\":\"https:\\\/\\\/www.mailgun.com\\\/wp-content\\\/uploads\\\/2025\\\/06\\\/cropped-android-chrome-512x512-1.png\",\"width\":512,\"height\":512,\"caption\":\"Transactional Email API Service For Developers | Mailgun\"},\"image\":{\"@id\":\"https:\\\/\\\/www.mailgun.com\\\/es\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes - Transactional Email API Service For Developers | Mailgun","description":"La primera vez que abordamos el problema de crear entornos de desarrollo locales recurrimos a herramientas comunes, pero, para las necesidades de nuestro proyecto, descubrimos que Kubernetes se adaptaba mejor.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/","og_locale":"es_ES","og_type":"article","og_title":"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes - Transactional Email API Service For Developers | Mailgun","og_description":"La primera vez que abordamos el problema de crear entornos de desarrollo locales recurrimos a herramientas comunes, pero, para las necesidades de nuestro proyecto, descubrimos que Kubernetes se adaptaba mejor.","og_url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/","og_site_name":"Transactional Email API Service For Developers | Mailgun","og_image":[{"width":720,"height":448,"url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/","url":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/","name":"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes - Transactional Email API Service For Developers | Mailgun","isPartOf":{"@id":"https:\/\/www.mailgun.com\/es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/#primaryimage"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/#primaryimage"},"thumbnailUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","datePublished":"2026-09-16T14:44:28+00:00","description":"La primera vez que abordamos el problema de crear entornos de desarrollo locales recurrimos a herramientas comunes, pero, para las necesidades de nuestro proyecto, descubrimos que Kubernetes se adaptaba mejor.","breadcrumb":{"@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/#primaryimage","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/07\/MG-Blog-IT-Engineering.png","width":720,"height":448},{"@type":"BreadcrumbList","@id":"https:\/\/www.mailgun.com\/es\/blog\/it-and-engineering\/creacion-de-entornos-de-desarrollo-con-kubernetes-devgun\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.mailgun.com\/es\/"},{"@type":"ListItem","position":2,"name":"Blog","item":"https:\/\/www.mailgun.com\/es\/blog\/"},{"@type":"ListItem","position":3,"name":"Devgun: creaci\u00f3n de entornos de desarrollo con Kubernetes"}]},{"@type":"WebSite","@id":"https:\/\/www.mailgun.com\/es\/#website","url":"https:\/\/www.mailgun.com\/es\/","name":"Transactional Email API Service For Developers | Mailgun","description":"Potentes API de email transaccional que te permiten enviar, recibir y hacer seguimiento de emails, creadas pensando en los desarrolladores. \u00a1Descubre m\u00e1s!","publisher":{"@id":"https:\/\/www.mailgun.com\/es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.mailgun.com\/es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.mailgun.com\/es\/#organization","name":"Transactional Email API Service For Developers | Mailgun","url":"https:\/\/www.mailgun.com\/es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/","url":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","contentUrl":"https:\/\/www.mailgun.com\/wp-content\/uploads\/2025\/06\/cropped-android-chrome-512x512-1.png","width":512,"height":512,"caption":"Transactional Email API Service For Developers | Mailgun"},"image":{"@id":"https:\/\/www.mailgun.com\/es\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/24592","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/users\/35"}],"version-history":[{"count":0,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog\/24592\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media\/4843"}],"wp:attachment":[{"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/media?parent=24592"}],"wp:term":[{"taxonomy":"blog_category","embeddable":true,"href":"https:\/\/www.mailgun.com\/es\/wp-json\/wp\/v2\/blog_category?post=24592"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}