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
About Us
Micael Gallego
● @micael_gallego
● Java Developer
● Laboratorio software CodeURJC
● Director Máster Cloud Apps en la
Universidad Rey Juan Carlos
About Us
Pablo Chico de Guzmán
● @pchico83
● Docker & Cloud Native Madrid
● 4 years working @Docker
● Kubernetes for Developers
● https://cloud.okteto.com
¿Qué es Kubernetes?
● Docker: Construcción y distribución de aplicaciones
● Kubernetes: Despliegue en producción en cluster
● Abstracción de cloud para developers
¿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
¿Cómo desplegar en Kubernetes durante el desarrollo?
¿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"]
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
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
Desarrollo Java en un IDE (sin Kubernetes)
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
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
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
Desarrollo Java con despliegue en Kubernetes
¿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
Optimización de capas con Dockerfile en SpringBoot
https://spring.io/guides/gs/spring-boot-docker/
Dockerfile
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
Optimización de capas con Jib
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.6.1</version>
</plugin>
</plugins>
</build>
</project>
pom.xml
$ ./mvnw compile jib:build -Dimage=micaelgallego/demoservice-k8s2:latest
$ kubectl apply -f k8s
demoservice-k8s2
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
Optimización de capas con Jib
¿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
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
Okteto: Envía tu código del laptop al pod del cluster
$ okteto up
$ kubectl apply -f k8s
demoservice-k8s3
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
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
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
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
Okteto: Envía tu código del laptop al pod del cluster
+
2
demoservice-k8s4
Okteto: Envía tu código del laptop al pod del cluster
demoservice-k8s4
Otros Tools de Desarrollo en Kubernetes
Despliegue de pods y sincronización de ficheros
Otros Tools de Desarrollo en Kubernetes
Tu laptop “conectado” a los servicios del cluster
Otros Tools de Desarrollo en Kubernetes
IDE ejecutado en el pod con interfaz remota / web
VS Code Remote
Development
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
Cómo leer una licencia de
software y no morir en el intento
Pablo Chico MAD · NOV 22-23 · 2019
Micael Gallego
Gracias!

Herramientas y plugins para el desarrollo de aplicaciones cloud native para Kubernetes - CommitConf 2019

  • 1.
    Cómo leer unalicencia 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 Chicode 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 Kubernetesdurante 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
  • 6.
    ¿Cómo desplegar enKubernetes durante el desarrollo?
  • 7.
    ¿Cómo acelerar elciclo 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 enun 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 enun 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
  • 10.
    Desarrollo Java enun IDE (sin Kubernetes)
  • 11.
    Desarrollo Java condespliegue 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 condespliegue 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 condespliegue 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
  • 14.
    Desarrollo Java condespliegue en Kubernetes
  • 15.
    ¿Se pueden optimizarlas 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 capascon Dockerfile en SpringBoot https://spring.io/guides/gs/spring-boot-docker/ Dockerfile
  • 17.
    Optimización de capascon 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
  • 18.
    Optimización de capascon Jib <project ...> ... <build> <plugins> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-plugin</artifactId> <version>1.6.1</version> </plugin> </plugins> </build> </project> pom.xml $ ./mvnw compile jib:build -Dimage=micaelgallego/demoservice-k8s2:latest $ kubectl apply -f k8s demoservice-k8s2
  • 19.
    Optimización de capascon 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
  • 20.
  • 21.
    ¿Podemos optimizar másel 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 tucó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 tucódigo del laptop al pod del cluster $ okteto up $ kubectl apply -f k8s demoservice-k8s3
  • 24.
    Okteto: Envía tucó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 yLiveReload 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 yLiveReload 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 tucódigo del laptop al pod del cluster + 2 demoservice-k8s4
  • 29.
    Okteto: Envía tucódigo del laptop al pod del cluster demoservice-k8s4
  • 30.
    Otros Tools deDesarrollo en Kubernetes Despliegue de pods y sincronización de ficheros
  • 31.
    Otros Tools deDesarrollo en Kubernetes Tu laptop “conectado” a los servicios del cluster
  • 32.
    Otros Tools deDesarrollo en Kubernetes IDE ejecutado en el pod con interfaz remota / web VS Code Remote Development
  • 33.
    Conclusiones ● Puedes evitarlos 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 unalicencia de software y no morir en el intento Pablo Chico MAD · NOV 22-23 · 2019 Micael Gallego Gracias!