Está en la página 1de 35

24-25 September, 2019

Dev Tools para Kubernetes


Micael Gallego Carrillo y Pablo Chico de Guzmán
Docker Madrid

● 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
About Us

Pablo Chico de Guzmán


● @pchico83 ● Kubernetes for Developers
● Docker & Cloud Native Madrid ● https://cloud.okteto.com
● 4 years working @Docker
About Us

Micael Gallego
● @micael_gallego
● CodeURJC - Universidad Rey Juan
Carlos
● Java Developer
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
¿Qué es Docker?

● Build, Ship and Run. Any application, anywhere


● Proceso ligero, aislado y portable
¿Qué es Kubernetes?

● Orquestador open source


● Evolución de Borg, Google
● Contenedores en producción
● Declarativo, Respuesta a fallo
● Standard Run API
● Gran comunidad
¿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
Desarrollo de Aplicaciones en Kubernetes
Optimizar build/push/redeploy
Python Demo

● PullAways (imagePullStrategy) puede recargar una aplicación con:

kubectl rollout restart deployment deployment-name

● IfNotPresent and rebuild image (solo local)


● Mount volume and hot reload (solo local)
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
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


Java Demo: desarrollo clásico con Eclipse
Java Demo: build/push/redeploy

● Compilación y construcción del contenedor


Dockerfile

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" ]

$ docker build . -t micaelgallego/demoservice-k8s1

$ docker push micaelgallego/demoservice-k8s1:latest


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
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


Java Demo: build/push/redeploy
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


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
Java Demo: Optimizando capas

pom.xml

<project ...>
...
<build>
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.6.1</version>
</plugin>
</plugins>
</build>
</project>

$ ./mvnw compile jib:build -Dimage=micaelgallego/demoservice-k8s2:latest


Java Demo: Optimizando capas

● Añadir un cambio en el servicio

$ ./mvnw compile jib:build -Dimage=micaelgallego/demoservice-k8s2:latest

$ kubectl rollout restart deployment demoservice-dply


Java Demo: Optimizando capas
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...
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)
Java Demo: Recarga Automática con Okteto
pom.xml
<project ...>
...
<build>
<plugins>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.6.1</version>
<configuration>
<from>
<image>gcr.io/distroless/java:debug</image>
</from>
</configuration>
</plugin>
</plugins>
</build>
</project>

$ ./mvnw compile jib:build -Dimage=micaelgallego/demoservice-k8s3:latest


Java Demo: Recarga Automática con Okteto

okteto.yml

name: demoservice-dply
command:
- java
- -cp
- /app/resources:/app/classes:/app/libs/*
- es.codeurjc.k8sdevtools.demoservice.K8sdevtoolsApplication
mountpath: /app/classes
subpath: target/classes
forward:
- 8080:8080

$ kubectl apply -f k8s

$ okteto up
Java Demo: Recarga Automática con Okteto

+
2
Java Demo: Recarga Automática con Okteto
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…
VSCode Remote SSH
VSCode Remote Kubernetes
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
Conclusiones

Docker Kubernetes Okteto


24-25 September, 2019

Muchas Gracias!

También podría gustarte