Migre o cluster para o plano de controlo gerido num novo cluster

Este tutorial mostra como migrar uma aplicação de um cluster do Google Kubernetes Engine (GKE) que usa a Cloud Service Mesh no cluster para um novo cluster que usa a Cloud Service Mesh gerida, a malha de serviços totalmente gerida e compatível com o Istio da Google.

Neste tutorial:

  1. Crie um novo cluster do Google Kubernetes Engine e instale o Cloud Service Mesh no cluster e o gateway de entrada do Cloud Service Mesh no cluster. Este cluster vai funcionar como o cluster existente do qual quer migrar.
  2. Implemente a aplicação de exemplo Online Boutique no cluster com a malha de serviços na nuvem no cluster.
  3. Crie outro cluster do Google Kubernetes Engine no mesmo Google Cloud projeto.
  4. Aprovisione a malha de serviços na nuvem gerida no segundo cluster e implemente o gateway de entrada da malha de serviços na nuvem.
  5. Implemente a Online Boutique no cluster com o Cloud Service Mesh gerido para replicar a implementação do cluster com o Cloud Service Mesh no cluster.
  6. Desvie 50% do tráfego de utilizadores do cluster com a Cloud Service Mesh no cluster para o cluster com a Cloud Service Mesh gerida, usando as capacidades de divisão de tráfego do Istio no cluster com a Cloud Service Mesh no cluster.
  7. Conclua a migração do Cloud Service Mesh no cluster para o Cloud Service Mesh gerido apontando a entrada do sistema de nomes de domínio (DNS) do cluster com o Cloud Service Mesh no cluster para o cluster com o Cloud Service Mesh gerido.

O tráfego de utilizadores é dividido em partes iguais entre um cluster com a Cloud Service Mesh no cluster e um cluster com a Cloud Service Mesh gerida. Cada cluster contém a sua própria implementação da Online Boutique.

Implementação de teste

A "implementação canária" é uma técnica usada no desenvolvimento de software para testar uma nova versão de algum software antes de lançar essa nova versão para todos os utilizadores. Envolve o aumento incremental da percentagem de tráfego enviado para a nova versão. Neste tutorial, vai configurar um novo cluster com a malha de serviços do Google Cloud gerida e transferir gradualmente o tráfego de utilizadores para este. Começa por direcionar 0% do tráfego de utilizadores para o novo cluster, depois 50% e, finalmente, 100%. Na produção, deve usar incrementos mais pequenos e mais frequentes. Se, em qualquer altura, notar que o novo cluster não consegue processar uma percentagem de tráfego, pode reverter a situação reduzindo a percentagem para 0%.

Painel de controlo Canary versus cluster Canary

Existem duas estratégias usadas frequentemente para migrações da malha de serviços na nuvem no cluster para a malha de serviços na nuvem gerida:

  • Migração do plano de controlo canário: nesta estratégia, aprovisiona o Cloud Service Mesh gerido no mesmo cluster em que o Cloud Service Mesh no cluster está instalado.
  • Migração de cluster canário: nesta estratégia, cria um novo cluster e, em seguida, aprovisiona o Cloud Service Mesh gerido no mesmo.

Neste tutorial, vai percorrer a estratégia de migração de cluster canário.

Custos

Este tutorial usa os seguintes componentes faturáveis do Google Cloud:

Quando terminar este tutorial, pode evitar custos contínuos eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the required APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. Inicie o Cloud Shell

    Neste tutorial, vai usar o Cloud Shell, que é um ambiente de shell alojado no Google Cloud que lhe permite gerir os seus recursos doGoogle Cloud .

    O Cloud Shell vem pré-instalado com as ferramentas de linha de comandos CLI do Google Cloud, kubectl e istioctl. A CLI gcloud fornece a CLI principal para o Google Cloud.

    Abra uma sessão do Cloud Shell no canto superior direito desta página, clique em e, de seguida, clique em Confirmar. É aberta uma sessão do Cloud Shell num frame na parte inferior da página. Conclua os seguintes comandos nessa sessão do Cloud Shell.

    Transfira código de exemplo

    Clone os repositórios git que contêm os recursos do Kubernetes e do Istio que vai usar:

      git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-samples.git
      git clone https://github.com/GoogleCloudPlatform/microservices-demo.git
    

    Configure o cluster com o Cloud Service Mesh no cluster

    Crie o cluster e instale a malha de serviço na nuvem no cluster

    Nesta secção, cria o cluster que usa o Cloud Service Mesh no cluster. Na prática, estes seriam os clusters que já está a usar.

    1. Substitua PROJECT_ID pelo seu ID do projeto e crie um novo cluster:

      gcloud container clusters create cluster-with-in-cluster-asm \
        --project=PROJECT_ID \
        --zone=us-central1-a \
        --machine-type=e2-standard-4 --num-nodes=2 \
        --workload-pool=PROJECT_ID.svc.id.goog
      
    2. Mude o nome do contexto do cluster para que seja mais fácil trabalhar com o cluster:

      kubectl config rename-context \
        gke_PROJECT_ID_us-central1-a_cluster-with-in-cluster-asm \
        cluster-with-in-cluster-asm
      
    3. Verifique se o contexto do cluster foi alterado:

      kubectl config get-contexts --output="name"
      
    4. Transfira a versão que instala o Cloud Service Mesh 1.26.4 para o diretório de trabalho atual:

      curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.26 > asmcli
      

      É-lhe pedido que escreva "y" e, em seguida, prima Enter.

      O resultado é semelhante ao seguinte:

      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
      100  167k  100  167k    0     0   701k      0 --:--:-- --:--:-- --:--:--  701k
      
    5. Torne o script asmcli executável:

      chmod +x asmcli
      
    6. Instale o Cloud Service Mesh no cluster através do asmcli:

      ./asmcli install \
        --project_id PROJECT_ID \
        --cluster_name cluster-with-in-cluster-asm \
        --cluster_location us-central1-a \
        --output_dir . \
        --enable_all \
        --ca mesh_ca
      

      A ferramenta asmcli pode demorar alguns minutos a terminar. A ferramenta produz mensagens informativas para que possa acompanhar o respetivo progresso.

      Em caso de êxito, o resultado é semelhante ao seguinte:

      ...
      asmcli: Successfully installed ASM.
      

    Implemente o gateway de entrada do Cloud Service Mesh

    1. Vai implementar o gateway de entrada do Cloud Service Mesh num espaço de nomes separado denominado asm-ingress. Crie o espaço de nomes:

      kubectl \
        --context cluster-with-in-cluster-asm \
        create namespace asm-ingress
      
    2. Use a etiqueta istio.io/rev=asm-1264-1 para adicionar o espaço de nomes asm-ingress à malha de serviços e ativar a injeção automática de proxy sidecar.

      kubectl \
        --context cluster-with-in-cluster-asm \
        label --overwrite namespace asm-ingress istio.io/rev=asm-1264-1
      

      O resultado é semelhante ao seguinte:

      namespace/asm-ingress labeled
      
    3. Implemente o gateway de entrada do Cloud Service Mesh:

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace=asm-ingress \
        apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml
      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace=asm-ingress \
        apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
      

      O resultado é semelhante ao seguinte:

      serviceaccount/asm-ingressgateway created
      service/asm-ingressgateway created
      deployment.apps/asm-ingressgateway created
      gateway.networking.istio.io/asm-ingressgateway created
      

    Implemente a loja online

    1. Vai implementar a Online Boutique num namespace separado denominado onlineboutique. Crie o espaço de nomes:

      kubectl \
        --context cluster-with-in-cluster-asm \
        create namespace onlineboutique
      
    2. Use a etiqueta istio.io/rev=asm-1264-1 para adicionar o espaço de nomes onlineboutique à malha de serviços e ativar a injeção automática de proxy sidecar.

      kubectl \
        --context cluster-with-in-cluster-asm \
        label --overwrite namespace onlineboutique istio.io/rev=asm-1264-1
      

      O resultado é semelhante ao seguinte:

      namespace/onlineboutique labeled
      
    3. Implemente os 12 serviços da Online Boutique, incluindo o gerador de carga que imita o tráfego de utilizadores:

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace=onlineboutique \
        apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace=onlineboutique \
        apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
      
    4. Obtenha o endereço IP externo do gateway de entrada do Cloud Service Mesh:

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace asm-ingress \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
      
    5. Copie o endereço IP externo do gateway de entrada e aceda ao mesmo através do seu navegador de Internet. É apresentada a app de exemplo Online Boutique.

    Configure o novo cluster com o Cloud Service Mesh gerido

    Crie o cluster e aprovisione a malha de serviço do Google Cloud gerida

    Nesta secção, cria o cluster para o qual vai migrar. Vai aprovisionar o Cloud Service Mesh gerido e implementar a Online Boutique para replicar as implementações do cluster que usa o Cloud Service Mesh no cluster.

    1. Crie um novo cluster:

      gcloud container clusters create cluster-with-csm \
        --project=PROJECT_ID --zone=us-central1-a \
        --machine-type=e2-standard-4 --num-nodes=2 \
        --workload-pool PROJECT_ID.svc.id.goog
      
    2. Mude o nome do contexto do cluster para que seja mais fácil trabalhar com o cluster:

      kubectl config rename-context \
        gke_PROJECT_ID_us-central1-a_cluster-with-csm \
        cluster-with-csm
      
    3. Verifique se o contexto do cluster foi alterado:

      kubectl config get-contexts --output="name"
      
    4. Ative o Cloud Service Mesh na frota do seu projeto. Uma frota é um agrupamento lógico de clusters do Kubernetes e outros recursos que podem ser geridos em conjunto.

      gcloud container fleet mesh enable --project PROJECT_ID
      

      O resultado é semelhante ao seguinte:

      Waiting for Feature Service Mesh to be created...done.
      
    5. Registe o cluster na frota do projeto:

      gcloud container fleet memberships register cluster-with-csm-membership \
        --gke-cluster=us-central1-a/cluster-with-csm \
        --enable-workload-identity \
        --project PROJECT_ID
      

      O resultado é semelhante ao seguinte:

      Waiting for membership to be created...done.
      Finished registering to the Fleet.
      
    6. Ative o Cloud Service Mesh gerido no cluster:

      gcloud container fleet mesh update \
        --management automatic \
        --memberships cluster-with-csm-membership \
        --project PROJECT_ID
      

      O resultado é semelhante ao seguinte:

      Waiting for Feature Service Mesh to be updated...done.
      
    7. Verifique se o Cloud Service Mesh gerido foi aprovisionado para o cluster e se está pronto a ser usado:

      gcloud container fleet mesh describe --project PROJECT_ID
      

      O Cloud Service Mesh pode demorar cerca de 10 minutos a ser aprovisionado e a ficar pronto a usar no cluster. Se vir controlPlaneManagement.state: DISABLED ou controlPlaneManagement.state: PROVISIONING, tem de executar novamente o comando anterior a cada poucos minutos até ver controlPlaneManagement.state: ACTIVE.

      O resultado é semelhante ao seguinte:

      createTime: '2022-07-06T01:05:39.110120474Z'
      membershipSpecs:
        projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
          mesh:
            management: MANAGEMENT_AUTOMATIC
      membershipStates:
        projects/123456789123/locations/global/memberships/cluster-with-csm-membership:
          servicemesh:
            controlPlaneManagement:
              details:
              - code: REVISION_READY
                details: 'Ready: asm-managed'
              state: ACTIVE
            dataPlaneManagement:
              details:
              - code: OK
                details: Service is running.
              state: ACTIVE
          state:
            code: OK
            description: 'Revision(s) ready for use: asm-managed.'
            updateTime: '2022-07-06T01:19:24.243993678Z'
      name: projects/your-project-id/locations/global/features/servicemesh
      resourceState:
        state: ACTIVE
      spec: {}
      state:
        state: {}
      updateTime: '2022-07-06T01:19:27.475885687Z'
      

    Implemente o gateway de entrada do Cloud Service Mesh

    1. Vai implementar o gateway de entrada do Cloud Service Mesh num espaço de nomes separado denominado asm-ingress. Crie o espaço de nomes:

      kubectl \
        --context cluster-with-csm \
        create namespace asm-ingress
      
    2. Use a etiqueta istio.io/rev=asm-managed para adicionar o espaço de nomes asm-ingress à malha de serviços e ativar a injeção automática de proxy sidecar.

      kubectl \
        --context cluster-with-csm \
        label namespace asm-ingress 'istio.io/rev=asm-managed'
      
    3. Implemente o gateway de entrada do Cloud Service Mesh:

      kubectl \
        --context cluster-with-csm \
        --namespace=asm-ingress \
        apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/asm-gateway-deployment-svc.yaml
      kubectl \
        --context cluster-with-csm \
        --namespace=asm-ingress \
        apply -f anthos-service-mesh-samples/docs/shared/asm-ingress-gateway/gateway.yaml
      

      O resultado é semelhante ao seguinte:

      namespace/asm-ingress configured
      serviceaccount/asm-ingressgateway configured
      service/asm-ingressgateway configured
      deployment.apps/asm-ingressgateway configured
      gateway.networking.istio.io/asm-ingressgateway configured
      

    Implemente a loja online

    1. Vai implementar a Online Boutique num namespace separado denominado onlineboutique. Crie o espaço de nomes:

      kubectl \
        --context cluster-with-csm \
        create namespace onlineboutique
      
    2. Use a etiqueta istio.io/rev=asm-managed para adicionar o espaço de nomes onlineboutique à malha de serviços e ativar a injeção automática de proxy sidecar.

      kubectl \
        --context cluster-with-csm \
        label namespace onlineboutique 'istio.io/rev=asm-managed'
      
    3. Implemente os 12 serviços da Online Boutique, incluindo o gerador de carga que imita o tráfego de utilizadores:

      kubectl \
        --context cluster-with-csm \
        --namespace=onlineboutique \
        apply -f anthos-service-mesh-samples/docs/shared/online-boutique/kubernetes-manifests.yaml
      kubectl \
        --context cluster-with-csm \
        --namespace=onlineboutique \
        apply -f anthos-service-mesh-samples/docs/shared/online-boutique/virtual-service.yaml
      
    4. Obtenha o endereço IP externo do gateway de entrada do Cloud Service Mesh:

      kubectl \
        --context cluster-with-csm \
        --namespace asm-ingress \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
      
    5. Copie o endereço IP externo do serviço asm-ingressgateway e aceda ao mesmo através do navegador de Internet. É apresentada a app de exemplo Online Boutique. Vai usar o endereço IP externo na secção seguinte, por isso, copie-o para uma variável de ambiente:

      export INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM=$( \
        kubectl \
          --context cluster-with-csm \
          --namespace asm-ingress \
          get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}' \
        )
      

    Teste o cluster com a malha de serviços na nuvem através de uma implementação

    Nesta secção, configura o cluster com a Cloud Service Mesh no cluster de modo que 50% do tráfego de utilizadores para a Online Boutique seja transferido para a instância da Online Boutique no cluster com a Cloud Service Mesh gerida. Para o conseguir, implementa dois recursos do Istio no cluster com a malha de serviços na nuvem no cluster:

    • Uma ServiceEntry para informar o Cloud Service Mesh no cluster sobre o ponto final da Online Boutique do cluster do Cloud Service Mesh gerido
    • Um VirtualService para indicar ao gateway de entrada do Cloud Service Mesh no cluster que divida o tráfego 50/50.
    1. Defina o endereço IP do gateway de entrada do cluster do Cloud Service Mesh gerido no recurso ServiceEntry:

      sed -i "s/1.2.3.4/${INGRESS_IP_OF_CLUSTER_WITH_MANAGED_ASM}/" anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
      
    2. Implemente o ServiceEntry no cluster com a malha de serviços na nuvem no cluster:

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace onlineboutique \
        apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
      
    3. Implemente o VirtualService no cluster com a malha de serviços na nuvem no cluster:

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace onlineboutique \
        apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/virtual-service-in-cluster-asm.yaml
      
    4. Visite o endereço IP do gateway de entrada do cluster com o Cloud Service Mesh no cluster no seu navegador de Internet:

      kubectl \
        --context cluster-with-in-cluster-asm \
        --namespace asm-ingress \
        get service
      

      Atualize a página inicial da loja online várias vezes e verifique o rodapé da página de cada vez. Repare que 50% dos pedidos são processados por um Pod no cluster com o Cloud Service Mesh gerido.

    Migre para o cluster com o Cloud Service Mesh gerido

    Esta secção pressupõe que é proprietário de um nome de domínio e tem acesso às respetivas definições de DNS (servidor de nomes do domínio).

    1. Adicione um registo A às definições de DNS para apontar o nome de domínio (como example.com) para o endereço IP do gateway de entrada em execução no cluster com a malha de serviços na nuvem no cluster.

    2. Aceda à Online Boutique visitando o nome do domínio no seu navegador de Internet.

    3. Minimize o tempo de vida (TTL) do registo de DNS para garantir que pode reverter rapidamente a entrada de DNS se precisar de reverter.

    4. Defina o registo A do nome do seu domínio para o endereço IP externo do gateway de entrada do cluster com o Cloud Service Mesh gerido.

    5. Quando a migração for bem-sucedida, elimine o cluster com o Cloud Service Mesh no cluster:

      gcloud container clusters delete cluster-with-in-cluster-asm \
        --zone=us-central1-a \
        --project=PROJECT_ID
      

    Limpar

    Para evitar incorrer em custos na sua Google Cloud conta pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

    Eliminar projeto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Elimine os recursos

    Elimine o cluster com a malha de serviços na nuvem gerida:

      gcloud container clusters delete cluster-with-managed-asm \
        --zone=us-central1-a \
        --project=PROJECT_ID
    

    O que se segue?