{"id":37475,"date":"2019-10-31T22:17:51","date_gmt":"2019-10-31T19:17:51","guid":{"rendered":"https:\/\/prohoster.info\/blog\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\/"},"modified":"2019-10-31T22:17:51","modified_gmt":"2019-10-31T19:17:51","slug":"instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","title":{"rendered":"Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/ad1f46a3562dcefacaa1722ee1ce3387.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEl enfoque moderno para la explotaci\u00f3n resuelve numerosos problemas urgentes de las empresas. Los contenedores y los orquestadores permiten escalar f\u00e1cilmente proyectos de cualquier complejidad, simplifican los lanzamientos de nuevas versiones y los hacen m\u00e1s confiables, pero al mismo tiempo crean problemas adicionales para los desarrolladores. Lo que m\u00e1s le preocupa a un programador es su c\u00f3digo: arquitectura, calidad, rendimiento, elegancia, y no c\u00f3mo se ejecutar\u00e1 en Kubernetes o c\u00f3mo testearlo y depurarlo despu\u00e9s de hacer incluso cambios m\u00ednimos. Por tanto, es muy l\u00f3gico que se est\u00e9n desarrollando activamente herramientas para Kubernetes que ayudan a resolver problemas incluso de los desarrolladores m\u00e1s 'arcaicos' y les permiten concentrarse en lo principal.<\/p>\n<p>Esta revisi\u00f3n presenta informaci\u00f3n breve sobre algunas herramientas que facilitan la vida al programador cuyo c\u00f3digo se ejecuta en los pods del cl\u00faster de Kubernetes.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Asistentes simples<\/h2>\n<p><\/p>\n<h3>Kubectl-debug<\/h3>\n<p><\/p>\n<ul>\n<li> Esencia: <b>agrega tu contenedor al Pod y observa lo que sucede en \u00e9l<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/aylei\/kubectl-debug\">GitHub<\/a><\/noindex>.<\/li>\n<li> Estad\u00edsticas en GH: 715 estrellas, 54 commits, 9 contribuyentes.<\/li>\n<li> Lenguaje: Go.<\/li>\n<li> Licencia: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nEste complemento para kubectl permite crear un contenedor adicional dentro del pod que te interesa, compartiendo el espacio de nombres de procesos con otros contenedores. En \u00e9l, se puede depurar el funcionamiento del pod: comprobar el funcionamiento de la red, escuchar el tr\u00e1fico de red, realizar un strace del proceso de inter\u00e9s, etc.<\/p>\n<p>Tambi\u00e9n puedes cambiar al contenedor del proceso ejecutando <code>chroot \/proc\/PID\/root<\/code> \u2014 esto es muy conveniente cuando necesitas obtener un shell root en un contenedor para el cual se ha establecido en el manifiesto <code>securityContext.runAs<\/code>.<\/p>\n<p>La herramienta es simple y efectiva, por lo que puede ser \u00fatil para cada desarrollador. Hablamos m\u00e1s sobre ella en <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">un art\u00edculo separado<\/a><\/noindex>.<\/p>\n<h3>Telepresence<\/h3>\n<p><\/p>\n<ul>\n<li> Esencia: <b>traslada la aplicaci\u00f3n a tu computadora. Desarrolla y depura localmente<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.telepresence.io\/\">Sitio web<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/telepresenceio\/telepresence\">GitHub<\/a><\/noindex>.<\/li>\n<li> Estad\u00edsticas en GH: 2131 estrellas, 2712 commits, 33 contribuyentes.<\/li>\n<li> Lenguaje: Python.<\/li>\n<li> Licencia: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nLa idea de esta herramienta es ejecutar un contenedor con la aplicaci\u00f3n en la computadora del usuario local y proxear todo el tr\u00e1fico del cl\u00faster hacia ella y de regreso. Este enfoque permite desarrollar localmente, simplemente modificando archivos en tu IDE favorito: los resultados estar\u00e1n disponibles de inmediato.<\/p>\n<p>Las ventajas de ejecutar localmente son la comodidad de realizar modificaciones y obtener resultados instant\u00e1neos, as\u00ed como la posibilidad de depurar la aplicaci\u00f3n de manera habitual. En cuanto a las desventajas, se requiere una buena velocidad de conexi\u00f3n, lo cual se nota especialmente al trabajar con aplicaciones que tienen un alto RPS y tr\u00e1fico. Adem\u00e1s, Telepresence tiene problemas con los vol\u00famenes en Windows, lo que puede ser un limitante decisivo para los desarrolladores acostumbrados a este sistema operativo.<\/p>\n<p>Ya hemos compartido nuestra experiencia usando Telepresence. <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<h3>Ksync<\/h3>\n<p><\/p>\n<ul>\n<li> Esencia: <b>sincronizaci\u00f3n casi instant\u00e1nea del c\u00f3digo con el contenedor en el cl\u00faster.<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/vapor-ware\/ksync\">GitHub<\/a><\/noindex>.<\/li>\n<li> Estad\u00edsticas breves en GH: 555 estrellas, 362 commits, 11 colaboradores.<\/li>\n<li> Lenguaje: Go.<\/li>\n<li> Licencia: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nLa utilidad permite sincronizar el contenido de un directorio local con el directorio de un contenedor en ejecuci\u00f3n en el cl\u00faster. Esta herramienta es ideal para desarrolladores que utilizan lenguajes de programaci\u00f3n de scripting, cuya principal dificultad es llevar el c\u00f3digo al contenedor en funcionamiento. Ksync est\u00e1 dise\u00f1ado para aliviar esta preocupaci\u00f3n.<\/p>\n<p>Con una sola inicializaci\u00f3n mediante el comando <code>ksync init<\/code> , se crea un DaemonSet en el cl\u00faster que se utiliza para rastrear el estado del sistema de archivos del contenedor seleccionado. En su computadora local, el desarrollador ejecuta el comando <code>ksync watch<\/code>, que monitorea las configuraciones y lanza <noindex><a rel=\"nofollow\" href=\"https:\/\/syncthing.net\/\">syncthing<\/a><\/noindex>, que realiza la sincronizaci\u00f3n directa de archivos con el cl\u00faster.<\/p>\n<p>Resta instruir a ksync sobre qu\u00e9 y c\u00f3mo sincronizar. Por ejemplo, el siguiente comando:<\/p>\n<pre><code class=\"plaintext\">ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false \/home\/user\/myproject\/ \/var\/www\/myproject\/<\/code><\/pre>\n<p>\n\u2026 crear\u00e1 un watcher llamado <code>myproject<\/code>, que buscar\u00e1 pods con la etiqueta <code>app=backend<\/code> y tratar\u00e1 de sincronizar el directorio local <code>\/home\/user\/myproject\/<\/code> con el directorio <code>\/var\/www\/myproject\/<\/code> del contenedor llamado <code>php<\/code>.<\/p>\n<p>Problemas y observaciones sobre ksync de nuestra experiencia:<\/p>\n<ul>\n<li> Los nodos del cl\u00faster de Kubernetes deben utilizar <code>overlay2<\/code> como controlador de almacenamiento para Docker. No funcionar\u00e1 con ninguna otra utilidad.<\/li>\n<li> Al utilizar Windows como sistema operativo cliente, puede haber un funcionamiento incorrecto del watcher del sistema de archivos. Este error se ha observado al trabajar con directorios grandes, que tienen una gran cantidad de archivos y subdirectorios. Hemos creado <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/syncthing\/syncthing\/issues\/5832\">un issue correspondiente<\/a><\/noindex> en el proyecto syncthing, pero hasta ahora no ha habido progreso (desde principios de julio).<\/li>\n<li> Utiliza el archivo <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.syncthing.net\/users\/ignoring.html\"><code>.stignore<\/code><\/a><\/noindex> para especificar rutas o patrones de archivos que no deben sincronizarse (por ejemplo, directorios <code>app\/cache<\/code> y <code>.git<\/code>).<\/li>\n<li> Por defecto, ksync reiniciar\u00e1 el contenedor con cada cambio de archivos. Esto es conveniente para Node.js, pero completamente innecesario para PHP. Es mejor desactivar opcache y usar la bandera <code>--reload=false<\/code>.<\/li>\n<li> La configuraci\u00f3n se puede corregir en <code>$HOME\/.ksync\/ksync.yaml<\/code>.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Squash<\/h3>\n<p><\/p>\n<ul>\n<li> Esencia: <b>depura procesos directamente en el cl\u00faster<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/solo-io\/squash\">GitHub<\/a><\/noindex>.<\/li>\n<li> Estad\u00edsticas breves de GH: 1154 estrellas, 279 commits, 23 contribuyentes.<\/li>\n<li> Lenguaje: Go.<\/li>\n<li> Licencia: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nEsta herramienta est\u00e1 dise\u00f1ada para depurar procesos directamente en los pods. La utilidad es simple y en modo interactivo permite seleccionar el depurador que se necesite. <i>(ver m\u00e1s abajo)<\/i> y namespace + pod, en el proceso en el que se necesita intervenir. Actualmente se admiten:<\/p>\n<ul>\n<li> delve \u2014 para aplicaciones en Go;<\/li>\n<li> GDB \u2014 a trav\u00e9s de target remote + reenv\u00edo de puerto;<\/li>\n<li> reenv\u00edo de puerto JDWP para depurar aplicaciones Java.<\/li>\n<\/ul>\n<p>\nDesde el lado de la IDE, el soporte est\u00e1 presente solo en VScode (con la ayuda de <noindex><a rel=\"nofollow\" href=\"https:\/\/marketplace.visualstudio.com\/items?itemName=ilevine.squash\">la extensi\u00f3n<\/a><\/noindex>), sin embargo, en los planes para el a\u00f1o actual (2019) est\u00e1n Eclipse e Intellij.<\/p>\n<p>Para depurar procesos, Squash inicia un contenedor privilegiado en los nodos del cl\u00faster, por lo que primero es necesario familiarizarse con las capacidades del <noindex><a rel=\"nofollow\" href=\"https:\/\/squash.solo.io\/secure_mode\/\">modo seguro<\/a><\/noindex> para evitar problemas de seguridad.<\/p>\n<h2>Soluciones complejas<\/h2>\n<p>\nPasamos a la artiller\u00eda pesada: proyectos m\u00e1s \"escalables\" destinados a cubrir muchas necesidades de los desarrolladores.<\/p>\n<p><i><b>NB<\/b>: En esta lista, sin duda, hay lugar para nuestra herramienta de c\u00f3digo abierto <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/333682\/\"><b>werf<\/b><\/a><\/noindex> (anteriormente conocida como dapp). Sin embargo, ya hemos escrito y hablado sobre ella varias veces, por lo que decidimos no incluirla en la revisi\u00f3n. Para quienes deseen conocer sus capacidades m\u00e1s de cerca, recomendamos leer\/escuchar la charla \"<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf \u2014 nuestra herramienta para CI\/CD en Kubernetes<\/a><\/noindex>\u00bb.<\/i><\/p>\n<h3>DevSpace<\/h3>\n<p><\/p>\n<ul>\n<li> Esencia: <b>para aquellos que quieren empezar a trabajar en Kubernetes, pero no desean profundizar en sus complejidades<\/b>.<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/devspace-cloud\/devspace\">GitHub<\/a><\/noindex>.<\/li>\n<li> Estad\u00edsticas breves de GH: 630 estrellas, 1912 commits, 13 contribuyentes.<\/li>\n<li> Lenguaje: Go.<\/li>\n<li> Licencia: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nSoluci\u00f3n de la empresa hom\u00f3nima, que proporciona cl\u00fasteres gestionados con Kubernetes para desarrollo colaborativo. La utilidad fue creada para cl\u00fasteres comerciales, pero funciona excelentemente con cualquier otro.<\/p>\n<p>Al ejecutar el comando <code>devspace init<\/code> en el directorio del proyecto se le propondr\u00e1 (en modo interactivo):<\/p>\n<ul>\n<li> elegir un cl\u00faster Kubernetes activo,<\/li>\n<li> usar el existente <code>Dockerfile<\/code> (o generar uno nuevo) para crear un contenedor basado en \u00e9l,<\/li>\n<li> elegir un repositorio para almacenar las im\u00e1genes de los contenedores, etc.<\/li>\n<\/ul>\n<p>\nDespu\u00e9s de todas estas acciones preparatorias, se puede comenzar el desarrollo ejecutando el comando <code>devspace dev<\/code>. Este construir\u00e1 el contenedor, lo cargar\u00e1 en el repositorio, desplegar\u00e1 la infraestructura en el cl\u00faster y comenzar\u00e1 la redirecci\u00f3n de puertos y la sincronizaci\u00f3n del contenedor con el directorio local.<\/p>\n<p>Opcionalmente, se le ofrecer\u00e1 acceder al contenedor a trav\u00e9s del terminal. No debe rechazar la oferta, ya que en realidad el contenedor se inicia con el comando sleep, y para pruebas reales, la aplicaci\u00f3n debe iniciarse manualmente.<\/p>\n<p>Finalmente, el comando <code>devspace deploy<\/code> despliega la aplicaci\u00f3n y la infraestructura relacionada en el cl\u00faster, despu\u00e9s de lo cual todo comienza a funcionar en modo de producci\u00f3n.<\/p>\n<p>Toda la configuraci\u00f3n del proyecto se almacena en el archivo <code>devspace.yaml<\/code>. Adem\u00e1s de la configuraci\u00f3n del entorno de desarrollo, tambi\u00e9n puede encontrar una descripci\u00f3n de la infraestructura, similar a los manifiestos est\u00e1ndar de Kubernetes, pero mucho m\u00e1s simplificada.<\/p>\n<p><img decoding=\"async\" alt=\"Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/7abbba3806facfb69ba4e3f9e0f18938.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>La arquitectura y los principales pasos para trabajar con DevSpace<\/i><\/p>\n<p>Adem\u00e1s, es f\u00e1cil agregar un componente predefinido (por ejemplo, una base de datos MySQL) o un Helm chart al proyecto. Para m\u00e1s detalles, consulte <noindex><a rel=\"nofollow\" href=\"https:\/\/devspace.cloud\/docs\/\">la documentaci\u00f3n<\/a><\/noindex> \u2014 no es complicado.<\/p>\n<h3>Skaffold<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/skaffold.dev\/\">Sitio web<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/skaffold\">GitHub<\/a><\/noindex>.<\/li>\n<li> Estad\u00edsticas breves de GH: 7423 estrellas, 4173 commits, 136 contribuyentes.<\/li>\n<li> Lenguaje: Go.<\/li>\n<li> Licencia: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nEsta utilidad de Google pretende cubrir todas las necesidades del desarrollador cuyo c\u00f3digo se ejecutar\u00e1 de alguna manera en un cl\u00faster de Kubernetes. Comenzar a usarla no es tan sencillo como con devspace: no hay interactividad, definici\u00f3n de lenguaje ni creaci\u00f3n autom\u00e1tica. <code>Dockerfile<\/code> aqu\u00ed no se le ofrecer\u00e1.<\/p>\n<p>Sin embargo, si eso no le asusta, aqu\u00ed hay lo que permite hacer Skaffold:<\/p>\n<ul>\n<li> Supervisar los cambios en el c\u00f3digo fuente.<\/li>\n<li> Sincronizarlo con el contenedor del pod, si no requiere compilaci\u00f3n.<\/li>\n<li> Construir contenedores con c\u00f3digo, si el lenguaje es interpretado, o compilar artefactos y empaquetarlos en contenedores.<\/li>\n<li> Verificar autom\u00e1ticamente las im\u00e1genes resultantes con <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/container-structure-test\">container-structure-test<\/a><\/noindex>.<\/li>\n<li> Etiquetar y cargar im\u00e1genes en Docker Registry.<\/li>\n<li> Desplegar la aplicaci\u00f3n en el cl\u00faster usando kubectl, Helm o kustomize.<\/li>\n<li> Hacer redirecci\u00f3n de puertos.<\/li>\n<li> Depurar aplicaciones escritas en Java, Node.js, Python.<\/li>\n<\/ul>\n<p>\nEl flujo de trabajo en varias variaciones se describe de manera declarativa en el archivo <code>skaffold.yaml<\/code>Para el proyecto, tambi\u00e9n se pueden definir varios perfiles en los que se pueden modificar parcial o totalmente las etapas de construcci\u00f3n y despliegue. Por ejemplo, para desarrollo, especificar una imagen base conveniente para el desarrollador, y para staging y producci\u00f3n, la m\u00ednima (+ usar <code>securityContext<\/code> o redefinir el cl\u00faster en el que se desplegar\u00e1 la aplicaci\u00f3n).<\/p>\n<p>La construcci\u00f3n de contenedores Docker puede llevarse a cabo de forma local o remota: en <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/cloud-build\/\">Google Cloud Build<\/a><\/noindex> o en un cl\u00faster usando <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\">Kaniko<\/a><\/noindex>. Tambi\u00e9n se soportan Bazel y Jib Maven\/Gradle. Para etiquetar, Skaffold admite m\u00faltiples estrategias: por hash de git commit, fecha\/hora, suma sha256 de los fuentes, etc.<\/p>\n<p>Es importante mencionar la posibilidad de probar contenedores. El marco mencionado anteriormente, container-structure-test, ofrece los siguientes m\u00e9todos de verificaci\u00f3n:<\/p>\n<ul>\n<li> Ejecuci\u00f3n de comandos en el contexto del contenedor con seguimiento de los c\u00f3digos de salida y verificaci\u00f3n de la 'salida' textual del comando.<\/li>\n<li> Verificaci\u00f3n de la existencia de archivos en el contenedor y la conformidad de los atributos con los especificados.<\/li>\n<li> Control del contenido de archivos mediante expresiones regulares.<\/li>\n<li> Verificaci\u00f3n de metadatos de la imagen (<code>ENV<\/code>, <code>ENTRYPOINT<\/code>, <code>VOLUMES<\/code> etc.).<\/li>\n<li> Verificaci\u00f3n de la compatibilidad de licencias.<\/li>\n<\/ul>\n<p>\nLa sincronizaci\u00f3n de archivos con el contenedor no se realiza de la manera m\u00e1s \u00f3ptima: Skaffold simplemente crea un archivo comprimido con los fuentes, lo copia y lo descomprime en el contenedor (debe tener tar instalado). Por lo tanto, si su tarea principal es la sincronizaci\u00f3n de c\u00f3digo, es mejor buscar una soluci\u00f3n especializada (ksync).<\/p>\n<p><img decoding=\"async\" alt=\"Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/a53647e9d3bf002c292dcae7a774e561.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Etapas principales del trabajo de Skaffold<\/i><\/p>\n<p>En general, la herramienta no permite abstraerse de los manifiestos de Kubernetes y no tiene ninguna interactividad, por lo que puede parecer dif\u00edcil de aprender. Pero en esto reside su ventaja: una mayor libertad de acci\u00f3n.<\/p>\n<h3>Garden<\/h3>\n<p><\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/garden.io\/\">Sitio web<\/a><\/noindex>; <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\">GitHub<\/a><\/noindex>.<\/li>\n<li> Estad\u00edsticas breves de GH: 1063 estrellas, 1927 commits, 17 contribuyentes.<\/li>\n<li> Lenguaje: TypeScript <i>(se planea dividir el proyecto en varios componentes, algunos de los cuales estar\u00e1n en Go, as\u00ed como crear un SDK para crear complementos en TypeScript\/JavaScript y Go)<\/i>.<\/li>\n<li> Licencia: Apache License 2.0.<\/li>\n<\/ul>\n<p>\nAl igual que Skaffold, Garden est\u00e1 orientado a la automatizaci\u00f3n de procesos de entrega de c\u00f3digo de aplicaciones en el cl\u00faster de K8s. Para ello, primero es necesario describir la estructura del proyecto en un archivo YAML y luego ejecutar el comando <code>garden dev<\/code>. Esto har\u00e1 toda la magia:<\/p>\n<ul>\n<li> Construir\u00e1 los contenedores con las diferentes partes del proyecto.<\/li>\n<li> Realizar\u00e1 pruebas de integraci\u00f3n y unitarias, si estas han sido descritas.<\/li>\n<li> Desplegar\u00e1 todos los componentes del proyecto en el cl\u00faster.<\/li>\n<li> En caso de que se modifique el c\u00f3digo fuente, reiniciar\u00e1 todo el pipeline.<\/li>\n<\/ul>\n<p>\nEl enfoque principal al utilizar esta herramienta se centra en la colaboraci\u00f3n de un cl\u00faster remoto por parte del equipo de desarrolladores. En este caso, si algunas etapas de construcci\u00f3n y prueba ya se han realizado, esto acelerar\u00e1 significativamente todo el proceso, ya que Garden podr\u00e1 utilizar los resultados en cach\u00e9.<\/p>\n<p>Un m\u00f3dulo del proyecto puede ser un contenedor, un contenedor de Maven, un Helm Chart, un manifiesto para <code>kubectl apply<\/code> o incluso una funci\u00f3n de OpenFaaS. Adem\u00e1s, cualquiera de los m\u00f3dulos se puede extraer de un repositorio Git remoto. Un m\u00f3dulo puede definir (o no) servicios, tareas y pruebas. Los servicios y las tareas pueden tener dependencias, lo que permite definir la secuencia de despliegue de un servicio determinado, as\u00ed como ordenar la ejecuci\u00f3n de tareas y pruebas.<\/p>\n<p>Garden proporciona al usuario un bonito dashboard (actualmente en <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/dashboard\">estado experimental<\/a><\/noindex>), donde se muestra el gr\u00e1fico del proyecto: componentes, secuencia de construcci\u00f3n, ejecuci\u00f3n de tareas y pruebas, as\u00ed como sus relaciones y dependencias. Directamente en el navegador, se pueden ver los registros de todos los componentes del proyecto y verificar qu\u00e9 devuelve cada componente a trav\u00e9s de HTTP (si, por supuesto, se ha declarado un recurso ingress para \u00e9l).<\/p>\n<p><img decoding=\"async\" alt=\"Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes\" src=\"\/wp-content\/uploads\/2019\/08\/931b48a306fcce025e4dd8aa51d01552.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Panel para Garden<\/i><\/p>\n<p>Esta herramienta tambi\u00e9n tiene un modo de hot-reload que simplemente sincroniza los cambios de los scripts con el contenedor en el cl\u00faster, acelerando dr\u00e1sticamente el proceso de depuraci\u00f3n de la aplicaci\u00f3n. Garden cuenta con un buen <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.garden.io\/\">documentaci\u00f3n<\/a><\/noindex> y decente <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/garden-io\/garden\/tree\/master\/examples\">conjunto de ejemplos<\/a><\/noindex>, lo que permite familiarizarse r\u00e1pidamente y comenzar a usarla. Por cierto, hace poco publicamos <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">la traducci\u00f3n de un art\u00edculo<\/a><\/noindex> de sus autores.<\/p>\n<h2>Conclusi\u00f3n<\/h2>\n<p>\nPor supuesto, esta lista no agota las herramientas para el desarrollo y la depuraci\u00f3n de aplicaciones en Kubernetes. Existen muchas otras utilidades muy \u00fatiles y pr\u00e1cticas que merecen, si no un art\u00edculo separado, al menos una menci\u00f3n. \u00a1Cu\u00e9ntanos qu\u00e9 est\u00e1s utilizando t\u00fa, con qu\u00e9 problemas te has encontrado y c\u00f3mo los has resuelto!<\/p>\n<h2>P.D.<\/h2>\n<p>\nTambi\u00e9n puedes leer en nuestro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/460351\/\">werf: nuestra herramienta para CI\/CD en Kubernetes (rese\u00f1a y video de la presentaci\u00f3n)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459586\/\">Garden v0.10.0: Tu computadora port\u00e1til no necesita Kubernetes.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/446788\/\">Consejos y trucos de Kubernetes: sobre desarrollo local y Telepresence.<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/436112\/\">El complemento kubectl-debug para depuraci\u00f3n en pods de Kubernetes.<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/462707\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 \u0440\u0435\u0448\u0430\u0435\u0442 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043d\u0430\u0441\u0443\u0449\u043d\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0431\u0438\u0437\u043d\u0435\u0441\u0430. \u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b \u0438 \u043e\u0440\u043a\u0435\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043b\u0435\u0433\u043a\u043e \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u044b \u043b\u044e\u0431\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0443\u043f\u0440\u043e\u0449\u0430\u044e\u0442 \u0440\u0435\u043b\u0438\u0437\u044b \u043d\u043e\u0432\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439, \u0434\u0435\u043b\u0430\u044e\u0442 \u0438\u0445 \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u043c\u0438, \u043d\u043e \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0442\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u0430, \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0437\u0430\u0431\u043e\u0442\u0438\u0442 \u0435\u0433\u043e \u043a\u043e\u0434: \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430, \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u043e, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c, \u044d\u043b\u0435\u0433\u0430\u043d\u0442\u043d\u043e\u0441\u0442\u044c, \u2014 \u0430 \u043d\u0435 \u0442\u043e, \u043a\u0430\u043a \u043e\u043d \u043f\u043e\u0435\u0434\u0435\u0442 \u0432 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":28120,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-37475","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=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\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\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\" \/>\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\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes\" \/>\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:17:51+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:17: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\udd47Herramientas para desarrolladores de aplicaciones desplegadas en Kubernetes | ProHoster","description":"Enfoque moderno para.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","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\udd47\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0432 Kubernetes | ProHoster","og:description":"\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043a.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/instrumenty-dlya-razrabotchikov-prilozhenij-zapuskaemyh-v-kubernetes","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:17:51+00:00","article:modified_time":"2019-10-31T19:17:51+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"37475","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-23 18:00:22","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:26:27","updated":"2026-01-23 18:00:22","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\/37475","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=37475"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/37475\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/28120"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=37475"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=37475"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=37475"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}