In dieser Anleitung wird beschrieben, wie Sie mit einem GitHub Actions, Workflow eine ASP.NET MVC-Webanwendung (Model-View-Controller) bereitstellen, die .NET Framework in Google Kubernetes Engine (GKE) verwendet.
Diese Anleitung richtet sich an Entwickler und DevOps-Entwickler mit grundlegenden Kenntnissen in Microsoft .NET, GitHub Actions und GKE. Außerdem benötigen Sie ein GitHub-Konto, um diese Anleitung auszuführen.
Ziele
Eine ASP.NET MVC-Webanwendung, die .NET Framework 4 verwendet und unter Windows 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.
Verwenden Sie den Preisrechner.
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 ein Konto, um die Leistung 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.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. 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.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. 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 mit GitHub Actions arbeiten.
- Rufen Sie das
dotnet-docs-samplesGitHub-Repository auf. - 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 vor, damit sich GitHub Actions authentifizieren und auf Ressourcen im Google Cloud Projekt zugreifen kann.
Workload Identity-Föderationspool und -Anbieter erstellen
Damit sich GitHub Actions authentifizieren Google Cloud und in GKE bereitstellen kann, verwenden Sie die Workload Identity-Föderation. 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 Workload Identity-Poolanbieter erforderlich. Wir empfehlen, ein dediziertes Projekt zur Verwaltung von Workload Identity-Pools und -Anbietern zu verwenden. In dieser Anleitung erstellen Sie den Pool und den Anbieter der Einfachheit halber im selben Projekt wie Ihren GKE-Cluster:
Öffnen Sie die Google Cloud Console.
-
Aktivieren Sie in der Google Cloud Console Cloud Shell.
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 Workload Identity-Poolanbieter 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 Actions per Push in Artifact Registry übertragen kann: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 „ Kubernetes Engine-Entwickler (
roles/container.developer) zu, damit GitHub Actions per Push in Artifact Registry übertragen kann:gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/container.developer
GitHub Actions-Workflow die Verwendung des Dienstkontos erlauben
Erlauben Sie dem GitHub Actions-Workflow, die Identität des Dienstkontos zu übernehmen und es zu verwenden:
Initialisieren Sie eine Umgebungsvariable, die das Subjekt enthält, das vom GitHub Actions-Workflow verwendet wird. Ein Subjekt ähnelt einem Nutzernamen, der das GitHub-Repository und die Verzweigung eindeutig identifiziert:
SUBJECT=repo:
OWNER/dotnet-docs-samples:ref:refs/heads/mainErsetzen Sie
OWNERdurch Ihren GitHub-Nutzernamen.Erteilen 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
Erlauben Sie dem Compute Engine-Standarddienstkonto den 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-windows \ --enable-ip-alias \ --zone us-central1-a gcloud container node-pools create clouddemo-windows-pool \ --cluster=clouddemo-windows \ --image-type=WINDOWS_LTSC_CONTAINERD \ --no-enable-autoupgrade \ --machine-type=n1-standard-2 \ --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 mit GitHub Actions die kontinuierliche Integration einrichten. Für jeden Commit, der an das Git-Repository gesendet wird, erstellt ein GitHub Actions-Workflow 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 außerdem 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. Google Cloud
- Erstellen Sie ein Docker-Image und stellen Sie es in Artifact Registry bereit.
- Stellen Sie das Docker-Image in GKE bereit.
So erstellen Sie den GitHub Actions-Workflow:
- Rufen Sie auf GitHub Ihren Fork des
dotnet-docs-samplesRepositorys auf. - 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-windows CLUSTER_ZONE: us-central1-a REPOSITORY: clouddemo REPOSITORY_REGION: us-central1 IMAGE: clouddemo jobs: build: runs-on: windows-2019 # Matches WINDOWS_LTSC in GKE 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: Setup MSBuild uses: microsoft/setup-msbuild@v1 - name: Setup NuGet uses: NuGet/setup-nuget@v1 - name: Restore NuGet packages run: nuget restore applications/clouddemo/net4/CloudDemo.Mvc.sln - name: Build solution run: msbuild /t:Rebuild /p:Configuration=Release /p:DeployOnBuild=true /p:PublishProfile=FolderProfile /nologo applications/clouddemo/net4/CloudDemo.Mvc.sln # # 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 }}:$env:GITHUB_SHA" >> $env:GITHUB_ENV - name: Lock image version in deployment.yaml shell: pwsh run: (Get-Content applications\clouddemo\net4\deployment.yaml) -replace "CLOUDDEMO_IMAGE","${{ env.IMAGE_TAG }}" | Out-File -Encoding ASCII applications\clouddemo\net4\deployment.yaml - name: Build Docker image run: docker build --tag "${{ env.IMAGE_TAG }}" applications/clouddemo/net4 - 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/net4/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 Actions und warten Sie, bis der Workflow abgeschlossen ist.
Die Ausführung des Workflows kann mehrere Minuten dauern.
Aktualisieren Sie in der Google Cloud Console die Seite Dienste und Ingress.
Rufen Sie den Tab Ingress auf.
Suchen Sie den Ingress-Dienst 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. Daher wird die CloudDemo-App möglicherweise nicht sofort geladen. Wenn der Load-Balancer bereit ist, sehen Sie die CloudDemo-App mit dem benutzerdefinierten Titel, die diesmal im Produktionscluster ausgeführt wird.
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.
Projekt löschen: Google Cloud
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