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. 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)
  2. 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
  3. 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!
  4. 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
  5. 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
  6. 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)
  7. 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
  8. 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
  9. 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?
  10. 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
  11. 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, …
  12. 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.
  13. 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)
  14. 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, …)
  15. 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, …)
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
  21. 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
  22. 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
  23. 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
  24. 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
  25. 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
  26. 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
  27. 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