
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?
- 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.
- La imagen ensamblada se verifica mediante la prueba de estructura de contenedor, se etiqueta y se envía al Registro de Docker.
- Después de eso, la imagen se implementa, se implementa en un clúster de Kubernetes.
- 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 SkaffoldPractica 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
leeroy-app y leeroy-web contienen código Go y Dockerfiles simples para construir este código localmente:
~/skaffold/examples/microservices
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 , // ,
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
Modifique el
leeroy-app/app.go
: lleva unos segundos ... y:
~/skaffold/examples/microservices
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: