In dieser Anleitung wird beschrieben, wie Sie einen GitHub Actions-Workflow verwenden, um eine ASP.NET Model-View-Controller (MVC)-Webanwendung mithilfe von .NET in Google Kubernetes Engine (GKE) bereitzustellen.
Diese Anleitung richtet sich an Entwickler und DevOps-Entwickler, die Grundkenntnisse zu Microsoft .NET, GitHub Actions und GKE haben. Sie benötigen außerdem ein GitHub-Konto, um diese Anleitung auszuführen.
Lernziele
ASP.NET Core-Webanwendung mit .NET 6.0 bereitstellen, die unter Linux in der Google Kubernetes Engine ausgeführt wird
Das folgende Diagramm zeigt den GitHub-Aktionen-Workflow zum Bereitstellen einer ASP.NET MVC-Webanwendung in Google Kubernetes Engine (GKE).
In dieser Anleitung erfahren Sie, wie Sie die folgenden Aufgaben ausführen, um Ihr Ziel zu erreichen:
- GitHub-Repository erstellen
- Authentifizierung konfigurieren
- GKE-Cluster und Artifact Registry-Repository bereitstellen
- GitHub Actions-Workflow erstellen
Kosten
In diesem Dokument verwenden Sie die folgenden kostenpflichtigen Komponenten von Google Cloud:
Mit dem Preisrechner können Sie eine Kostenschätzung für Ihre voraussichtliche Nutzung vornehmen.
Nach Abschluss der in diesem Dokument beschriebenen Aufgaben können Sie weitere Kosten vermeiden, indem Sie die erstellten Ressourcen löschen. Weitere Informationen finden Sie unter Bereinigen.
Hinweis
- Melden Sie sich bei Ihrem Google Cloud-Konto an. Wenn Sie mit Google Cloud noch nicht vertraut sind, erstellen Sie ein Konto, um die Leistungsfähigkeit unserer Produkte in der Praxis sehen und bewerten zu können. Neukunden erhalten außerdem ein Guthaben von 300 $, um Arbeitslasten auszuführen, zu testen und bereitzustellen.
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Artifact Registry and Google Kubernetes Engine APIs aktivieren.
-
Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.
-
Die Abrechnung für das Google Cloud-Projekt muss aktiviert sein.
-
Artifact Registry and Google Kubernetes Engine APIs aktivieren.
GitHub-Repository erstellen
Erstellen Sie einen Fork des Repositorys dotnet-docs-samples
in Ihrem GitHub-Konto.
Dieser Schritt ist erforderlich, da wir mit GitHub Actions erstellen.
- Rufen Sie das GitHub-Repository
dotnet-docs-samples
auf. - Klicken Sie auf Fork.
Legen Sie auf der Seite Fork erstellen Folgendes fest:
- Inhaber: Ihr GitHub-Konto
- Repository-Name:
dotnet-docs-samples
Klicken Sie auf Fork erstellen.
Authentifizierung konfigurieren
Bereiten Sie Ihr Google Cloud-Projekt so vor, dass GitHub Actions Ressourcen im Google Cloud-Projekt authentifizieren und darauf zugreifen können.
Föderationspool und Anbieter von Workload Identity erstellen
Verwenden Sie die Arbeitslast-Identitätsföderation, um GitHub-Aktionen zu authentifizieren und Google Cloud in GKE bereitzustellen. Mit der Workload Identity-Föderation können Sie vermeiden, dass Dienstkontoschlüssel für Ihre GitHub Actions-Arbeitslast gespeichert und verwaltet werden müssen.
Für die Verwendung der Workload Identity-Föderation sind ein Workload Identity-Pool und ein Anbieter erforderlich. Wir empfehlen, ein dediziertes Projekt zum Verwalten von Workload Identity-Pools und -Anbietern zu verwenden. In dieser Anleitung erstellen wir der Einfachheit halber den Pool und den Anbieter im selben Projekt wie der GKE-Cluster:
Öffnen Sie die Google Cloud Console.
-
Aktivieren Sie Cloud Shell in der Google Cloud Console.
Unten in der Google Cloud Console wird eine Cloud Shell-Sitzung gestartet und eine Eingabeaufforderung angezeigt. Cloud Shell ist eine Shell-Umgebung, in der das Google Cloud CLI bereits installiert ist und Werte für Ihr aktuelles Projekt bereits festgelegt sind. Das Initialisieren der Sitzung kann einige Sekunden dauern.
Erstellen Sie einen neuen Workload Identity-Pool:
gcloud iam workload-identity-pools create github-actions \ --location="global" \ --description="GitHub Actions tutorial" \ --display-name="GitHub Actions"
Fügen Sie GitHub Actions als Anbieter von Workload Identity-Pools hinzu:
gcloud iam workload-identity-pools providers create-oidc github-actions-oidc \ --location="global" \ --workload-identity-pool=github-actions \ --issuer-uri="https://token.actions.githubusercontent.com/" \ --attribute-mapping="google.subject=assertion.sub"
Dienstkonto erstellen
Erstellen Sie in Cloud Shell ein Dienstkonto, mit dem GitHub Actions Docker-Images veröffentlichen und in GKE bereitstellen kann:
SERVICE_ACCOUNT=$(gcloud iam service-accounts create github-actions-workflow \ --display-name "GitHub Actions workflow" \ --format "value(email)")
Gewähren Sie dem Dienstkonto die Rolle „Artifact Registry-Autor“ (
roles/artifactregistry.writer
), damit GitHub-Aktionen in Artifact Registry übertragen werden können.gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/artifactregistry.writer
Weisen Sie dem Dienstkonto die Rolle „Google Kubernetes Engine-Entwickler“ (
roles/container.developer
) zu, damit GitHub-Aktionen an Artifact Registry übertragen werden können.gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/container.developer
Dem GitHub Actions-Workflow erlauben, das Dienstkonto zu verwenden
Erlauben Sie dem GitHub Actions-Workflow, die Identität des Dienstkontos zu übernehmen und das Dienstkonto zu verwenden:
Initialisieren Sie eine Umgebungsvariable, die das Thema enthält, das vom GitHub Actions-Workflow verwendet wird. Ein Betreff ähnelt einem Nutzernamen, der das GitHub-Repository und den Zweig eindeutig identifiziert:
SUBJECT=repo:
OWNER
/dotnet-docs-samples:ref:refs/heads/mainErsetzen Sie
OWNER
durch Ihren GitHub-Nutzernamen.Gewähren Sie dem Inhaber die Berechtigung, die Identität des Dienstkontos zu übernehmen:
PROJECT_NUMBER=$(gcloud projects describe $(gcloud config get-value core/project) --format='value(projectNumber)') gcloud iam service-accounts add-iam-policy-binding $SERVICE_ACCOUNT \ --role=roles/iam.workloadIdentityUser \ --member="principal://iam.googleapis.com/projects/$PROJECT_NUMBER/locations/global/workloadIdentityPools/github-actions/subject/$SUBJECT"
GKE-Cluster und Artifact Registry-Repository bereitstellen
Erstellen Sie ein Repository für Docker-Images:
gcloud artifacts repositories create clouddemo \ --repository-format=docker \ --location=us-central1
Gewähren Sie dem Compute Engine-Standarddienstkonto Zugriff auf das Repository:
gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.reader
Erstellen Sie den Cluster:
gcloud container clusters create clouddemo-linux \ --enable-ip-alias \ --zone us-central1-a
Die Ausführung dieses Befehls kann mehrere Minuten dauern.
Rufen Sie den Projektnamen und die Projektnummer des Clusters ab:
echo "Project ID: $(gcloud config get-value core/project)" echo "Project Number: $(gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\))"
Sie benötigen diese Werte später.
GitHub Actions-Workflow erstellen
Sie können jetzt GitHub-Aktionen verwenden, um die Continuous Integration einzurichten. Für jeden Commit, der an das Git-Repository gesendet wird, erstellt ein GitHub-Aktionsworkflow den Code und verpackt die Build-Artefakte in einen Docker-Container. Der Container wird dann in Artifact Registry veröffentlicht.
Das Repository enthält bereits das folgende Dockerfile:
Das Repository enthält auch ein Kubernetes-Manifest:
Erstellen Sie einen GitHub Actions-Workflow, der Folgendes ausführt:
- Authentifizieren Sie sich mit der Workload Identity-Föderation und dem zuvor erstellten Dienstkonto bei Google Cloud.
- Docker-Image erstellen und in Artifact Registry bereitstellen
- das Docker-Image in GKE bereitstellen
So erstellen Sie den GitHub Actions-Workflow:
- Wechseln Sie auf GitHub zu der Verzweigung des Repositorys
dotnet-docs-samples
. - Klicken Sie auf Datei hinzufügen > Neue Datei erstellen.
Geben Sie im Textfeld Datei benennen den folgenden Namen ein:
.github/workflows/deploy-gke.yaml
Kopieren Sie den folgenden Code in die Datei:
name: Build and Deploy to GKE on: push: branches: - main env: PROJECT_ID:
PROJECT_ID
PROJECT_NUMBER:PROJECT_NUMBER
CLUSTER: clouddemo-linux CLUSTER_ZONE: us-central1-a REPOSITORY: clouddemo REPOSITORY_REGION: us-central1 IMAGE: clouddemo jobs: build: runs-on: ubuntu-latest permissions: id-token: write contents: read steps: - name: Checkout uses: actions/checkout@v3 # # Authenticate to Google Cloud using workload identity federation # - id: 'auth' name: 'Obtain access token by using workload identity federation' uses: 'google-github-actions/auth@v0' with: create_credentials_file: true token_format: access_token workload_identity_provider: projects/${{ env.PROJECT_NUMBER }}/locations/global/workloadIdentityPools/github-actions/providers/github-actions-oidc service_account: github-actions-workflow@${{ env.PROJECT_ID }}.iam.gserviceaccount.com - name: Connect to Artifact Registry run: |- echo ${{ steps.auth.outputs.access_token }} | docker login -u oauth2accesstoken --password-stdin https://${{ env.REPOSITORY_REGION }}-docker.pkg.dev - name: Connect to GKE uses: google-github-actions/get-gke-credentials@v0 with: cluster_name: ${{ env.CLUSTER }} location: ${{ env.CLUSTER_ZONE }} # # Build the .NET code # - name: Build solution run: |- dotnet publish applications/clouddemo/netcore/CloudDemo.MvcCore.sln \ --configuration Release \ --framework net6.0 # # Build the Docker image and push it to Artifact Registry # - name: Create image tag run: echo "IMAGE_TAG=${{ env.REPOSITORY_REGION }}-docker.pkg.dev/${{ env.PROJECT_ID }}/${{ env.REPOSITORY }}/${{ env.IMAGE }}:$GITHUB_SHA" >> $GITHUB_ENV - name: Lock image version in deployment.yaml run: sed -i 's|CLOUDDEMO_IMAGE|${{ env.IMAGE_TAG }}|g' applications/clouddemo/netcore/deployment.yaml - name: Build Docker image run: docker build --tag "${{ env.IMAGE_TAG }}" applications/clouddemo/netcore - name: Publish Docker image to Google Artifact Registry run: docker push "${{ env.IMAGE_TAG }}" # # Deploy to GKE # - name: Deploy to GKE run: kubectl apply -f applications/clouddemo/netcore/deployment.yamlErsetzen Sie die folgenden Werte:
PROJECT_ID
: die Projekt-ID des Projekts, das den GKE-Cluster enthält.PROJECT_NUMBER
: die Projektnummer des Projekts, das den GKE-Cluster enthält.
Geben Sie im Abschnitt Commit für neue Datei eine Commit-Nachricht ein, z. B.
Add workflow
, und klicken Sie auf Commit für neue Datei.Klicken Sie im Menü auf Aktionen und warten Sie, bis der Workflow abgeschlossen ist.
Der Workflow kann einige Minuten dauern.
Aktualisieren Sie in der Google Cloud Console die Seite Dienste und eingehenden Traffic.
Rufen Sie den Tab Ingress auf.
Suchen Sie den Dienst für eingehenden Traffic für den Cluster clouddemo und warten Sie, bis sein Status zu OK wechselt. Dieser Vorgang kann einige Minuten dauern.
Öffnen Sie den Link in der Spalte Frontends derselben Zeile. Es dauert einige Minuten, bis der Load-Balancer verfügbar ist. Die CloudDemo-Anwendung wird daher möglicherweise zuerst nicht geladen. Wenn der Load-Balancer bereit ist, sehen Sie die CloudDemo-App mit dem benutzerdefinierten Titel, diesmal im Produktionscluster.
Bereinigen
Nachdem Sie die Anleitung abgeschlossen haben, können Sie die erstellten Ressourcen bereinigen, damit sie keine Kontingente mehr nutzen und keine Gebühren mehr anfallen. In den folgenden Abschnitten erfahren Sie, wie Sie diese Ressourcen löschen oder deaktivieren.
GitHub-Repository löschen
Informationen zum Löschen des GitHub-Repositorys finden Sie unter Repository löschen. Wenn Sie das Repository löschen, gehen alle Quellcodeänderungen verloren.
Projekt löschen
Am einfachsten vermeiden Sie weitere Kosten, wenn Sie das zum Ausführen der Anleitung erstellte Projekt löschen.
Google Cloud-Projekt löschen:
gcloud projects delete PROJECT_ID
Nächste Schritte
- Containeranwendungen in Kubernetes bereitstellen, verwalten und skalieren
- Sehen Sie sich die Best Practices im Google Cloud-Architektur-Framework an.
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center