Implante o app ASP.NET Core no Kubernetes no Google Kubernetes Engine

1. Visão geral

O ASP.NET Core é um novo framework de código aberto e multiplataforma para criação de aplicativos modernos baseados em nuvem e conectados à Internet usando a linguagem de programação C#.

O Kubernetes é um projeto de código aberto que pode ser executado em diversos ambientes, de laptops a clusters com vários nós de alta disponibilidade, de nuvens públicas a implantações locais e de máquinas virtuais a bare metal.

Neste laboratório, você implantará um aplicativo simples do ASP.NET Core no Kubernetes em execução no Kubernetes Engine. Este codelab tem como base o Criar e iniciar o app ASP.NET Core no Google Cloud Shell. É recomendável fazer isso antes de começar este.

O objetivo deste codelab é transformar seu código (um simples app Hello World ASP.NET Core) em um aplicativo replicado executado no Kubernetes. Você pega o código que desenvolveu em sua máquina, o transforma em uma imagem de contêiner do Docker e, em seguida, executa essa imagem no Google Kubernetes Engine.

Veja um diagrama das várias partes deste codelab para ajudar você a entender como as peças se encaixam. Use-o como referência ao longo do codelab. tudo deverá fazer sentido quando você chegar ao fim (mas sinta-se à vontade para ignorar isso por enquanto).

7dbdc973aceef1af.jpeg

Para os fins deste codelab, o uso de um ambiente gerenciado como o Kubernetes Engine (uma versão hospedada pelo Google do Kubernetes em execução no Compute Engine) permite que você se concentre mais em testar o Kubernetes, em vez de configurar a infraestrutura subjacente.

Se você estiver interessado em executar o Kubernetes no computador, como um laptop de desenvolvimento, conheça o Minikube. Ele oferece uma configuração simples de um cluster do Kubernetes de nó único para desenvolvimento e teste. Se quiser, use o Minikube para fazer este codelab.

O que você vai aprender

  • Como empacotar um aplicativo simples do ASP.NET Core como um contêiner do Docker
  • Como criar um cluster do Kubernetes no Google Kubernetes Engine (GKE).
  • Como implantar o aplicativo do ASP.NET Core em um pod
  • Como permitir tráfego externo no pod
  • Como escalonar verticalmente o serviço e fazer um upgrade
  • Como executar o painel gráfico do Kubernetes

O que é necessário

Como você usará este tutorial?

Apenas leitura Leitura e exercícios

Como você classificaria sua experiência com o Google Cloud Platform?

Iniciante Intermediário Proficiente

2. Configuração e requisitos

Configuração de ambiente autoguiada

  1. Faça login no Console do Google Cloud e crie um novo projeto ou reutilize um existente. Crie uma conta do Gmail ou do Google Workspace, se ainda não tiver uma.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • O Nome do projeto é o nome de exibição para os participantes do projeto. É uma string de caracteres não usada pelas APIs do Google Você pode atualizar a qualquer momento.
  • O ID do projeto precisa ser exclusivo em todos os projetos do Google Cloud e não pode ser alterado após a definição. O console do Cloud gera automaticamente uma string exclusiva. normalmente você não se importa com o que seja. Na maioria dos codelabs, é necessário fazer referência ao ID do projeto, que normalmente é identificado como PROJECT_ID. Se você não gostar do ID gerado, poderá gerar outro ID aleatório. Como alternativa, você pode tentar o seu próprio e ver se ele está disponível. Ela não pode ser alterada após essa etapa e permanecerá durante a duração do projeto.
  • Para sua informação, há um terceiro valor, um Número de projeto, que algumas APIs usam. Saiba mais sobre esses três valores na documentação.
  1. Em seguida, ative o faturamento no console do Cloud para usar os recursos/APIs do Cloud. A execução deste codelab não será muito cara, se tiver algum custo. Para encerrar os recursos e não gerar faturamento além deste tutorial, exclua os recursos criados ou exclua o projeto inteiro. Novos usuários do Google Cloud estão qualificados para o programa de US$ 300 de avaliação sem custos.

Inicie o Cloud Shell

Embora o Google Cloud e o Spanner possam ser operados remotamente do seu laptop, neste codelab usaremos o Google Cloud Shell, um ambiente de linha de comando executado no Cloud.

Ativar o Cloud Shell

  1. No Console do Cloud, clique em Ativar o Cloud Shell853e55310c205094.png.

55efc1aaa7a4d3ad.png

Se você nunca iniciou o Cloud Shell antes, uma tela intermediária (abaixo da dobra) será exibida com a descrição dele. Se esse for o caso, clique em Continuar (e você não verá mais esse aviso). Esta é a aparência dessa tela única:

9c92662c6a846a5c.png

Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell.

9f0e51b578fecce5.png

Essa máquina virtual tem todas as ferramentas de desenvolvimento necessárias. Ela oferece um diretório principal persistente de 5 GB, além de ser executada no Google Cloud. Isso aprimora o desempenho e a autenticação da rede. Praticamente todo o seu trabalho neste codelab pode ser feito em um navegador ou no seu Chromebook.

Depois de se conectar ao Cloud Shell, você já estará autenticado e o projeto já estará configurado com seu ID do projeto.

  1. Execute o seguinte comando no Cloud Shell para confirmar que você está autenticado:
gcloud auth list

Resposta ao comando

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Execute o seguinte comando no Cloud Shell para confirmar que o comando gcloud sabe sobre seu projeto:
gcloud config list project

Resposta ao comando

[core]
project = <PROJECT_ID>

Se o projeto não estiver configurado, configure-o usando este comando:

gcloud config set project <PROJECT_ID>

Resposta ao comando

Updated property [core/project].

3. Crie um aplicativo do ASP.NET Core no Cloud Shell

No prompt do Cloud Shell, verifique a versão da ferramenta de linha de comando dotnet para confirmar se ela já está instalada. Isso deve imprimir a versão da ferramenta de linha de comando dotnet instalada:

dotnet --version

Em seguida, crie uma nova estrutura para o app da Web ASP.NET Core.

dotnet new mvc -o HelloWorldAspNetCore

Esse comando cria um projeto e restaura as dependências dele. Você verá uma mensagem semelhante ao exemplo abaixo.

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

4. Execute o aplicativo do ASP.NET Core

Estamos quase prontos para executar o app. Navegue até a pasta do app.

cd HelloWorldAspNetCore

Por fim, execute o app.

dotnet run --urls=http://localhost:8080

O aplicativo começará a ouvir na porta 8080.

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

Para verificar se o app está em execução, clique no botão de visualização da Web, no canto superior direito, e selecione "Visualizar na porta 8080".

Capture.PNG

Você verá a página da Web padrão do ASP.NET Core:

f42271880ce4d572.png

Depois de verificar se o app está em execução, pressione Ctrl+C para encerrá-lo.

5. Empacote o aplicativo do ASP.NET Core como um contêiner do Docker

Em seguida, prepare o app para ser executado como um contêiner. O primeiro passo é definir o contêiner e o conteúdo dele.

No diretório base do app, crie um Dockerfile para definir a imagem Docker.

touch Dockerfile

Adicione o código a seguir a Dockerfile usando seu editor favorito (vim, nano,emacs ou o editor de código do Cloud Shell).

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine-amd64 AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Make sure the app binds to port 8080
ENV ASPNETCORE_URLS http://*:8080

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]

Uma importante configuração incluída no seu Dockerfile é a porta em que o aplicativo escuta o tráfego de entrada (8080). Isso é feito configurando a variável de ambiente ASPNETCORE_URLS, que os aplicativos do ASP.NET Core usam para determinar qual porta detectar.

Salvar esta Dockerfile. Agora, vamos criar a imagem:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .

Depois que o processo for concluído (o download e a extração levar um tempo), você vai perceber que a imagem foi criada e salva localmente:

docker images

REPOSITORY                             TAG   
gcr.io/yourproject-XXXX/hello-dotnet   v1            

Teste a imagem localmente com o seguinte comando, que vai executar um contêiner do Docker localmente na porta 8080 usando a imagem de contêiner recém-criada:

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

E mais uma vez, aproveite o recurso de visualização da Web do Cloud Shell :

Captura de tela de 2015-11-03 17:20:22.png

A página da Web padrão do ASP.NET Core vai aparecer em uma nova guia.

f42271880ce4d572.png

Depois de verificar se o app está funcionando bem localmente em um contêiner do Docker, interrompa o contêiner em execução usando Ctrl-> C.

Agora que a imagem funciona como esperado, envie-a para o Google Container Registry. Ele é um repositório privado para imagens do Docker que todos os projetos do Google Cloud podem acessar, além de estar disponível também fora do Google Cloud Platform.

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

Se tudo correr bem e depois de um tempo, você verá a imagem do contêiner listada na seção do Container Registry. Agora, você tem uma imagem Docker para todo o projeto disponível que o Kubernetes pode acessar e orquestrar, como você verá em alguns minutos.

576374602b52f4e4.png

Se quiser, navegue pelas imagens de contêiner armazenadas no Google Cloud Storage neste link: https://console.cloud.google.com/storage/browser/ (o link resultante completo deve estar neste formato: https://console.cloud.google.com/project/PROJECT_ID/storage/browser/).

6. criar o cluster do Kubernetes.

Agora você já pode criar o cluster do GKE, mas, antes disso, acesse a seção "Google Kubernetes Engine" no console da Web e aguarde a inicialização do sistema. Leva só alguns segundos.

d5f6e3c267feea1a.png

Um cluster consiste em um servidor de API mestre do Kubernetes administrado pelo Google e um conjunto de nós de trabalho. Os nós de trabalho são máquinas virtuais do Compute Engine.

Use a CLI gcloud da sessão do Cloud Shell para criar um cluster. Ajuste sua zona para um local próximo a você ( a lista de zonas). Esse processo levará alguns minutos para ser concluído:

gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b

No final, você verá o cluster criado.

Creating cluster hello-dotnet-cluster...done.
Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-dotnet-cluster  europe-west1-b  1.10.7-gke.6

Agora você tem um cluster do Kubernetes totalmente funcional com a tecnologia do Google Kubernetes Engine:

eefb8d9b7f39598b.png

Agora é hora de implantar o aplicativo em um contêiner no cluster do Kubernetes. De agora em diante, você usará a linha de comando kubectl, que já está configurada no ambiente do Cloud Shell. O restante deste codelab exige que o cliente e o servidor do Kubernetes sejam a 1.2 ou mais recente. kubectl version vai mostrar a versão atual do comando.

7. Criar implantação

Um pod do Kubernetes é um grupo de contêineres agrupados para fins de administração e comunicação em rede. Ele pode ter um único contêiner ou vários. Aqui você simplesmente usará um contêiner criado com sua imagem do ASP.NET Core armazenada no seu Container Registry particular. Ele suprirá conteúdo na porta 8080.

Crie um arquivo hello-dotnet.yaml usando seu editor favorito (vim, nano,emacs ou o editor de código do Cloud Shell) e defina a implantação do Kubernetes para o pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: hello-dotnet
  template:
    metadata:
      labels:
        run: hello-dotnet
    spec:
      containers:
      - name: hello-dotnet
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Implante no namespace padrão com kubectl:

kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created

Como você pode ver, criamos um objeto de implantação. Implantações são a maneira recomendada de criar e escalonar pods. Aqui, uma nova implantação gerencia uma réplica de pod único que executa a imagem hello-dotnet:v1.

Para ver a implantação que você acabou de criar, execute:

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   1         1         1            1           37s

Para ver o pod criado pela implantação, execute este comando:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-ztzrb   1/1       Running   0          57s

Agora é um bom momento para executar alguns comandos kubectl interessantes (nenhum deles mudará o estado do cluster. A documentação completa está disponível aqui):

kubectl get pods
kubectl cluster-info
kubectl config view
kubectl get events
kubectl logs <pod-name>

Neste ponto, o contêiner já deve estar em execução sob o controle do Kubernetes, mas você ainda precisa torná-lo acessível ao mundo exterior.

8. permitir o tráfego externo

Por padrão, o pod é acessível somente do seu IP interno dentro do cluster. Para tornar o contêiner hello-dotnet acessível de fora da rede virtual do Kubernetes, é necessário expor o pod como um serviço do Kubernetes.

No Cloud Shell, é possível expor o pod à Internet pública com o comando kubectl expose combinado com a sinalização --type="LoadBalancer". A sinalização é obrigatória para a criação de um IP acessível externamente:

kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080

O sinalizador usado neste comando especifica se você usará o balanceador de carga fornecido pela infraestrutura subjacente (nesse caso, o balanceador de carga do Compute Engine). Você expôs a implantação, não o pod diretamente. Isso fará com que o serviço resultante faça o balanceamento de carga do tráfego em todos os pods gerenciados pela implantação (nesse caso, apenas um pod, mas você adicionará mais réplicas posteriormente).

O mestre do Kubernetes cria o balanceador de carga e as regras de encaminhamento do Compute Engine relacionadas, pools de destino e regras de firewall para tornar o serviço totalmente acessível de fora do Google Cloud Platform.

Para encontrar o endereço IP publicamente acessível do serviço, basta solicitar que kubectl liste todos os serviços de cluster:

kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-dotnet 10.3.253.62   104.155.20.69   8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

Há dois endereços IP listados para seu serviço, ambos usando a porta 8080. Um é o IP interno que é visível apenas dentro da sua rede virtual na nuvem. Outro é o IP com balanceamento de carga externo. Neste exemplo, o endereço IP externo é 104.155.20.69.

Agora, você deve conseguir acessar o serviço ao apontar seu navegador para este endereço: http://<EXTERNAL_IP>:8080

6b053874002827fe.png

Até aqui, você ganhou pelo menos vários recursos com a migração para contêineres e o Kubernetes. Não é necessário especificar em qual host executar a carga de trabalho, e você também se beneficia do monitoramento e da reinicialização do serviço. Vamos ver o que mais a nova infraestrutura do Kubernetes pode oferecer.

9. Escalone seu serviço

Um dos poderosos recursos oferecidos pelo Kubernetes é a facilidade de escalonar seu aplicativo. Suponha que, de repente, você precise de mais capacidade para seu aplicativo. basta pedir ao controlador de replicação para gerenciar um novo número de réplicas do pod:

kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         4         4            3           16m
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m
hello-dotnet-714049816-sh812   1/1       Running   0          1m
hello-dotnet-714049816-ztzrb   1/1       Running   0          16m

Observe a abordagem declarativa aqui. Em vez de iniciar ou interromper novas instâncias, declare quantas instâncias precisam estar em execução ao mesmo tempo. Os loops de reconciliação do Kubernetes simplesmente garantem que a realidade corresponda ao que você solicitou e tomam medidas, se necessário.

Este diagrama resume o estado do nosso cluster Kubernetes:

6af0243662464ca9.png

Também é possível reduzir o escalonamento vertical do serviço com muita facilidade. Confira como reduzir o escalonamento vertical de quatro para dois pods.

kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

10. Resiliência do teste

O Kubernetes (ou mais especificamente o ReplicaSet) monitora os pods e, se algo der errado com o pod, ele cria um novo imediatamente. Vamos testar isso e ver como funciona.

Primeiro, acesse a lista de pods:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

Exclua um dos pods transmitindo o nome dele:

kubectl delete pod hello-dotnet-714049816-g4azy

Se você analisar a lista de pods outra vez, vai perceber que um novo pod está sendo criado e executado de novo imediatamente:

kubectl get pods
NAME                         READY     STATUS           RESTARTS   AGE
hello-dotnet-714049816-abczy   1/1    ContainerCreating  0          1m
hello-dotnet-714049816-rk0u6   1/1    Running            0          1m

11. implementar uma atualização no serviço

Em algum momento, o aplicativo implantado na produção exigirá correções de bugs ou recursos adicionais. Vamos conferir como é esse processo.

Primeiro, vamos modificar o aplicativo. Abra o editor de código no Cloud Shell.

f487389b8b1cc105.png

Navegue até Index.cshtml em HelloWorldAspNetCore > Views > Home e atualize uma das mensagens do carrossel.

Encontre a seguinte linha:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core 

E modifique a mensagem para:

Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud

Salve as alterações e volte ao Cloud Shell. Dentro de HelloWorldAspNetCore,, crie a imagem Docker:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 . 

E envie para o Container Registry:

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 

Agora já está tudo pronto para o Kubernetes atualizar o controlador de replicação para a nova versão do aplicativo. Para mudar o rótulo da imagem do contêiner em execução, é necessário editar o hello-dotnet deployment atual e mudar a imagem de gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 para gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2.

Para fazer isso, use o comando kubectl edit. Isso abrirá um editor de texto que exibe a configuração yaml completa da implantação. Não é preciso entender a configuração YAML completa agora. Apenas entenda que, ao atualizar o campo spec.template.spec.containers.image na configuração, você instrui a implantação a atualizar os pods para usar a nova imagem.

kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2017-01-06T10:05:28Z
  generation: 3
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-dotnet
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-dotnet
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
        imagePullPolicy: IfNotPresent
        name: hello-dotnet
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

Depois de fazer a mudança, salve e feche o arquivo. Isso usa vi. Portanto, pressione "Esc", digite :wq e pressione a tecla "Enter".

deployment "hello-dotnet" edited

Isso atualiza a implantação com a nova imagem, fazendo com que novos pods sejam criados com ela e os pods antigos sejam excluídos.

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

Enquanto isso acontece, os usuários dos serviços não sofrerão nenhuma interrupção. Depois de um tempo, eles começarão a acessar a nova versão do aplicativo.

fb9f41e814dda653.png

Encontre mais detalhes sobre atualizações graduais na documentação do Kubernetes.

Esperamos que, com esses recursos de implantação, escalonamento e atualização, você concorde que, depois de configurar seu ambiente (seu cluster do GKE/Kubernetes aqui), o Kubernetes vai ajudar você a se concentrar no seu aplicativo em vez de gerenciar a infraestrutura.

12. Cloud Build

Até agora, criamos contêineres com comandos comuns do Docker (docker build ...) e, em seguida, enviamos a imagem manualmente para o Container Registry do Google Cloud Platform. Também é possível adiar as duas etapas para o Cloud Build no lado do servidor, que pode criar e enviar a imagem do contêiner sem a instalação local do Docker.

Primeiro, ative a API Cloud Build em Gerenciador de APIs > Biblioteca. Pesquise Cloud Build e clique em API Cloud Build:

f8b0239fa7719f29.png

Clique em Ativar API, se ainda não tiver feito isso. No final, você verá a API ativada desta forma:

ea6053f9603613b5.png

Depois que a API Cloud Build estiver ativada, será possível executar o seguinte comando para criar e enviar sua imagem a partir do serviço do Container Builder:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

A imagem é armazenada automaticamente no Container Registry.

13. Executar o painel gráfico do Kubernetes

Nas versões recentes do Kubernetes, uma interface gráfica do usuário da Web (painel) foi introduzida. Essa interface do usuário permite que você inicie rapidamente e habilita algumas das funcionalidades encontradas na CLI, como uma maneira mais acessível e detectável de interagir com o sistema.

Para configurar o acesso ao painel do cluster do Kubernetes, digite estes comandos na janela do Cloud Shell :

gcloud container clusters get-credentials hello-dotnet-cluster \
    --zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081

Em seguida, use o recurso de visualização do Cloud Shell novamente para acessar a porta 8081:

port8081.png

Isso enviará você ao ponto de extremidade da API. Você pode receber uma mensagem de erro "Não autorizado" mas não se preocupe com isso. Para acessar o painel, remova "?authuser=3" e a substitua por "/ui".

Aproveite o painel gráfico do Kubernetes e use-o para implantar aplicativos em contêiner, bem como para monitorar e gerenciar seus clusters.

177789527b650f6b.png

Como alternativa, você pode acessar o painel em uma máquina local ou de desenvolvimento usando instruções semelhantes fornecidas ao pressionar o botão "Conectar" no console da Web para o cluster que você quer monitorar.

da1ccc707dd6647.png

a51c7160e237f32f.png

Quando o painel estiver pronto, pressione Control + C para interromper o proxy. Para saber mais sobre o painel do Kubernetes, faça o tour do painel.

14. Logging

Use o comando kubectl logs para recuperar os registros de um contêiner em execução no Kubernetes. Quando você usa o Google Kubernetes Engine para executar clusters do Kubernetes gerenciados, todos os registros são encaminhados e armazenados automaticamente no Google Cloud Logging. Para conferir toda a saída de registro dos pods, acesse StackdriverLogging → Registros no console do Google Cloud:

b63159b959ba5010.png

No console de geração de registros, acesse o Contêiner do GKE para ver todos os registros coletados do STDOUT:

43e9aab3e02358d5.png

Depois disso, você tem a opção de exportar os registros para o Google BigQuery, fazer mais análises ou configurar alertas com base em registros. Não vamos fazer isso no laboratório de hoje.

15. Parabéns!

Isso conclui este codelab simples de introdução ao ASP.NET Core e ao Kubernetes. Nós abordamos apenas uma pequena parte dessa tecnologia e incentivamos você a explorar ainda mais com seus próprios pods, controladores de replicação e serviços. Verifique também as sondas de atividade (verificações de integridade) e considere a possibilidade de usar a API Kubernetes diretamente.

Limpar

Pronto! É hora de limpar alguns dos recursos utilizados para economizar custos e ser um bom cidadão da nuvem.

Exclua a implantação (que também exclui os pods em execução) e o serviço (que também exclui o balanceador de carga externo):

Primeiro, exclua o serviço e a implantação, o que também exclui o balanceador de carga externo:

kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted
deployment "hello-dotnet" deleted

Em seguida, exclua o cluster:

gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted.
 - [hello-dotnet-cluster] in [europe-west1-b]
Do you want to continue (Y/n)?  Y
Deleting cluster hello-dotnet-cluster...done.                                                                                                                                                                                            
Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].

Isso exclui todas as instâncias do Google Compute Engine que executam o cluster.

Por fim, exclua o bucket de armazenamento do registro do Docker que hospeda suas imagens:

gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...

Obviamente, também é possível excluir todo o projeto, mas você perderá qualquer configuração de faturamento que tenha feito. É necessário desativar o faturamento do projeto primeiro. Além disso, a exclusão de um projeto só interromperá todo o faturamento após o término do ciclo de faturamento atual.

O que vimos

  • Como empacotar um aplicativo simples do ASP.NET Core como um contêiner do Docker
  • Como criar um cluster do Kubernetes no Google Kubernetes Engine.
  • Como implantar o aplicativo do ASP.NET Core em um pod
  • Como permitir tráfego externo no pod
  • Como escalonar verticalmente o serviço e fazer um upgrade
  • Como executar o painel gráfico do Kubernetes

Próximas etapas

Licença

Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.