Revisión de Skaffold para el desarrollo de Kubernetes



Hace un año y medio, el 5 de marzo de 2018, Google lanzó la primera versión alfa de su proyecto de código abierto para CI / CD llamado Skaffold , cuyo objetivo era crear un "desarrollo simple y reproducible para Kubernetes" para que los desarrolladores pudieran centrarse en el desarrollo, y No en administración. ¿Qué podría ser de interés para Skaffold? Resultó que tiene algunas cartas de triunfo en la manga, gracias a las cuales puede convertirse en una herramienta poderosa para un desarrollador y tal vez un ingeniero operativo. Nos familiarizaremos con el proyecto y sus capacidades.

NB : Por cierto, ya hablamos brevemente sobre Skaffold en nuestra descripción general de herramientas para desarrolladores cuya vida está relacionada con Kubernetes.

Teoría Propósito y características


Entonces, en términos generales, Skaffold resuelve el problema de automatizar el ciclo de CI / CD (en las etapas de compilación, inserción, implementación), ofreciendo al desarrollador comentarios rápidos, es decir. la capacidad de obtener rápidamente el resultado de los próximos cambios de código, en forma de una aplicación actualizada que se ejecuta en el clúster de Kubernetes. Y puede funcionar en diferentes contornos (desarrollo, etapa, producción ...), para lo cual Skaffold ayuda a describir las tuberías apropiadas para el despliegue.

El código fuente de Skaffold está escrito en Go y se distribuye bajo la licencia gratuita Apache 2.0 ( GitHub ).

Considere las principales funciones y características. Los primeros incluyen lo siguiente:

  • Skaffold ofrece herramientas para crear canalizaciones de CI / CD.
  • Le permite monitorear los cambios en el código fuente en segundo plano e iniciar el proceso automatizado de construir código en imágenes de contenedor, publicar estas imágenes en el Registro Docker e implementarlas en el clúster de Kubernetes.
  • Sincroniza archivos en el repositorio con el directorio de trabajo en el contenedor.
  • Pruebas automáticas utilizando contenedor-estructura-prueba.
  • Adelante puertos.
  • Lee los registros de la aplicación que se ejecuta en el contenedor.
  • Ayuda a depurar aplicaciones escritas en Java, Node.js, Python, Go.

Ahora sobre las características:

  • Skaffold en sí no tiene componentes del lado del clúster . Es decir, no necesita configurar Kubernetes adicionalmente para usar esta utilidad.
  • Diferentes canalizaciones para su aplicación . ¿Necesita implementar el código en el Minikube local mientras está desarrollando y luego en el escenario o la producción? Para hacer esto, se proporcionan perfiles y configuraciones de usuario, variables de entorno y banderas, que le permiten describir diferentes canalizaciones para una aplicación.
  • CLI Solo utilidades de consola y configuraciones en YAML. En la red puede encontrar referencias a intentos de crear una GUI experimental , pero por el momento esto probablemente solo significa que alguien la necesita, pero en realidad no.
  • Modularidad Skaffold no es una cosechadora independiente, pero busca usar módulos separados o soluciones existentes para tareas específicas.

Ilustración de este último:

  • En la etapa de ensamblaje, puede usar:
    • Docker Build localmente, en un clúster usando Kaniko o en Google Cloud Build;
    • Bazel localmente;
    • Jib Maven y Jib Gradle localmente o en Google Cloud Build;
    • los scripts de compilación personalizados se ejecutan localmente. Si necesita ejecutar otra solución (más flexible / familiar / ...) para el ensamblado, se describe en el script para que Skaffold lo ejecute ( ejemplo de la documentación ). Esto le permite utilizar cualquier recopilador al que se pueda llamar utilizando un script;
  • En la etapa de prueba, se admite la ya mencionada prueba de estructura de contenedor ;
  • Para el despliegue se proporcionan:
    • Kubectl;
    • Timón;
    • personalizar

Gracias a esto, Skaffold puede llamarse un tipo de marco para construir CI / CD . Aquí hay un ejemplo de un flujo de trabajo cuando se usa (de la documentación del proyecto):



¿Cómo es el trabajo de Skaffold en general?

  1. La utilidad supervisa los cambios en el directorio de origen. Si se realizan modificaciones en los archivos, se sincronizan con el pod de aplicación en el clúster de Kubernetes. Si es posible, sin volver a montar la imagen. De lo contrario, aparecerá una nueva imagen.
  2. La imagen ensamblada se verifica mediante la prueba de estructura de contenedor, se etiqueta y se envía al Registro de Docker.
  3. Después de eso, la imagen se implementa, se implementa en un clúster de Kubernetes.
  4. Si el inicio se skaffold dev comando skaffold dev , comenzamos a recibir registros de la aplicación y Skaffold espera que los cambios repitan todos los pasos nuevamente.



Ilustración de hitos de Skaffold

Practica Trying Skaffold


Para demostrar el uso de Skaffold, tomaré un ejemplo del repositorio GitHub del proyecto . Por cierto, allí puedes encontrar muchos otros ejemplos que tienen en cuenta varios detalles. Todas las acciones se realizarán localmente en Minikube. La instalación es simple y toma unos minutos, y se requiere kubectl para comenzar.

Instalar Skaffold:

 curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-linux-amd64 chmod +x skaffold sudo mv skaffold /usr/local/bin skaffold version v0.37.1 

Clonemos el repositorio Skaffold con los ejemplos necesarios:

 git clone https://github.com/GoogleContainerTools/skaffold cd skaffold/examples/microservices 

Elegí un ejemplo con dos pods, cada uno de los cuales contiene una pequeña aplicación en Go. Una aplicación es el frontend (leeroy-web), una solicitud de redireccionamiento a la segunda aplicación es el backend (leeroy-app). Veamos cómo se ve:

 ~/skaffold/examples/microservices # tree . ├── leeroy-app │ ├── app.go │ ├── Dockerfile │ └── kubernetes │ └── deployment.yaml ├── leeroy-web │ ├── Dockerfile │ ├── kubernetes │ │ └── deployment.yaml │ └── web.go ├── README.adoc └── skaffold.yaml 4 directories, 8 files 

leeroy-app y leeroy-web contienen código Go y Dockerfiles simples para construir este código localmente:

 ~/skaffold/examples/microservices # cat leeroy-app/Dockerfile FROM golang:1.12.9-alpine3.10 as builder COPY app.go . RUN go build -o /app . FROM alpine:3.10 CMD ["./app"] COPY --from=builder /app . 

No daré el código de la aplicación; es suficiente saber que leeroy-web acepta solicitudes y las leeroy-app a leeroy-app . Por lo tanto, en los archivos Deployment.yaml hay Servicio solo para la app (para enrutamiento interno). Se nos lanzará el puerto web pod para acceder rápidamente a la aplicación.

Cómo se ve skaffold.yaml :

 ~/skaffold/examples/microservices # cat skaffold.yaml apiVersion: skaffold/v1beta13 kind: Config build: artifacts: - image: leeroy-web context: ./leeroy-web/ - image: leeroy-app context: ./leeroy-app/ deploy: kubectl: manifests: - ./leeroy-web/kubernetes/* - ./leeroy-app/kubernetes/* portForward: - resourceType: deployment resourceName: leeroy-web port: 8080 localPort: 9000 

Todos los pasos mencionados anteriormente se describen aquí. Además de esta configuración, también hay un archivo con configuraciones globales: ~/.skaffold/config . Se puede editar manualmente o mediante la CLI, por ejemplo, así:

 skaffold config set --global local-cluster true 

Este comando establece la variable global del local-cluster en true , después de lo cual Skaffold no intentará 'empujar' las imágenes al registro remoto. Si está desarrollando localmente, puede usar este comando para agregar imágenes localmente también.

Volver a skaffold.yaml :

  • En la etapa de build , le indicamos que necesita recopilar y guardar la imagen localmente. Después de que el ensamblaje comience por primera vez, veremos lo siguiente:

     // .. Minikube      , //   ,    # minikube ssh $ docker images REPOSITORY TAG IMAGE ID CREATED SIZE leeroy-app 7d55a50803590b2ff62e47e6f240723451f3ef6f8c89aeb83b34e661aa287d2e 7d55a5080359 4 hours ago 13MB leeroy-app v0.37.1-171-g0270a0c-dirty 7d55a5080359 4 hours ago 13MB leeroy-web 5063bfb29d984db1ff70661f17d6efcc5537f2bbe6aa6907004ad1ab38879681 5063bfb29d98 5 hours ago 13.1MB leeroy-web v0.37.1-171-g0270a0c-dirty 5063bfb29d98 5 hours ago 13.1MB 

    Como puede ver, Skaffold probó independientemente las imágenes. Por cierto, se admiten varias políticas de etiquetado.
  • Lo siguiente se especifica en el context: ./leeroy-app/ configuración context: ./leeroy-app/ , es decir Se especifica el contexto en el que se ensambla la imagen.
  • En la etapa de implementación, se determina que usaremos kubectl y una máscara para los manifiestos deseados.
  • PortForward : similar a cómo usualmente kubectl port-forward puertos usando kubectl port-forward , le damos instrucciones a Skaffold para llamar a este comando. En este caso, el puerto local 9000 se reenvía a 8080 en Implementación con el nombre leeroy-web .

Es hora de comenzar el desarrollo de skaffold dev : el equipo creará un "ciclo de retroalimentación" continuo, es decir no solo recopila todo e instala en un clúster, sino que también informa sobre el estado de los pods en este momento, controlará los cambios y actualizará el estado de los pods.

Aquí está el resultado de ejecutar skaffold dev --port-forward al reensamblar:



En primer lugar, está claro que se está utilizando el caché. A continuación, la aplicación se ensambla, se implementa, se reenvían los puertos. Dado que se especifica --port-forward , Skaffold reenvió el puerto a la web , según lo solicitado, pero reenvió la app a su discreción (eligió la libre más cercana). Después de eso, obtenemos los primeros registros de las aplicaciones.

Comprobar rendimiento?

 ~/skaffold/examples/microservices # kubectl get po NAME READY STATUS RESTARTS AGE leeroy-app-6998dfcc95-2nxvf 1/1 Running 0 103s leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 103s ~/skaffold/examples/microservices # curl localhost:9000 leeroooooy app!!! 

Modifique el leeroy-app/app.go : lleva unos segundos ... y:

 ~/skaffold/examples/microservices # kubectl get po NAME READY STATUS RESTARTS AGE leeroy-app-ffd79d986-l6nwp 1/1 Running 0 11s leeroy-web-69f7d47c9d-5ff77 1/1 Running 0 4m59s ~/skaffold/examples/microservices # curl localhost:9000 leeroooooy Habr!!! 

Al mismo tiempo, Skaffold trajo a la consola lo mismo que antes, con la excepción de un punto: lanzó solo la leeroy-app , y no todo a la vez.

Más práctica


Vale la pena mencionar que al crear un nuevo proyecto, las configuraciones para Skaffold pueden ser bootstrap usando el comando init , lo cual es muy conveniente. Además, puede escribir varias configuraciones: desarrolle en la configuración de forma predeterminada y luego despliegue al escenario con el comando de run (el mismo proceso que dev , simplemente no sigue los cambios), usando una configuración diferente.

Katacoda tiene un tutorial con un ejemplo aún más simple. Pero ofrece una caja de arena preparada con Kubernetes, la aplicación y Skaffold. Una gran opción si está interesado en probar los conceptos básicos por su cuenta.

Un posible caso de uso para Skaffold es llevar a cabo el desarrollo en un clúster remoto. No todos se sienten cómodos ejecutando Minikube en su propio hardware, y luego implementando la aplicación y esperando su funcionamiento adecuado ... En este caso, Skaffold resuelve perfectamente la tarea, que puede ser confirmada, por ejemplo, por los ingenieros de Reddit, sobre los que ya escribimos en nuestro blog.

Y en esta publicación de Weaveworks puede encontrar un ejemplo de creación de una tubería para producción.

Conclusión


Skaffold es una herramienta conveniente para construir tuberías que implican la implementación de aplicaciones a Kubernetes y se centran principalmente en las necesidades de desarrollo. Con él, es bastante simple crear una tubería "corta" que tenga en cuenta las necesidades básicas del desarrollador, sin embargo, si lo desea, puede organizar procesos más ambiciosos. Como uno de los ejemplos ilustrativos del uso de Skaffold en procesos de CI / CD , se ofrece un proyecto de prueba de 10 microservicios utilizando las capacidades de Kubernetes, gRPC, Istio y OpenCensus Tracing.

Skaffold ya recibió más de 8000 estrellas en GitHub, está siendo desarrollado por Google y forma parte de GoogleContainerTools ; en general, en este momento hay muchas razones para creer que el proyecto se desarrollará felizmente para siempre.

PS


Lea también en nuestro blog:

Source: https://habr.com/ru/post/474692/


All Articles