1. Visão geral
Na primeira parte do laboratório, você criou um aplicativo ASP.NET Core, conteinerizou, implantou-o no Google Kubernetes Engine (GKE) e configurou o tráfego dele para ser gerenciado pelo Istio.
Nesta segunda parte do laboratório, você precisa ter o cluster do Kubernetes e o aplicativo do primeiro laboratório em execução. Você verá como o Istio pode ajudar a gerenciar, monitorar e proteger seus serviços com o mínimo de alterações no código. Especificamente, você vai conhecer os recursos do Istio, como métricas, rastreamento, visualização de serviços, gerenciamento de tráfego dinâmico, injeção de falhas e muito mais.
O que você vai aprender
- Como consultar métricas com o Prometheus
- Como visualizar métricas com o Grafana.
- Como criar uma nova versão do serviço.
- Como fixar um serviço em uma versão específica.
- Como dividir o tráfego entre diferentes versões.
- Como injetar falhas em chamadas de serviço.
O que é necessário
Como você usará este tutorial?
Como você classificaria sua experiência com o Google Cloud Platform?
2. Configuração e requisitos
Configuração de ambiente autoguiada
- Faça login no Console do Cloud e crie um novo projeto ou reutilize um existente. Crie uma se você ainda não tiver uma conta do Gmail ou do G Suite.
Lembre-se do código do projeto, um nome exclusivo em todos os projetos do Google Cloud. O nome acima já foi escolhido e não servirá para você. Faremos referência a ele mais adiante neste codelab como PROJECT_ID
.
- Em seguida, será necessário ativar o faturamento no Console do Cloud para usar os recursos do Google Cloud.
A execução deste codelab não será muito cara, se for o caso. Siga todas as instruções na seção "Limpeza", que orienta você sobre como encerrar recursos para não incorrer em cobranças além deste tutorial. Novos usuários do Google Cloud estão qualificados para o programa de avaliação gratuita de US$ 300.
Inicie o Cloud Shell
Embora o Google Cloud possa ser operado remotamente em um laptop, neste codelab você vai usar o Google Cloud Shell, um ambiente de linha de comando executado no Google Cloud.
Ativar o Cloud Shell
- No Console do Cloud, clique em Ativar o Cloud Shell.
Se você nunca tiver iniciado o Cloud Shell, verá uma tela intermediária (abaixo da dobra) com a descrição do que ele é. Se esse for o caso, clique em Continuar e você não o verá novamente. Esta é a aparência dessa tela única:
Leva apenas alguns instantes para provisionar e se conectar ao Cloud Shell.
Essa máquina virtual contém 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.
- 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`
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. Testar o aplicativo
Antes de começar o laboratório, verifique se o aplicativo ainda está funcionando. Como lembrete, é assim que você vê o IP externo e a porta do gateway, listados em EXTERNAL-IP
:
kubectl get svc istio-ingressgateway -n istio-system
Para ver o aplicativo, abra o navegador e navegue até http://<gatewayurl>
:
Se o aplicativo não aparecer, volte ao laboratório anterior para verificar se você seguiu todas as etapas e se o aplicativo e o Istio estão instalados e funcionando corretamente.
Agora, você pode estar se perguntando: "Qual é a vantagem do Istio?". Ao permitir que o Istio gerencie o tráfego do seu aplicativo, você tem acesso sem custo financeiro a recursos como métricas, rastreamento, gerenciamento de tráfego dinâmico, visualização de serviços, injeção de falhas e muito mais.
Você vai começar a explorar as métricas na próxima etapa.
4. Métricas com Grafana e Prometheus
Por padrão, o Istio gera algumas métricas. É possível usar complementos para consultar e visualizar essas métricas padrão.
Prometheus
O Prometheus é uma solução de monitoramento de código aberto. É possível usar o Prometheus para consultar as métricas geradas pelo Istio, mas primeiro você precisa instalar o complemento Prometheus.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
Verifique se o Prometheus está em execução:
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
Acesse http://<gatewayurl>
algumas vezes ou execute o comando curl para enviar tráfego para o aplicativo.
Configure o encaminhamento de portas para a IU do Prometheus:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
Agora você pode executar uma consulta clicando no botão "Visualização na Web", no canto superior direito do Cloud Shell, e depois em Visualizar na porta 8080:
A interface do Prometheus vai aparecer em uma nova guia:
Para saber mais sobre o Prometheus, consulte Como consultar métricas com o Prometheus.
Grafana
O Grafana é outro complemento para visualização de métricas.
Instale o Grafana. Substitua istio-version
pela versão atual do Istio,por exemplo, 1.0.3-gke.3
:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
Verifique se o Grafana está em execução:
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
Acesse http://<gatewayurl>
algumas vezes ou execute o comando curl para enviar tráfego para o aplicativo.
Configure o encaminhamento de portas para a IU do Grafana:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
Para conferir os painéis do Grafana, acesse a visualização na Web:
Para saber mais sobre o Granfana, consulte Como visualizar métricas com o Grafana.
5. Criar uma nova versão do aplicativo
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.
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
Depois de enviar a imagem do contêiner, é possível implantar a nova versão na próxima etapa.
6. Criar a nova implantação
Para implantar a nova versão, primeiro você precisa criar uma nova implantação para ela no Kubernetes. Adicione o código abaixo ao final do arquivo aspnetcore.yaml
:
--- apiVersion: apps/v1 kind: Deployment metadata: name: aspnetcore-v2 spec: replicas: 1 selector: matchLabels: app: aspnetcore version: v2 template: metadata: labels: app: aspnetcore version: v2 spec: containers: - name: aspnetcore image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 8080
Implante a nova versão no namespace padrão com kubectl
:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
Verifique se os pods esperados estão em execução:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
Agora, teste o aplicativo novamente. Descubra o IP externo do gateway:
kubectl get svc istio-ingressgateway -n istio-system
Ele está listado em EXTERNAL-IP. Abra uma navegação anônima e acesse http://<replace-with-external-ip>
Ao atualizar a página, algumas vezes, você verá a mensagem "Aprenda sobre a criação de apps da Web com o ASP.NET Core":
Outras vezes, você verá a mensagem "Saiba mais sobre a criação de apps da Web com o ASP.NET Core no Google Cloud":
Isso ocorre porque as implantações v1
e v2
são expostas pelo mesmo serviço do Kubernetes (aspnetcore-service
), e o VirtualService que você criou no laboratório anterior (aspnetcore-virtualservice
) usa esse serviço como um host.
Na próxima etapa, você fixará o serviço na implantação v2
usando uma DestinationRule.
7. Fixar seu serviço na nova versão
Nesta etapa, você fixará seu serviço para usar a implantação v2
e pode fazer isso com uma DestinationRule. Uma DestinationRule configura o conjunto de políticas que serão aplicadas a uma solicitação após a ocorrência de uma operação de roteamento do VirtualService.
Uma DestinationRule também define subconjuntos endereçáveis, ou seja, versões nomeadas, do host de destino correspondente. Esses subconjuntos são usados nas especificações de rota do VirtualService ao enviar tráfego para versões específicas do serviço.
Crie um novo arquivo com o nome aspnetcore-destinationrule.yaml
:
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: aspnetcore-destinationrule spec: host: aspnetcore-service trafficPolicy: tls: mode: ISTIO_MUTUAL subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
Em seguida, crie a DestinationRule. Isso cria dois subconjuntos (v1 e v2) que podem ser usados do VirtualService:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
Agora, volte ao arquivo aspnetcore-virtualservice.yaml
para atualizar o VirtualService para usar o subconjunto v2
:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service subset: v2
Atualize o VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
Abra o navegador e acesse http://<replace-with-external-ip>.
. Mesmo após várias atualizações, você verá a mensagem "Aprenda a criar apps da Web com o ASP.NET Core no Google Cloud":
8. Dividir o tráfego entre as versões
Às vezes, pode ser necessário dividir o tráfego entre as versões para fins de teste. Por exemplo, é possível enviar 75% do tráfego para a v1 e 25% para a v2 do serviço. É fácil fazer isso com o Istio. Crie um novo arquivo aspnetcore-virtualservice-weights.yaml
para se referir aos dois subconjuntos com pesos diferentes:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service subset: v1 weight: 75 - destination: host: aspnetcore-service subset: v2 weight: 25
Atualize o VirtualService:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
Agora, ao atualizar o navegador, você deve ver as versões v1 vs. v2 exibidas com uma proporção aproximada de 3:1.
Para saber mais, consulte divisão de tráfego no Istio.
9. Injetar falhas
Outra tarefa de desenvolvimento útil para testes é injetar falhas ou atrasos no tráfego e ver como os serviços se comportam em resposta.
Por exemplo, talvez você queira retornar uma resposta de solicitação inválida (HTTP 400) para 50% do tráfego da versão v1. Crie um arquivo aspnetcore-virtualservice-fault-abort.yaml
para corresponder ao seguinte:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: abort: percentage: value: 50 httpStatus: 400 route: - destination: host: aspnetcore-service subset: v1
Atualize o VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
Agora, ao atualizar o navegador, você verá que, na metade das vezes, o serviço v1 retorna um código de resposta HTTP 400s.
Ou talvez você queira adicionar um atraso de cinco segundos às solicitações. Crie um arquivo aspnetcore-virtualservice-fault-delay.yaml
para corresponder ao seguinte:
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: delay: fixedDelay: 5s percentage: value: 100 route: - destination: host: aspnetcore-service subset: v1
Atualize o VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
Agora, ao atualizar o navegador, você vai notar que as solicitações têm um atraso de 5 segundos.
Para saber mais sobre os recursos do Istio, como tempos limite, novas tentativas, regras condicionais, disjuntores e muito mais, consulte Recursos de gerenciamento de tráfego.
10. Parabéns!
Esperamos que este laboratório tenha fornecido uma visão geral do que o Istio pode fazer pelos seus serviços desde o início. Saiba mais sobre o Istio e o GKE.
Próximas etapas
- Saiba mais sobre Istio.
- Saiba mais sobre o Kubernetes.
- Saiba mais sobre o Google Kubernetes Engine.
- Saiba mais sobre .NET no Google Cloud Platform.
Licença
Este conteúdo está sob a licença Atribuição 2.0 Genérica da Creative Commons.
11. Limpeza
Você pode excluir o app e desinstalar o Istio ou simplesmente excluir o cluster do Kubernetes.
Excluir o aplicativo
Para excluir o aplicativo:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
Para confirmar se o aplicativo desapareceu:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
Desinstalar o Istio
Para excluir o Istio:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
Para confirmar se o Istio desapareceu:
kubectl get pods -n istio-system
Excluir cluster do Kubernetes
gcloud container clusters delete hello-dotnet-cluster