Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes

El enfoque moderno para la explotación resuelve numerosos problemas urgentes de las empresas. Los contenedores y los orquestadores permiten escalar fácilmente proyectos de cualquier complejidad, simplifican los lanzamientos de nuevas versiones y los hacen más confiables, pero al mismo tiempo crean problemas adicionales para los desarrolladores. Lo que más le preocupa a un programador es su código: arquitectura, calidad, rendimiento, elegancia, y no cómo se ejecutará en Kubernetes o cómo testearlo y depurarlo después de hacer incluso cambios mínimos. Por tanto, es muy lógico que se estén desarrollando activamente herramientas para Kubernetes que ayudan a resolver problemas incluso de los desarrolladores más 'arcaicos' y les permiten concentrarse en lo principal.

Esta revisión presenta información breve sobre algunas herramientas que facilitan la vida al programador cuyo código se ejecuta en los pods del clúster de Kubernetes.

Asistentes simples

Kubectl-debug

  • Esencia: agrega tu contenedor al Pod y observa lo que sucede en él.
  • GitHub.
  • Estadísticas en GH: 715 estrellas, 54 commits, 9 contribuyentes.
  • Lenguaje: Go.
  • Licencia: Apache License 2.0.

Este plugin para kubectl permite crear un contenedor adicional dentro del pod de interés que compartirá el espacio de nombres de procesos con los demás contenedores. Se puede depurar el funcionamiento del pod: comprobar el funcionamiento de la red, escuchar el tráfico de red, realizar un strace del proceso de interés, etc.

También puedes cambiar al contenedor del proceso ejecutando chroot /proc/PID/root — esto es muy conveniente cuando necesitas obtener un shell root en un contenedor para el cual se ha establecido en el manifiesto securityContext.runAs.

La herramienta es simple y efectiva, por lo que puede ser útil para cada desarrollador. Hablamos más sobre ella en un artículo separado.

Telepresence

  • Esencia: traslada la aplicación a tu computadora. Desarrolla y depura localmente.
  • Sitio web; GitHub.
  • Estadísticas en GH: 2131 estrellas, 2712 commits, 33 contribuyentes.
  • Lenguaje: Python.
  • Licencia: Apache License 2.0.

La idea de esta herramienta es ejecutar un contenedor con la aplicación en la computadora del usuario local y proxear todo el tráfico del clúster hacia ella y de regreso. Este enfoque permite desarrollar localmente, simplemente modificando archivos en tu IDE favorito: los resultados estarán disponibles de inmediato.

Las ventajas de ejecutar localmente son la comodidad de realizar modificaciones y obtener resultados instantáneos, así como la posibilidad de depurar la aplicación de manera habitual. En cuanto a las desventajas, se requiere una buena velocidad de conexión, lo cual se nota especialmente al trabajar con aplicaciones que tienen un alto RPS y tráfico. Además, Telepresence tiene problemas con los volúmenes en Windows, lo que puede ser un limitante decisivo para los desarrolladores acostumbrados a este sistema operativo.

Ya hemos compartido nuestra experiencia usando Telepresence. aquí.

Ksync

  • Esencia: sincronización casi instantánea del código con el contenedor en el clúster..
  • GitHub.
  • Estadísticas breves en GH: 555 estrellas, 362 commits, 11 colaboradores.
  • Lenguaje: Go.
  • Licencia: Apache License 2.0.

La utilidad permite sincronizar el contenido de un directorio local con el directorio de un contenedor en ejecución en el clúster. Esta herramienta es ideal para desarrolladores que utilizan lenguajes de programación de scripting, cuya principal dificultad es llevar el código al contenedor en funcionamiento. Ksync está diseñado para aliviar esta preocupación.

Con una sola inicialización mediante el comando ksync init , se crea un DaemonSet en el clúster que se utiliza para rastrear 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 lanza syncthing, que realiza la sincronización directa de archivos con el clúster.

Resta instruir a ksync sobre qué y cómo sincronizar. Por ejemplo, el siguiente comando:

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

… creará un watcher llamado myproject, que buscará pods con la etiqueta app=backend y tratará de sincronizar el directorio local /home/user/myproject/ con el directorio /var/www/myproject/ del contenedor llamado php.

Problemas y observaciones sobre ksync de nuestra experiencia:

  • Los nodos del clúster de Kubernetes deben utilizar overlay2 como controlador de almacenamiento para Docker. No funcionará con ninguna otra utilidad.
  • Al usar Windows como sistema operativo del cliente, puede haber un funcionamiento incorrecto del watcher del sistema de archivos. Este error se ha notado al trabajar con grandes directorios, es decir, con muchos archivos y subdirectorios. Creamos un issue correspondiente en el proyecto syncthing, pero hasta ahora no ha habido progreso (desde principios de julio).
  • Utiliza el archivo .stignore para especificar rutas o patrones de archivos que no deben sincronizarse (por ejemplo, directorios app/cache y .git).
  • Por defecto, ksync reiniciará 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 --reload=false.
  • La configuración se puede corregir en $HOME/.ksync/ksync.yaml.

Squash

  • Esencia: depura procesos directamente en el clúster.
  • GitHub.
  • Estadísticas breves de GH: 1154 estrellas, 279 commits, 23 contribuyentes.
  • Lenguaje: Go.
  • Licencia: Apache License 2.0.

Esta herramienta está destinada a depurar procesos directamente en los pod. La utilidad es sencilla y en modo interactivo permite elegir el depurador necesario (ver más abajo) y namespace + pod, en el proceso en el que se necesita intervenir. Actualmente se admiten:

  • delve — para aplicaciones en Go;
  • GDB — a través de target remote + reenvío de puerto;
  • reenvío de puerto JDWP para depurar aplicaciones Java.

Desde el lado de la IDE, el soporte está presente solo en VScode (con la ayuda de la extensión), sin embargo, en los planes para el año actual (2019) están Eclipse e Intellij.

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

Soluciones complejas

Pasamos a la artillería pesada: proyectos más "escalables" destinados a cubrir muchas necesidades de los desarrolladores.

NB: En esta lista, sin duda, hay lugar para nuestra herramienta de código abierto werf (anteriormente conocida como dapp). Sin embargo, ya hemos escrito y hablado sobre ella varias veces, por lo que decidimos no incluirla en la revisión. Para quienes deseen conocer sus capacidades más de cerca, recomendamos leer/escuchar la charla "werf — nuestra herramienta para CI/CD en Kubernetes».

DevSpace

  • Esencia: para aquellos que quieren empezar a trabajar en Kubernetes, pero no desean profundizar en sus complejidades.
  • GitHub.
  • Estadísticas breves de GH: 630 estrellas, 1912 commits, 13 contribuyentes.
  • Lenguaje: Go.
  • Licencia: Apache License 2.0.

Solución de la empresa homónima, que proporciona clústeres gestionados con Kubernetes para desarrollo colaborativo. La utilidad fue creada para clústeres comerciales, pero funciona excelentemente con cualquier otro.

Al ejecutar el comando devspace init en el directorio del proyecto se le propondrá (en modo interactivo):

  • elegir un clúster Kubernetes activo,
  • usar el existente Dockerfile (o generar uno nuevo) para crear un contenedor basado en él,
  • elegir un repositorio para almacenar las imágenes de los contenedores, etc.

Después de todas estas acciones preparatorias, se puede comenzar el desarrollo ejecutando el comando devspace dev. Este construirá el contenedor, lo cargará en el repositorio, desplegará la infraestructura en el clúster y comenzará la redirección de puertos y la sincronización del contenedor con el directorio local.

Opcionalmente, se le ofrecerá acceder al contenedor a través 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ón debe iniciarse manualmente.

Finalmente, el comando devspace deploy despliega la aplicación y la infraestructura relacionada en el clúster, después de lo cual todo comienza a funcionar en modo de producción.

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

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes
La arquitectura y los principales pasos para trabajar con DevSpace

Además, es fácil agregar un componente predefinido (por ejemplo, una base de datos MySQL) o un Helm chart al proyecto. Para más detalles, consulte la documentación — no es complicado.

Skaffold

  • Sitio web; GitHub.
  • Estadísticas breves de GH: 7423 estrellas, 4173 commits, 136 contribuyentes.
  • Lenguaje: Go.
  • Licencia: Apache License 2.0.

Esta herramienta de Google aspira a cubrir todas las necesidades del desarrollador, cuyo código se ejecutará de alguna manera en el clúster de Kubernetes. Comenzar a usarla no es tan fácil como con devspace: no hay interactividad, detección de idioma ni creación automática Dockerfile aquí no se le ofrecerá.

Sin embargo, si eso no le asusta, aquí hay lo que permite hacer Skaffold:

  • Supervisar los cambios en el código fuente.
  • Sincronizarlo con el contenedor del pod, si no requiere compilación.
  • Construir contenedores con código, si el lenguaje es interpretado, o compilar artefactos y empaquetarlos en contenedores.
  • Verificar automáticamente las imágenes resultantes con container-structure-test.
  • Etiquetar y cargar imágenes en Docker Registry.
  • Desplegar la aplicación en el clúster usando kubectl, Helm o kustomize.
  • Hacer redirección de puertos.
  • Depurar aplicaciones escritas en Java, Node.js, Python.

El flujo de trabajo en varias variaciones se describe de manera declarativa en el archivo skaffold.yamlPara el proyecto, también se pueden definir varios perfiles en los que se pueden modificar parcial o totalmente las etapas de construcción y despliegue. Por ejemplo, para desarrollo, especificar una imagen base conveniente para el desarrollador, y para staging y producción, la mínima (+ usar securityContext o redefinir el clúster en el que se desplegará la aplicación).

La construcción de contenedores Docker puede llevarse a cabo de forma local o remota: en Google Cloud Build o en un clúster usando Kaniko. También se soportan Bazel y Jib Maven/Gradle. Para etiquetar, Skaffold admite múltiples estrategias: por hash de git commit, fecha/hora, suma sha256 de los fuentes, etc.

Es importante mencionar la posibilidad de probar contenedores. El marco mencionado anteriormente, container-structure-test, ofrece los siguientes métodos de verificación:

  • Ejecución de comandos en el contexto del contenedor con seguimiento de los códigos de salida y verificación de la 'salida' textual del comando.
  • Verificación de la existencia de archivos en el contenedor y la conformidad de los atributos con los especificados.
  • Control del contenido de archivos mediante expresiones regulares.
  • Verificación de metadatos de la imagen (ENV, ENTRYPOINT, VOLUMES etc.).
  • Verificación de la compatibilidad de licencias.

La sincronización de archivos con el contenedor no se realiza de la manera más óptima: 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ón de código, es mejor buscar una solución especializada (ksync).

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes
Etapas principales del trabajo de 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 aprender. Pero en esto reside su ventaja: una mayor libertad de acción.

Garden

  • Sitio web; GitHub.
  • Estadísticas breves de GH: 1063 estrellas, 1927 commits, 17 contribuyentes.
  • Lenguaje: TypeScript (se planea dividir el proyecto en varios componentes, algunos de los cuales estarán en Go, así como crear un SDK para crear complementos en TypeScript/JavaScript y Go).
  • Licencia: Apache License 2.0.

Al igual que Skaffold, Garden está orientado a la automatización de procesos de entrega de código de aplicaciones en el clúster de K8s. Para ello, primero es necesario describir la estructura del proyecto en un archivo YAML y luego ejecutar el comando garden dev. Esto hará toda la magia:

  • Construirá los contenedores con las diferentes partes del proyecto.
  • Realizará pruebas de integración y unitarias, si estas han sido descritas.
  • Desplegará todos los componentes del proyecto en el clúster.
  • En caso de que se modifique el código fuente, reiniciará todo el pipeline.

El enfoque principal al utilizar esta herramienta se centra en la colaboración de un clúster remoto por parte del equipo de desarrolladores. En este caso, si algunas etapas de construcción y prueba ya se han realizado, esto acelerará significativamente todo el proceso, ya que Garden podrá utilizar los resultados en caché.

Un módulo del proyecto puede ser un contenedor, un contenedor de Maven, un Helm Chart, un manifiesto para kubectl apply o incluso una función de 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, lo que permite definir la secuencia de despliegue de un servicio determinado, así como ordenar la ejecución de tareas y pruebas.

Garden proporciona al usuario un bonito dashboard (actualmente en estado experimental), donde se muestra el gráfico del proyecto: componentes, secuencia de construcción, ejecución de tareas y pruebas, así como sus relaciones y dependencias. Directamente en el navegador, se pueden ver los registros de todos los componentes del proyecto y verificar qué devuelve cada componente a través de HTTP (si, por supuesto, se ha declarado un recurso ingress para él).

Herramientas para desarrolladores de aplicaciones que se ejecutan en Kubernetes
Panel para Garden

Esta herramienta también tiene un modo de hot-reload que simplemente sincroniza los cambios de los scripts con el contenedor en el clúster, acelerando drásticamente el proceso de depuración de la aplicación. Garden cuenta con un buen documentación y decente conjunto de ejemplos, lo que permite familiarizarse rápidamente y comenzar a usarla. Por cierto, hace poco publicamos la traducción de un artículo de sus autores.

Conclusión

Por supuesto, esta lista no agota las herramientas para el desarrollo y la depuración de aplicaciones en Kubernetes. Existen muchas otras utilidades muy útiles y prácticas que merecen, si no un artículo separado, al menos una mención. ¡Cuéntanos qué estás utilizando tú, con qué problemas te has encontrado y cómo los has resuelto!

P.D.

También puedes leer en nuestro blog:

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster