Übung: Erstellen der Bereitstellungspipeline
Nachdem Sie die Helm-Diagramme erstellt haben, verfügen Sie nun über alle Tools, die Sie benötigen, um die Anwendung mit GitHub Actions in AKS bereitzustellen. In dieser Lerneinheit beenden Sie die CI/CD-Pipeline, indem Sie die letzten Bereitstellungsschritte ausführen.
Die Bereitstellungsschritte umfassen Folgendes:
- Erstellen des Bereitstellungsauftrags
- Einrichten von Open ID Connect (OIDC)
- Bereitstellen der Anwendung mit Helm
- Ausführen der Bereitstellung für die Produktion
Hinzufügen des Bereitstellungsauftrags
Navigieren Sie in GitHub zu Ihrem Fork des Repositorys.
Erweitern Sie das Verzeichnis .github/workflows, und öffnen Sie die Datei build-staging.yml für die Bearbeitung.
Fügen Sie am Ende der Datei wie folgt einen neuen
deploy
-Auftrag nach dembuild_push_image
-Auftrag hinzu. Stellen Sie sicher, dass der Einzug übereinstimmt.Der Auftrag hat drei Schlüssel:
runs-on
,needs
undpermissions
.- Verwenden Sie
ubuntu-20.04
fürruns-on
, um die Konsistenz mit dem anderen Auftrag zu gewährleisten. - Verwenden Sie für
needs
den Namen des ersten Auftrags (build_push_image
), sodass die Anwendung erst bereitgestellt wird, nachdem das Image erstellt wurde. - Fügen Sie für
permissions
zwei Argumente namensid-token
undcontents
hinzu. Legen Sieid-token
aufwrite
undcontents
aufread
fest. Dadurch erhält GitHub Actions Zugriff und kann Anforderungen senden und die Repositoryinhalte lesen.
- Verwenden Sie
Fügen Sie
- uses: actions/checkout@v2
als ersten Schritt des Auftrags hinzu.Der hinzugefügte
deploy
-Auftrag sollte folgendem Code ähneln:deploy: runs-on: ubuntu-20.04 needs: build_push_image permissions: id-token: write contents: read steps: - uses: actions/checkout@v2
Hinzufügen des Schritts „Helm installieren“
Verwenden Sie eine GitHub-Aktion, um die Helm-Version v3.3.1
herunterzuladen und zu installieren.
Suchen Sie im rechten Bereich der Bearbeitungsseite nach Installer für Helm-Tools. Klicken Sie auf das erste von Azure veröffentlichte Ergebnis.
Wählen Sie das Kopiersymbol aus, um den YAML-Code zu kopieren.
Fügen Sie den YAML-Code unterhalb des Schlüssels
uses
in build-staging.yml ein.Benennen Sie den Schritt von
Helm tool installer
inInstall Helm
um, und heften Sie den Schlüsselversion
anv3.3.1
an.steps: - uses: actions/checkout@v2 - name: Install Helm uses: Azure/setup-helm@v1 with: version: v3.3.1
Hinzufügen des Schritts für die Azure-Anmeldeauthentifizierung
Verwenden Sie OIDC, um GitHub Actions für den Zugriff auf AKS zu authentifizieren.
Suchen Sie im rechten Bereich nach Azure-Anmeldung, und wählen Sie Azure-Anmeldung (von Azure veröffentlicht) aus.
Wählen Sie das Kopiersymbol aus, um den YAML-Code zu kopieren, und fügen Sie ihn unter dem Schritt
Install Helm
in build-staging.yml ein.Ändern Sie den Namen des Schritts von
Azure Login
inSign in to Azure with OIDC
.Azure Login
erfordert drei Parameter für die Authentifizierung:client-id
,tenant-id
undsubscription-id
. Füllen Sie diese Parameter mit Platzhaltern für Geheimnisse aus, die Sie später festlegen.- name: Sign in to Azure with OIDC uses: Azure/login@v1.5.1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
Suchen Sie im rechten Bereich nach Kontext festlegen, und wählen Sie Azure Kubernetes-Kontext festlegen (von Azure veröffentlicht) aus.
Wählen Sie das Kopiersymbol aus, um den YAML-Code zu kopieren, und fügen Sie ihn unter dem Schritt
Sign in to Azure with OIDC
in build-staging.yml ein. Füllen Sie die Parameterresource-group
undcluster-name
mit Platzhaltern für die Geheimnisse aus, die Sie in einer früheren Lerneinheit festgelegt haben.- name: Azure Kubernetes set context uses: Azure/aks-set-context@v3 with: resource-group: ${{ secrets.RESOURCE_GROUP }} cluster-name: ${{ secrets.CLUSTER_NAME }}
Die Datei build-staging.yml sollte wie das folgende Beispiel aussehen:
name: Build and push the latest build to staging on: push: branches: [ main ] jobs: build_push_image: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Buildx uses: docker/setup-buildx-action@v3.0.0 - name: Docker Login uses: docker/login-action@v3.0.0 with: registry: ${{ secrets.ACR_NAME }} username: ${{ secrets.ACR_LOGIN }} password: ${{ secrets.ACR_PASSWORD }} - name: Build and push staging images uses: docker/build-push-action@v5.0.0 with: context: . push: true tags: ${{secrets.ACR_NAME}}/contoso-website:latest deploy: runs-on: ubuntu-20.04 needs: build_push_image # Will wait for the execution of the previous job permissions: id-token: write # This is required for requesting the JWT contents: read # This is required for actions/checkout steps: - uses: actions/checkout@v2 - name: Install Helm uses: Azure/setup-helm@v1 with: version: v3.3.1 - name: Sign in to Azure with OIDC uses: Azure/login@v1.5.1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Azure Kubernetes set context uses: Azure/aks-set-context@v3 with: resource-group: ${{ secrets.RESOURCE_GROUP }} cluster-name: ${{ secrets.CLUSTER_NAME }}
Einrichten von Open ID Connect (OIDC)
Weisen Sie Ihren Geheimnissen Werte zu, indem Sie einen Dienstprinzipal und Zertifikate zur Anmeldung mit OIDC erstellen.
Erstellen Sie den Dienstprinzipal
Führen Sie
az account show
in Azure Cloud Shell aus, und speichern Sie den Wertid
aus der Ausgabe.Erstellen Sie einen Dienstprinzipal, indem Sie den folgenden Befehl ausführen und den Wert
id
aus dem vorherigen Befehl für$SUBSCRIPTION_ID
ersetzen:az ad sp create-for-rbac --scopes /subscriptions/$SUBSCRIPTION_ID --role Contributor
Kopieren Sie die JSON-Ausgabe, und speichern Sie sie für den nächsten Schritt.
Festlegen der Geheimnisse
Wählen Sie auf der Seite des GitHub-Repositorys die Registerkarte Einstellungen aus, und klicken Sie dann im linken Menü auf Geheimnisse und Variablen>Aktionen. Definieren Sie die folgenden drei neuen Geheimnisse, die die Ausgabe aus den vorherigen Schritten verwenden.
AZURE_CLIENT_ID
: Der Wert"appId"
aus der Ausgabe vonaz ad sp create-for-rbac
AZURE_TENANT_ID
: Der Wert"tenant"
aus der Ausgabe vonaz ad sp create-for-rbac
AZURE_SUBSCRIPTION_ID
: Der Wertid
aus der Ausgabe vonaz account show
Für jedes Geheimnis
- Wählen Sie New repository secret (Neues Repositorygeheimnis) aus.
- Geben Sie für Name den Geheimnisnamen ein.
- Geben Sie unter Geheimnis den Wert ein.
- Klicken Sie auf Add secret (Geheimnis hinzufügen).
Hinzufügen von Verbundanmeldeinformationen
Erstellen Sie Verbundzertifikate, um GitHub Actions für den Zugriff auf die Anwendung zu autorisieren.
Wechseln Sie im Azure-Portal zu App-Registrierungen.
Suchen Sie nach der Anwendung, die dem im vorherigen Schritt
az ad sp create-for-rbac
zurückgegebenendisplayName
-Wert entspricht, und wählen Sie sie aus. Der Anwendungsname verwendet standardmäßig den Zeitstempel der Dienstprinzipalerstellung.Stellen Sie sicher, dass die Werte von appID (Client-ID), Objekt-ID (Anwendungsobjekt-ID) und Verzeichnis-ID (Mandanten-ID) mit der vorherigen JSON-Ausgabe übereinstimmen.
Klicken Sie im linken Navigationsbereich auf Zertifikate & Geheimnisse.
Wählen Sie auf dem Bildschirm Zertifikate und Geheimnisse die Registerkarte Verbundanmeldeinformationen aus.
Wählen Sie Anmeldeinformationen hinzufügen aus.
Wenn Sie die Staging-Anmeldeinformationen hinzufügen möchten, wählen Sie auf dem Bildschirm Anmeldeinformationen hinzufügen die folgenden Informationen aus, oder geben Sie sie ein:
- Szenario mit Verbundanmeldeinformationen: Wählen Sie GitHub Actions stellt die Azure-Ressourcen bereit aus.
- Organisation: Geben Sie Ihren GitHub-Benutzernamen ein.
- Repository: Geben Sie mslearn-aks-deployment-pipeline-github-actionsein.
- Entitätstyp: Wählen Sie Branch aus.
- Name der GitHub-Verzweigung: Geben Sie main ein.
- Name: Geben Sie staging-cred ein.
- Beschreibung: Geben Sie Testing ein.
Wählen Sie Hinzufügen aus.
Wählen Sie zum Hinzufügen der Produktionsanmeldeinformationen erneut Anmeldeinformationen hinzufügen aus, und geben Sie auf dem Bildschirm Anmeldeinformationen hinzufügen die gleichen Werte wie für die vorherigen Anmeldeinformationen ein, mit folgender Ausnahme:
- Entitätstyp: Wählen Sie Tag aus.
- GitHub-Tagname: Geben Sie v2.0.0 ein, da Sie im nächsten Schritt Version 2 bereitstellen.
- Name: Geben Sie prod-cred ein.
Wählen Sie Hinzufügen aus.
Bereitstellen der Anwendung mit Helm
Nachdem Sie Helm konfiguriert und Zugriff auf Ihren Cluster gewährt haben, können Sie nun die Anwendung bereitstellen.
Hinzufügen des Schritts „Helm-Bereitstellung durchführen“
Wechseln Sie zurück zur Datei build-staging.yml in GitHub, und erstellen Sie nach dem letzten Schritt im
deploy
-Auftrag einen neuen Schritt namensRun Helm Deploy
. Fügen Sie darunter einen weiteren Schlüssel namensrun
hinzu.- name: Run Helm Deploy run:
Sie können mit dem
run
-Schlüssel beliebige Shellbefehle innerhalb des Containers auszuführen. Diese Pipeline verwendet den Schlüsselrun
, um den folgenden Helm-Befehl auszuführen:helm upgrade --install --create-namespace --atomic --wait --namespace staging contoso-website \ ./kubernetes/contoso-website \ --set image.repository=${{ secrets.ACR_NAME }} \ --set dns.name=${{ secrets.DNS_NAME }}
Grundlegendes zur Funktionsweise der einzelnen Parameter
Parameter Aktion oder Wert helm upgrade
Mit diesem Parameter wird ein Upgrade für ein installiertes Release durchgeführt. --install
Wenn das Release nicht vorhanden ist, wird dieses installiert. --create-namespace
Wenn der Namespace im --namespace
-Flag nicht vorhanden ist, wird er erstellt.--atomic
Wenn das Release fehlschlägt, werden alle Workloads entfernt, die installiert wurden. --wait
Wartet, bis das Release abgeschlossen ist, und gibt den Status OK
zurück.--namespace staging contoso-website
Stellt das Release contoso-website
imstaging
-Namespace bereit../kubernetes/contoso-website
Dieser Parameter gibt den Chartverzeichnispfad an. --set image.repository
Dieser Parameter aktualisiert den Wert von image.repository
in der Datei values.yamlnur für dieses Release.--set dns.name
Dieser Parameter aktualisiert den dns.name
-Schlüssel in der Datei values.yamlnur für dieses Release.Fügen Sie der Datei den Befehl hinzu, und legen Sie seine Ausführung fest, beginnend mit dem Zeichen
|
. Der SchrittRun Helm deploy
sollte mit diesem Beispiel übereinstimmen:... - name: Run Helm Deploy run: | helm upgrade \ --install \ --create-namespace \ --atomic \ --wait \ --namespace staging \ contoso-website \ ./kubernetes/contoso-website \ --set image.repository=${{ secrets.ACR_NAME }} \ --set dns.name=${{ secrets.DNS_NAME }}
Die vollständige Datei build-staging.yml sollte wie das folgende Beispiel aussehen:
name: Build and push the latest build to staging on: push: branches: [ main ] jobs: build_push_image: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Set up Buildx uses: docker/setup-buildx-action@v3.0.0 - name: Docker Login uses: docker/login-action@v3.0.0 with: registry: ${{ secrets.ACR_NAME }} username: ${{ secrets.ACR_LOGIN }} password: ${{ secrets.ACR_PASSWORD }} - name: Build and push staging images uses: docker/build-push-action@v5.0.0 with: context: . push: true tags: ${{secrets.ACR_NAME}}/contoso-website:latest deploy: runs-on: ubuntu-20.04 needs: build_push_image # Waits for the execution of the previous job permissions: id-token: write # Required for requesting the JWT contents: read # Required for actions/checkout steps: - uses: actions/checkout@v2 - name: Install Helm uses: Azure/setup-helm@v1 with: version: v3.3.1 - name: Sign in to Azure with OIDC uses: Azure/login@v1.5.1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Azure Kubernetes set context uses: Azure/aks-set-context@v3 with: resource-group: ${{ secrets.RESOURCE_GROUP }} cluster-name: ${{ secrets.CLUSTER_NAME }} - name: Run Helm Deploy run: | helm upgrade \ --install \ --create-namespace \ --atomic \ --wait \ --namespace staging \ contoso-website \ ./kubernetes/contoso-website \ --set image.repository=${{ secrets.ACR_NAME }} \ --set dns.name=${{ secrets.DNS_NAME }}
Festlegen des DNS_NAME-Geheimnisses
Wechseln Sie auf einer neuen Browserregisterkarte zu Ihrem Fork des Repositorys, und wählen Sie die Registerkarte Einstellungen und dann im linken Menü Geheimnisse und Variablen>Aktionen aus.
Wählen Sie New repository secret (Neues Repositorygeheimnis) aus.
Geben Sie unter Name
DNS_NAME
ein.Geben Sie unter Geheimnis den Wert von DNS-Zonenname für AKS aus der ursprünglichen Ausgabe des Setupskripts ein.
Wenn Sie diesen Wert nicht haben, führen Sie den folgenden Befehl in Cloud Shell aus, und ersetzen Sie die Werte für
<resource-group-name>
und<aks-cluster-name>
:az aks show -g <resource-group-name> -n <aks-cluster-name> -o tsv --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName
Klicken Sie auf Add secret (Geheimnis hinzufügen).
Committen der Änderungen und Testen der Stagingbereitstellung
Wenn Sie Ihre Änderungen committen möchten, wählen Sie Änderungen committen aus. Geben Sie eine Beschreibung für den Commit ein, und wählen Sie dann Änderungen committen aus.
Wählen Sie die Registerkarte Aktionen aus, um den ausgeführten Build anzuzeigen.
Nach erfolgreicher Buildausführung wechseln Sie in Ihrem Browser zu
contoso-staging.<aks-dns-zone-name>
, um zu überprüfen, ob die Website angezeigt wird.
Ausführen der Bereitstellung für die Produktion
Der nächste Schritt besteht darin, den Produktionsworkflow zu erstellen.
Öffnen Sie im Verzeichnis .github/workflows in Ihrem Repository die Datei build-production.yml für die Bearbeitung.
Kopieren Sie den
deploy
-Auftrag aus der Stagingpipeline, und fügen Sie ihn unter der letzten Zeile in der Datei build-production.yml ein.Ändern Sie den Schritt
Run Helm Deploy
so, dass die Bereitstellung im Produktionsnamespace durchgeführt wird. Ändern Sie dazu das Flag--namespace
vonstaging
inproduction
.Fügen Sie einen neuen Parameter,
--set image.tag=${GITHUB_REF##*/}
, am Ende des Helm-Befehls hinzu.Sie verwenden hier ein Bash-Feature namens Parameter Expansion (Parametererweiterung). Die Erweiterung
${ENV##<wildcard><character>}
gibt das letzte Vorkommen der Zeichenfolge nachcharacter
zurück.In diesem Fall möchten Sie nur den Tagnamen abrufen, der als GitHub Actions-Runtime
GITHUB_REF
dargestellt wird. Die Branches sindrefs/heads/<branch>
, während die Tagsrefs/tags/<tag>
sind.Sie möchten
refs/tags/
entfernen, um nur den Tagnamen abzurufen, also übergeben Sie${GITHUB_REF##*/}
. Dadurch wird alles nach dem letzten/
-Zeichen in der UmgebungsvariableGITHUB_REF
zurückgegeben.Die endgültige Datei build-production.yml sollte wie das folgende Beispiel aussehen:
name: Build and push the tagged build to production permissions: id-token: write # This is required for requesting the JWT contents: read # This is required for actions/checkout on: push: tags: - 'v*' jobs: build_push_image: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 - name: Fetch latest version id: fetch_version run: echo ::set-output name=TAG::${GITHUB_REF#refs/tags/} - name: Set up Buildx uses: docker/setup-buildx-action@v3.0.0 - name: Docker Login uses: docker/login-action@v3.0.0 with: registry: ${{ secrets.ACR_NAME }} username: ${{ secrets.ACR_LOGIN }} password: ${{ secrets.ACR_PASSWORD }} - name: Build and push production images uses: docker/build-push-action@v2 with: context: . push: true tags: ${{secrets.ACR_NAME}}/contoso-website:latest,${{secrets.ACR_NAME}}/contoso-website:${{ steps.fetch_version.outputs.TAG }} deploy: runs-on: ubuntu-20.04 needs: build_push_image steps: - uses: actions/checkout@v2 - name: Install Helm uses: Azure/setup-helm@v1 with: version: v3.3.1 - name: Login to Azure with OIDC uses: azure/login@v1 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }} - name: Azure Kubernetes set context uses: Azure/aks-set-context@v3 with: resource-group: ${{ secrets.RESOURCE_GROUP }} cluster-name: ${{ secrets.CLUSTER_NAME }} - name: Run Helm Deploy run: | helm upgrade \ --install \ --create-namespace \ --atomic \ --wait \ --namespace production \ contoso-website \ ./kubernetes/contoso-website \ --set image.repository=${{ secrets.ACR_NAME }} \ --set dns.name=${{ secrets.DNS_NAME }} \ --set image.tag=${GITHUB_REF##*/}
Wenn Sie Ihre Änderungen committen möchten, wählen Sie Änderungen committen aus. Geben Sie eine Beschreibung für den Commit ein, und wählen Sie dann Änderungen committen aus.
Produktionsänderungen
Jedes Mal, wenn Sie den Produktionsworkflow ausführen, müssen Sie das Verbundzertifikat mit der entsprechenden Tagversion wie folgt aktualisieren:
Navigieren Sie im Azure-Portal zur Anwendungsseite, und wählen Sie in der linken Navigationsleiste Zertifikate und Geheimnisse aus.
Wählen Sie die Registerkarte Verbundanmeldeinformationen aus.
Wählen Sie die Anmeldeinformationen für prod-cred aus.
Erhöhen Sie auf dem Bildschirm Anmeldeinformationen bearbeiten neben Auf Grundlage der Auswahl die Tagnummer auf einen neuen Wert im Format „v.x.x.x“, etwa v.2.0.1.
Wählen Sie Aktualisieren.
Führen Sie
git pull
in Cloud Shell aus, um die neuesten Änderungen abzurufen. Führen Sie dann den folgenden Befehl aus, um die Änderungen zu markieren und zu pushen, und ersetzen Sie dabei den Platzhalter durch das neue Versionstag:git tag -a v<new version tag> -m 'Create new production deployment' && git push --tags
Wenn Sie dazu aufgefordert werden, geben Sie das PAT aus vorherigen Übungen als Kennwort an.
Öffnen Sie in GitHub die Registerkarte Actions (Aktionen), um den aktiven Prozess anzusehen.
Navigieren Sie nach erfolgreicher Ausführung des Workflows in Ihrem Browser zu
contoso-production.<aks-dns-zone-name>
, um die Produktionsbereitstellung zu testen und um zu überprüfen, ob die Website angezeigt wird.
Fahren Sie mit der nächsten Lerneinheit fort, um Ihre Ressourcen zu löschen, damit keine weiteren Gebühren anfallen.