Este tutorial descreve como usar um fluxo de trabalho do GitHub Actions, para implantar um aplicativo da Web ASP.NET Model-View-Controller (MVC) que usa o.NET Framework no Google Kubernetes Engine (GKE).
Este tutorial é destinado a desenvolvedores e engenheiros de DevOps que têm conhecimento básico do Microsoft .NET, do GitHub Actions e do GKE. Você também precisa de uma conta do GitHub para executar este tutorial.
Objetivos
Implantar um aplicativo da Web ASP.NET MVC que usa o .NET Framework 4 e é executado no Windows em Google Kubernetes Engine.
O diagrama a seguir mostra o GitHub Actions, fluxo de trabalho para implantar um aplicativo da Web ASP.NET MVC no Google Kubernetes Engine (GKE).

Neste tutorial, mostramos como concluir as seguintes tarefas para alcançar seu objetivo:
- Crie um repositório do GitHub
- Configurar a autenticação
- Implantar um cluster do GKE e um repositório do Artifact Registry
- Criar um fluxo de trabalho do GitHub Actions
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso,
use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Para mais informações, consulte Liberar espaço.
Antes de começar
- Faça login na sua Google Cloud conta do. Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
-
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.
Crie um repositório do GitHub
Crie um fork do repositório dotnet-docs-samples na sua conta do GitHub.
Essa etapa é necessária porque estamos criando com o GitHub Actions.
- Acesse o
dotnet-docs-samplesrepositório do GitHub. - Clique em Fork.
Na página Criar um novo fork, defina o seguinte:
- Proprietário : sua conta do GitHub
- Nome do repositório -
dotnet-docs-samples
Clique em Criar fork.
Configurar a autenticação
Prepare seu Google Cloud projeto para que o GitHub Actions possa autenticar e acessar recursos nele. Google Cloud
Criar um pool e um provedor de federação de identidade da carga de trabalho
Para permitir que o GitHub Actions autentique Google Cloud e implante no GKE, use a federação de identidade da carga de trabalho. Ao usar a federação de identidade da carga de trabalho, é possível evitar a necessidade de armazenar e gerenciar chaves de conta de serviço para a carga de trabalho do GitHub Actions.
O uso da federação de identidade da carga de trabalho requer um pool e um provedor de identidade da carga de trabalho. Recomendamos que você use um projeto dedicado para gerenciar pools de identidade da carga de trabalho e de transporte público. Neste tutorial, para simplificar, crie o pool e o provedor no mesmo projeto do cluster do GKE:
Abra o Google Cloud console.
-
No Google Cloud console, ative o Cloud Shell.
Na parte inferior do Google Cloud console, uma sessão do Cloud Shell é iniciada e exibe um prompt de linha de comando. O Cloud Shell é um ambiente shell com a Google Cloud CLI já instalada e com valores já definidos para o projeto atual. A inicialização da sessão pode levar alguns segundos.
Crie um novo pool de Identidade da carga de trabalho:
gcloud iam workload-identity-pools create github-actions \ --location="global" \ --description="GitHub Actions tutorial" \ --display-name="GitHub Actions"Adicione o GitHub Actions como um provedor de pool de Identidade da carga de trabalho:
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'"Substitua
ORGANIZATIONpelo nome da sua organização do GitHub.
Criar uma conta de serviço
No Cloud Shell, crie uma conta de serviço que o GitHub Actions possa usar para publicar imagens do Docker e implantar no GKE:
SERVICE_ACCOUNT=$(gcloud iam service-accounts create github-actions-workflow \ --display-name "GitHub Actions workflow" \ --format "value(email)")
Conceda o papel de gravador do Artifact Registry (
roles/artifactregistry.writer) à conta de serviço para permitir que as ações do GitHub enviem para o Artifact Registry:gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/artifactregistry.writer
Conceda o papel de desenvolvedor do Google Kubernetes Engine (
roles/container.developer) à conta de serviço para permitir que as ações do GitHub enviem para o Artifact Registry:gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member serviceAccount:$SERVICE_ACCOUNT \ --role roles/container.developer
Permitir que o fluxo de trabalho do GitHub Actions use a conta de serviço
Permita que o fluxo de trabalho do GitHub Actions represente e use a conta de serviço:
Inicialize uma variável de ambiente que contenha o assunto usado pelo fluxo de trabalho do GitHub Actions. Um assunto é semelhante a um nome de usuário que identifica exclusivamente o repositório e a ramificação do GitHub:
SUBJECT=repo:
OWNER/dotnet-docs-samples:ref:refs/heads/mainSubstitua
OWNERpelo nome de usuário do GitHub.Conceda permissão ao assunto para representar a conta de serviço:
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"
Implantar um cluster do GKE e um repositório do Artifact Registry
Crie um repositório para imagens do Docker:
gcloud artifacts repositories create clouddemo \ --repository-format=docker \ --location=us-central1
Permita que a conta de serviço padrão do Compute Engine acesse o repositório:
gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \ --member=serviceAccount:$PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.reader
Crie o 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
Esse comando pode levar alguns minutos para ser concluído.
Consiga o nome e o número do projeto do 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\))"
Você precisará desses valores mais tarde.
Criar um fluxo de trabalho do GitHub Actions
Agora, use o GitHub Actions para configurar a integração contínua. Para cada confirmação enviada para o repositório Git, um fluxo de trabalho do GitHub Actions cria o código e empacota os artefatos de build em um contêiner do Docker. Em seguida, o contêiner é publicado no Artifact Registry.
O repositório já contém o seguinte Dockerfile:
O repositório também contém um manifesto do Kubernetes:
Crie um fluxo de trabalho do GitHub Actions que faça o seguinte:
- Autentique o Google Cloud usando a federação de identidade da carga de trabalho e a conta de serviço que você criou anteriormente.
- Crie uma imagem Docker e implante-a no Artifact Registry.
- Implante a imagem Docker no GKE.
Para criar o fluxo de trabalho do GitHub Actions, faça o seguinte:
- No GitHub, acesse seu fork do
dotnet-docs-samplesrepositório. - Clique em Adicionar arquivo > Criar novo arquivo.
No campo de texto Nomeie seu arquivo, insira o seguinte nome:
.github/workflows/deploy-gke.yaml
Copie o seguinte código no arquivo:
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.yamlSubstitua os seguintes valores:
PROJECT_ID: o ID do projeto que contém o cluster do GKE.PROJECT_NUMBER: o número do projeto que contém o cluster do GKE.
Na seção Fazer commit do novo arquivo, insira uma mensagem de commit, por exemplo,
Add workflowe clique em Fazer commit do novo arquivo.No menu, clique em Ações e aguarde a conclusão do fluxo de trabalho.
O fluxo de trabalho pode levar alguns minutos para ser concluído.
No Google Cloud console, atualize a página Serviços e entrada.
Acesse a guia Entrada.
Localize o serviço Entrada para o cluster clouddemo e aguarde até que o status dele mude para Ok. Isso pode levar alguns minutos.
Abra o link na coluna Front-ends da mesma linha. O balanceador de carga leva alguns minutos para ficar disponível, então o app CloudDemo pode não carregar no início. Quando o balanceador de carga estiver pronto, você verá o app CloudDemo com o título personalizado, desta vez em execução no cluster de produção.
Liberar espaço
Depois de concluir o tutorial, você pode limpar os recursos que criou para que eles parem de usar a cota e gerar cobranças. Nas seções a seguir, descrevemos como excluir ou desativar esses recursos.
Excluir o repositório do GitHub
Para excluir o repositório do GitHub, consulte Excluir um repositório. A exclusão do repositório faz com que todas as alterações no código-fonte sejam perdidas.
Excluir o projeto
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para este tutorial.
Excluir um Google Cloud projeto do:
gcloud projects delete PROJECT_ID
A seguir
- Implante, gerencie e escalone aplicativos em contêineres no Kubernetes.
- Analise as práticas recomendadas no Google Cloud Well-Architected Framework.
- Confira arquiteturas de referência, diagramas, tutoriais e práticas recomendadas do Google Cloud. Confira o Centro de arquitetura do Cloud.