Revisión de Skaffold para desarrollo en Kubernetes

Revisión de Skaffold para desarrollo en 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 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 revisión general de herramientas para desarrolladores, 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, se distribuye 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:

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 (ejemplo de la documentación). Esto permite utilizar cualquier constructor que se pueda invocar mediante un script;
  • En la fase de prueba se soporta ya mencionado container-structure-test;
  • 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):

Revisión de Skaffold para desarrollo en Kubernetes

¿Cómo se ve en términos generales el funcionamiento de Skaffold?

  1. 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.
  2. La imagen construida se verifica mediante container-structure-test, se etiqueta y se envía a Docker Registry.
  3. Después de esto, la imagen se despliega - se implementa en el clúster de Kubernetes.
  4. 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.

Revisión de Skaffold para desarrollo en Kubernetes
Ilustración de las etapas principales del trabajo de Skaffold

Práctica. Probamos Skaffold

Para demostrar el uso de Skaffold, tomaré un ejemplo de el repositorio de proyecto en GitHub. Por cierto, ahí mismo 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.1

Clonamos el repositorio de Skaffold con los ejemplos necesarios:

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

He 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 archivos

leeroy-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 build especificamos 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.1MB

    Como 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 con kubectl port-forward, damos instrucciones a Skaffold para invocar este comando. En este caso, el puerto local 9000 se redirige al 8080 en el Deployment llamado leeroy-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:

Revisión de Skaffold para desarrollo en Kubernetes

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 la guía 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 hemos escrito en nuestro blog.

Y en esta publicación 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 se presenta tal un proyecto de prueba 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 GoogleContainerTools — 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

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