Bereits seit einigen Jahren tendiert die Softwareentwicklung mehr und mehr in Richtung von Microservice-Architekturen. Mit Containern gibt es zudem eine weitestgehend plattformunabhängige Möglichkeit selbst Services basierend auf unterschiedlichsten Sprachen und mit heterogenen Abhängigkeiten einheitlich zu hosten. Um die Hürden für das Hosting von Containerlösungen weiter zu reduzieren bietet Microsoft daher jetzt mit Azure Container Apps eine vollständig verwaltete Kuberneteslösung an.

Warum Azure Container Apps?

Im Segment der Orchestrierungslösungen für Container hat sich derweil Kubernetes als klarer Platzhirsch durchgesetzt. Für kleine Enwicklungsteams ist Kubernetes allerdings nicht leicht zu handhaben. Es erfordert umfangreiche Kenntnisse in Konfiguration und Management, um ein Cluster erfolgreich zu betreiben. Ganz anders als Azure Container Apps.

Neben der vereinfachten Möglichkeit Containerumgebungen zu hosten bringt Azure Container Apps native Unterstützung für DAPR mit – eine portable Open Source Laufzeitumgebung, die Entwickler*innen einige der immer wieder kehrenden Herausforderungen für Microservice-Apps vereinfacht. Es stellt dazu sogenannte Building Blocks bereit, die die tatsächliche verwendete Lösung kapseln, sodass die verwendete Technologie austauschbar wird und bei der Programmierung nicht berücksichtigt werden muss. Im Folgenden wird daher ein minimalistisches Web Front in Form einer Blazor App mittels DAPR für die Verwendung von State Management aufgesetzt, containerisiert und schlussendlich auf Azure Container Apps bereitgestellt.

Ein Blick in die Praxis: Azure Container Apps

Zunächst provisionieren wir die dazu notwendigen Services in Azure:

Azure
Überblick der Services in Azure

Jetzt braucht es nur noch die passende Applikation in Container Form und eine Repräsentation des Table Store innerhalb unserer Container App. Dazu wird eine Blazor App erstellt und das DAPR Nuget-Package hinzugefügt:

Add Dapr Package
Add Dapr Package

Der DAPR Client wird innerhalb des Program.cs als Service der App registriert:

Inject Dapr Client
Inject Dapr Client

Anschließend wird der DaprClient verwendet um auf der Counter-Page einen Zähler zu implementieren, der seinen Zustand abspeichert. Dazu wird der aktuelle State bei Initialisierung der Seite zunächst aus dem State-Store ausgelesen und anschließend bei Klick auf den IncrementCount-Button viewseitig aktualisiert und im StateStore abgespeichert.

Call DAPR StateStore
Call DAPR StateStore

Der Statestore selbst ist bei einer Defaultinstallation von DAPR lokal bereits durch einen entsprechenden Redis-Container implementiert. Somit kann die App lokal getestet werden. Für die Verwendung als Container App wird stattdessen folgende Konfiguration verwendet, um den State Store durch meinen Tablestorage zu realisieren:

State Store Configuration
State Store Configuration

Jetzt wird noch ein Dockerfile ergänzt, um meine Blazor App als Container zu packen:

Dockerfile Contents
Dockerfile Contents

Das damit erstellte Docker Image wird getagged und in die Azure Container Registry gepusht:

docker build .\BlogPost\ -t acrblogpost.azurecr.io/blogpost:latest
docker push acrblogpost.azurecr.io/blogpost

Zu guter Letzt wird jetzt die Container App über die Azure CLI erzeugt. Dabei wird das soeben gepushte Image der Registry sowie die zu Beginn angelegte Container App Environment referenziert. Um die App nach außen erreichbar zu machen wird ein externer Ingress definiert, der die Container App auf Port 80 verfügbar macht. DAPR kann nativ verfügbar gemacht werden ohne das weitere Konfig an der Container App notwendig sind. Die Statestore Konfiguration wird ebenfalls als DAPR-Component übergeben.

az containerapp create `
  --name blogapp `
  --resource-group rg-blogpost `
  --environment env-blogpost `
  --image acrblogpost.azurecr.io/blogpost:latest `
  --target-port 80 `
  --ingress 'external' `
  --min-replicas 1 `
  --max-replicas 1 `
  --enable-dapr `
  --dapr-app-port 80 `
  --dapr-app-id blogapp `
  --dapr-components ./statestore.yaml `
  --registry-login-server acrblogpost.azurecr.io `
  --registry-username acrblogpost `
  --registry-password I=NSkzHPx**********YDNkR

Nach erfolgreichem Deployment kann die App nun über die default URL aufgerufen werden:

App URL
App URL
Container App
Verwendung der Container App

Der State wird wie auch lokal im State Store persistiert und kann auch nach Neuladen der App weiterverwendet werden:

State Store Ansicht im Storage Explorer

Und das war noch lange nicht alles! Mit Azure Container Apps ist im Weiteren auch eine dynamische Skalierung der Container Servics möglich, die auf Basis des Web-Traffics oder diverser Metriken stattfinden kann. Für die Integration mit anderen Services sind weitere DAPR Building Blocks verfügbar – unter anderem aus den Kategorien Service-to-Service-Invocation, Publish/Subscribe und Event Bindings.

Für all die Entwicklerteams, die keine tiefere Expertise in Sachen Container Orchestration aufbauen möchten, ist Container Apps daher eine echte Chance einen schnellen Einstieg in das Hosting von Container Architekturen zu finden.

Es gibt immer eine einfachere Lösung, und aConTechs Cloudworker haben Sie für Sie zur Hand! Egal ob Azure, Microsoft 365 oder intelligente Prozessautomatisierung durch clevere Power Apps – aConTechs Experten haben die passende Lösung für Ihre digitale Transformation. Setzen Sie sich jetzt in Verbindung mit aConTechs Experten!