Questo tutorial descrive come utilizzare un flusso di lavoro di GitHub Actions, per eseguire il deployment di un'applicazione web ASP.NET Model-View-Controller (MVC) che utilizza .NET Framework in Google Kubernetes Engine (GKE).
Questo tutorial è destinato a sviluppatori e ingegneri DevOps che hanno una conoscenza di base di Microsoft .NET, GitHub Actions e GKE. Per eseguire questo tutorial è necessario anche un account GitHub.
Obiettivi
Esegui il deployment di un'applicazione web ASP.NET MVC che utilizza .NET Framework 4 ed è in esecuzione su Windows in Google Kubernetes Engine.
Il seguente diagramma mostra il flusso di lavoro di GitHub Actions per eseguire il deployment di un'applicazione web ASP.NET MVC in Google Kubernetes Engine (GKE).

Questo tutorial mostra come completare le seguenti attività per raggiungere il tuo obiettivo:
- Crea un repository GitHub
- Configura l'autenticazione
- Esegui il deployment di un cluster GKE e di un repository Artifact Registry
- Crea un flusso di lavoro di GitHub Actions
Costi
In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:
Per generare una stima dei costi in base all'utilizzo previsto,
utilizza il calcolatore prezzi.
Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Liberare spazio.
Prima di iniziare
- Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
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.
Crea un repository GitHub
Crea un fork del repository dotnet-docs-samples nel tuo account GitHub.
Questo passaggio è necessario perché stiamo creando con GitHub Actions.
- Vai al
dotnet-docs-samplesrepository GitHub. - Fai clic su Fork.
Nella pagina Crea un nuovo fork, imposta quanto segue:
- Proprietario : il tuo account GitHub
- Nome repository -
dotnet-docs-samples
Fai clic su Crea fork.
Configura l'autenticazione
Preparail tuo Google Cloud progetto in modo che GitHub Actions possa autenticare e accedere alle risorse nel Google Cloud progetto.
Crea un pool e un provider di federazione delle identità per i carichi di lavoro
Per consentire a GitHub Actions di autenticare Google Cloud ed eseguire il deployment in GKE, utilizza la federazione delle identità per i workload. Utilizzando la federazione delle identità per i workload, puoi evitare di dover archiviare e gestire le chiavi degli account di servizio per il tuo workload di GitHub Actions.
L'utilizzo della federazione delle identità per i workload richiede un pool di identità del workload e un provider. Ti consigliamo di utilizzare un progetto dedicato per gestire i pool e i provider di identità per i carichi di lavoro. In questo tutorial, per semplicità, crea il pool e il provider nello stesso progetto del cluster GKE:
Apri la Google Cloud console.
-
Nella Google Cloud console, attiva Cloud Shell.
Nella parte inferiore della Google Cloud console viene avviata una sessione di Cloud Shell e viene visualizzato un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già inclusa e installata e con valori già impostati per il progetto corrente. L'inizializzazione della sessione può richiedere alcuni secondi.
Crea un nuovo pool di identità del workload:
gcloud iam workload-identity-pools create github-actions \ --location="global" \ --description="GitHub Actions tutorial" \ --display-name="GitHub Actions"Aggiungi GitHub Actions come provider di pool di identità del workload:
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'"Sostituisci
ORGANIZATIONcon il nome della tua organizzazione GitHub.
Crea un account di servizio
In Cloud Shell, crea un account di servizio che GitHub Actions può utilizzare per pubblicare immagini Docker ed eseguire il deployment in GKE:
SERVICE_ACCOUNT=$(gcloud iam service-accounts create github-actions-workflow \ --display-name "GitHub Actions workflow" \ --format "value(email)")
Concedi il ruolo Writer di Artifact Registry (
roles/artifactregistry.writer) all'account di servizio per consentire a GitHub Actions di eseguire il push in Artifact Registry:gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/artifactregistry.writer
Concedi il ruolo Sviluppatore Google Kubernetes Engine (
roles/container.developer) all'account di servizio per consentire a GitHub Actions di eseguire il push in Artifact Registry:gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/container.developer
Consenti al flusso di lavoro di GitHub Actions di utilizzare l'account di servizio
Consenti al flusso di lavoro di GitHub Actions di simulare l'identità e utilizzare l'account di servizio:
Inizializza una variabile di ambiente che contiene il soggetto utilizzato dal flusso di lavoro di GitHub Actions. Un soggetto è simile a un nome utente che identifica in modo univoco il repository e il ramo GitHub:
SUBJECT=repo:
OWNER/dotnet-docs-samples:ref:refs/heads/mainSostituisci
OWNERcon il tuo nome utente GitHub.Concedi al soggetto l'autorizzazione a simulare l'identità dell'account di servizio:
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"
Esegui il deployment di un cluster GKE e di un repository Artifact Registry
Crea un repository per le immagini Docker:
gcloud artifacts repositories create clouddemo \ --repository-format=docker \ --location=us-central1
Consenti all'account di servizio predefinito Compute Engine di accedere al 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
Crea il 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
Il completamento di questo comando potrebbe richiedere diversi minuti.
Recupera il nome e il numero del progetto del cluster:
echo "Project ID: $(gcloud config get-value core/project)" echo "Project Number: $(gcloud projects describe $(gcloud config get-value core/project) --format=value\(projectNumber\))"
Avrai bisogno di questi valori in un secondo momento.
Crea un flusso di lavoro di GitHub Actions
Ora puoi utilizzare GitHub Actions per configurare l'integrazione continua. Per ogni commit di cui viene eseguito il push nel repository Git, un flusso di lavoro di GitHub Actions crea il codice e impacchetta gli artefatti di build in un container Docker. Il container viene quindi pubblicato in Artifact Registry.
Il repository contiene già il seguente Dockerfile:
Il repository contiene anche un manifest Kubernetes:
Crea un flusso di lavoro di GitHub Actions che:
- Autentica utilizzando la federazione delle identità per i workload e l'account di servizio che hai creato in precedenza. Google Cloud
- Crea un'immagine Docker ed eseguine il deployment in Artifact Registry.
- Esegui il deployment dell'immagine Docker in GKE.
Per creare il flusso di lavoro di GitHub Actions, procedi come segue:
- Su GitHub, vai al fork del
dotnet-docs-samplesrepository. - Fai clic su Aggiungi file > Crea nuovo file.
Nel campo di testo Assegna un nome al file, inserisci il seguente nome:
.github/workflows/deploy-gke.yaml
Incolla il seguente codice nel file:
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.yamlSostituisci i seguenti valori:
PROJECT_ID: l'ID progetto del progetto che contiene il cluster GKE.PROJECT_NUMBER: il numero del progetto che contiene il cluster GKE.
Nella sezione Esegui il commit del nuovo file , inserisci un messaggio di commit, ad esempio
Add workflowe fai clic su Esegui il commit del nuovo file.Nel menu, fai clic su Azioni e attendi il completamento del workflow.
Il completamento del workflow potrebbe richiedere diversi minuti.
Nella Google Cloud console, aggiorna la pagina Servizi e Ingress.
Vai alla scheda Ingress.
Individua il servizio Ingress per il cluster clouddemo e attendi che il suo stato passi a Ok. Questa operazione potrebbe richiedere diversi minuti.
Apri il link nella colonna Frontend della stessa riga. Il bilanciatore del carico impiega alcuni minuti per diventare disponibile, quindi l'app CloudDemo potrebbe non essere caricata all'inizio. Quando il bilanciatore del carico è pronto, vedrai l'app CloudDemo con il titolo personalizzato, questa volta in esecuzione nel cluster di produzione.
Libera spazio
Al termine del tutorial, puoi eliminare le risorse che hai creato in modo che non utilizzino più la quota generando addebiti. Le seguenti sezioni descrivono come eliminare o disattivare queste risorse.
Elimina il repository GitHub
Per eliminare il repository GitHub, consulta Eliminare un repository. L'eliminazione del repository comporta la perdita di tutte le modifiche del codice sorgente.
Elimina il progetto
Il modo più semplice per eliminare la fatturazione è quello di eliminare il progetto creato per il tutorial.
Elimina un Google Cloud progetto:
gcloud projects delete PROJECT_ID
Passaggi successivi
- Esegui il deployment, gestisci e scala le applicazioni containerizzate su Kubernetes.
- Consulta le best practice nel Google Cloud Well-Architected Framework.
- Esplora architetture, diagrammi e best practice di riferimento su Google Cloud. Consulta il nostro Cloud Architecture Center.