Revisión de Skaffold para el desarrollo de Kubernetes

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 Open Source para CI/CD llamado patín, cuyo objetivo era crear un “desarrollo de Kubernetes simple y repetible” para que los desarrolladores pudieran centrarse en el desarrollo en lugar de en la administración. ¿Qué podría ser interesante sobre Skaffold? Resulta que tiene algunos trucos bajo la manga que pueden convertirlo en una herramienta poderosa para el desarrollador, y tal vez incluso para el ingeniero de operaciones. Conozcamos el proyecto y sus capacidades.

NB: Por cierto, ya hemos hablado brevemente sobre Skaffold en nuestra charla general. revisión de herramientas de desarrollador, cuyas vidas están conectadas con Kubernetes.

Teoría. Propósito y capacidades

Entonces, en términos generales, Skaffold resuelve el problema de automatizar el ciclo CI/CD (en las etapas de construcción, envío e implementación), ofreciendo al desarrollador comentarios rápidos, es decir, la capacidad de recibir rápidamente el resultado de cambios de código posteriores, en forma de una aplicación actualizada que se ejecuta en el clúster de Kubernetes. Y puede funcionar en diferentes circuitos (desarrollo, etapa, producción...), para lo cual Skaffold ayuda a describir los canales correspondientes para el lanzamiento.

El código fuente de Skaffold está escrito en Go, distribuido por bajo la licencia gratuita Apache 2.0 (GitHub).

Veamos las funciones y características principales. 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 y ejecutar un proceso automatizado para ensamblar código en imágenes de contenedor, publicar estas imágenes en Docker Registry e implementarlas en el clúster de Kubernetes.
  • Sincroniza archivos en el repositorio con el directorio de trabajo en el contenedor.
  • Pruebas automáticamente mediante prueba de estructura de contenedor.
  • Puertos de avance.
  • Lee los registros de una aplicación que se ejecuta en un 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 es necesario configurar más Kubernetes para utilizar esta utilidad.
  • Diferentes canales para su aplicación. ¿Necesita implementar el código en el Minikube local mientras desarrolla y luego pasarlo al escenario o a la producción? Para ello existen Perfiles y configuraciones de usuario, variables de entorno y indicadores, que le permiten describir diferentes canalizaciones para una aplicación.
  • CLI. Solo utilidad de consola y configuraciones en YAML. En Internet se pueden encontrar referencias a intentos de crear interfaz gráfica de usuario experimental, sin embargo, en este momento lo más probable es que esto solo signifique que alguien lo necesita, pero no realmente.
  • Modularidad. Skaffold no es un recolector independiente, sino que se esfuerza por utilizar módulos individuales o soluciones existentes para tareas específicas.

Ilustración de este último:

  • En la etapa de montaje puedes utilizar:
    • Docker build localmente, en un clúster usando kaniko o en Google Cloud Build;
    • Bazel a nivel local;
    • 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 de compilación (más flexible/familiar/...), se describe en el script para que Skaffold la inicie (ejemplo de la documentación). Esto le permite utilizar cualquier recopilador al que se pueda llamar mediante un script;
  • En la etapa de prueba, lo ya mencionado prueba-de-estructura-de-contenedores;
  • Para la implementación se proporciona lo siguiente:
    • Kubectl;
    • Timón;
    • personalizar.

Gracias a esto, Skaffold puede considerarse un producto único. marco para construir CI/CD. A continuación se muestra un flujo de trabajo de ejemplo al usarlo (de la documentación del proyecto):

Revisión de Skaffold para el desarrollo de Kubernetes

¿Cómo es el trabajo de Skaffold en términos generales?

  1. La utilidad monitorea los cambios en el directorio del código fuente. Si se realizan modificaciones en los archivos, se sincronizan con el pod de la aplicación en el clúster de Kubernetes. A ser posible, sin volver a montar la imagen. De lo contrario, se ensambla una nueva imagen.
  2. La imagen ensamblada se verifica mediante prueba de estructura de contenedor, se etiqueta y se envía al Registro Docker.
  3. Después de esto, la imagen se implementa, se implementa en el clúster de Kubernetes.
  4. Si el lanzamiento se inicializó usando el comando skaffold dev, luego comenzamos a recibir registros de la aplicación y Skaffold espera los cambios para repetir todas las acciones nuevamente.

Revisión de Skaffold para el desarrollo de Kubernetes
Ilustración de las principales etapas de la operación Skaffold.

Práctica. Probando Skaffold

Para demostrar el uso de Skaffold, tomaré un ejemplo de Repositorio de proyectos de GitHub. Por cierto ibid Puede encontrar muchos otros ejemplos que tienen en cuenta varios detalles específicos. Realizaré todas las acciones localmente en Minikube. La instalación es sencilla y lleva unos minutos, y necesitarás 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 de 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 Go. Una aplicación es el frontend (leeroy-web), que redirige la solicitud a la segunda aplicación: 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 crear 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, basta con saberlo. leeroy-web acepta solicitudes y las transfiere a leeroy-app. Por lo tanto en los archivos Deployment.yaml hay un Servicio solo para app (para enrutamiento interno). Puerto de cápsulas web Nos lo reenviaremos a nosotros mismos para acceder rápidamente a la aplicación.

Parece 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

Todas las etapas mencionadas 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 establecerá la variable global local-cluster en significado true, después de lo cual Skaffold no intentará enviar imágenes al registro remoto. Si está desarrollando localmente, puede utilizar este comando para crear imágenes localmente.

Volver a skaffold.yaml:

  • En el escenario build especificamos que necesita recopilar y guardar la imagen localmente. Después de que la compilación se ejecute 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 etiquetó las imágenes él mismo. Por cierto, se admiten varias políticas de etiquetado.

  • Más adelante en la configuración se indica context: ./leeroy-app/, es decir. Se especifica el contexto en el que se recoge la imagen.
  • En la etapa de implementación, se determina que usaremos kubectl y una máscara para los manifiestos necesarios.
  • PortForward: similar a cómo normalmente reenviamos puertos usando kubectl port-forward, le damos instrucciones a Skaffold para que llame a este comando. En este caso, el puerto local 9000 se reenvía al 8080 en Implementación con el nombre leeroy-web.

Es hora de lanzar skaffold dev: El equipo creará un “bucle de retroalimentación” continuo, es decir. no solo recopilará todo y lo implementará en el clúster, sino que también le informará sobre el estado de los pods en ese momento, monitoreará los cambios y actualizará el estado de los pods.

Aquí está el resultado del lanzamiento. skaffold dev --port-forward al volver a montar:

Revisión de Skaffold para el desarrollo de Kubernetes

Primero, puede ver que se está utilizando el caché. A continuación, se ensambla, implementa y reenvía los puertos. Desde especificado --port-forward, Skaffold envió el puerto a web, como le preguntaron, pero aquí app lanzó a su discreción (eligió el libre más cercano). Después de esto, recibimos los primeros registros de las aplicaciones.

¿Comprobamos si funciona?

~/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!!!

Modificando el archivo leeroy-app/app.go - pasan 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, el propio Skaffold mostró lo mismo en la consola que antes, con la excepción de un punto: solo se lanzó leeroy-app, y no todos a la vez.

Más práctica

También vale la pena mencionar que al crear un nuevo proyecto, las configuraciones para Skaffold se pueden iniciar usando el comando init, lo cual es muy conveniente. Además, puede escribir varias configuraciones: llevar a cabo el desarrollo en la configuración predeterminada y luego implementarla en el escenario con el comando run (mismo proceso que dev, simplemente no monitorea los cambios), usando una configuración diferente.

En katacoda hay руководство Es aún más fácil con un ejemplo. Pero ofrece un sandbox listo para usar con Kubernetes, una aplicación y Skaffold. Una gran opción si estás interesado en probar los conceptos básicos tú mismo.

Un posible caso de uso de Skaffold es realizar el desarrollo en un clúster remoto. No todo el mundo se siente cómodo ejecutando Minikube en su propio hardware, luego implementa la aplicación y espera que funcione adecuadamente... En este caso, Skaffold resuelve el problema a la perfección, lo que pueden confirmar, por ejemplo, los ingenieros de Reddit, como hemos hecho nosotros. ya discutido escribió en nuestro blog.

Y en esta publicacion En Weaveworks puede encontrar un ejemplo de cómo crear una canalización para producción.

Conclusión

Skaffold es una herramienta conveniente para crear canales que implican implementar aplicaciones en Kubernetes y se centran principalmente en las necesidades de desarrollo. Hace que sea bastante fácil crear un proceso "corto" que tenga en cuenta las necesidades básicas del desarrollador, pero si lo desea, puede organizar procesos más grandes. Como uno de los ejemplos claros del uso de Skaffold en procesos de CI/CD es dado tal proyecto de prueba de 10 microservicios utilizando las capacidades de Kubernetes, gRPC, Istio y OpenCensus Tracing.

Skaffold ya tiene casi 8000+ estrellas en GitHub, está desarrollado por Google y es parte de Herramientas de contenedor de Google — 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:

Fuente: habr.com

Añadir un comentario