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. 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
  2. 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)
  3. 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
  4. 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
  5. DEV LOOP Inner and Outer Dev Loop Push Build Test

    Code Integrate Test Release Deploy Inner Loop Outer Loop
  6. INNER DEV LOOP Traditional Inner Dev Loop Code (3 mins)

    Build & Reload (1 min) Inspect (1 min) Commit (10 s)
  7. 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)
  8. 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
  9. 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
  10. 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
  11. 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
  12. PROJECT TYE Weitere Features - "Hot Reload" - Watch Support

    - DAPR Support - Azure Functions Support - Ingress
  13. 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
  14. 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
  15. 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<RandomNumberService> _logger; public RandomNumberService(ILogger<RandomNumberService> logger) { _logger = logger; } public async Task<int> Generate() { _logger.LogInformation("Generating random number"); var randomNumber = new Random().Next(1, 1000); _logger.LogInformation($"Random number generated: {randomNumber}"); return randomNumber; } }
  16. 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
  17. LOGGING Structured Logging public async Task<int> 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
  18. 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
  19. 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
  20. DISTRIBUTED TRACING Instrumentation Web API Projekt services.AddOpenTelemetryTracing(builder => { var

    serviceName = Configuration.GetValue<string>("Jaeger:ServiceName") ?? "RandomNumberService"; builder .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService(serviceName)) .AddAspNetCoreInstrumentation() .AddHttpClientInstrumentation() .AddJaegerExporter(b => { var jaegerHostname = Environment.GetEnvironmentVariable("JAEGER_HOSTNAME") ?? "localhost"; b.AgentHost = jaegerHostname; }); });
  21. RECILIENCY / WIDERSTANDSFÄHIGKEIT Warum? - Die Kommunikation zwischen einzelnen Diensten

    kann ausfallen - Netzwerkänderungen - DDoS-Attacken - Kompletter Systemausfall - Häufigste Fehler sind "Blips"
  22. 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"
  23. POLLY Implementierung für HttpClient services.AddHttpClient<IRandomNumberService, RandomNumberService>() // 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)); });
  24. 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
  25. 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
  26. 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();
  27. 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
  28. 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/
  29. 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/
  30. 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
  31. 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
  32. KUBERNETES Kustomize - Schreiben eines Basis Kubernetes Manifests - Weitere

    Manifests können davon „erben“ - Ermöglicht Konfiguration von verschiedenen Umgebungen - Secrets - Connection Strings - Replicas - etc.
  33. 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]