Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und betreiben (Java Forum Nord 2019)

2b3056649bc1f58233eb3c7e54c5cf17?s=47 Dirk Weil
September 24, 2019
11

Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und betreiben (Java Forum Nord 2019)

Containerbasierte Umgebungen wie Docker sind im Mainstream angekommen. Orchestrierungsplattformen wie Kubernetes versprechen eine skalierbare Verwaltung von Containern. Es spricht einiges dafür, dass aus einer Menge von Java-Quellen zukünftig nicht ein JAR oder WAR gebaut wird, sondern eben ein Container-Image. Damit einher geht eine Neuausrichtung des Entwicklungs- und Deploy-Prozesses weg von manuellen Arbeitsschritten hin zu einer eher industriellen Vorgehensweise mit wiederholbaren und nachvollziehbaren Schritten.
Dieser Vortrag zeigt, wie mit Docker, Kubernetes, Git und Jenkins effizient Anwendungen in Produktion gebracht werden können. Einige Folien, viel Live-Demo.

2b3056649bc1f58233eb3c7e54c5cf17?s=128

Dirk Weil

September 24, 2019
Tweet

Transcript

  1. 1.

    Das Runde muss in das Eckige Wie aus Java-Anwendungen Container

    werden Java Forum Nord, 24.09.2019 Dirk Weil, GEDOPLAN GmbH
  2. 2.

    Dirk Weil GEDOPLAN GmbH, Bielefeld GEDOPLAN IT Consulting Consulting, coaching,

    concepts, reviews, development GEDOPLAN IT Training & partner Java, JEE, tools trainings in Berlin, Bielefeld, Köln, on-site JEE since 1998 Speaker and author Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 2 gedoplan.de
  3. 3.

    Application Stage Odyssey Das runde muss in das Eckige -

    wie aus Java-Anwendungen Container werden 3 gedoplan.de Dev Ops Hier ist die Anwendung als WAR-File Du braucht ein JDK 8 und einen WildFly 14 Die Datasource xyz wird benötigt; für Test und Integration reicht die H2-DB Ach ja! Kopiere bitte diese Dateien ins Home des Users! OK. Worauf läuft das? Gut, stelle ich bereit; was noch? Läuft nicht: config.yaml fehlt! Damit scheint es zu laufen Jetzt dasselbe für Prod …
  4. 4.

    Application Stage Odyssey Anwendung  JAR/WAR/EAR! Lösungsmöglichkeit: Virtuelle Maschine Komplettes

    OS mit Tools, Dateien etc. automatisierbar mit Ansible o. ä. schwergewichtig! Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 4 gedoplan.de @Path("hello") @ApplicationScoped public class HelloResource { @GET @Produces(MediaType.TEXT_PLAIN) public String getHello() { return "Hello World!"; } }
  5. 5.

    Virtuelle Maschinen vs. Container VM = „kompletter Rechner“ Hypervisor teilt

    HW zu Isolation durch Hypervisor Container = Prozess auf Host OS Isolation durch Namespaces Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 5 gedoplan.de VM 1 App Guest OS VM 2 App Guest OS Hypervisor Host OS Container 1 App Container 2 App Namespaces Host OS (Linux) Container 4 App Container 3 App
  6. 6.

    Docker Das runde muss in das Eckige - wie aus

    Java-Anwendungen Container werden 6 gedoplan.de FROM openjdk:8 ADD target/k8s-demo-hello.jar /opt/ ENTRYPOINT [ "java", "-jar", "/opt/k8s-demo-hello.jar" ] Debian curl git JDK Layered filesystem
  7. 7.

    Docker Demo Docker Desktop (aka Docker for Windows / Mac)

    Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 7 gedoplan.de # Build image docker build –t gedoplan/k8s-demo-hello . # Run container docker run --rm gedoplan/k8s-demo-hello
  8. 8.

    Docker io.fabric8:docker-maven-plugin Integriert Docker Build in Maven Build Interpoliert Maven-Properties

    im Dockerfile Assembly mit vorbereiteten Descriptoren diverse weitere Operationen Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 8 gedoplan.de <plugin> <groupId>io.fabric8</groupId> <artifactId>docker-maven-plugin</artifactId> <configuration> <images> <image> <name>gedoplan/${project.artifactId}</name> <build> <dockerFileDir>${project.basedir}</dockerFileDir> <assembly> <descriptorRef>artifact</descriptorRef> </assembly> …
  9. 9.

    Docker Demo Das runde muss in das Eckige - wie

    aus Java-Anwendungen Container werden 9 gedoplan.de # Einfache SE-Anwendung: k8s-demo-hello mvn -Pdocker docker run gedoplan/k8s-demo-hello # REST-Service als WAR auf WildFly: k8s-demo-rest-war mvn -Pdocker docker run -p 8888:8080 gedoplan/k8s-demo-rest-war # REST-Service mit Apache Meecrowave: k8s-demo-rest-mee mvn -Pdocker docker run -p 8888:8080 gedoplan/k8s-demo-rest-mee
  10. 10.

    Kubernetes (aka K8s) Container (~Prozesse) brauchen Laufzeitplattform (~Betriebssystem) Start, Stopp,

    Überwachung Verteilung (On-prem / Cloud) Networking / Discovery Skalierung Persistenz Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 10 gedoplan.de
  11. 11.

    Node 2 Node 1 K8s Das runde muss in das

    Eckige - wie aus Java-Anwendungen Container werden 11 gedoplan.de Deployment b Pod b-1 C y C z Deployment a Pod a-3 C x RS a RS b Pod a-2 C x Pod a-1 C x Svc a Svc b Ingress a Pod ein Container, ggf. mehrere Abstraktion eines Rechners Node „echter Rechner“ ReplicaSet sorgt für n laufende Pods Deployment ergänzt RS um Rolling Update Service feste IP-Adresse Load Balancer Ingress Reverse Proxy
  12. 12.

    K8s Demo Das runde muss in das Eckige - wie

    aus Java-Anwendungen Container werden 12 gedoplan.de # K8s-Manifest für REST-Service als WAR: rest-war.yaml # (enthält Deployment, Service + Ingress) kubectl apply –f rest-war.yaml # Pod-Neustart nach (simuliertem) Ausfall kubectl get all -l app=rest-war kubectl delete pod rest-war-xxx # Pod-Anzahl manipulieren kubectl edit deployment rest-war # Webservice „von Außen“ konsumieren curl http://rest-war.localtest.me/rs/hello
  13. 13.

    Paketieren und Ausliefern K8s-Application = Deployment(s) Service(s) Ingress(es) (ConfigMaps, Secrets,

    Persistent Volumes, …) Anwendungen in unterschiedlichen Umgebungen ausrollbar Prod, Test, lokal, … Bedarf: Application- / Package-Management und Templating Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 13 gedoplan.de
  14. 14.

    Werkzeuge zum Paketieren ermöglichen: K8s-Manifeste zusammenfassen zu Anwendungen Templating Das

    runde muss in das Eckige - wie aus Java-Anwendungen Container werden 14 gedoplan.de Kustomize
  15. 15.

    Ausrollen der Anwendung Anforderungen Immutable Pakete mit K8s-Manifesten Zentrale Bereitstellung

    der Pakete -> einfaches Verteilen Historie der Releases Automatisiertes Ausrollen Probleme beim Ausrollen per CMD-Werkzeug Nicht wiederholbar bei Verwendung von Parametern Erfordert entsprechende Berechtigung Know-how bei allen Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 15 gedoplan.de
  16. 16.

    GitOps Das runde muss in das Eckige - wie aus

    Java-Anwendungen Container werden 16 gedoplan.de Application Instance K8s Manifeste Synchronisieren GitOps Service Weave Flux Argo-CD oder Push CI
  17. 17.

    Jenkins CI/CD-Server Ausführung in K8s Jenkins läuft im Cluster Konfigurierbare

    Build-Container Deployment in K8s per GitOps Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 17 gedoplan.de Entwicklungs- Umgebung Plan Test SCM Build Build Deploy pipeline { agent { kubernetes { label 'rest-war-build‘ … } stages { stage('Checkout Project‘) { … } stage('Build Maven project‘) { … } stage('Build Docker Images‘) { … } stage('Deploy Application in Test’) { … }
  18. 18.

    Jenkins Das runde muss in das Eckige - wie aus

    Java-Anwendungen Container werden 18 gedoplan.de
  19. 19.

    Argo-CD Das runde muss in das Eckige - wie aus

    Java-Anwendungen Container werden 19 gedoplan.de
  20. 20.

    More github.com/GEDOPLAN/k8s-demo Demo-Projekt http://www.gedoplan-it-training.de Seminare in Berlin, Bielefeld, Köln, Frankfurt,

    Inhouse http://www.gedoplan-it-consulting.de Reviews, Coaching, Development, … http://javaeeblog.wordpress.com/ http://gedoplan-it-consulting.de/expertenkreis-java/  dirk.weil@gedoplan.de @dirkweil Das runde muss in das Eckige - wie aus Java-Anwendungen Container werden 20 gedoplan.de