Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Cloud-Native Java-Anwendungen für Kubernetes

Cloud-Native Java-Anwendungen für Kubernetes

Kubernetes bietet eine Infrastruktur, in der Anwendungen horizontal skalieren können, bei Fehlern automatisch neu starten und neue Versionen per Rolling-Update ausgerollt werden können. Damit dies reibungslos funktioniert stellt Kubernetes verschiedene APIs bereit, die eine Java-Anwendung nutzen sollte. Zusätzlich können mit OpenTelemetry Traces, Metriken und Logs z. B. mit dem Grafana-Stack gesammelt und ausgewertet werden. So können Entwickler, Betrieb und die Fachseite Informationen abrufen, ob alles wie erwartet funktioniert. Dieser Vortrag bietet Einsteigern einen Überblick über die notwendigen Kubernetes- und Observability-Grundlagen für Java-Anwendungen.

Alexander Schwartz

June 30, 2022
Tweet

More Decks by Alexander Schwartz

Other Decks in Programming

Transcript

  1. Cloud Native Java-Anwendungen
    für Kubernetes
    Alexander Schwartz, Principal Software Engineer @ Red Hat
    JakartaOne & CloudLand | 2022-06-30

    View Slide

  2. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 2
    Kubernetes 1x1: Kubernetes ist ein Scheduling für Container
    Kubernetes: Verteilt Pods mit Containern auf Nodes, stellt Loadbalancer bereit und
    sorgt für Kommunikation zwischen den Pods.
    Controller: Liest Ressourcen, pass die Realität an, legt neue Ressourcen an
    und meldet den Status zurück.
    Was sind die
    Herausforderungen
    beim Bau eines
    solches Systems?
    “Die Realität”
    (Container, Nodes, …)
    “Der Plan”
    (Resources im API-Server)

    View Slide

  3. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 3
    Kubernetes Resources (Auswahl)
    Ingress:
    HTTP-Loadbalancer für Services
    Service:
    Adressierung von mehreren Pods über IP-Adressen oder Service-Discovery
    Pod:
    Gruppe von Containern, die sich eine interne IP-Adresse teilen.
    ReplicaSet:
    Gruppe von gleichartigen Pods mit definierter Anzahl, kann horizontal skalieren
    Deployment:
    Erstellt bei Änderungen am Pod-Template ein neues ReplicaSet für Rolling Updates
    Pod Pod
    Dep.
    RS
    Ingress
    Service

    View Slide

  4. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 4
    Kubernetes als Scheduler
    Neuer Pod Node zuweisen
    Container nutzt
    mehr sein RAM-
    Limit
    Container
    killen
    Container
    wird beendet
    Container
    neu starten
    Ressourcen auf
    Node knapp
    (“pressure”)
    Einzelne Pods
    “evicten”
    RAM auf Node
    ausgelastet
    Einen Prozess
    OOM Killen
    Node geht in
    Wartung
    Pods “evakuieren”
    Akteure: Linux-Kernel, Container-Engine,
    kube-scheduler, kubelet
    … und noch viel mehr Regeln und Ausnahmen!

    View Slide

  5. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 5
    Anforderungen an Cloud Native Anwendungen
    • Sicherheit eingebaut
    • Ressourcen-Bedarf bekannt
    • Horizontal skalierbar
    • Lastspitzen werden behandelt
    • Verfügbarkeit 24/7, auch bei Upgrades, Re-Konfiguration und Ausfall von Knoten
    • Tolerant gegenüber Fehlern in Umsystemen
    • Service-Level-Objectives überwachbar im Normal- und Fehlerzustand
    • Fehlerzustände sind analysierbar

    View Slide

  6. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 6
    Java in Kubernetes
    Java als Workload
    • Läuft in einem Pod oder
    mehreren horizontal skalierten Pods
    • Beantwortet Anfragen z. B. per HTTP
    • Fachlicher Workload oder
    technische Infrastruktur
    Java als Controller
    • Liest den Soll-Zustand der Ressourcen
    via Kubernetes-API aus
    • Schreibt und aktualisiert Ressourcen
    • Überwacht den Zustand der Ressourcen und
    Container und publiziert den Status
    → Java Operator SDK

    View Slide

  7. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 7
    Java Startup
    1. Scheduling des Pods auf einem Node
    2. Container-Image-Download
    3. Konfiguration per Datei oder Environment-Variable
    • Secrets vs. ConfigMaps
    • TLS Zertifikate
    4. Container starten
    5. Startup-Probe abwarten
    6. Readiness-Probe abwarten
    7. Einhängen in den Loadbalancer
    8. Prüfen ob ein Neustart erforderlich ist über die Liveness-Probe
    (Beim Beenden wird der Container automatisch neu gestartet)

    View Slide

  8. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 8
    Java Best Practices
    • Memory Settings der JVM die zu den Kubernetes Memory Requests/Limits passt
    • Horizontal skalieren
    • Kommunikation per HTTP(S), TCP oder UDP
    • Loadbalancing für nachgelagerte Systeme
    • Robuste Anbindung von nachgelagerten Systemen

    View Slide

  9. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 9
    Java Shutdown
    1. Kill-Signal erhalten
    2. Readiness-Probe deaktivieren
    3. Re-Konfiguration des Loadbalancers abwarten
    4. Laufende Requests abarbeiten, Verbindungen schließen
    5. Ressourcen wie z. B. Datenbankverbindungen schließen
    6. Prozess beenden

    View Slide

  10. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 10
    Kubernetes Probes
    Readiness Probe für den Loadbalancer:
    Kann ich etwas Sinnvolles tun? Werde ich gerade heruntergefahren?
    Startup Probe für Startup und Rolling-Update:
    Selbsttest und Warm-Up für den ersten Request.
    Liveness Probe für einen automatischen Neustart:
    Wann würde ein Neustart helfen? Keine externen Checks!
    Health Probe für einen Selbsttest:
    Detaillierter Status der Komponenten und Umsysteme:
    Ist etwas nicht erreichbar oder falsch konfiguriert?

    View Slide

  11. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 11
    Verhalten bei Last
    Worst Case
    • Request Backlog und lange Antwortzeiten
    • Keine internen Metriken
    • Pod-Restart
    Best Case
    • Load Shedding
    • Horizontal Pod Autoscaler auf Basis von
    Custom Metrics
    • Schneller Startup

    View Slide

  12. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 12
    Observability für Java-Pods (1/2)
    Bereich Informationen
    Tracing Verknüpfung von Aufrufen über Komponenten und Container hinweg als Graph.
    Angereichert mit HTTP-Response-Code, SQL-Statements, Zeitverhalten, …

    View Slide

  13. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 13
    Observability für Java-Pods (1/2)
    Bereich Informationen
    Tracing Verknüpfung von Aufrufen über Komponenten und Container hinweg als Graph.
    Angereichert mit HTTP-Response-Code, SQL-Statements, Zeitverhalten, …
    Logs Protokolliert Ereignisse, angereichert mit Trace-IDs, um Logs zu korrelieren und
    Traces zuzuordnen.

    View Slide

  14. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 14
    Observability für Java-Pods (1/2)
    Bereich Informationen
    Tracing Verknüpfung von Aufrufen über Komponenten und Container hinweg als Graph.
    Angereichert mit HTTP-Response-Code, SQL-Statements, Zeitverhalten, …
    Logs Protokolliert Ereignisse, angereichert mit Trace-IDs, um Logs zu korrelieren und
    Traces zuzuordnen.
    Metriken 1 Von außen ermittelbar und über die Plattform erfasst.
    (CPU-Nutzung, Network-IO, Memory-Usage, Anzahl der Container-Neustarts)

    View Slide

  15. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 15
    Observability für Java-Pods (1/2)
    Bereich Informationen
    Tracing Verknüpfung von Aufrufen über Komponenten und Container hinweg als Graph.
    Angereichert mit HTTP-Response-Code, SQL-Statements, Zeitverhalten, …
    Logs Protokolliert Ereignisse, angereichert mit Trace-IDs, um Logs zu korrelieren und
    Traces zuzuordnen.
    Metriken 1 Von außen ermittelbar und über die Plattform erfasst.
    (CPU-Nutzung, Network-IO, Memory-Usage, Anzahl der Container-Neustarts)
    Metriken 2 Nur von innen ermittelbar, vom Container bereitgestellt. Mit „Exemplars“ um sie
    mit Traces zu verknüpfen.
    (JVM Garbage Collection Statistiken, Datenbank-Connection-Pool-Metriken, …)

    View Slide

  16. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 16
    Observability für Java-Pods (1/2)
    Bereich Informationen
    Tracing Verknüpfung von Aufrufen über Komponenten und Container hinweg als Graph.
    Angereichert mit HTTP-Response-Code, SQL-Statements, Zeitverhalten, …
    Logs Protokolliert Ereignisse, angereichert mit Trace-IDs, um Logs zu korrelieren und
    Traces zuzuordnen.
    Metriken 1 Von außen ermittelbar und über die Plattform erfasst.
    (CPU-Nutzung, Network-IO, Memory-Usage, Anzahl der Container-Neustarts)
    Metriken 2 Nur von innen ermittelbar, vom Container bereitgestellt. Mit „Exemplars“ um sie
    mit Traces zu verknüpfen.
    (JVM Garbage Collection Statistiken, Datenbank-Connection-Pool-Metriken, …)
    Java Flight Recorder On-Demand Informationen aufzeichnen, oder kontinuierlich.
    (Wo im Code wird gewartet, wo wird CPU genutzt und Speicher alloziert, JVM-
    Events, Custom-Events, …)

    View Slide

  17. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 18
    Observability für Java-Pods (2/2)
    Bereich Nach innen Nach außen (aktuell) Nach außen (Zukunft)
    Tracing OpenTelemetry Agent Jaeger, Zipkin, Tempo, … OpenTelemetry

    View Slide

  18. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 19
    Observability für Java-Pods (2/2)
    Bereich Nach innen Nach außen (aktuell) Nach außen (Zukunft)
    Tracing OpenTelemetry Agent Jaeger, Zipkin, Tempo, … OpenTelemetry
    Logs Log4j, … JSON mit Tracing-IDs OpenTelemetry

    View Slide

  19. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 20
    Observability für Java-Pods (2/2)
    Bereich Nach innen Nach außen (aktuell) Nach außen (Zukunft)
    Tracing OpenTelemetry Agent Jaeger, Zipkin, Tempo, … OpenTelemetry
    Logs Log4j, … JSON mit Tracing-IDs OpenTelemetry
    Metriken 1 - cAdvisor stellt Metriken im Prometheus-Format bereit

    View Slide

  20. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 21
    Observability für Java-Pods (2/2)
    Bereich Nach innen Nach außen (aktuell) Nach außen (Zukunft)
    Tracing OpenTelemetry Agent Jaeger, Zipkin, Tempo, … OpenTelemetry
    Logs Log4j, … JSON mit Tracing-IDs OpenTelemetry
    Metriken 1 - cAdvisor stellt Metriken im Prometheus-Format bereit
    Metriken 2 OpenTelemetry
    Agent, Micrometer, …
    Prometheus-Format via
    Endpoint
    OpenTelemetry

    View Slide

  21. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 22
    Observability für Java-Pods (2/2)
    Bereich Nach innen Nach außen (aktuell) Nach außen (Zukunft)
    Tracing OpenTelemetry Agent Jaeger, Zipkin, Tempo, … OpenTelemetry
    Logs Log4j, … JSON mit Tracing-IDs OpenTelemetry
    Metriken 1 - cAdvisor stellt Metriken im Prometheus-Format bereit
    Metriken 2 OpenTelemetry
    Agent, Micrometer, …
    Prometheus-Format via
    Endpoint
    OpenTelemetry
    Java Flight Recorder Optional: JFR custom
    events
    JMX Cryostat

    View Slide

  22. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 24
    Suchen nach Traces in Jaeger
    Suchen nach:
    • Service
    • Operation
    • HTTP-Statuscodes
    • …
    Findet:
    • Aufrufhierarchien
    • Zeiten
    • Fehlermeldungen
    • SQL-Statements
    • …
    TraceID verlinkt zu Logs

    View Slide

  23. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 25
    Suchen nach Logs in Loki
    Suchen nach:
    • Metriken
    • Pods
    • …
    Findet:
    • Request-Anzahl
    • Request-Timing
    • Memory/CPU
    • DB-Connection-Pools
    Exemplars verlinken zu
    Traces und Logs

    View Slide

  24. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 26
    Suchen nach Metriken in Prometheus
    Suchen nach:
    • Pod
    • Labels
    • …
    Findet:
    • Log-Level
    • Meldungen
    • Kontext (MDC)
    • …
    TraceID verlinkt zu Traces

    View Slide

  25. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 27
    Java Flight Recorder via Cryostat
    • Verbindet sich via JMX
    mit den JVMs
    • Automatisches oder
    manuelles Aufzeichnen
    • Download der Dateien
    zur Analyse

    View Slide

  26. CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 28
    Anforderungen an Cloud Native Anwendungen
    • Sicherheit eingebaut
    • Ressourcen-Bedarf bekannt
    • Horizontal skalierbar
    • Lastspitzen werden behandelt
    • Verfügbarkeit 24/7, auch bei Upgrades, Re-Konfiguration und Ausfall von Knoten
    • Tolerant gegenüber Fehlern in Umsystemen
    • Service-Level-Objectives überwachbar im Normal- und Fehlerzustand
    • Fehlerzustände sind analysierbar

    View Slide

  27. Kubernetes
    https://kubernetes.io/
    Quarkus
    https://quarkus.io/
    OpenTelemetry
    https://opentelemetry.io/
    Grafana, Loki, Tempo
    https://grafana.com/
    Prometheus
    https://prometheus.io/
    CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 29
    Links
    @ahus1de
    Cryostat
    https://cryostat.io/
    Java Operator SDK
    https://github.com/java-operator-sdk/java-operator-sdk
    Keycloak Benchmark Projekt
    https://github.com/keycloak/keycloak-benchmark
    → Verzeichnis provision/minikube

    View Slide

  28. Kontakt
    Alexander Schwartz
    [email protected]
    https://www.ahus1.de
    @ahus1de
    CC BY-NC-SA 3.0 | Alexander Schwartz | Cloud Native Java-Anwendungen für Kubernetes | Juni 2022 30

    View Slide