Charla impartida entre Pablo Chico y Micael Gallego en la que se muestran algunas herramientas para mejorar la experiencia de desarrollo de aplicaciones cloud native para Kubernetes. Concretamente, se presenta cómo okteto puede reducir el tiempo empleado en el ciclo de change, build, push, deploy de pods Java en Kubernetes usando la sincronización de ficheros.
Ejemplos de código en https://github.com/micaelgallego/k8s-dev-tools-codemo19
Tema 3: Despliegue de aplicaciones web (Desarrollo Aplicaciones Web)
Dev Tools para Kubernetes - Codemotion 2019
1. Dev Tools para Kubernetes
Micael Gallego Carrillo y Pablo Chico de Guzmán
24-25 September, 2019
2. ● Fundada en Abril del 2014
● Con Javier Provecho y Pablo Moncada
● 4.000 miembros
● ¡Ven a presentar con nosotros!
● https://meetup.com/Docker-Madrid
@DockerMadrid
Docker Madrid
3. About Us
Pablo Chico de Guzmán
● @pchico83
● Docker & Cloud Native Madrid
● 4 years working @Docker
● Kubernetes for Developers
● https://cloud.okteto.com
5. Agenda
● ¿Qué es Docker? ¿Qué es Kubernetes?
● Desarrollo de Aplicaciones Nativas de Kubernetes
● Inner Loop Muy Lento:
● Python Demo
● Java Demo
● Otros Puntos de Fricción: https://t.co/z2BSi0UFp6
● Conclusiones
https://github.com/micaelgallego/k8s-dev-tools-code
mo19
6. ¿Qué es Docker?
● Build, Ship and Run. Any application, anywhere
● Proceso ligero, aislado y portable
7. ¿Qué es Kubernetes?
● Orquestador open source
● Evolución de Borg, Google
● Contenedores en producción
● Declarativo, Respuesta a fallo
● Standard Run API
● Gran comunidad
8. ¿Qué es una Aplicación Nativa de Kubernetes?
● Una aplicación que solo puede correr en Kubernetes
● Acceso a la Kubernetes API
● Otros casos (entornos integrados):
● Acoplada con Config Maps, Secretos, Volúmenes
● Microservices, Service Discovery de Kubernetes
● Networking, Service mesh
11. Python Demo
● PullAways (imagePullStrategy) puede recargar una aplicación con:
● IfNotPresent and rebuild image (solo local)
● Mount volume and hot reload (solo local)
kubectl rollout restart deployment deployment-name
12. Java Demo: desarrollo clásico con Eclipse
● Java es un lenguaje que necesita compilación
● Los IDEs (como Eclipse) permiten compilación incremental:
● Durante la edición: Para ayudar al developer (autocompletar y errores)
● Al guardar el fichero: Genera los binarios (.class) en disco
13. Java Demo: desarrollo clásico con Eclipse
● Para el desarrollador la experiencia es “similar” a los lenguajes de script
● No hay esperas por el proceso de compilación
● Es todo automático
● Frameworks web tienen Hot Reload: Guardar y actualizar
15. Java Demo: build/push/redeploy
● Compilación y construcción del contenedor
FROM maven 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
16. Java Demo: build/push/redeploy
● 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
17. Java Demo: build/push/redeploy
● Añadir un cambio en el servicio
● Compilación servicio Java
● Descarga librerías Maven
● Construye el uber 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
19. Java Demo: Optimizando capas
● Construcción del contenedor y transferencia más rápida
● Separar librerías y aplicación en capas diferentes
● Se aprovecha la caché con las librerías al construir
● Se reduce la transferencia al código de la aplicación
● Extra bonus! La aplicación arrancará más rápido*
* Exploded jar: https://spring.io/blog/2018/12/12/how-fast-is-spring
20. Java Demo: Optimizando capas
● Jib
● Conteineriza y publica aplicaciones Java
● No es necesario el Docker daemon
● Imagen optimizada (distroless)
● Integrado con Maven y Gradle
● Desarrollado por Google
https://github.com/GoogleContainerTools/jib
24. Java Demo: Recarga Automática con Okteto
● Podemos optimizar aún más
el proceso?
● Podemos transferir
únicamente los ficheros .class
nuevos del laptop al pod k8s
cuando hacemos un cambio?
● Si tenemos hot reload, eso
permitiría un reinicio del
servicio prácticamente
instantáneo...
25. Java Demo: Recarga Automática con Okteto
● Sincroniza ficheros del laptop a un pod desplegado en Kubernetes
● Redirige el log del pod a tu shell (ideal para desarrollo)
● Permite acceder en local a procesos del pod (con redirección de puertos)
30. VSCode Remote Development
● Entornos de desarrollo aislados, replicables e integrados
● Contenedores, WSL y SSH
● Independencia de la máquina local
● Extensiones: debugger, linter, test frameworks…
33. Otros Puntos de Fricción Desarrollando en Kubernetes
● Inner-loop muy lento
● Complejidad de los Kubernetes manifest
● Complejidad de kubectl y acceso a logs y errores
● IDE plugins y debuggers
● Correr todos mis microservicios en local
● Instalar Kubernetes en local