In dieser Anleitung wird beschrieben, wie Sie mit einem GitHub Actions-Workflow eine ASP.NET-MVC-Webanwendung (Model-View-Controller) bereitstellen, die .NET für Google Kubernetes Engine (GKE) verwendet.
Diese Anleitung richtet sich an Entwickler und DevOps-Entwickler, die über Grundkenntnisse zu Microsoft .NET, GitHub Actions und GKE verfügen. Außerdem benötigen Sie ein GitHub-Konto, um dieses Tutorial auszuführen.
Ziele
Eine ASP.NET Core-Webanwendung, die .NET 6.0 verwendet und unter Linux ausgeführt wird, in Google Kubernetes Engine bereitstellen.
Das folgende Diagramm zeigt den GitHub Actions-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 in Ihrem Google Cloud -Konto an. Wenn Sie mit Google Cloudnoch nicht vertraut sind, erstellen Sie einfach 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry and Google Kubernetes Engine APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
Enable the Artifact Registry and Google Kubernetes Engine APIs, if any are not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
GitHub-Repository erstellen
Erstellen Sie einen Fork des Repositorys dotnet-docs-samples in Ihrem GitHub-Konto.
Dieser Schritt ist erforderlich, da wir GitHub Actions verwenden.
- Rufen Sie das GitHub-Repository
dotnet-docs-samplesauf. - Klicken Sie auf Fork.
Legen Sie auf der Seite Neuen 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 sich authentifizieren und auf Ressourcen im Google Cloud -Projekt zugreifen kann.
Workload Identity-Föderationspool und -Anbieter erstellen
Damit sich GitHub Actions bei Google Cloud authentifizieren und in GKE bereitstellen kann, verwenden Sie die Identitätsföderation von Arbeitslasten. Mithilfe 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. Der Einfachheit halber erstellen Sie in dieser Anleitung den Pool und den Anbieter im selben Projekt wie Ihren GKE-Cluster:
Öffnen Sie die Google Cloud -Konsole.
-
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" \ --attribute-condition="assertion.repository_owner=='ORGANIZATION'"Ersetzen Sie
ORGANIZATIONdurch den Namen Ihrer GitHub-Organisation.
Dienstkonto erstellen
Erstellen Sie in Cloud Shell ein Dienstkonto, das von GitHub Actions zum Veröffentlichen von Docker-Images und zum Bereitstellen in GKE verwendet werden kann:
SERVICE_ACCOUNT=$(gcloud iam service-accounts create github-actions-workflow \ --display-name "GitHub Actions workflow" \ --format "value(email)")
Weisen Sie dem Dienstkonto die Rolle „Artifact Registry-Autor“ (
roles/artifactregistry.writer) zu, damit GitHub-Aktionen in Artifact Registry hochladen 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 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/container.developer
GitHub Actions-Workflow erlauben, das Dienstkonto zu verwenden
Dem GitHub Actions-Workflow erlauben, die Identität des Dienstkontos zu übernehmen und es zu verwenden:
Initialisieren Sie eine Umgebungsvariable, die das vom GitHub Actions-Workflow verwendete Subjekt enthält. Ein Subjekt ähnelt einem Nutzernamen, der das GitHub-Repository und den Branch eindeutig identifiziert:
SUBJECT=repo:
OWNER/dotnet-docs-samples:ref:refs/heads/mainErsetzen Sie
OWNERdurch Ihren GitHub-Nutzernamen.Gewähren Sie dem Subjekt 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 Actions verwenden, um Continuous Integration einzurichten. Für jeden Commit, der in das Git-Repository übertragen wird, erstellt ein GitHub Actions-Workflow den Code und packt 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 außerdem ein Kubernetes-Manifest:
Erstellen Sie einen GitHub Actions-Workflow, der Folgendes ausführt:
- Authentifizieren Sie sich bei Google Cloud mithilfe der Workload Identity-Föderation und des Dienstkontos, das Sie zuvor erstellt haben.
- Docker-Image erstellen und in Artifact Registry bereitstellen
- Stellen Sie das Docker-Image in GKE bereit.
So erstellen Sie den GitHub Actions-Workflow:
- Rufen Sie auf GitHub Ihren Fork des Repositorys
dotnet-docs-samplesauf. - 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_IDPROJECT_NUMBER:PROJECT_NUMBERCLUSTER: 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 Bereich Neue Datei committen eine Commit-Nachricht ein, z. B.
Add workflow, und klicken Sie auf Neue Datei committen.Klicken Sie im Menü auf Aktionen und warten Sie, bis der Workflow abgeschlossen ist.
Es kann einige Minuten dauern, bis der Workflow abgeschlossen ist.
Aktualisieren Sie in der Google Cloud Console die Seite Dienste und Ingress.
Rufen Sie den Tab Eingang auf.
Suchen Sie den Dienst für eingehenden Traffic für den Cluster clouddemo und warten Sie, bis der Status zu OK wechselt. Dieser Vorgang kann einige Minuten dauern.
Öffnen Sie den Link in der Spalte Frontends derselben Zeile. Es kann einige Minuten dauern, bis der Load-Balancer verfügbar ist. Die CloudDemo-App wird daher möglicherweise nicht sofort geladen. Wenn der Load Balancer bereit ist, wird die CloudDemo-App mit dem benutzerdefinierten Titel angezeigt. Sie wird diesmal im Produktionscluster ausgeführt.
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 Änderungen am Quellcode 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 Well-Architected Framework an.
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center