Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes

Un enfoque moderno de las operaciones resuelve muchos problemas empresariales urgentes. Los contenedores y orquestadores facilitan la escala de proyectos de cualquier complejidad, simplifican el lanzamiento de nuevas versiones, los hacen más confiables, pero al mismo tiempo crean problemas adicionales para los desarrolladores. El programador, ante todo, se preocupa por su código: arquitectura, calidad, rendimiento, elegancia, y no por cómo funcionará en Kubernetes y cómo probarlo y depurarlo después de realizar incluso cambios mínimos. Por lo tanto, también es bastante natural que se estén desarrollando activamente herramientas para Kubernetes, que ayuden a resolver los problemas incluso de los desarrolladores más "arcaicos" y les permitan centrarse en lo principal.

Esta revisión proporciona información breve sobre algunas de las herramientas que facilitan la vida de un programador cuyo código se ejecuta en el pod'ax de un clúster de Kubernetes.

Ayudantes simples

Depuración de Kubectl

  • El resultado final: agregue su contenedor a un Pod y vea qué sucede en él.
  • GitHub.
  • Breves estadísticas de GH: 715 estrellas, 54 confirmaciones, 9 contribuyentes.
  • Idioma: Ir.
  • Licencia: Licencia Apache 2.0.

Este complemento para kubectl le permite crear un contenedor adicional dentro del pod de interés, que compartirá el espacio de nombres del proceso con otros contenedores. En él se puede depurar el funcionamiento del pod: comprobar la red, escuchar el tráfico de la red, hacer un seguimiento del proceso de interés, etc.

También puede cambiar al contenedor de procesos ejecutando chroot /proc/PID/root - esto puede ser muy conveniente cuando necesita obtener un shell raíz en un contenedor para el cual está configurado en el manifiesto securityContext.runAs.

La herramienta es sencilla y eficaz, por lo que puede resultar útil para todos los desarrolladores. Escribimos más sobre esto en artículo separado.

Telepresencia

  • El resultado final: transfiera la aplicación a su computadora. Desarrollar y depurar localmente.
  • sitio web; GitHub.
  • Breves estadísticas de GH: 2131 estrellas, 2712 confirmaciones, 33 contribuyentes.
  • Idioma: Python.
  • Licencia: Licencia Apache 2.0.

La idea de este complemento es iniciar un contenedor con la aplicación en la computadora del usuario local y enviar todo el tráfico desde el clúster hacia él y viceversa. Este enfoque le permite desarrollar localmente simplemente editando archivos en su IDE favorito: los resultados estarán disponibles de inmediato.

Las ventajas de ejecutar localmente son la conveniencia de realizar ediciones y resultados instantáneos, la capacidad de depurar la aplicación de la forma habitual. La desventaja es que exige velocidad de conexión, lo que se nota especialmente cuando tienes que trabajar con una aplicación con RPS y tráfico bastante altos. Además, Telepresence tiene problemas con los montajes de volumen en Windows, lo que puede suponer una limitación decisiva para los desarrolladores acostumbrados a este sistema operativo.

Ya hemos compartido nuestra experiencia de uso de Telepresencia aquí.

ksincronización

  • El resultado final: sincronización casi instantánea del código con el contenedor en el clúster.
  • GitHub.
  • Breves estadísticas de GH: 555 estrellas, 362 confirmaciones, 11 contribuyentes.
  • Idioma: Ir.
  • Licencia: Licencia Apache 2.0.

La utilidad le permite sincronizar el contenido de un directorio local con el directorio de un contenedor que se ejecuta en el clúster. Esta herramienta es perfecta para desarrolladores de lenguajes de programación scripting, cuyo principal problema es entregar código a un contenedor en ejecución. Ksync está diseñado para aliviar este dolor de cabeza.

Cuando se inicializa una vez mediante el comando ksync init Se crea un DaemonSet en el clúster, que se utiliza para monitorear el estado del sistema de archivos del contenedor seleccionado. En su computadora local, el desarrollador ejecuta el comando ksync watch, que monitorea las configuraciones y ejecuta syncthing, que sincroniza directamente archivos con el clúster.

Todo lo que queda es indicarle a ksync qué sincronizar con qué. Por ejemplo, este comando:

ksync create --name=myproject --namespace=test --selector=app=backend --container=php --reload=false /home/user/myproject/ /var/www/myproject/

... creará un observador llamado myprojectque buscará un pod con una etiqueta app=backend e intente sincronizar el directorio local /home/user/myproject/ con catalogo /var/www/myproject/ en el contenedor llamado php.

Problemas y notas sobre ksync desde nuestra experiencia:

  • Debe usarse en nodos del clúster de Kubernetes. overlay2 como controlador de almacenamiento para Docker. La utilidad no funcionará con ninguna otra.
  • Cuando se utiliza Windows como sistema operativo cliente, es posible que el observador del sistema de archivos no funcione correctamente. Este error se detectó al trabajar con directorios grandes, con una gran cantidad de archivos y directorios anidados. Creamos tema relevante en el proyecto de sincronización, pero aún no hay avances (desde principios de julio).
  • Usar archivo .stignore para especificar rutas o patrones de archivos que no necesitan sincronizarse (por ejemplo, directorios app/cache и .git).
  • De forma predeterminada, ksync reiniciará el contenedor cada vez que cambien los archivos. Para Node.js esto es conveniente, pero para PHP es completamente innecesario. Es mejor desactivar opcache y usar la bandera. --reload=false.
  • La configuración siempre se puede corregir en $HOME/.ksync/ksync.yaml.

Squash

  • El resultado final: depurar procesos directamente en el cluster.
  • GitHub.
  • Breves estadísticas de GH: 1154 estrellas, 279 confirmaciones, 23 contribuyentes.
  • Idioma: Ir.
  • Licencia: Licencia Apache 2.0.

Esta herramienta está diseñada para depurar procesos directamente en pods. La utilidad es simple e interactiva le permite seleccionar el depurador deseado (vea abajo) y espacio de nombres + pod, en cuyo proceso es necesario intervenir. Actualmente soportado:

  • profundizar - para aplicaciones Go;
  • GDB: a través de destino remoto + reenvío de puertos;
  • Reenvío de puertos JDWP para depurar aplicaciones Java.

En el lado IDE, el soporte solo está disponible en VScode (usando extensiones), sin embargo, los planes para el año actual (2019) incluyen Eclipse e Intellij.

Para depurar procesos, Squash ejecuta un contenedor privilegiado en los nodos del clúster, por lo que primero debe familiarizarse con las capacidades. modo seguro para evitar problemas de seguridad.

Soluciones complejas

Pasemos a la artillería pesada: proyectos más "a gran escala" diseñados para satisfacer de inmediato muchas de las necesidades de los desarrolladores.

NB: En esta lista, por supuesto, hay un lugar para nuestra utilidad de código abierto. patio (anteriormente conocido como dapp). Sin embargo, ya lo hemos escrito y hablado más de una vez y, por lo tanto, decidimos no incluirlo en la revisión. Para aquellos que deseen familiarizarse más con sus capacidades, recomendamos leer/escuchar el informe “werf es nuestra herramienta para CI/CD en Kubernetes".

Espacio de desarrollo

  • El resultado final: para aquellos que quieren empezar a trabajar en Kubernetes, pero no quieren profundizar en su jungla.
  • GitHub.
  • Breves estadísticas de GH: 630 estrellas, 1912 confirmaciones, 13 contribuyentes.
  • Idioma: Ir.
  • Licencia: Licencia Apache 2.0.

Una solución de la empresa del mismo nombre, que proporciona clústeres gestionados con Kubernetes para el desarrollo de equipos. La utilidad fue creada para grupos comerciales, pero funciona muy bien con otros.

Al ejecutar el comando devspace init en el catálogo de proyectos se le ofrecerá (interactivamente):

  • seleccione un clúster de Kubernetes que funcione,
  • utilizar existente Dockerfile (o generar uno nuevo) para crear un contenedor basado en él,
  • seleccione un repositorio para almacenar imágenes de contenedores, etc.

Después de todos estos pasos preparatorios, puede comenzar el desarrollo ejecutando el comando devspace dev. Construirá el contenedor, lo cargará en el repositorio, implementará la implementación en el clúster e iniciará el reenvío de puertos y la sincronización del contenedor con el directorio local.

Opcionalmente, se le pedirá que mueva la terminal al contenedor. No debe negarse, porque en realidad el contenedor comienza con el comando de suspensión y, para realizar pruebas reales, la aplicación debe iniciarse manualmente.

Finalmente, el equipo devspace deploy implementa la aplicación y la infraestructura asociada al clúster, después de lo cual todo comienza a funcionar en modo de combate.

Toda la configuración del proyecto se almacena en un archivo. devspace.yaml. Además de la configuración del entorno de desarrollo, también puede encontrar una descripción de la infraestructura en él, similar a los manifiestos estándar de Kubernetes, solo que muy simplificada.

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes
Arquitectura y etapas principales del trabajo con DevSpace.

Además, es fácil agregar un componente predefinido (por ejemplo, un DBMS MySQL) o un gráfico Helm al proyecto. Leer más en documentación - no es complicado.

patín

  • sitio web; GitHub.
  • Breves estadísticas de GH: 7423 estrellas, 4173 confirmaciones, 136 contribuyentes.
  • Idioma: Ir.
  • Licencia: Licencia Apache 2.0.

Esta utilidad de Google pretende cubrir todas las necesidades de un desarrollador cuyo código de alguna manera se ejecutará en un clúster de Kubernetes. Empezar a utilizarlo no es tan fácil como devspace: sin interactividad, detección de idioma y creación automática Dockerfile Aquí no te lo ofrecerán.

Sin embargo, si esto no te asusta, esto es lo que Skaffold te permite hacer:

  • Realice un seguimiento de los cambios en el código fuente.
  • Sincronícelo con el contenedor de cápsulas si no requiere ensamblaje.
  • Recopile contenedores con código, si se interpreta el lenguaje, o compile artefactos y empaquetelos en contenedores.
  • Las imágenes resultantes se verifican automáticamente usando prueba-de-estructura-de-contenedores.
  • Etiquetar y cargar imágenes en Docker Registry.
  • Implemente una aplicación en un clúster usando kubectl, Helm o kustomize.
  • Realizar reenvío de puertos.
  • Depurar aplicaciones escritas en Java, Node.js, Python.

El flujo de trabajo en varias variaciones se describe declarativamente en el archivo skaffold.yaml. Para un proyecto, también puede definir varios perfiles en los que puede cambiar parcial o completamente las etapas de montaje y despliegue. Por ejemplo, para el desarrollo, especifique una imagen base que sea conveniente para el desarrollador y para la puesta en escena y la producción, una mínima (+ uso securityContext contenedores o redefinir el clúster en el que se implementará la aplicación).

Los contenedores Docker se pueden construir de forma local o remota: en Compilación de la nube de Google o en un clúster usando Kaniko. Bazel y Jib Maven/Gradle también son compatibles. Para el etiquetado, Skaffold admite muchas estrategias: mediante git commit hash, fecha/hora, sha256-sum de fuentes, etc.

Por otra parte, cabe destacar la posibilidad de probar contenedores. El marco de prueba de estructura de contenedores ya mencionado ofrece los siguientes métodos de verificación:

  • Ejecutar comandos en el contexto de un contenedor con seguimiento de los estados de salida y verificar la salida de texto del comando.
  • Comprobar la presencia de archivos en el contenedor y hacer coincidir los atributos especificados.
  • Control del contenido de los archivos mediante expresiones regulares.
  • Verificación de metadatos de imagen (ENV, ENTRYPOINT, VOLUMES etc.).
  • Comprobando la compatibilidad de la licencia.

La sincronización de archivos con el contenedor no se realiza de la forma más óptima: Skaffold simplemente crea un archivo con las fuentes, lo copia y lo descomprime en el contenedor (es necesario instalar tar). Por lo tanto, si su tarea principal es la sincronización de código, es mejor buscar una solución especializada (ksync).

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes
Principales etapas de la operación Skaffold

En general, la herramienta no permite abstraerse de los manifiestos de Kubernetes y no tiene ninguna interactividad, por lo que puede parecer difícil de dominar. Pero ésta también es su ventaja: una mayor libertad de acción.

Garden

  • sitio web; GitHub.
  • Breves estadísticas de GH: 1063 estrellas, 1927 confirmaciones, 17 contribuyentes.
  • Idioma: mecanografiado (Está previsto dividir el proyecto en varios componentes, algunos de los cuales estarán en Go, y también crear un SDK para crear complementos en TypeScript/JavaScript y Go).
  • Licencia: Licencia Apache 2.0.

Al igual que Skaffold, Garden tiene como objetivo automatizar los procesos de entrega de código de aplicación al clúster K8. Para hacer esto, primero debe describir la estructura del proyecto en un archivo YAML y luego ejecutar el comando garden dev. Ella hará toda la magia:

  • Recoger contenedores con varias partes del proyecto.
  • Realiza pruebas de integración y unitarias, si se han descrito alguna.
  • Implementa todos los componentes del proyecto en el clúster.
  • Si el código fuente cambia, se reiniciará todo el proceso.

El objetivo principal del uso de esta herramienta es compartir un clúster remoto con un equipo de desarrollo. En este caso, si algunos de los pasos de construcción y prueba ya se han realizado, esto acelerará significativamente todo el proceso, ya que Garden podrá utilizar los resultados almacenados en caché.

Un módulo de proyecto puede ser un contenedor, un contenedor Maven, un gráfico Helm, un manifiesto para kubectl apply o incluso una función OpenFaaS. Además, cualquiera de los módulos se puede extraer de un repositorio Git remoto. Un módulo puede definir o no servicios, tareas y pruebas. Los servicios y las tareas pueden tener dependencias, por lo que puede determinar la secuencia de implementación de un servicio en particular y organizar el lanzamiento de tareas y pruebas.

Garden proporciona al usuario un hermoso panel (actualmente en estado experimental), que muestra el gráfico del proyecto: componentes, secuencia de montaje, ejecución de tareas y pruebas, sus conexiones y dependencias. Directamente en el navegador, puede ver los registros de todos los componentes del proyecto y verificar qué genera un componente en particular a través de HTTP (si, por supuesto, se declara un recurso de entrada para él).

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes
Panel para Jardín

Esta herramienta también tiene un modo de recarga en caliente, que simplemente sincroniza los cambios de script con el contenedor en el clúster, lo que acelera enormemente el proceso de depuración de la aplicación. El jardín tiene uno bueno. la documentación y no está mal conjunto de ejemplos, permitiéndole acostumbrarse rápidamente y comenzar a usarlo. Por cierto, hace poco publicamos traducción del artículo de sus autores.

Conclusión

Por supuesto, las herramientas para desarrollar y depurar aplicaciones en Kubernetes no se limitan a esta lista. Hay muchas más utilidades muy útiles y prácticas que merecen, si no un artículo aparte, al menos una mención. ¡Cuéntanos qué usas, qué problemas encontraste y cómo los resolviste!

PS

Lea también en nuestro blog:

Fuente: habr.com

Añadir un comentario