Como migrar do Compute Engine para o Kubernetes Engine com o Migrate for Anthos

1. Visão geral

Nem sempre é possível ou viável reformular aplicativos que já existem para que funcionem no Kubernetes. O Migrate for Anthos pode ajudar a modernizar os aplicativos atuais e executá-los no Kubernetes. Neste codelab, você migrará um app da Web hospedado no Compute Engine para o Kubernetes Engine usando o Migrate for Anthos.

O que você vai aprender

  • Como implantar o Migrate for Anthos em um cluster do Kubernetes
  • Como criar um contêiner em um conjunto com estado a partir de uma instância atual do Compute Engine
  • Como implantar um contêiner no Kubernetes e configurá-lo com um balanceador de carga

O que é necessário

  • Um projeto do Google Cloud com o faturamento configurado. Se não tiver, você vai precisar criar uma.

2. Etapas da configuração

Este codelab pode ser executado totalmente no Google Cloud Platform sem qualquer instalação ou configuração local.

Ativar APIs

Antes de começar, ative as APIs necessárias no projeto do Google Cloud:

Crie um servidor da Web da instância do Compute

Vamos criar uma instância de computação para hospedar nosso servidor da Web nginx inicial, junto com as regras de firewall para acessar a página de destino padrão do servidor. Há algumas maneiras de fazer isso, mas vamos usar o Cloud Shell para facilitar o processo.

No Cloud Shell, execute este comando:

gcloud compute instances create webserver --zone=us-central1-a && \
gcloud compute firewall-rules create default-allow-http --allow=tcp:80 

A primeira metade do comando cria uma instância do Google Cloud na zona us-central1-a, e a segunda cria uma regra de firewall chamada "default-allow-http". que permite o tráfego HTTP na rede.

Quando a instância for criada, ela vai mostrar uma tabela com os detalhes dela. Anote o IP externo. Ele será necessário para confirmar que nosso servidor da Web será executado mais tarde.

a08aa5bf924b107d.png

Assim que a instância estiver funcionando, poderemos usar o SSH na instância pelo Cloud Shell para instalar o nginx e iniciar o servidor da Web:

gcloud compute ssh --zone us-central1-a webserver

Depois de fazer login na instância de computação, instale o nginx:

sudo apt install nginx

Saia da sessão SSH com o comando logout.

Para verificar se o servidor da Web está em execução, digite o IP externo da instância no navegador. Você verá a tela de boas-vindas padrão do nginx:

5c08e3b2bd17e03.png

Esse servidor vai servir como o app da Web legado que será migrado para o Kubernetes com o Migrate for Anthos.

3. Cluster do Kubernetes com o Migrate for Anthos

Agora vamos criar um cluster do GKE para onde vamos migrar o servidor da Web do Compute Engine. No Console do Cloud, execute o seguinte:

gcloud container clusters create my-gke-cluster \
  --zone us-central1-a \
  --cluster-version 1.13 \
  --machine-type n1-standard-4 \
  --image-type "UBUNTU" \
  --num-nodes 1 \
  --enable-stackdriver-kubernetes

Aguarde alguns minutos até que o comando seja concluído. Depois que o cluster for criado, você receberá uma resposta com os detalhes:

c69778b8fb8ac72b.png

Em seguida, navegue até o GCP Marketplace para implantar o Migrate for Anthos:

45f5753cae53ccb5.png

Na página do Migrate for Anthos no mercado, clique em "Configurar" e, se solicitado, selecione o projeto na lista. A página seguinte vai apresentar um formulário com alguns valores padrão inseridos. Verifique se o cluster selecionado é o que acabamos de criar e clique em Implantar:

94dc6238b2affd16.png

Agora o Migrate for Anthos está implantado no cluster do Kubernetes. Quando a implantação for concluída, o status "OK" será exibido. na página de aplicativos do Kubernetes Engine:

5bf601103a5335cf.png

4. Da instância do Compute ao conjunto com estado

Agora que temos um cluster do Kubernetes executando o Migrate for Anthos, podemos iniciar o processo de migração. Para implantar nossa instância de computação em um cluster do Kubenetes, vamos encerrar a instância do Compute Engine para criar snapshots dos discos. Antes de continuar, anote o ID da instância, que será necessário mais adiante:

gcloud compute instances describe webserver --zone us-central1-a | grep ^id

Vamos encerrar a instância do Compute:

gcloud compute instances stop webserver --zone us-central1-a

Agora que a instância foi interrompida, podemos fazer um snapshot seguro dos discos executando o script a seguir. Certifique-se de inserir o ID do projeto e o ID da instância:

python3 /google/migrate/anthos/gce-to-gke/clone_vm_disks.py \
  -p <project-id>   -i <instance-id> \
  -z us-central1-a \
  -T us-central1-a \
  -A webserver-statefulset \
  -o containerized-webserver.yaml

Com essas sinalizações, o clone_vm_disks.py vai:

  • Verifique se a instância do GCE está desativada
  • Criar um snapshot de cada um dos discos da sua instância
  • Criar um disco a partir de cada snapshot
  • Excluir os snapshots criados
  • Gere um arquivo YAML no seu diretório de trabalho atual para implantar um conjunto com estado que hospedará seu servidor da Web

O arquivo yaml gerado vai provisionar um conjunto com estado no cluster do Kubernetes, junto com as declarações de volume permanente necessárias para ativar os discos copiados no contêiner do servidor da Web. Podemos aplicar essas mudanças com kubectl:

kubectl apply -f containerized-webserver.yaml

Verifique o status do webserver-statefulset na página "Cargas de trabalho":

É normal que o status seja "Pods estão pendentes". por alguns minutos depois de executar kubectl apply. Prossiga quando o status for "OK".

5. Expor o cluster ao balanceador de carga

Neste ponto, o cluster do Kubernetes deve estar executando o servidor da Web como um conjunto com estado, mas também vamos expor o contêiner a um balanceador de carga para acessar o servidor da Web usando um endereço IP externo. No Cloud Shell, crie um novo arquivo chamado loadbalancer.yaml com o seguinte conteúdo:

loadbalancer.yaml

apiVersion: v1
kind: Service
metadata:
  name: webserver-loadbalancer
spec:
  type: LoadBalancer
  selector:
    app: webserver-statefulset
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

Agora, aplique com kubectl:

kubectl apply -f loadbalancer.yaml

Podemos usar a kubectl para recuperar o endereço IP externo do serviço webserver-container:

kubectl get services

Se inserirmos o endereço IP externo no navegador, será exibida a mesma tela de boas-vindas padrão do nginx:

5c08e3b2bd17e03.png

Conseguimos! Nosso servidor da Web do GCE agora está hospedado no Kubernetes. Legal!

6. Stackdriver Monitoring

Métricas

Como um serviço gerenciado do Kubernetes, o Kubernetes Engine é instrumentado automaticamente para geração de registros e monitoramento com o Stackdriver. Vamos ver algumas das métricas que o Stackdriver captura automaticamente.

Clique no link "Monitoring" no menu de produtos. O acesso a ele pela primeira vez no projeto pode levar alguns minutos durante a configuração do espaço de trabalho.

Depois de carregar, passe o mouse sobre Recursos no painel esquerdo e selecione "Kubernetes Engine NEW" no menu.

4e62c8ad3f2b3fe9.png

Cada linha do painel apresentado aqui representa um recurso do Kubernetes. Use os links acima do painel para alternar entre a visualização de infraestrutura, cargas de trabalho ou serviços.

62066a9251d19843.png

Na visualização "Cargas de trabalho", expanda "my-gke-cluster" e detalhar até o padrão > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset. Clique no contêiner definido com estado do servidor da Web. Aqui você encontrará algumas métricas prontas para uso que estão sendo capturadas pelo Stackdriver, incluindo a utilização de memória e de CPU.

d054778de301429e.png

Os gráficos mostrados neste painel podem ser usados para criar um painel personalizado.

Painéis personalizados

Com o Stackdriver, é possível criar painéis personalizados que podem ser usados para organizar tabelas e gráficos referentes a quaisquer dados de métricas disponíveis. Vamos criar um painel personalizado para fornecer uma visualização rápida de algumas das métricas do nosso servidor da Web.

No painel à esquerda, passe o cursor sobre "Painéis" e clique em "Criar painel".

56a0513efe60de3e.png

Agora que o painel está vazio, podemos adicionar as métricas que queremos acompanhar. Vamos dar ao nosso painel sem título um nome útil como "My Web Server Containers" e clique em "Adicionar gráfico" no canto superior direito:

bd66ba91f3125028.png

Lembra-se das métricas prontas para uso? Vamos adicionar um gráfico da utilização da CPU do contêiner. No campo "Título do gráfico", insira "Utilização da CPU". Na caixa "Encontrar tipo de recurso e métrica", digite request_utilization e selecione "Utilização de solicitação da CPU" na lista filtrada. Essa seleção preencherá os campos "Tipo de recurso" e "Métrica" para nós.

Em seguida, vamos filtrar por nosso project_id (se tivermos vários projetos) e container_name. Na caixa "Filtro", digite project_id, selecione-o na lista filtrada e selecione o projeto no campo "Valor". Também precisamos filtrar por container_name. Na caixa "Filtro", digite container_name, selecione-o na lista filtrada e selecione webserver-statefulset no campo "Valor". Clique em "Salvar".

Agora temos um painel com nosso primeiro gráfico.

3d3d45e4357454e0.png

7. Verificação de tempo de atividade e política de alertas

Com o Stackdriver, é possível configurar alertas para nos notificar quando uma métrica atingir os valores limite especificados. Por exemplo, o Stackdriver pode nos enviar um e-mail quando a utilização da CPU da última etapa estiver acima de um determinado limite por um período prolongado, o que pode indicar um problema com nosso aplicativo. Para demonstrar como esses alertas são, vamos configurar uma verificação de tempo de atividade e, em seguida, simular uma interrupção do serviço.

No painel esquerdo, selecione "Verificações de tempo de atividade" e, em seguida, "Visão geral das verificações de tempo de atividade":

49368e5700274cf2.png

Como a página "Verificações de tempo de atividade" sugere, vamos configurar nossa primeira verificação de tempo de atividade. Clique no botão Adicionar verificação de tempo de atividade no canto superior direito da página.

d884560f91011009.png

No formulário de processo, insira "Endpoint Uptime". e o endereço IP externo do balanceador de carga como o nome do host.

568a8f1e27ae8417.png

Clique em Salvar e crie uma Política de alertas complementar:

f89d53a106a709f4.png

Clique em Criar política de alertas.

Vamos chamá-la de "Política de tempo de atividade do endpoint". Na seção Configuração, defina "Acionadores de condição se". para "Qualquer violação de série temporal" e clique em Salvar.

74609849348bd03e.png

Ainda não terminamos. Em seguida, especificaremos um Canal de notificação para sermos notificados quando nossa política de alertas for violada. No menu suspenso "Tipo de canal de notificação", selecione "E-mail" seguido de um endereço de e-mail válido.

44c474e28a497659.png

Clique em Adicionar canal de notificação. Por fim, na parte de baixo do formulário, nomeie a política como "Tempo de atividade do app da Web". e clique em "Salvar".

Para conferir a aparência de um alerta, abra o Cloud Shell novamente no console do Cloud. O comando abaixo vai interromper a execução do serviço nginx no pod de servidor da Web:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx -s stop"

Após alguns minutos, você receberá um e-mail alertando sobre a interrupção:

808ac1d75ce3681f.png

Vamos desfazer isso. De volta ao Cloud Shell, vamos reiniciar o nginx:

kubectl exec -t webserver-statefulset-0 -- /bin/bash -c "nginx"

Depois de alguns minutos , você receberá outro e-mail do Stackdriver, desta vez com notícias melhores do que antes:

5b8262fbbc4877c.png

8. Limpeza

Agora que migramos do GCE para o GKE com o Migrate for Anthos, vamos limpar todos os recursos criados no projeto.

Excluir o projeto

Se preferir, exclua o projeto inteiro. No Console do GCP, acesse a página Cloud Resource Manager:

Na lista de projetos, selecione o projeto em que estamos trabalhando e clique em Excluir. Você precisará digitar o ID do projeto. Depois de fazer isso, clique em Desligar.

Se preferir excluir os diferentes componentes um por um, prossiga para a próxima seção.

Stackdriver

Painel

Na página do painel, clique no ícone de configurações dc259295eb33cb42.png na parte superior da página e selecione Excluir painel.

Política de alertas

Na página de políticas, selecione Excluir no menu de ações 2ef75d82e76accaa.png. à direita de cada política criada.

Verificação de tempo de atividade

Na página "Verificações de tempo de atividade", selecione Excluir no menu "Ações" à direita de cada verificação criada.

GCE e Kubernetes

Instância do Google Compute Engine

gcloud compute instances delete webserver --zone=us-central1-a

Cluster do Kubernetes (inclui o Migrate for Anthos, o conjunto com estado e o serviço de balanceador de carga)

gcloud container clusters delete my-gke-cluster --zone=us-central1-a

Discos

Nosso conjunto com estado usou um disco que criamos. Use o seguinte comando para recuperar o nome:

gcloud compute disks list --filter=webserver

Usando o nome do seu disco no lugar do meu, exclua-o com:

gcloud compute disks delete vls-690d-webserver --zone=us-central1-a

Tudo limpo!

9. Parabéns!

Parabéns! Você usou o Migrate for Anthos para migrar o servidor da Web de uma instância do GCE para um cluster do Kubernetes.

O que vimos

  • Migramos um servidor da Web do GCE para um cluster do Kubernetes usando o Migrate for Anthos
  • Abrimos nosso servidor da Web com estado para o mundo ao expô-lo por um serviço de balanceador de carga do Kubernetes.
  • Ativamos o Stackdriver e criamos um painel personalizado
  • Configuramos uma verificação de tempo de atividade com uma política de alertas para nos informar quando nosso servidor da Web ficar inativo