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

Entwickler-Experience in einer containerisierten Applikationswelt

Entwickler-Experience in einer containerisierten Applikationswelt

Container. Das ist das erste Wort, das auftaucht, wenn es um die Entwicklung einer neuen Service-orientierten Applikation geht. So gut diese Technologie auch ist, bringt sie auch so manche Hürden mit sich. Für Architekt:innen und Entwickler:innen wirft sie oft viele Fragen auf, wie man diese mit einem guten Entwicklungsprozess angeht. Natürlich am besten so, dass Erweiterungen und Änderungen mit wenig Aufwand hinzugefügt werden können. In dieser Session zeigt Daniel Lindemann wie Entwicklungsumgebungen für containerbasierte .NET-Applikationen aufgebaut werden können, die Entwickler:innen dabei helfen, Abhängigkeiten zu verwalten, Fehlerquellen aufzuspüren, leicht den Code zu erweitern und zu debuggen.

Daniel Lindemann

September 23, 2021
Tweet

More Decks by Daniel Lindemann

Other Decks in Technology

Transcript

  1. ENTWICKLER-EXPERIENCE IN EINER
    CONTAINERISIERTEN APPLIKATIONSWELT

    View Slide

  2. Daniel Lindemann
    Begeisterter .NET- und NodeJS-Entwickler mit
    einer seltsamen Liebe für das Optimieren,
    Automatisieren und Containerisieren von
    Anwendungen
    Focused on:
    ▪ Cloud-native architectures
    ▪ Container technologies
    ▪ DevOps - Dev by night, Ops by day
    LinkedIn: https://linkedin.com/in/daniel-lindemann
    Twitter: @daniellindemann
    GitHub: https://github.com/daniellindemann

    View Slide

  3. AGENDA
    - Warum Container?
    - Projekt-Setup und Dev-Tools
    - Ausführen mit Kubernetes

    View Slide

  4. DISCLAIMER
    Demo
    - Code in C# mit .NET 5
    - Services benutzen HTTP zur Kommunikation
    - Vorgestellte Bibliotheken und Tools sind Beispiele; natürlich können auch anderen genutzt werden
    - Container sind Linux Container
    - Container Engine ist Docker (containerd)

    View Slide

  5. CONTAINER
    Warum Container?

    View Slide

  6. CONTAINER
    Vorteile
    - Container sind Plattformunabhängig (meistens)
    - Docker ist das defacto Standardtool
    - Beinhalten Abhängigkeiten
    - Applikationsbestandteile in kleinere Stücke aufteilen
    - Wartbarkeit
    - Schneller Start
    - Über Dockerfile einfach zu erstellen und zu erweitern
    - Ermöglicht die Skalierung von einzelnen Applikationsbestandteilen
    - Cloud Agnostic
    - Cloud Ready → Cloud Native

    View Slide

  7. CONTAINER
    Für Entwickler und Admins
    Schnelle
    Integration
    Agile
    Bereitstellung
    Unveränder-
    lichkeit
    Kosten-
    ersparnis
    Elastic
    bursting
    Effiziente
    Bereitstellung
    Für Admins
    Für Entwickler

    View Slide

  8. MICROSERVICES ≠ CONTAINERS
    "Microservices" ist ein
    Architekturansatz für Software
    Container sind ein
    Implementierungsdetail, das oft hilft

    View Slide

  9. PROJEKT-SETUP UND DEV-TOOLS
    Inner Development Loop

    View Slide

  10. DEV LOOP
    Inner and Outer Dev Loop
    Push
    Build
    Test
    Code
    Integrate
    Test
    Release
    Deploy
    Inner
    Loop
    Outer
    Loop

    View Slide

  11. INNER DEV LOOP
    Traditional Inner Dev Loop
    Code
    (3 mins)
    Build & Reload
    (1 min)
    Inspect
    (1 min)
    Commit
    (10 s)

    View Slide

  12. INNER DEV LOOP
    Container Inner Dev Loop
    T
    i
    m
    e
    Build
    (1 min)
    Inspect
    (1 min)
    Commit
    (10 s)
    Code
    (3 mins)
    Container build,
    Upload & deploy
    (4 mins)

    View Slide

  13. HERAUSFORDERUNGEN
    Heutige Herausforderungen für Entwickler
    - Erstellen von Images und Containern vermeiden
    - Starten von mehreren Projekten
    - Service Discovery
    - Installation von Abhängigkeiten
    - Onboarding von neuen Kollegen
    - Zentrales Logging für mehrere Projekte
    - Nachverfolgung von Requests

    View Slide

  14. APPLICATION
    Beispiel-Applikation: Lotto Service
    Web
    RandomNumber
    Service
    Lotto Service
    /api/LottoNumber
    ​/api​/LottoNumber​/history
    /api/RandomNumber

    View Slide

  15. PROJECT TYE
    Was ist Tye?
    - Vereinfacht das Entwickeln, Testen und Deployen von
    Container-Applikationen und Microservices
    - Mehrere Dienste lokal ausführen
    - Service Discovery über Konfigurationskonventionen
    - Versteht .NET Projekte
    - Lokales Dashboard für Logs, Metrics, etc.
    - Ausführen von Abhängigkeiten als Docker Container
    https://github.com/dotnet/tye

    View Slide

  16. PROJECT TYE
    Installation und Ausführung
    - Tye ist ein CLI-Tool
    - Globale Installation als .NET Tool
    > dotnet tool install -g Microsoft.Tye --version "0.10.0-alpha.21420.1"
    - Tye erkennt Solutions und tye.yaml Konfigurationsdateien
    > tye run

    View Slide

  17. PROJECT TYE
    Projekt Startup
    ~\..\lotto-microservices ❯❯❯ tye run
    Loading Application Details...
    Launching Tye Host...
    [09:48:25 INF] Executing application from ~\..\lotto-microservices\tye.yaml
    [09:48:25 INF] Dashboard running on http://127.0.0.1:8000
    [09:48:26 INF] Creating docker network tye_network_960dcf0b-2
    [09:48:26 INF] Running docker command network create --driver bridge tye_network_960dcf0b-2
    [09:48:28 INF] Building projects
    [09:48:33 INF] Application lotto-service started successfully with Pid: 18564
    [09:48:33 INF] Launching service web_61d5c719-1: C:\Users\d.lindemann\repos\lotto-microservices\src\Web\bin\Debug\net5.0\Web.exe
    [09:48:33 INF] Launching service lottoservice_763055ab-f: C:\Users\d.lindemann\repos\lotto-
    microservices\src\LottoService\bin\Debug\net5.0\LottoService.exe
    [09:48:33 INF] Launching service randomnumberservice_823d1f0d-9: C:\Users\d.lindemann\repos\lotto-
    microservices\src\RandomNumberService\bin\Debug\net5.0\RandomNumberService.exe
    [09:48:33 INF] web_61d5c719-1 running on process id 19692 bound to http://localhost:5004, https://localhost:5005
    [09:48:33 INF] lottoservice_763055ab-f running on process id 952 bound to http://localhost:5002, https://localhost:5003
    [09:48:33 INF] Replica web_61d5c719-1 is moving to a ready state
    [09:48:33 INF] Replica lottoservice_763055ab-f is moving to a ready state
    [09:48:33 INF] randomnumberservice_823d1f0d-9 running on process id 14884 bound to http://localhost:5000, https://localhost:5001
    [09:48:33 INF] Replica randomnumberservice_823d1f0d-9 is moving to a ready state

    View Slide

  18. PROJECT TYE
    Dashboard

    View Slide

  19. DEMO

    View Slide

  20. PROJECT TYE
    Weitere Features
    - "Hot Reload" - Watch Support
    - DAPR Support
    - Azure Functions Support
    - Ingress

    View Slide

  21. PROJECT TYE
    Alternativen
    https://tilt.dev/
    A toolkit for fixing the pains of multi-service development
    https://garden.io/
    Automation platform for Kubernetes development and testing
    https://www.telepresence.io/
    Fast, local development for Kubernetes and OpenShift Microservices
    docker
    compose
    https://docs.docker.com/compose/
    Defining and running multi-container Docker applications

    View Slide

  22. LOGGING
    Warum?
    - Logs zeigen an, was in einer Applikation abläuft
    - Logs zeigen wichtige Informationen und zu welcher Zeit sie passiert sind
    - Logs lesen ist das Debugging in einer Production-Umgebung
    - Log-Level zeigen die Wichtigkeit der Information
    - Trace
    - Debug
    - Information
    - Warning
    - Error
    - Critical

    View Slide

  23. LOGGING
    .NET Logging
    - .NET bietet für das Logging ein fertiges Interface ILogger<>
    - Logger können per Dependency Injection genutzt werden
    public class RandomNumberService
    {
    private readonly ILogger _logger;
    public RandomNumberService(ILogger logger)
    {
    _logger = logger;
    }
    public async Task Generate()
    {
    _logger.LogInformation("Generating random number");
    var randomNumber = new Random().Next(1, 1000);
    _logger.LogInformation($"Random number generated: {randomNumber}");
    return randomNumber;
    }
    }

    View Slide

  24. LOGGING
    Structured Logging
    - Erleichtert die Speicherung und das Abfrage von Log-Ereignissen
    - Parameter bleiben erhalten
    - Speicherung in Datenbanken einfacher möglich
    - Seq
    - Loki & Grafana
    - Azure Monitor

    View Slide

  25. LOGGING
    Structured Logging
    public async Task Generate()
    {
    int min = 1, max = 1000;
    _logger.LogInformation("Generating random number between {min} and {max}“, min, max);
    var randomNumber = new Random().Next(min, max);
    _logger.LogInformation("Random number generated: {randomNumber}“, randomNumber);
    return randomNumber;
    }
    Generating random number between 1 and 1000
    min 1
    max 1000
    Random number generated: 381
    randomNumber 381

    View Slide

  26. LOGGING
    Alternativen

    View Slide

  27. LOGGING
    Zentrales Logging
    - Zentrales Logging ermöglicht alle Logs an einer Stelle einzusehen
    - Speicherung von Logs zur (späteren) Analyse
    - Filtern nach Log-Inhalten wird erleichtert

    View Slide

  28. LOGGING
    Seq
    https://datalust.co/seq

    View Slide

  29. DEMO

    View Slide

  30. LOGGING
    Seq Alternativen

    View Slide

  31. Web
    Service A
    DISTRIBUTED TRACING
    Service B

    View Slide

  32. DISTRIBUTED TRACING
    Correlation
    Web
    Service B
    Service A
    Id:1
    Id:2
    Parent: 1
    Id:3
    Parent: 2

    View Slide

  33. DISTRIBUTED TRACING
    Spans
    Trace
    Span
    Span
    Span
    Id: 00-a678b313d0b921195028ed37952d7a99-8ac83a9e17967ea6-01
    ParentId: 00-a678b313d0b921195028ed37952d7a99-cbf8f5c99a26d994-01
    RootId: a678b313d0b921195028ed37952d7a99
    StartTimeUTC: 9/15/2021 7:07:01 AM
    Tags:
    - shoe.size: EU 44
    - show.type: Sneaker
    - show.color: White

    View Slide

  34. DISTRIBUTED TRACING
    Spans in .NET
    .NET nutzt den Namespace System.Diagnostics
    Trace
    Activity
    Activity
    Activity

    View Slide

  35. DISTRIBUTED TRACING
    Reporting Traces
    Web Service B
    Service A

    View Slide

  36. DISTRIBUTED TRACING
    Reporting Traces
    Web Service B
    Service A

    View Slide

  37. DISTRIBUTED TRACING
    Open Telemetry
    Logs
    Tracing
    Metrics
    Telemetry

    View Slide

  38. DISTRIBUTED TRACING
    Reporting Traces
    Web Service B
    Service A

    View Slide

  39. DISTRIBUTED TRACING
    nuget Pakete für ASP.NET Projekt

    View Slide

  40. DISTRIBUTED TRACING
    Instrumentation Web API Projekt
    services.AddOpenTelemetryTracing(builder =>
    {
    var serviceName = Configuration.GetValue("Jaeger:ServiceName") ?? "RandomNumberService";
    builder
    .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName))
    .AddAspNetCoreInstrumentation()
    .AddHttpClientInstrumentation()
    .AddJaegerExporter(b =>
    {
    var jaegerHostname = Environment.GetEnvironmentVariable("JAEGER_HOSTNAME") ?? "localhost";
    b.AgentHost = jaegerHostname;
    });
    });

    View Slide

  41. DEMO

    View Slide

  42. RECILIENCY / WIDERSTANDSFÄHIGKEIT
    Warum?
    - Die Kommunikation zwischen einzelnen Diensten kann ausfallen
    - Netzwerkänderungen
    - DDoS-Attacken
    - Kompletter Systemausfall
    - Häufigste Fehler sind "Blips"

    View Slide

  43. RECILIENCY / WIDERSTANDSFÄHIGKEIT
    Polly

    View Slide

  44. POLLY
    Policies
    Retry Circuit Breaker
    Viele Fehler sind
    vorübergehend und
    können sich nach einer
    kurzen Verzögerung
    selbst korrigieren.
    Wenn ein System
    ernsthaft in
    Schwierigkeiten ist, ist es
    besser, schnell zu
    versagen, als die
    Benutzer/Anrufer warten
    zu lassen.
    Ein Teil der Anfragen
    kann ähnlich sein.
    Cache
    . . .
    "Maybe it's just a blip" "Stop doing it if it hurts" "You've asked that
    one before"

    View Slide

  45. POLLY
    nuget Pakete für ASP.NET Projekte

    View Slide

  46. POLLY
    Implementierung für HttpClient
    services.AddHttpClient()
    // retry policy
    .AddPolicyHandler(_ =>
    {
    var jitterer = new Random();
    return HttpPolicyExtensions
    .HandleTransientHttpError()
    .OrResult(msg => msg.StatusCode == HttpStatusCode.NotFound)
    .WaitAndRetryAsync(5, retryAttempt =>
    TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)) + // exponential back-off: 2, 4, 8 etc
    TimeSpan.FromMilliseconds(jitterer.Next(0, 1000)) // plus some jitter: up to 1 second
    );
    })
    // circuit breaker
    .AddPolicyHandler(_ =>
    {
    return HttpPolicyExtensions
    .HandleTransientHttpError()
    .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30));
    });

    View Slide

  47. Antwort zurückgeben
    Update Unterbrechungsstatus
    Update Unterbrechungsstatus
    POLLY
    Ablauf Http Call
    Aufruf HttpClient Wait and Retry Circuit Breaker Http call
    Aufruf…
    Aufruf…
    zurückweisen bei Unterbrechung
    Http Aufruf ausführen …
    Aufruf löst Ausnahme aus oder gibt Statuscode zurück
    Fehler weiterleiten
    Warten … Aufruf wiederholen …
    Wenn alle Versuche aufgebraucht sind,
    Fehler an Aufrufer weiterleiten
    Antwort zurückgeben

    View Slide

  48. DOCKER
    Images erstellen
    - Dockerfile kann über IDE einfach erstellt werden
    - Auf die Reihenfolge der Docker Commands achten
    - Applikationen in Container NIE als root ausführen
    - Minimieren der Images
    - Ändern der Linux Distribution zu alpine
    - Self-contained Applikation
    - Ausführen in Container mit Image mcr.microsoft.com/dotnet/runtime-deps:5.0-alpine

    View Slide

  49. DEMO

    View Slide

  50. ANNAHMEN ÜBER INFRASTRUKTUR
    Anmerkung
    - Keine Annahme über Infrastruktur im Code treffen
    - Dateisystem
    - Netzwerk
    - Security
    Beispiel:
    // do not use https - networking assumptions are not the job of the program
    app.UseHttpsRedirection();

    View Slide

  51. TEST DRIVEN DEVELOPMENT
    Anmerkung
    - Alle vorgestellten Tools sind kein Ersatz für TDD
    - TDD ermöglicht die Entwicklung und Implementierung einzelner Dienste deutlich zu beschleunigen
    - Für Unit Tests werden keine externen Abhängigkeiten benötigt, wie Datenbanken oder Software

    View Slide

  52. AUSFÜHREN MIT KUBERNETES
    Local und mit Azure Kubernetes Services

    View Slide

  53. KUBERNETES
    Ausführen von containerisierten Applikationen
    Planung Beziehung/Anti-
    Beziehung
    Überwachung Ausfallsicher-
    heit
    Skalierung Netzwerk Service
    Discovery
    Koordinierte
    App-Upgrades

    View Slide

  54. KUBERNETES
    Lokales Setup (Windows)
    - Docker installieren
    - https://www.docker.com/
    - Kubernetes aktivieren
    - kubectl installieren
    - https://kubernetes.io/docs/tasks/tools/
    - Alternative: Rancher Desktop
    - https://rancherdesktop.io/

    View Slide

  55. KUBERNETES
    Lokales Setup (Linux)
    - KinD installieren
    - KinD = Kubernetes in Docker
    - https://kind.sigs.k8s.io/
    - Cluster erstellen
    > kind create cluster
    - kubectl installieren
    - https://kubernetes.io/docs/tasks/tools/
    - Alternative: Minikube
    - https://minikube.sigs.k8s.io/

    View Slide

  56. KUBERNETES
    Lokalen Kubernetes Cluster testen mit nginx

    View Slide

  57. KUBERNETES
    Deployment mit Project Tye
    - Tye kann die Applikation in Kubernetes bereitstellen
    > tye deploy
    - Benötigt Image Registry
    > docker run -p 4999:5000 --name registry2 -d registry:2
    - Für einen ersten Test vollkommen ausreichend
    - Undeploy nach Test
    > tye undeploy
    - Weitere Commands
    - tye build - Erstellen von Container Images
    - tye push - Pushen von Container Images

    View Slide

  58. DEMO

    View Slide

  59. KUBERNETES
    Team Cluster
    - Viele Dev Teams haben einen gemeinsamen Kubernetes Cluster
    - "Identisch" zu Production Cluster
    - Automatisches Deployment von Nightly Builds
    - Azure bietet mit AKS (Azure Kubernetes Services) einen gemanagten Kubernetes Cluster an

    View Slide

  60. KUBERNETES
    Kustomize
    - Schreiben eines Basis Kubernetes Manifests
    - Weitere Manifests können davon „erben“
    - Ermöglicht Konfiguration von verschiedenen Umgebungen
    - Secrets
    - Connection Strings
    - Replicas
    - etc.

    View Slide

  61. DEBUGGING
    Bridge to Kubernetes

    View Slide

  62. DEMO

    View Slide

  63. WEITERE TOOLS
    DAPR HELM
    https://helm.sh/
    https://dapr.io/

    View Slide

  64. View Slide

  65. abtis verfügt über mehr als 15 Jahre Erfahrung in der Planung und dem Betrieb von Microsoft Infrastrukturen und betreut bereits
    mehr als 100.000 Anwender der Cloudplattformen Microsoft 365 und Azure. Als einer der zehn Fokuspartner von Microsoft in
    Deutschland mit 14 Gold-Kompetenzen setzen wir ein starkes Zeichen als Vorreiter in der IT-Branche.
    www.abtis.de +49 7231 4431 - 100 [email protected]

    View Slide