
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 , cuyo objetivo es crear un "desarrollo simple y reproducible para Kubernetes", para que los desarrolladores puedan concentrarse en el desarrollo y no en la administración. ¿Qué puede interesar de Skaffold? Resulta que tiene varias cartas bajo la manga que lo pueden convertir en una herramienta poderosa tanto para desarrolladores como para ingenieros de operaciones. Vamos a conocer el proyecto y sus capacidades.
NB: Por cierto, ya hemos hablado brevemente sobre Skaffold en nuestra , cuyas vidas están relacionadas con Kubernetes.
Teoría. Propósito y capacidades
Entonces, hablando en términos generales, Skaffold resuelve la tarea de automatización del ciclo CI/CD (en las etapas de construcción, push, despliegue), ofreciendo al desarrollador una retroalimentación rápida, es decir, la posibilidad de obtener rápidamente el resultado de los últimos cambios en el código, en forma de una aplicación actualizada que funciona en un clúster de Kubernetes. Y puede funcionar en diferentes entornos (dev, stage, production…), para lo cual Skaffold ayuda a describir los pipelines correspondientes para el despliegue.
El código fuente de Skaffold está escrito en el lenguaje Go, bajo la licencia abierta Apache License 2.0 (GitHub).
Veamos las funciones y características principales. Las primeras incluyen las siguientes:
- Skaffold ofrece herramientas para crear pipelines de CI/CD.
- Permite monitorear en segundo plano los cambios en el código fuente y lanzar un proceso automatizado de construcción del código en imágenes de contenedores, publicar estas imágenes en Docker Registry y desplegarlas en un clúster de Kubernetes.
- Sincroniza archivos en el repositorio con el directorio de trabajo en el contenedor.
- Prueba automáticamente utilizando container-structure-test.
- Redirige puertos.
- Lee los registros de la aplicación ejecutada en el contenedor.
- Ayuda en la depuración de 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 se requiere configurar Kubernetes adicionalmente para usar esta herramienta.
- Diferentes pipelines para tu aplicación. ¿Necesitas desplegar código en un Minikube local mientras desarrollas, y luego en stage o producción? Para esto, se prevén y configuraciones de usuario, variables de entorno y flags que permiten describir diferentes pipelines para una sola aplicación.
- en cli-runtime y kubectl. Solo se trata de una utilidad de consola y configuraciones en YAML. En la red se pueden encontrar menciones a intentos de crear , sin embargo, hasta ahora eso significa más bien que a alguien le interesa, pero no mucho.
- Modularidad. Skaffold no es un engranaje independiente, sino que busca utilizar módulos separados o soluciones ya existentes para tareas específicas.
Ilustración de lo anterior:
- En la fase de construcción se puede utilizar:
- docker build localmente, en el clúster utilizando kaniko o en Google Cloud Build;
- Bazel localmente;
- Jib Maven y Jib Gradle localmente o en Google Cloud Build;
- scripts de construcción personalizados que se ejecutan localmente. Si necesitas ejecutar otra solución (más flexible/ familiar/…) para la construcción, se describe en el script para que Skaffold la ejecute (). Esto permite utilizar cualquier constructor que se pueda invocar mediante un script;
- En la fase de prueba se soporta ya mencionado ;
- Para el despliegue se prevén:
- Kubectl;
- Helm;
- kustomize.
Gracias a esto, Skaffold puede considerarse una especie de framework para construir CI/CD. Aquí hay un ejemplo del flujo de trabajo al utilizarlo (de la documentación del proyecto):

¿Cómo se ve en términos generales el funcionamiento de Skaffold?
- La utilidad monitorea los cambios en el directorio del código fuente. Si se hacen modificaciones en los archivos, se sincronizan con el pod de la aplicación en el clúster de Kubernetes. Si es posible, se hace sin volver a construir la imagen. De lo contrario, se construye una nueva imagen.
- La imagen construida se verifica mediante container-structure-test, se etiqueta y se envía a Docker Registry.
- Después de esto, la imagen se despliega - se implementa en el clúster de Kubernetes.
- Si el inicio fue activado mediante el comando
skaffold dev, comenzamos a recibir los registros de la aplicación, y Skaffold espera cambios para repetir toda la acción nuevamente.

Ilustración de las etapas principales del trabajo de Skaffold
Práctica. Probamos Skaffold
Para demostrar el uso de Skaffold, tomaré un ejemplo de . Por cierto, también se pueden encontrar muchos otros ejemplos que tengan en cuenta diversas especificidades. Todas las acciones se realizarán localmente en Minikube. La instalación es sencilla y tomará unos minutos, y para comenzar a trabajar necesitarás kubectl.
Instalaremos 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.1Clonamos el repositorio de Skaffold con los ejemplos necesarios:
git clone https://github.com/GoogleContainerTools/skaffold
cd skaffold/examples/microservicesHe elegido un ejemplo con dos pods, cada uno conteniendo una pequeña aplicación escrita en Go. Una aplicación es el frontend (leeroy-web), que redirige las solicitudes a la segunda aplicación, que 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 directorios, 8 archivosleeroy-app y leeroy-web contienen código en Go y Dockerfiles simples para la construcción local de dicho código:
~/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 voy a proporcionar el código de las aplicaciones; es suficiente saber que leeroy-web recibe solicitudes y las proxies a leeroy-app. Por lo tanto, en los archivos Deployment.yaml hay un Service solo para app (para el enrutamiento interno). El puerto del pod web lo utilizaremos para un acceso rápido 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 Aquí se describen todas las etapas mencionadas anteriormente. Además de esta configuración, hay un archivo con configuraciones globales — ~/ .skaffold/config. Se puede editar manualmente o a través de CLI — por ejemplo, así:
skaffold config set --global local-cluster true Este comando establecerá la variable global local-cluster en true, después de lo cual Skaffold no intentará 'empujar' las imágenes a un registro remoto. Si estás desarrollando localmente, puedes usar este comando para almacenar imágenes también localmente.
Volvamos a skaffold.yaml:
- En la etapa
buildespecificamos que se debe construir y guardar la imagen localmente. Después de que se ejecute la construcción 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.1MBComo se puede ver, Skaffold etiquetó automáticamente las imágenes. Por cierto, se admiten varias políticas de etiquetado.
- Luego en la configuración se indica
context: ./leeroy-app/, es decir, se ha establecido el contexto en el que se construye la imagen. - En la etapa de despliegue, se determina que utilizaremos kubectl y una plantilla para los manifiestos necesarios.
-
PortForward: de manera similar a como normalmente abrimos puertos conkubectl port-forward, damos instrucciones a Skaffold para invocar este comando. En este caso, el puerto local 9000 se redirige al 8080 en el Deployment llamadoleeroy-web.
Es el momento perfecto para ejecutar skaffold dev: el comando creará un 'ciclo de retroalimentación' continuo, es decir, no solo compilará todo y lo desplegará en el clúster, sino que también informará sobre el estado de los pods en ese momento, estará atento a los cambios y actualizará el estado de los pods.
Aquí está el resultado de la ejecución skaffold dev --port-forward en una nueva construcción:

Primero, se puede ver que se está utilizando caché. Luego, la aplicación se compila, despliega y se redirigen los puertos. Dado que se especifica --port-forward, Skaffold ha redirigido el puerto a web, como se solicitó, pero app él lo redirigió a su propia discreción (eligió el puerto libre más cercano). Después de esto, recibimos los primeros registros de las aplicaciones.
¿Verificamos la funcionalidad?
~\/skaffold\/examples\/microservices # kubectl get po
NOMBRE LISTO ESTADO REINICIOS EDAD
leeroy-app-6998dfcc95-2nxvf 1\/1 Ejecutando 0 103s
leeroy-web-69f7d47c9d-5ff77 1\/1 Ejecutando 0 103s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy app!!! Modificamos el archivo leeroy-app\/app.go — pasan unos segundos… y:
~\/skaffold\/examples\/microservices # kubectl get po
NOMBRE LISTO ESTADO REINICIOS EDAD
leeroy-app-ffd79d986-l6nwp 1\/1 Ejecutando 0 11s
leeroy-web-69f7d47c9d-5ff77 1\/1 Ejecutando 0 4m59s
~\/skaffold\/examples\/microservices # curl localhost:9000
leeroooooy Habr!!! Mientras tanto, Skaffold ha mostrado en la consola lo mismo que antes, excepto por un detalle: solo imprimió leeroy-app, y no todo de una vez.
Más práctica
Cabe mencionar que al crear un nuevo proyecto, se pueden 'bootstrapear' las configuraciones de Skaffold con el comando init, lo cual es muy conveniente. Además, se pueden escribir varias configuraciones: desarrollar usando la configuración predeterminada y luego desplegar en stage con el comando run (el mismo proceso que dev, solo que no monitorea cambios), utilizando otra configuración.
En katacoda hay un ejemplo aún más sencillo. Allí se ofrece un entorno listo con Kubernetes, una aplicación y Skaffold. Una excelente opción si deseas probar las bases por ti mismo.
Una de las posibles aplicaciones de Skaffold es el desarrollo en un clúster remoto. No todos se sienten cómodos ejecutando Minikube en su propio hardware y luego desplegando la aplicación mientras esperan que funcione adecuadamente… En tal caso, Skaffold resuelve muy bien el desafío, algo que pueden confirmar, por ejemplo, los ingenieros de Reddit, sobre lo cual ya en nuestro blog.
Y en Weaveworks se puede encontrar un ejemplo de creación de un pipeline para producción.
Conclusión
Skaffold es una herramienta conveniente para construir pipelines que implican el despliegue de aplicaciones en Kubernetes, orientadas principalmente a las necesidades del desarrollo. Con él, es bastante sencillo crear un pipeline "corto" que tenga en cuenta las necesidades básicas del desarrollador, aunque también es posible organizar procesos más grandes si se desea. Como uno de los ejemplos ilustrativos del uso de Skaffold en procesos de CI/CD tal de 10 microservicios que utilizan las capacidades de Kubernetes, gRPC, Istio y OpenCensus Tracing.
Skaffold ya ha recibido casi 8000+ estrellas en GitHub, está desarrollado por Google y es parte de — en general, en este momento hay todas las razones para creer que el proyecto continuará desarrollándose a largo plazo.
P.D.
También puedes leer en nuestro blog:
- «»;
- «»;
- «»;
- «».
Fuente: habr.com
