Despliegue y validación de microservicios en Kubernetes con Skaffold

Publicado por Oscar Sanz el

MicroserviciosKubernetesMinikubeSkaffoldArquitectura de Soluciones

Continuando el artículo sobre el Despliegue de microservicios Java con Docker y JIB vamos a seguir hablando de herramientas que nos pueden ayudar durante la fase de desarrollo en entornos Cloud.

En concreto en este artículo vamos a hablar de la utilidad Skaffold, herramienta desarrollada por el equipo de Google Cloud.

Skaffold es un CLI que nos facilita las tareas de desarrollo en aplicaciones desplegadas en Kubernetes.

Las funcionalidades que nos aporta está herramienta son:

  • Desarrollo en local con un cluster de Kubernetes (local o Cloud).
  • Gestión de la configuración del ciclo de vida en diferentes entornos. Toda la configuración se gestiona en el fichero skaffold.yaml.
  • Reducir la complejidad de los procesos de integración continua y despliegue continuo.
  • No requiere configuración adicional en nuestro cluster de Kubernetes, sólo en el equipo del desarrollador.

El uso de Skaffold nos facilita las siguientes tareas:

  • Cambios en el código fuente.
  • Construcción de los artefactos para generar los Pods.
  • Probar los artefactos generados utilizando la estructura de un contenedor.
  • Etiquetar los artefactos (tagging).
  • Promoción de artefactos (push).
  • Desplegar artefactos en el cluster (deploy).
  • Monitorizar los artefactos desplegados (debug).

Prueba de Concepto

A continuación vamos a ver cómo funciona Skaffold con un pequeño servicio en Spring Boot. Para ello necesitamos cumplir los siguientes pre-requisitos:

  • Cluster Kubernetes (minikube).
  • Skaffold.
  • Visual Studio Code.
  • Maven 3.x
  • Java JDK 8 o superior.
  • Docker Runtime.
  • Credenciales de acceso de un Registro Docker (Ej. Docker Hub).
Instalación minikube

Para poder desplegar el ejemplo de este post vamos a necesitar un cluster de Kubernetes. Para ello vamos a seguir la guía de "como instalar minikube" en el siguiente [enlace].(https://kubernetes.io/es/docs/tasks/tools/install-minikube/)

1.- La virtualización VT-x o AMD-v debe estar habilitada en la BIOS de tu ordenador. El siguiente comando nos proporciona está información:

Mac: sysctl -a | grep machdep.cpu.features

Linux: egrep --color 'vmx|svm' /proc/cpuinfo

2.- Instalación de un HiperVisor, para ello os recomiendo instalar VirtualBox que es compatible con Mac y Linux a través del siguiente enlace.

3.1.- Instalación Minikube (Mac)

Para instalar minikube en Mac podemos utilizar uno de los siguientes comandos:

brew cask install minikube

o

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-darwin-amd64 && chmod +x minikube

Mover el ejecutable "minikube" a "/usr/local/bin":

sudo mv minikube /usr/local/bin

3.2.- Instalación minikube (Linux)

Para instalar minikube en Linux podemos utilizar el siguiente comando:

curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube

Mover el ejecutable "minikube" a "/usr/local/bin":

sudo cp minikube /usr/local/bin && rm minikube

4.- Arrancar minikube

Para iniciar nuestro cluster en local ejecutaremos el siguiente comando:

minikube start

run-minikube

Si este comando nos devuelve un error debemos borrar los ficheros temporales con rm -rf ~/.minikube

5.- Arrancar Dashboard

Para iniciar el dashboard de nuestro minikube ejecutaremos minikube dashboard

run-dashboard
web-dashboard

Instalación de Skaffold

1.- Instalación en Mac

Para instalar Skaffold en un entorno Mac debemos ejecutar el siguiente comando:

brew install skaffold

o

curl -Lo skaffold https://storage.googleapis.com/skaffold/releases/latest/skaffold-darwin-amd64`
chmod +x skaffold
sudo mv skaffold /usr/local/bin
2.- Instalación en Linux

Para instalar Skaffold en un entorno Linux debemos ejecutar los siguientes comandos:

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

Desplegando un microservicio SpringBoot con Skaffold

A continuación vamos a publicar un microservicio en nuestro clúster de Kubernetes local (minikube).

El microservicio lo podremos obtener de este enlace de Github.

https://github.com/osanzs/helloworld-skaffold.git

1.- Abrimos el proyecto con Visual Studio:

Abrir-proyecto

2.- La configuración de Skaffold se encuentra en los siguientes ficheros:

  • skaffold.yaml: Configuración general del proyecto.
  • k8s-pod.yaml: Despliegue de los artefactos en Kubernetes.

El fichero skaffold.yaml se puede autogenerar a partir de un fichero Dockerfile con el siguiente comando skaffold init desde nuestra consola.

Si no disponemos de un Dockerfile podemos ejecutar el siguiente comando para crear un fichero de configuración base skaffold init --skip-build.

Este comando generará el siguiente fichero:

init-config

Para este ejemplo hemos añadido la configuración de los puertos que vamos a utilizar para exponer nuestro microservicio, quedado la configuración del proyecto con el siguiente contenido:

config-skaffold

El fichero k8s-pod.yaml contendrá la información de los artefactos. En nuestro ejemplo vamos a desplegar un Pod con nuestro microservicio:

pod-config

La información más relevante de este fichero es:

  • kind: Tipo de artefacto (Pod, Service, Deployment).
  • containers: Información de la imagen que se va a desplegar en el Pod.

La imagen utilizada se ha generado con Java Image Build (JIB) que podéis consultar en el artículo Desplegando microservicios Java con Docker y JIB

3.- Para desplegar este ejemplo en nuestro clúster ejecutaremos el siguiente comando:

skaffold run

skaffold-run

A continuación en nuestro clúster tendremos nuestro Pod desplegado:

pod-kubernetes

4.- Para validar nuestro microservicio tendremos que exponer un endpoint para acceder a nuestro Pod. Para ello crearemos un "Service" a través del CLI de Kubernetes con el siguiente comando:

kubectl expose pod helloworld-skaffold --type=NodePort

k8s-service

Para entornos productivos no es recomendable exponer un Pod sino utilizar un artefacto "deployment" que nos permita gestionar N instancias de nuestro Pod.

Para validar que nuestro service se ha desplegado correctamente utilizaremos el siguiente comando:

kubectl get services

services-k8s

5.- Utilizaremos minikube service helloworld-skaffold para validar el correcto funcionamiento de nuestro servicio.

A continuación se abrirá un navegador con el contexto principal de nuestra aplicación, generando un error 404 debido a que no hemos publicado nada:

error-spring

Si accedemos a nuestro contexto "hello" comprobaremos que nuestro servicio funciona correctamente:

ok-spring

6.- Para eliminar nuestra aplicación del clúster ejecutaremos el siguiente comando:

skaffold delete

skaffold-delete
k8s-delete

Debug de un microservicio SpringBoot con Skaffold

Skaffold además de facilitar el proceso de despliegue, también nos permite depurar y validar nuestras aplicaciones sobre un clúster de Kubernetes.

Para arrancar nuestra aplicación conectando nuestro IDE al clúster de Kubernetes tenemos las siguientes opciones:

  • "skaffold dev": Permite realizar cambios de código fuente al realizar un cambio en nuestro workspace.
  • "skaffold debug": Proporciona la misma funcionalidad que el modo dev, pero adicionalmente nos permite realizar un attach y poder ejecutar tareas de debug.

Los pasos para ejecutar un proceso de depuración sobre nuestra aplicación debemos ejecutar los siguientes pasos.

1.- Ejecutar nuestro proyecto con el siguiente comando:

skaffold debug

Este comando comenzará a realizar las siguientes operaciones sobre nuestro clúster:

Creación de imagen Docker con JIB

crear-tag

Creación de artefacto (Pod) en el clúster

build-ok

Despliegue del artefacto en el clúster

deploy-k8s

En está captura se muestra el puerto de debug expuesto por el contenedor (5005). Este puerto es el utilizado por defecto en la imagen base utilizada por JIB (Distroless Java).

2.- Para conectar nuestro IDE (Visual Studio Code) al contenedor procederemos a ejecutar el comando "Kubernetes: Debug (Attach)

debug-command

A continuación el asistente nos ira solicitando la información para arrancar el modo debug en nuestro IDE.

Selección del Pod

seleccion-pod

Lenguaje de programación

language-java

Puerto de Debug

debug-port

Si todo ha funcionado correctamente tendremos nuestro entorno conectado al clúster:

cluster-debug

3.- Para validar el correcto funcionamiento vamos a crear un breakpoint en la linea 29 del fichero "HelloController.java"

breakpoint-controller

4.- Ejecutamos nuestro servicio desde el navegador:

http://192.168.99.100:30217/hello?name=Oscar%20Sanz

Al invocar esta URL podremos comprobar que nuestro IDE nos indica que el servicio está en modo debug:

debug-code
debug-var

Si procedemos a ejecutar la siguiente instrucción, la petición se completará mostrando la respuesta en el navegador.

response-ok

5.- Para finalizar el proceso de debug sólo tendremos que ejecutar "CTRL+C" y el proceso finalizará.

stop-debug

Conclusión

En este artículo hemos repasado de forma muy práctica cómo puede ayudarnos Skaffold en nuestro día a día con microservicios desplegados en Kubernetes.

Si te ha gustado, ¡síguenos en Twitter para estar al día de nuevas entregas!