Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Herramientas y plugins para el desarrollo de aplicaciones cloud native para Kubernetes - CommitConf 2019
1. Cómo leer una licencia de
software y no morir en el intento
Pablo Chico
Organizador Docker Madrid Meetup
MAD · NOV 22-23 · 2019
Micael Gallego
Profesor Universidad Rey Juan Carlos
2. About Us
Micael Gallego
● @micael_gallego
● Java Developer
● Laboratorio software CodeURJC
● Director Máster Cloud Apps en la
Universidad Rey Juan Carlos
3. About Us
Pablo Chico de Guzmán
● @pchico83
● Docker & Cloud Native Madrid
● 4 years working @Docker
● Kubernetes for Developers
● https://cloud.okteto.com
4. ¿Qué es Kubernetes?
● Docker: Construcción y distribución de aplicaciones
● Kubernetes: Despliegue en producción en cluster
● Abstracción de cloud para developers
5. ¿Desplegar en Kubernetes durante el desarrollo?
● Aplicaciones nativas de Kubernetes
● Acceso a la Kubernetes API
● Aplicaciones que dependen de Kubernetes para funcionar
● Acoplada con Config Maps, Secretos, Volúmenes
● Microservices, Service Discovery de Kubernetes
● Networking, Service mesh
7. ¿Cómo acelerar el ciclo de build/push/redeploy?
FROM python:3-alpine
ADD requirements.txt requirements.txt
RUN pip install -r requirements.txt
ADD . /src
CMD ["python", "app.py"]
8. Desarrollo Java en un IDE (sin Kubernetes)
● Java es un lenguaje que necesita compilación
● Los IDEs permiten compilación incremental (muy rápida):
● Durante la edición: Para ayudar al developer (autocompletar y errores)
● Al guardar el fichero: Genera los binarios (.class) en disco
9. Desarrollo Java en un IDE (sin Kubernetes)
● Si se usa un IDE la experiencia es “similar” a los lenguajes de script
● Se guarda el fichero y está compilado de forma inmediata
● No hay esperas por el proceso de compilación
● Los frameworks se recargan automáticamente ante cambios (Hot Reload)
https://github.com/micaelgallego/k8s-dev-tools-commitconf19
11. Desarrollo Java con despliegue en Kubernetes
● Compilación y construcción del contenedor
FROM maven:3.6-jdk-8 as builder
COPY . /code/
WORKDIR /code
RUN mvn package
FROM openjdk:8-jre
COPY --from=builder /code/target/*.jar /usr/app/
WORKDIR /usr/app
CMD [ "java", "-jar", "demoservice-0.0.1-SNAPSHOT.jar" ]
Dockerfile
$ docker build . -t micaelgallego/demoservice-k8s1
$ docker push micaelgallego/demoservice-k8s1:latest
demoservice-k8s1
12. Desarrollo Java con despliegue en Kubernetes
● Despliegue en Kubernetes
$ kubectl apply -f k8s
$ kubectl get deployments,services
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.extensions/demoservice-dply 0/1 1 0 3m1s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/demoservice-service NodePort 10.104.15.250 <none> 8080:31236/TCP 31s
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 98d
demoservice-k8s1
13. Desarrollo Java con despliegue en Kubernetes
● Añadir un cambio en el servicio
● Compilación del código Java
● Descarga librerías Maven
● Construye el fat jar desde cero
● Construcción del contenedor con un nuevo fichero de 16Mb
● Publicación del contenedor en un registro (transferencia de red)
● Reinicio del deployment en Kubernetes (si el tag es latest)
$ kubectl rollout restart deployment demoservice-dply
demoservice-k8s1
15. ¿Se pueden optimizar las capas de la imagen con Java?
● No crear un fat jar con aplicación y librerías
● Separar librerías y aplicación en capas diferentes
● Cuando cambia la aplicación se transfieren los .class de la aplicación
● Extra bonus! La aplicación arrancará más rápido
https://spring.io/blog/2018/12/12/how-fast-is-spring
16. Optimización de capas con Dockerfile en SpringBoot
https://spring.io/guides/gs/spring-boot-docker/
Dockerfile
17. Optimización de capas con Jib
● Jib
● Dockeriza y publica cualquier aplicación Java
● No es necesario el Docker daemon
● Imagen con capas optimizadas (libs vs app)
● Imagen base ligera (distroless)
● Integrado con Maven y Gradle
● Desarrollado por Google
https://github.com/GoogleContainerTools/jib
19. Optimización de capas con Jib
● Añadir un cambio en el servicio
$ kubectl rollout restart deployment demoservice-dply
$ ./mvnw compile jib:build -Dimage=micaelgallego/demoservice-k8s2:latest
demoservice-k8s2
21. ¿Podemos optimizar más el proceso?
● Si tuviéramos un
compilador Java en el pod
podríamos enviar los
cambios en los ficheros
fuente que han sido
actualizados
● Con hot reload el cambio
en el fuente lanzaría la
compilación y la
actualización del servicio
en el pod
22. Okteto: Envía tu código del laptop al pod del cluster
● Sustituye el pod de la aplicación por otro pod con Maven (compilador)
● Ejecuta la aplicación de nuevo en ese contenedor (mvn spring-boot:run)
● Sincroniza los ficheros del laptop a ese pod de forma automática
23. Okteto: Envía tu código del laptop al pod del cluster
$ okteto up
$ kubectl apply -f k8s
demoservice-k8s3
24. Okteto: Envía tu código del laptop al pod del cluster
name: demoservice-dply
image: maven:3.6-jdk-8
command:
- mvn
- spring-boot:run
volumes:
- /root/.m2
forward:
- 8080:8080
okteto.yml
demoservice-k8s3
25. name: demoservice-dply
image: maven:3.6-jdk-8
command:
- mvn
- spring-boot:run
volumes:
- /root/.m2
forward:
- 8080:8080
Okteto: Envía tu código del laptop al pod del cluster
okteto.yml
Sustituye el pod del deployment
demoservice-dply...
...por una imagen con maven
Ejecuta la aplicación
Expone la app en localhost
Guarda la caché de maven en volúmen
demoservice-k8s3
26. Okteto: Depuración y LiveReload
Eclipse se puede conectar a una JVM
para hacer depuración remota
demoservice-k8s4
La extensión del navegador
LiveReload recarga la página cuando
detecta un cambio
27. Okteto: Depuración y LiveReload
name: demoservice-dply
image: maven:3.6-jdk-8
command:
- mvn
- spring-boot:run
volumes:
- /root/.m2
forward:
- 8080:8080
- 8000:8000
- 35729:35729
okteto.yml
● Podemos configurar la aplicación para que exporte el puerto 8000 para
depuración remota desde Eclipse
● Con las dev-tools expone el puerto 35729 para el plugin Remote LiveReload
del navegador
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<jvmArguments>
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8000
</jvmArguments>
</configuration>
</plugin>
...
pom.xml
demoservice-k8s4
28. Okteto: Envía tu código del laptop al pod del cluster
+
2
demoservice-k8s4
29. Okteto: Envía tu código del laptop al pod del cluster
demoservice-k8s4
30. Otros Tools de Desarrollo en Kubernetes
Despliegue de pods y sincronización de ficheros
31. Otros Tools de Desarrollo en Kubernetes
Tu laptop “conectado” a los servicios del cluster
32. Otros Tools de Desarrollo en Kubernetes
IDE ejecutado en el pod con interfaz remota / web
VS Code Remote
Development
33. Conclusiones
● Puedes evitar los 5
minutos en el ciclo de
build/push/redeploy
● Muchas herramientas
para desarrollo cloud
native eficiente
● Elige la más adecuada
para tu tecnología / flujo
de trabajo
34. Cómo leer una licencia de
software y no morir en el intento
Pablo Chico MAD · NOV 22-23 · 2019
Micael Gallego
Gracias!