CI/CD-Pipeline für containerbasierte Workloads

Container Registry
Cosmos DB
Kubernetes-Dienst
Monitor
Pipelines

Dieses Beispielszenario richtet sich an Unternehmen, die ihre Anwendungsentwicklung durch die Verwendung von Containern und DevOps-Workflows modernisieren möchten. In diesem Szenario wird eine Node.js-Web-App erstellt und von Jenkins in einer Azure Container Registry-Instanz und in Azure Kubernetes Service bereitgestellt. Für eine global verteilte Datenbankschicht wird Azure Cosmos DB verwendet. Zur Überwachung der Anwendungsleistung sowie zur Behandlung entsprechender Probleme wird Azure Monitor mit einer Grafana-Instanz und einem entsprechenden Dashboard verknüpft.

Beispielszenarien für diese Anwendung wären etwa die Bereitstellung einer automatisierten Entwicklungsumgebung, die Überprüfung neuer Codecommits oder das Pushen neuer Bereitstellungen an Staging- oder Produktionsumgebungen. In der Vergangenheit mussten Unternehmen Anwendungen und Updates in der Regel manuell erstellen und kompilieren sowie eine umfangreiche monolithische Codebasis pflegen. Mit einem modernen Konzept für die Anwendungsentwicklung, das auf Continuous Integration (CI) und Continuous Deployment (CD) setzt, können Sie Dienste schneller erstellen, testen und bereitstellen. Durch diesen modernen Ansatz können Sie Anwendungen und Updates schneller für Ihre Kunden bereitstellen und flexibler auf veränderte geschäftliche Anforderungen reagieren.

Azure-Dienste wie Azure Kubernetes Service, Container Registry und Cosmos DB bieten Unternehmen die neuesten Techniken und Tools für die Anwendungsentwicklung und vereinfachen die Implementierung von Hochverfügbarkeit.

Mögliche Anwendungsfälle

Zu den weiteren relevanten Anwendungsfällen zählen:

  • Modernisieren der Anwendungsentwicklung mit einem Microservice- und Container-basierten Ansatz
  • Beschleunigen von Anwendungsentwicklung und Bereitstellungslebenszyklen
  • Automatisieren von Bereitstellungen in Test- oder Akzeptanzumgebungen zu Überprüfungszwecken

Aufbau

Architecture overview of the Azure components involved in a DevOps scenario using Jenkins, Azure Container Registry, and Azure Kubernetes Service

Datenfluss

Dieses Szenario umfasst eine DevOps-Pipeline für eine Node.js-Webanwendung und ein Datenbank-Back-End. Die Daten durchlaufen das Szenario wie folgt:

  1. Ein Entwickler ändert den Quellcode der Node.js-Webanwendung.
  2. Die Codeänderung wird in einem Quellcodeverwaltungsrepository wie GitHub committet.
  3. Zum Starten des CI-Prozesses (Continuous Integration) löst ein GitHub-Webhook einen Jenkins-Projektbuildvorgang aus.
  4. Der Jenkins-Buildauftrag verwendet einen dynamischen Build-Agent in Azure Kubernetes Service, um einen Containerbuildprozess auszuführen.
  5. Auf der Grundlage des Codes in der Quellcodeverwaltung wird ein Containerimage erstellt und anschließend an Azure Container Registry gepusht.
  6. Über Continuous Deployment (CD) stellt Jenkins dieses aktualisierte Containerimage im Kubernetes-Cluster bereit.
  7. Die Node.js-Webanwendung verwendet Cosmos DB als Back-End. Sowohl Cosmos DB als auch Azure Kubernetes Service übermitteln Metriken an Azure Monitor.
  8. Eine Grafana-Instanz bietet visuelle Dashboards zur Anwendungsleistung, die auf den Daten von Azure Monitor basieren.

Komponenten

  • Jenkins ist ein Open-Source-Automatisierungsserver, der sich problemlos in Azure-Dienste integrieren lässt, um Continuous Integration (CI) und Continuous Deployment (CD) zu ermöglichen. In diesem Szenario orchestriert Jenkins die Erstellung neuer Containerimages auf der Grundlage von Commits in der Quellcodeverwaltung, pusht die Images an die Azure Container Registry-Instanz und aktualisiert anschließend Anwendungsinstanzen in Azure Kubernetes Service.
  • Virtuelle Linux-Computer in Azure fungieren als IaaS-Plattform zum Ausführen der Jenkins- und Grafana-Instanzen.
  • Azure Container Registry speichert und verwaltet Containerimages, die vom Azure Kubernetes Service-Cluster verwendet werden. Images werden sicher gespeichert und können von der Azure-Plattform in anderen Regionen repliziert werden, um die Bereitstellung zu beschleunigen.
  • Azure Kubernetes Service ist eine verwaltete Kubernetes-Plattform, mit der Sie Containeranwendungen ganz ohne Kenntnisse auf dem Gebiet der Containerorchestrierung bereitstellen und verwalten können. Azure führt als gehosteter Kubernetes-Dienst wichtige Aufgaben für Sie aus, z.B. Systemüberwachung und Wartung.
  • Azure Cosmos DB ist eine global verteilte Datenbank, bei der Sie zwischen verschiedenen Datenbank- und Konsistenzmodellen wählen können, um Ihre individuellen Anforderungen zu erfüllen. Mit Cosmos DB können Ihre Daten global repliziert werden, und es müssen keine Komponenten für die Clusterverwaltung oder Replikation bereitgestellt und konfiguriert werden.
  • Azure Monitor dient zum Nachverfolgen der Leistung, Gewährleisten der Sicherheit und Identifizieren von Trends. Metriken von Monitor können von anderen Ressourcen und Tools (etwa von Grafana) verwendet werden.
  • Grafana ist eine Open-Source-Lösung für Abfragen, Visualisierungen und Warnungen sowie zum Nachvollziehen von Metriken. Dank eines Datenquellen-Plug-Ins für Azure Monitor kann Grafana visuelle Dashboards zur Überwachung der Leistung Ihrer Anwendungen erstellen, die in Azure Kubernetes Service ausgeführt werden und Cosmos DB verwenden.

Alternativen

  • Azure Pipelines unterstützen Sie bei der Implementierung einer Pipeline für Continuous Integration (CI), Tests und Continuous Deployment (CD) für jede beliebige App.
  • Kubernetes kann direkt auf virtuellen Azure-Computern ausgeführt werden und bietet so bei Bedarf ein höheres Maß an Kontrolle als bei der Ausführung über einen verwalteten Dienst.
  • Service Fabric ist eine weitere Alternative für einen Containerorchestrator, die AKS ersetzen kann.

Überlegungen

Verfügbarkeit

Bei diesem Szenario wird Azure Monitor mit Grafana für visuelle Dashboards kombiniert, um die Leistung Ihrer Anwendung zu überwachen und Probleme zu melden. Mithilfe dieser Tools können Sie die Leistung überwachen und entsprechende Probleme behandeln, für die ggf. Codeaktualisierungen erforderlich sind, die dann über die CI/CD-Pipeline bereitgestellt werden können.

Der Azure Kubernetes Service-Cluster verfügt über einen Lastenausgleich, der Anwendungsdatenverkehr an Container (Pods) verteilt, die Ihre Anwendung ausführen. Dieses Konzept der Ausführung von Containeranwendungen in Kubernetes stellt eine hochverfügbare Infrastruktur für Ihre Kunden bereit.

Skalierbarkeit

Azure Kubernetes Service ermöglicht die Skalierung der Anzahl von Clusterknoten, um den Anforderungen Ihrer Anwendungen gerecht zu werden. Mit zunehmender Größe Ihrer Anwendung können Sie die Anzahl von Kubernetes-Knoten für die Ausführung Ihres Diensts aufskalieren.

Anwendungsdaten werden in Azure Cosmos DB gespeichert. Dabei handelt es sich um eine global verteilte und global skalierbare Datenbank mit mehreren Modellen. Cosmos DB abstrahiert die Notwendigkeit der Infrastrukturskalierung, wie dies bei herkömmlichen Datenbankkomponenten der Fall ist. Sie haben die Möglichkeit, Ihre Cosmos DB-Instanz global zu replizieren, um den Anforderungen Ihrer Kunden gerecht zu werden.

Weitere Skalierbarkeitsthemen finden Sie in der Prüfliste zur Leistungseffizienz, die im Azure Architecture Center verfügbar ist.

Sicherheit

Zur Minimierung der Angriffsfläche wird die Jenkins-VM-Instanz in diesem Szenario nicht über HTTP verfügbar gemacht. Für Verwaltungsaufgaben, die eine Interaktion mit Jenkins erfordern, wird von Ihrem lokalen Computer aus über einen SSH-Tunnel eine sichere Remoteverbindung hergestellt. Für die VM-Instanzen von Jenkins und Grafana ist ausschließlich die Authentifizierung mit öffentlichem SSH-Schlüssel zulässig. Kennwortbasierte Anmeldungen sind deaktiviert. Weitere Informationen finden Sie unter Ausführen eines Jenkins-Servers in Azure.

Zur Trennung von Anmeldeinformationen und Berechtigungen verwendet dieses Szenario einen dedizierten Azure Active Directory-Dienstprinzipal. Die Anmeldeinformationen für diesen Dienstprinzipal werden als Objekt mit sicheren Anmeldeinformationen in Jenkins gespeichert, damit sie nicht direkt in Skripts oder in der Buildpipeline verfügbar/sichtbar sind.

Allgemeine Informationen zum Entwerfen sicherer Lösungen finden Sie in der Dokumentation zur Azure-Sicherheit.

Resilienz

In diesem Szenario wird Azure Kubernetes Service für Ihre Anwendung genutzt. Kubernetes verfügt über integrierte Resilienzkomponenten, die die Container (Pods) überwachen und im Falle eines Problems neu starten. In Kombination mit der Ausführung mehrerer Kubernetes-Knoten kann Ihre Anwendung die Nichtverfügbarkeit eines Pods oder Knotens tolerieren.

Allgemeine Informationen zur Entwicklung robuster Lösungen finden Sie unter Entwerfen zuverlässiger Azure-Anwendungen.

Bereitstellen dieses Szenarios

Voraussetzungen

  • Sie benötigen ein bestehendes Azure-Konto. Wenn Sie kein Azure-Abonnement besitzen, können Sie ein kostenloses Konto erstellen, bevor Sie beginnen.

  • Sie benötigen ein öffentliches SSH-Schlüsselpaar. Informationen zum Erstellen eines öffentlichen Schlüsselpaars finden Sie unter Schnelle Schritte: Erstellen und Verwenden eines SSH-Schlüsselpaars (öffentlich und privat) für virtuelle Linux-Computer in Azure.

  • Für die Authentifizierung des Diensts und der Ressourcen benötigen Sie einen Azure Active Directory-Dienstprinzipal. Bei Bedarf können Sie mit az ad sp create-for-rbac einen Dienstprinzipal erstellen.

    az ad sp create-for-rbac --name myDevOpsScenario \
                        --role Contributor \
                        --scopes /subscriptions/mySubscriptionID
    

    Notieren Sie sich die Werte für appId und password aus der Befehlsausgabe. Diese Werte müssen beim Bereitstellen des Szenarios in der Vorlage angegeben werden.

  • Sie können die unterstützten Kubernetes-Versionen für Ihre Bereitstellungsregion ermitteln, indem Sie az aks get-versions ausführen. Mit dem folgenden Befehl wird die CLI-Standardversion abgerufen:

    az aks get-versions -l <region> --query "orchestrators[?default!=null].orchestratorVersion" -o tsv
    

Exemplarische Vorgehensweise

Gehen Sie wie folgt vor, um dieses Szenario mit einer Azure Resource Manager-Vorlage bereitzustellen.

  1. Klicken Sie auf den Link unten, um die Lösung bereitzustellen.

    Deploy to Azure

  2. Warten Sie, bis die Vorlagenbereitstellung im Azure-Portal geöffnet wurde, und führen Sie anschließend folgende Schritte aus:

    • Erstellen Sie über Neu erstellen eine neue Ressourcengruppe, und geben Sie einen Namen (beispielsweise myAKSDevOpsScenario) in das Textfeld ein.
    • Wählen Sie im Dropdownfeld Standort eine Region aus.
    • Geben Sie die App-ID und das Kennwort Ihres Dienstprinzipals aus dem Befehl az ad sp create-for-rbac ein.
    • Geben Sie einen Benutzernamen und ein sicheres Kennwort für die Jenkins-Instanz und die Grafana-Konsole an.
    • Geben Sie einen SSH-Schlüssel an, um Anmeldungen bei den virtuellen Linux-Computern zu schützen.
    • Geben Sie die Kubernetes-Version aus dem Befehl az aks get-versions ein.
    • Lesen Sie die allgemeinen Geschäftsbedingungen, und aktivieren Sie dann das Kontrollkästchen Ich stimme den oben genannten Geschäftsbedingungen zu.
    • Klicken Sie auf die Schaltfläche Kaufen.

Der Bereitstellungsvorgang kann zwischen 15 und 20 Minuten dauern.

Preise

Zur Ermittlung der Betriebskosten für dieses Szenario sind alle Dienste im Kostenrechner vorkonfiguriert. Wenn Sie wissen möchten, welche Kosten für Ihren spezifischen Anwendungsfall entstehen, passen Sie die entsprechenden Variablen an Ihren voraussichtlichen Datenverkehr an.

Auf der Grundlage der Anzahl der zu speichernden Containerimages und der Kubernetes-Knoten für die Ausführung Ihrer Anwendungen haben wir drei exemplarische Kostenprofile erstellt:

  • Klein: Dieses Preisbeispiel entspricht 1000 Containerbuildprozessen pro Monat.
  • Mittel: Dieses Preisbeispiel entspricht 100.000 Containerbuildprozessen pro Monat.
  • Groß: Dieses Preisbeispiel entspricht 1.000.000 Containerbuildprozessen pro Monat.

Nächste Schritte

Dieses Szenario verwendet Azure Container Registry und Azure Kubernetes Service, um eine containerbasierte Anwendung zu speichern und auszuführen. Azure Container Instances kann ebenfalls zum Ausführen containerbasierter Anwendungen verwendet werden, ohne dafür Orchestrierungskomponenten bereitstellen zu müssen. Weitere Informationen finden Sie in der Übersicht über Azure Container Instances.

Produktdokumentation:

Microsoft Learn-Module: