Este é o quinto e último tutorial num percurso de aprendizagem que ensina a modularizar e colocar num contentor uma app monolítica.
O percurso de aprendizagem é composto pelos seguintes tutoriais:
- Overview
- Compreenda o monolito
- Modularize o monolítico
- Prepare a app modular para a contentorização
- Coloque a app modular em contentores
- Implemente a app num cluster do GKE (este tutorial)
No tutorial anterior, Coloque a app modular num contentor, preparou a app modular Cymbal Books para implementação. Colocou os módulos da app em contentores, testou os contentores resultantes e enviou as imagens de contentores para o Artifact Registry.
Neste tutorial, implementa a app contentorizada num cluster do Google Kubernetes Engine. Este passo conclui a transformação da app Cymbal Books num sistema modular e escalável que é executado num cluster do Kubernetes.
Custos
Seguir os passos neste tutorial implica encargos na sua Google Cloud conta. Os custos começam quando ativa o GKE e implementa a app de exemplo Cymbal Books. Estes custos incluem encargos por cluster do GKE, conforme descrito na página de preços, e encargos pela execução de VMs do Compute Engine.
Para evitar cobranças desnecessárias, certifique-se de que desativa o GKE ou elimina o projeto assim que concluir este tutorial.
Antes de começar
Antes de começar este tutorial, certifique-se de que concluiu os tutoriais anteriores da série. Para uma vista geral da série completa e links para tutoriais específicos, consulte o Percurso de aprendizagem: transforme um monolítico numa app do GKE – Vista geral.
Em particular, tem de ter realizado os passos no tutorial anterior, Coloque a app modular num contentor.
Configure o cluster do GKE
Antes de poder implementar a app modular Cymbal Books, tem de criar primeiro um cluster do GKE. Este cluster fornece a infraestrutura na qual os contentores da sua app vão ser executados.
Neste tutorial, vai usar a CLI gcloud para criar o cluster. Em alternativa, pode usar a Google Cloud consola, que oferece uma interface gráfica do utilizador (GUI) para criar e gerir Google Cloud recursos, como clusters do GKE.
Crie e valide um cluster do GKE
Um cluster do GKE fornece os recursos de computação necessários para executar os seus contentores no Kubernetes. Siga estes passos para criar um cluster com a CLI gcloud.
Aceda à Google Cloud consola.
Na consola, clique no botão Ativar Cloud Shell:
É aberta uma sessão do Cloud Shell num frame na parte inferior da consola.
Defina o projeto predefinido na CLI Google Cloud:
gcloud config set project PROJECT_ID
Substitua
PROJECT_ID
pelo ID do projeto que criou ou selecionou na secção selecione ou crie um Google Cloud projeto da secção anterior. Um ID do projeto é uma string exclusiva que distingue o seu projeto de todos os outros projetos no Google Cloud. Para localizar o ID do projeto, aceda ao seletor de projetos. Nessa página, pode ver os IDs dos seus Google Cloud projetos.Crie um cluster do GKE:
gcloud container clusters create CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION \ --num-nodes=2
Substitua o seguinte:
CLUSTER_NAME
: um nome para o seu cluster, comocymbal-cluster
.CONTROL_PLANE_LOCATION
: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais, comous-central1
oueurope-west1-b
.
Recupere as credenciais do cluster para que a CLI
kubectl
possa estabelecer ligação ao cluster:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION
Este comando atualiza o ficheiro de configuração do Kubernetes, que é armazenado por predefinição em
~/.kube/config
. Este ficheiro de configuração contém as credenciais que okubectl
requer para interagir com o seu cluster do GKE.Verifique se
kubectl
está ligado ao cluster listando os nós do cluster:kubectl get nodes
Se a configuração for bem-sucedida, este comando apresenta os nós no seu cluster do GKE. Como criou o cluster com
--num-nodes=2
, deve ver informações sobre dois nós, semelhantes às seguintes:NAME STATUS ROLES AGE VERSION gke-nov18-default-pool-6a8f9caf-bryg Ready <none> 30s v1.30.8-gke.1128000 gke-nov18-default-pool-6a8f9caf-ut0i Ready <none> 30s v1.30.8-gke.1128000
Neste exemplo, ambos os nós estão no estado
Ready
. Este estado significa que o cluster do GKE está pronto para alojar as suas cargas de trabalho contentorizadas!
Implemente a app
Agora que criou um cluster do GKE, pode implementar a app Cymbal Books no mesmo. Para implementar uma app num cluster, aplica o manifesto do Kubernetes ao cluster.
Aplique o manifesto do Kubernetes
No Cloud Shell, implemente a app no cluster do GKE executando os seguintes comandos:
Navegue para o diretório raiz da aplicação contentorizada:
cd kubernetes-engine-samples/quickstarts/monolith-to-microservices/containerized/
Aplique o manifesto do Kubernetes:
kubectl apply -f kubernetes_manifest.yaml
O comando anterior indica ao Kubernetes que crie os recursos especificados no ficheiro kubernetes-manifest.yaml
. Estes recursos incluem serviços, uma implementação e pods.
Encontrou os serviços pela primeira vez na secção Altere o código modular do tutorial Prepare a app modular para a contentorização.
Nesse tutorial, atualizou o código da app para usar nomes de serviços em vez de
localhost
. Essa atualização permite que o Kubernetes encaminhe pedidos entre módulos e garante que os módulos podem comunicar entre si num cluster.
Agora, quando aplica o manifesto, o Kubernetes cria os serviços no cluster.
Uma implementação é um objeto da API Kubernetes que lhe permite executar várias réplicas de pods distribuídas entre os nós num cluster. A secção seguinte explica o que são os pods.
O que é um pod do Kubernetes?
No tutorial anterior, criou uma imagem de contentor para cada módulo da app Cymbal Books. Por exemplo, criou imagens de contentores com base nos módulos home_app
e book_details_app
.
Quando usa o comando kubectl apply
para implementar o manifesto do Kubernetes, o Kubernetes extrai as imagens de contentores do Artifact Registry para o cluster. No cluster, as imagens de contentores tornam-se contentores e os contentores são executados em pods.
Um pod é um ambiente isolado no qual os contentores são executados e realiza as seguintes tarefas:
- Atribui CPU e memória: um pod fornece os recursos de que os contentores precisam para funcionar.
- Fornece rede: cada Pod tem o seu próprio endereço IP. Isto permite que o Pod comunique com outros Pods.
Os pods são executados em nós, que são as máquinas que fornecem capacidade de computação para o cluster. O Kubernetes atribui automaticamente pods a nós e distribui os pods pelos nós do cluster para reduzir o risco de sobrecarregar um único nó. Esta distribuição ajuda o cluster a usar os respetivos recursos de computação e memória de forma eficiente.
Valide a implementação
Depois de aplicar o manifesto do Kubernetes com o comando kubectl apply
, verifique se a app foi implementada com êxito no cluster. Para verificar a implementação, certifique-se de que os pods e os serviços estão a ser executados corretamente.
Verifique os pods
Para ver os pods no seu cluster, execute o seguinte comando:
kubectl get pods
Este comando apresenta os pods e o respetivo estado atual. Procure a coluna STATUS para confirmar que todos os pods estão marcados como Running
, o que indica que estão a ser executados com êxito e prontos para publicar pedidos. O resultado esperado
tem o seguinte aspeto:
NAME READY STATUS RESTARTS AGE
home-app-67d59c6b6d-abcde 1/1 Running 0 30s
book-details-app-6d8bcbc58f-xyz 1/1 Running 0 30s
book-reviews-app-75db4c4d7f-def 1/1 Running 0 30s
images-app-7f8c75c79c-ghi 1/1 Running 0 30s
O estado de um pod aparece inicialmente como Pending
enquanto está a ser criado e os respetivos contentores estão em processo de início. Se um pod permanecer Pending
durante um período prolongado, o cluster pode não ter recursos suficientes para que esse pod entre num estado Running
saudável. Se um pod tiver o estado CrashLoopBackOff
, pode haver um problema com o contentor. Os passos de resolução de problemas são fornecidos
mais adiante no tutorial.
Verifique os serviços
Os serviços permitem a comunicação entre os pods e permitem que os clientes externos (por exemplo, utilizadores, scripts automatizados ou ferramentas de monitorização) acedam à app. Para ver os serviços no seu cluster, execute o seguinte comando:
kubectl get services
A saída deste comando tem o seguinte aspeto:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
home-app-service LoadBalancer 10.12.3.4 35.185.1.2 80:30837/TCP 30s
details-service ClusterIP 10.12.3.5 <none> 80/TCP 30s
reviews-service ClusterIP 10.12.3.6 <none> 80/TCP 30s
images-service LoadBalancer 10.12.3.7 34.125.6.3 80:32014/TCP 30s
Os campos principais a observar na saída são os seguintes:
TYPE
: este campo indica como o serviço é exposto. Os serviços do tipoLoadBalancer
oferecem acesso externo à app.EXTERNAL-IP
: para um serviço do tipoLoadBalancer
, o campoEXTERNAL-IP
mostra o endereço IP público que os utilizadores podem introduzir no respetivo navegador de Internet para aceder à app. Para um serviço do tipoClusterIP
, este campo está vazio porque os serviçosClusterIP
só são acessíveis no cluster.
Teste a implementação
Depois de implementar a app Cymbal Books no cluster do GKE, verifique se a app está acessível e se os contentores conseguem comunicar entre si.
Aceda à app
Confirme se a app está acessível seguindo estes passos:
Recupere o endereço IP externo para o
home-app-service
:kubectl get services
Procure a coluna
**EXTERNAL-IP**
no resultado e tome nota do endereço IP associado ahome-app-service
.Abra um navegador de Internet e introduza o seguinte URL:
http://EXTERNAL-IP
Substitua
EXTERNAL-IP
pelo endereço IP que encontrou no passo anterior.Verifique se a página inicial da app Cymbal Books é carregada corretamente.
Valide a comunicação entre serviços
Os contentores na app Cymbal Books dependem dos serviços para trocar informações. Certifique-se de que os contentores conseguem comunicar eficazmente seguindo estes passos:
Obtenha o endereço IP externo do
home-app-service
, conforme descrito anteriormente.Use a interface da app para testar as interações entre contentores. Para tal, confirme que as seguintes funcionalidades funcionam clicando em todos os links disponíveis na interface da app:
- Verifique as imagens das capas dos livros: confirme se as imagens das capas dos livros são carregadas corretamente na página inicial e na página de detalhes do livro. Se o fizerem, os contentores
home_app
ebook_details_app
estão a comunicar com êxito com o contentorimages_app
. - Ver detalhes do livro: navegar para uma página de detalhes do livro a partir da página inicial. Se vir os detalhes de um livro, o contentor
home_app
está a comunicar corretamente com obook_details_app
. - Ver críticas de livros: clique num link de crítica de um livro para verificar se o contentor
home_app
consegue comunicar com o contentorbook_reviews_app
.
- Verifique as imagens das capas dos livros: confirme se as imagens das capas dos livros são carregadas corretamente na página inicial e na página de detalhes do livro. Se o fizerem, os contentores
A sua app está agora a ser executada num cluster do GKE!
Parabéns! Viu como transformar uma app monolítica num sistema modular e contentorizado que é executado num cluster do GKE em direto. Ao longo do caminho, aprendeu a dividir o código fortemente acoplado em módulos independentes, a criar e enviar imagens de contentores para um repositório, a definir manifestos do Kubernetes e a implementar a sua app do registo para o GKE. Este é um feito importante e reflete os passos que as equipas dão no mundo real para modernizar as aplicações para a nuvem!
Resolução de problemas
Se a app não responder ou os contentores não comunicarem, siga estes passos de resolução de problemas para diagnosticar e resolver problemas comuns.
Verifique o estado dos seus Pods
Comece por listar todos os pods no cluster para determinar se estão a ser executados conforme esperado:
kubectl get pods
Reveja a saída para confirmar que cada Pod está no estado Running
. Se algum pod não estiver em execução, anote o respetivo nome para inspeção adicional.
Inspecione os registos de pods
Se um Pod não estiver a processar pedidos corretamente, verifique os respetivos registos para procurar mensagens de erro:
kubectl logs POD_NAME
Substitua POD_NAME
pelo nome do Pod que quer
inspecionar. Este comando é útil para identificar problemas de arranque ou erros de tempo de execução.
Descreva um Pod para obter informações detalhadas
Se um Pod permanecer num estado não Running
durante mais de cinco minutos, por exemplo, num estado Pending
, ContainerCreating
ou CrashLoopBackOff
, pode ver informações detalhadas sobre o estado e os eventos do Pod através do seguinte comando:
kubectl describe pod POD_NAME
Substitua POD_NAME
pelo nome do Pod sobre o qual quer
informações detalhadas.
A secção Events
no resultado pode indicar que as restrições de recursos ou os problemas com as obtenções de imagens estão a impedir o início correto do pod.
Valide a configuração do serviço
Certifique-se de que os seus serviços estão configurados corretamente, especialmente o serviço que expõe o módulo doméstico com um endereço IP externo. Apresente uma lista dos serviços com o seguinte comando:
kubectl get services
Se reparar que o módulo Service for the home tem uma morada EXTERNAL-IP
indicada como Pending
, execute o seguinte comando:
kubectl describe service SERVICE_NAME
Substitua SERVICE_NAME
pelo nome do módulo de casa
Service.
Este comando fornece mais detalhes sobre a configuração do serviço e ajuda a identificar atrasos na atribuição do endereço IP externo ou outros problemas de configuração.
Verifique os eventos de cluster
Pode examinar os eventos de cluster para determinar se um problema está a afetar vários componentes do cluster:
kubectl get events
Este comando pode determinar se problemas de recursos ou de rede mais amplos estão a afetar a sua implementação.
Limpe os recursos
A execução de um cluster do GKE incorre em custos. Depois de concluir este tutorial, limpe os seus recursos para evitar cobranças adicionais. Siga estes passos para remover o cluster e, opcionalmente, todo o projeto.
Elimine o cluster do GKE
Para eliminar o cluster do GKE, use o seguinte comando:
gcloud container clusters delete CLUSTER_NAME
--location=CONTROL_PLANE_LOCATION
Substitua o seguinte:
CLUSTER_NAME
: o nome do cluster que criou, comocymbal-cluster
.CONTROL_PLANE_LOCATION
: a localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.
Quando lhe for pedido, confirme a eliminação.
Verifique se o cluster foi eliminado
Para garantir que o cluster foi eliminado, execute o seguinte comando:
gcloud container clusters list
O cluster já não deve aparecer no resultado. Se aparecer, aguarde alguns momentos e tente novamente.
(Opcional) Elimine o Google Cloud projeto
Se criou um Google Cloud projeto especificamente para este tutorial e já não precisa dele, pode eliminar o Google Cloud projeto completo. A eliminação do projeto remove todos os recursos e interrompe a faturação do projeto:
- Na Google Cloud consola, abra a página Gerir recursos.
- Selecione o projeto que quer eliminar.
- Clique em Eliminar projeto e siga as instruções para confirmar.
Resumo da série
Parabéns! Ao concluir este percurso de aprendizagem, aprendeu os princípios básicos da conversão de uma app monolítica numa app modular e contentorizada que é executada num cluster do Kubernetes. Os passos seguintes resumem o processo:
-
- Explorou a estrutura da app monolítica Cymbal Books.
- Configurou um ambiente Python local para executar o monolítico e testou os respetivos pontos finais.
- Ter compreendido a base de código da app para a preparar para a modularização.
-
- Aprendeu a dividir o código monolítico em módulos separados. Cada módulo processa uma funcionalidade distinta, como a apresentação de detalhes ou críticas de livros.
- Viu como estes módulos são implementados como apps Flask independentes em execução em portas diferentes.
- Testou a app modularizada.
Prepare o código modular para a contentorização
- Soube que tinha de atualizar os URLs em
home.py
para usar nomes de serviços em vez delocalhost
. - Aprendeu como o manifesto do Kubernetes define os serviços que permitem que os módulos da app, que já comunicam entre si, se encontrem no contexto de um cluster do Kubernetes.
- Soube que tinha de atualizar os URLs em
Coloque a app modular em contentores
- Configurou um Google Cloud projeto e clonou a app do GitHub para o Cloud Shell.
- Criou imagens de contentores para cada módulo com o Docker e testou os contentores localmente.
- Enviou as imagens de contentores para o Artifact Registry para preparar a app para a implementação num cluster.
- Atualizou o manifesto do Kubernetes para fazer referência aos caminhos das imagens de contentores no Artifact Registry.
Implemente a app num cluster do GKE (o tutorial em que se encontra agora):
- Criou um cluster do GKE.
- Implementou as imagens de contentores do Artifact Registry no cluster do GKE.
- Testou a versão final da app, que agora é escalável e é executada num ambiente do Kubernetes!
O que se segue?
Para mais formação prática sobre como criar clusters, consulte a nossa série, Percurso de aprendizagem: aplicações escaláveis.