Skalierung von Azure-Web-Anwendungen für Entwickler
Teil 1: Skalierungsstrategien
Wir haben bereits in mehreren Beiträgen die Vorzüge der Azure App Services als ideale Plattform zum Hosting von Web-Anwendungen besprochen, insbesondere aus Entwicklersicht. Einer der Vorteile ist die Skalierung der unterliegenden von Microsoft verwalteten Infrastruktur, mit der sich die App-Service-Plattform dem Leistungsbedarf deiner Web-Anwendung anpasst. Neben der Zeitplan- und Metrik-basierten Skalierung unterstützt der App-Service-Dienst seit einiger Zeit nun auch die vollautomatische Skalierung. Wie das funktioniert, demonstriert dieser Beitrag. Ein Folge-Beitrag widmet sich dann der neuen automatisierten Last-Tests, mit denen Entwickler den Erfolg ihrer Skalierungsstrategie komfortabel testen können. Natürlich lernst du auch alles dazu in unseren Schulungen, wie z. B. Microsoft Azure Administrator, Developing Solutions for Microsoft Azure und Microsoft Azure DevOps Engineer
Passende Schulungen
AZ-104 Microsoft Azure Administrator (AZ-104T00)
AZ-104 Microsoft Azure Administrator (AZ-104T00): Azure Administration für Profis
AZ-204 Developing Solutions for Microsoft Azure (AZ-204T00)
Wir haben in unseren Blog-Beiträgen schon häufiger die Vorzüge von Azure Web Apps aufgeführt. Hast du also als Entwickler die Anforderung, deine App auf Basis eines klassischen Web-Anwendungstechnologiestapels schreiben zu können, kannst du dir die Bereitstellung, den Betrieb und die Verwaltung der zugrundliegenden Infrastruktur mit Azure Web Apps komplett sparen, weil Microsoft sich um die Bereitstellung und Wartung der Gastbetriebssysteme UND der Sprachen-Frameworks, bzw. Laufzeitumgebungen kümmert. Der Service unterstützt derzeit ASP.NET, ASP.NET Core, Java, Node.js, PHP, oder Python. Erwähnenswert ist in diesem Zusammenhang auch die Integration zahlreicher Java-Tools mittels Maven oder Gradle, ohne dass du dazu deine gewohnte Umgebung in Visual Studio Code, IntelliJ oder Eclipse verlassen musst. Du kannst auch PowerShell und weitere Skripts oder ausführbare Dateien als Hintergrunddienst ausführen. Außerdem kannst du deine Apps auf Basis auch containerisieren, wahlweise mit Docker bei einer Linux-Infrastruktur-Stack oder mittels Windows-Containern. Im Falle Docker kannst du deine App mit dem Docker-Compose-Support auf mehrere Container verteilen und sogar Sidecar-Container deiner Wahl ausführen. Zudem ist der gesamte Service Microsoft-seitig ISO-, SOC- und PCI-konform zertifiziert und es gibt zahlreiche Anwendungsvorlagen im Azure Marketplace zum Bereitstellen auf App-Services basierender Lösungen, wie WordPress, Joomla und Drupal. In puncto Sicherheit ist erwähnenswert, dass du für Zugriff einschränkende IP-Zugriffsrichtlinien sowie Identitäten für verwaltete Dienste einrichten kannst, um z. B. das ungewollte Übernehmen von Unterdomänen zu verhindern.
Für Entwickler ist in erster Linie die DevOps-Optimierung interessant, bzw. CI/CD-Integration mittels Azure DevOps, BitBucket, Docker Hub, Azure Container Registry und GitHub. Dank Support für Staging-Slots kannst du deine Updates über Test- und Staging-Umgebungen abstufen und damit nahtlos zu einem neuen Release wechseln. Ferner kannst du aus deiner Web-App Dank Verfügbarkeit einer großen Anzahl von SaaS-Konnektoren Verbindung zu Diensten wie SAP oder Salesforce einrichten. Ebenso kannst du aus einer Web-App über Hybridverbindungen und virtuelle Azure-Netzwerke auf lokale Daten zugreifen. Außerdem kannst du deine Webanwendung mit Hilfe der App-Services-integrierten Authentifizierung oder über die Microsoft Identity Plattform und die MSAL durch Anbinden jedes OIDC/OAuth-fähigen IDPs, bzw. via Google, Facebook oder X, komfortabel mit einer Authentifizierungsebene ausstatten.
Wir haben uns auch bereits in mehreren Artikeln der CI/CD-Integration, z. B. via GitHub und der hervorragenden VS-Code-Integration gewidmet. Diese bietet dir eine komfortable Möglichkeit, deinen Code aus einer vertrauten Umgebung bereitzustellen und zu debuggen. Neben dem Bereitstellen von Code oder Containern unterstützten die App Services auch seherlosen Code, sodass du problemlos bei Bedarf ein Code-Fragment oder Skript ausführen kannst, ohne explizit eine Infrastruktur bereitstellen oder verwalten zu müssen. Du zahlst dann nur für Rechenzeit, die für deinen Code tatsächlich benötigt wird. Entwicklern kommt ebenfalls zugute, dass die Azure App Services eine sofort einsetzbare CORS-Unterstützung für RESTful-API-Szenarien zur Verfügung stellen. Das vereinfacht Szenarien mit mobilen Apps durch Aktivierung von Authentifizierung, Offlinedatensynchronisierung oder Push-Benachrichtigungen.
Thema dieses und des folgenden Beitrages soll aber die Fähigkeit zur Globale Skalierung mit Hochverfügbarkeit sein, d. h. du kannst deine Web-App in Abhängigkeit des verwendeten Serviceplans manuell oder automatisch zentral oder horizontal hoch und auch herunterskalieren. Die zugehörige App Service-SLA garantiert Hochverfügbarkeit. Zum Nachvollziehen des folgenden Beispiels benötigen du einen App-Service-Plan, der manuelle oder automatische Skalierung unterstützt.
Der richtige Serviceplan
Erstelle also wahlweise vorab, auch im Kontext der Web-App-Erstellung einen geeigneten Service-Plan. Die Laufzeitumgebung spielt für dieses Beispiel keine Rolle, z. B. PHP 8.3. Im Kontext der Web-App-Erstellung klicke auf „Preispläne erkunden“. Sortiere dann die Anzeige der verfügbaren Service-Pläne mit Hilfe der bei Radiobuttons am Kopf der Seite Nach Funktionen (Featureansicht). Wähle nun einen Service-Plan der in der Spalte „Auto Scale“ entweder Manual, Rules oder Elastic aufweist. Lustige Anekdote bei der deutschen Lokalisierung des Azure-Portals: „Manual“ (für manuell) ist hier mit „Handbuch“ übersetzt.
Passende Schulungen
AZ-400 – Microsoft Azure DevOps Engineer (AZ-400T00)
AZ-400 - Microsoft Azure DevOps Engineer - Der Kurs bereitet dich auf die DevOps Zertifizierung AZ-400 vor.
Wir starten zunächst mit einem B1, der nur manuelle Skalierung unterstützt und rüsten dann später auf. Die übrigen Einstellungen zur Web-App-Erstellung sind für dieses Beispiel weitgehend egal. Wir binden für dieses Beispiel keine Datenbank an sondern eine einfache PHP-App aus einem bestehenden Git-Hub-Repository, um uns die hervorragende CI/CI-Unterstützung zunutze zu machen.
Die CI/CD-Integration für GitHub lässt sich übrigens bereits direkt im Bereitstellungsassistenten für die Web-App einrichten, im dritten Tab „Bereitstellung“. Andere Quell-Code-Anbieter wie Git, Bitbucket usw. müssen hingegen im Anschluss an die App-Bereitstellung im Bereitstellungscenter eingerichtet werden.
Horizontale Skalierung
Bei einem B1-Plan wie im Beispiel basiert der Plan auf exakt einer Instanz, also eine von Microsoft transparent verwalteten VM. Möchtest du deine Web-Web, bzw. strenggenommen den unterliegenden App-Service-Plan, im Anschluss an die Bereitstellung skalieren, kannst du entweder in der Verwaltungsseite deine Web-App starten und im Menü „App-Service-Plan“ mit einem Klick auf „App-Service-Plan“ zu dieser wechseln oder du navigierst von der Übersichtsseite deiner Web-App ausgehend rechts oben bei „App-Service-Plan“ dort hin. Du kannst natürlich auch direkt im Azure-Portal deine App-Service-Plan-Ressource aufrufen oder mithilfe der Ressourcengruppe. So oder so navigierst du in deinem App-Service-Plan ins Menü „Einstellungen“ wahlweise zu „Hochskalieren (App Service Plan“, wenn du durch Up- oder Downgrade zu einem größeren oder kleineren Plan wechseln möchtest (vertikale Skalierung), was zu einen Neustart der App führt, oder zu „Aufskalieren (App Service Plan)“, wenn du von der manuellen, automatischen oder Regel-basierten horizontalen Skalierung oder Downtime profitieren möchtest.
Starten wir mit der manuellen Skalierung: Verwende dazu den Schieberegler am Fuß der Seite, um in diesem Beispiel die Anzahl der Instanzen auf 2 zu setzen. Optional kannst du den Wert 1 auch direkt mit 2 überschreiben. Bei „Skalierungsmethode“ steht „Manual“, bzw. „Handbuch“ in der unglücklichen deutschen Übersetzung:
Vergesse nicht den Klick auf „Speichern“. Die aktuelle Instanzzahl siehst du anschließend z. B. durch einen Klick auf Eigenschaften.
Wie du der Abbildung oben entnehmen kannst, wird die automatische, sowie die Regel-basierte Skalierung von unserem B1 nicht unterstützt. Navigiere daher zur vertikalen Skalierung „Hochskalieren (App Service Plan“, wähle einen geeigneten Plan, wie z. B. „Premium v3 P0V3“, klicke auf „Auswählen“ und dann auf „Upgrade“.
Wurde der Tarifplan aktualisiert, wechsel erneut zur horizontalen Skalierung und wähle z. B. „Automatisch“, der neuesten Skalierungs-Strategie für Web-Apps. Die Plattform kümmert sich dann vollautomatisch und das Auf- und Abskalieren auf Basis des Datenverkehrs. Der Wert bei „Maximaler Burst“ meint dann die Anzahl von Instanzen, auf die dieser Plan bei Auslastung aufskaliert werden kann. Der Wert muss größer oder gleich den aktuellen Instanzen für diesen Plan sein.
Wie du den Erfolg anhand automatisierter Last-Tests prüfen kannst (das neuste Feature der App Services) zeigt ein Folge-Beitrag. Wenden wir uns schließlich noch der regelbasierten Skalierung zu. Dieser wird übrigens solange ignoriert, wie die automatische Skalierung noch aktiviert ist. Du musst daher auf den angezeigten Link „Verwalten der regelbasierten Skalierung“ klicken. Du landest dann im klassischen Menü zur Konfiguration der Skalierung mit dem Namen „Einstellungen für die Autoskalierung“, was etwas widersprüchlich ist, aber die oben erwähnte automatische Skalierung ist eine neue Funktion, während du hier im klassischen Menü erneut zwischen „Manuelle Skalierung“ und „Benutzerdefinierte Autoskalierung“ wählen kannst, wie untenstehende Abbildung zeigt.
Im Tab Konfigurieren“ legst du dann eine oder mehrere Skalierungsbedingungen fest. Eine erste Bedingung mit dem Namen „Standard“ wird automatisch erstellt mit dem Skalierungsmodus „Auf eine bestimmte anzahl von instanzen skalieren“. Die deutsche falsche Kleinschreibung wurde dem Screenshot entnommen.
Du kannst diese automatisch erstellte Standardbedingung ändern oder weitere Bedingungen erstellen und auch mehrere Bedingungen miteinander kombinieren, etwas „Basierend auf einer Metrik“ skalieren oder „Zeitplan“. Erstelle nun exemplarisch eine Metrik-basierte Bedingung.
In diesem Fall musst du auf den Link „Regel hinzufügen“ klicken – du kannst auch mehrere Metrik-basierte Regeln in eine Bedingung packen – und bei Instanz Grenzwerte“ einen Minimum-Wert, einen Maximum-Wert und einen Standard-Wert festlegen.
Lege nun eine Metrik-Regel fest. Du kannst auf jede gewünschte Metrik skalieren, welche die „Metrikquelle“ eines App-Service-Plans bereitstellt, wie z. B. „CPU Percentage“, “Memory Percentage“ oder verschiedene TCP-Metriken.
In Abstimmung an das Lastverhalten deiner Anwendung – bei der Metrik-basierten Skalierung ist es im Unterschied zur automatischen Skalierung nützlich, wenn du das Lastverhalten deiner Anwendung kennst oder vorhersagen kannst – experimentiere nun mit den Werten für „Operator“, „Metrikschwellwert“, „Dauer“, Aggregationsintervall“, „Statistik zum Aggregationsintervall“ und Zeitaggregation“, um geeignete Arbeitspunkte zu finden. Hilfreich ist dabei, dass du jeweils eine Echtzeitsicht auf die gewählte Metrik angezeigt bekommst. Auch wenn die Beispielswerte in der folgenden Abbildung auf eine entspannte Situation deuten und eine Skalierung nicht erforderlich machen, könntest du natürlich testweise versuchen, eine solche zu provozieren. Wir verwenden daher angesichts der momentanen mittleren Arbeitsspeicherauslastung von ca. 56 Prozent einen Trigger von 40 % mit einem Operator „Größer als“ über eine Dauer von 1 Minute und wählen bei „Vorgang“ den Eintrag „Anzahl erhören um“ sowie bei „Anzahl von Instanzen“ den Wert 1.
Wie du siehst, kannst du auch den „Prozentsatz erhöhen“ oder die „Instanzzahl erhöhen auf“ die für Cloud-Workloads viel gepriesene Elastizität – also das automatische Verringern der Kapazität, wenn sie nicht mehr benötigt wird – erreichst du natürlich nur, wenn du auch passende „Scale-In“-Bedingungen erstellst.
Du kannst jetzt z. B. auch eine weitere Skalierungsbedingung hinzufügen und beispielsweise nach einem spezifischen Zeitplan skalieren, wenn du z. B. höheren Kapazitätsbedarf nur zu bestimmten Geschäftszeiten erwartest. Du darfst jeweils den Klick auf „Speichern“ nicht vergessen.
Den „Erfolg“ deiner Metrik- oder Zeitplan-basierten Skalierungsmaßnahmen kannst du z. B. im Tab „Verlauf“ verfolgen.
Kontakt
„*“ zeigt erforderliche Felder an