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 reescrever ou reestruturar aplicativos atuais para trabalhar no Kubernetes manualmente. O Migrate for Anthos pode ajudar a modernizar os aplicativos atuais e executá-los no Kubernetes. Neste codelab, você vai migrar um web app 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 usando uma instância do Compute Engine
  • Como implantar seu contêiner no Kubernetes e configurá-lo com um balanceador de carga

O que é necessário

  • Um projeto na nuvem do Google Cloud com o faturamento configurado. Se você não tiver uma, crie uma.

2. Etapas da configuração

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

Ativar APIs

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

Criar um servidor da Web de instância do Compute

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

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 desse comando vai criar uma instância do Google Cloud na zona us-central1-a, enquanto a segunda metade vai criar uma regra de firewall chamada "default-allow-http" que vai permitir o tráfego http na nossa rede.

Quando a instância for criada, uma tabela com os detalhes dela vai aparecer. Anote o IP externo. Vamos precisar dele para verificar se o servidor da Web está em execução mais tarde.

a08aa5bf924b107d.png

Depois que a instância estiver funcionando, podemos usar o SSH para acessar a instância do Cloud Shell, 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, insira o IP externo da instância no navegador. A tela de boas-vindas padrão do nginx vai aparecer:

5c08e3b2bd17e03.png

Esse servidor da Web vai servir como o app da Web legado que vamos migrar para o Kubernetes usando o Migrate for Anthos.

3. Cluster do Kubernetes com o Migrate for Anthos

Em seguida, vamos criar um cluster do GKE, que é 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 para que o comando seja concluído. Depois que o cluster for criado, você vai receber uma saída com os detalhes dele:

c69778b8fb8ac72b.png

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

45f5753cae53ccb5.png

Na página do Marketplace do Migrate for Anthos, clique em "Configurar" e, se solicitado, selecione seu 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

O Migrate for Anthos agora está implantado no nosso cluster do Kubernetes. Quando a implantação terminar, o status "OK" vai aparecer na página de aplicativos do Kubernetes Engine:

5bf601103a5335cf.png

4. Da instância de computação ao conjunto com estado

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

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

Vamos desligar a instância de computação:

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

Agora que a instância está parada, podemos criar snapshots dos discos com segurança executando o seguinte script. Insira seu ID do projeto e seu 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 flags, o clone_vm_disks.py vai:

  • Verificar se a instância do GCE está desativada
  • Crie um snapshot de cada disco da instância
  • Crie um novo disco com base em cada snapshot
  • Excluir os snapshots criados
  • Gere um arquivo YAML no diretório de trabalho atual para implantar um conjunto stateful que vai hospedar seu servidor da Web.

O arquivo YAML gerado vai provisionar um conjunto stateful no cluster do Kubernetes, além das declarações de volume permanente necessárias para montar 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 mostre "Pods pendentes" por alguns minutos após a execução de kubectl apply. Continue quando o status for "OK".

5. Expor o cluster ao balanceador de carga

Neste ponto, nosso cluster do Kubernetes deve estar executando o servidor da Web como um conjunto com estado, mas também precisamos expor o contêiner a um balanceador de carga para acessar o servidor da Web por um endereço IP externo. No Cloud Shell, crie um 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 o kubectl para recuperar o endereço IP externo do serviço webserver-container:

kubectl get services

Se digitarmos o endereço IP externo no navegador, vamos receber a mesma tela de boas-vindas padrão do nginx de antes:

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 conferir algumas das métricas que o Stackdriver captura automaticamente.

Clique no link do Monitoring no menu de produtos. O primeiro acesso ao projeto pode levar alguns minutos enquanto o espaço de trabalho é configurado.

Depois de carregado, passe o cursor sobre "Recursos" no painel à esquerda e selecione "Kubernetes Engine NEW" no menu.

4e62c8ad3f2b3fe9.png

Cada linha no painel apresentado aqui representa um recurso do Kubernetes. É possível alternar entre as visualizações de infraestrutura, cargas de trabalho ou serviços com os links acima do painel.

62066a9251d19843.png

Na visualização "Cargas de trabalho", expanda "my-gke-cluster" e detalhe até default > webserver-statefulset > webserver-statefulset-0 > webserver-statefulset. Clique no contêiner do conjunto stateful do webserver. Aqui, você encontra algumas métricas prontas para uso capturadas pelo Stackdriver, incluindo uso de memória e uso da CPU.

d054778de301429e.png

Os gráficos mostrados neste painel são os que vamos usar para criar um painel personalizado.

Painéis personalizados

Com o Stackdriver, é possível criar painéis personalizados para organizar gráficos e tabelas de qualquer dado de métrica disponível. Vamos criar um painel personalizado para fornecer uma visão geral 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 temos nosso painel vazio, podemos adicionar as métricas que queremos monitorar. Vamos dar ao painel sem título um nome útil, como "Meus contêineres de servidor da Web", e clicar em "Adicionar gráfico" no canto superior direito:

bd66ba91f3125028.png

Lembra das métricas prontas para uso? Vamos adicionar um gráfico para a utilização da CPU do contêiner. No campo "Título do gráfico", digite "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 vai preencher os campos "Tipo de recurso" e "Métrica".

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

Agora temos um painel com nosso primeiro gráfico.

3d3d45e4357454e0.png

7. Política de alertas e verificação de tempo de atividade

Com o Stackdriver, podemos configurar alertas para receber notificações quando qualquer métrica atingir os valores limite especificados. Por exemplo, podemos fazer com que o Stackdriver nos envie 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 app. Para demonstrar como esses alertas são, vamos configurar uma verificação de tempo de atividade e simular uma interrupção.

No painel à esquerda, selecione "Verificações de tempo de atividade" e "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. Clique no botão Adicionar verificação de tempo de atividade na parte superior direita da página.

d884560f91011009.png

No formulário a seguir, insira "Tempo de atividade do endpoint" como título e o endereço IP externo do balanceador de carga como nome do host.

568a8f1e27ae8417.png

Clique em Salvar e crie uma política de alertas:

f89d53a106a709f4.png

Clique em Criar política de alertas.

Vamos nomear como "Política de tempo de atividade do endpoint". Na seção Configuração, defina "Condição acionada se" como "Qualquer violação de série temporal" e clique em Salvar.

74609849348bd03e.png

Ainda não terminamos. Em seguida, vamos especificar um canal de notificação para que possamos ser avisados quando nossa política de alertas for violada. No menu suspenso "Tipo de canal de notificação", selecione "E-mail" e digite 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 ver como um alerta vai aparecer, abra o Cloud Shell novamente no console do Cloud. O comando a seguir vai interromper o serviço nginx em execução no pod do servidor da Web:

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

Depois de alguns minutos, você vai receber um alerta por e-mail sobre a interrupção do serviç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ê vai receber outro e-mail do Stackdriver, desta vez com notícias melhores:

5b8262fbbc4877c.png

8. Limpeza

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

Excluir o projeto

Se preferir, exclua todo o projeto. 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, siga para a próxima seção.

Stackdriver

Painel

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

Política de alertas

Na página "Políticas", selecione Excluir no menu "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 Migrate for Anthos, conjunto com estado e serviço de balanceador de carga)

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

Discos

Nosso conjunto stateful usou um disco que criamos. Use o seguinte para recuperar o nome:

gcloud compute disks list --filter=webserver

Usando o nome do seu disco em vez do meu, exclua-o com:

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

Tudo limpo!

9. Parabéns!

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

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 de conjunto com estado para o mundo expondo-o 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 saber quando nosso servidor da Web fica inativo.