Migre do Istio 1.11 ou posterior para a Cloud Service Mesh

Este tutorial mostra-lhe como migrar uma aplicação de um cluster do Google Kubernetes Engine (GKE) que usa o Istio para um novo cluster que usa a malha de serviços gerida do Cloud Service Mesh, 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 Istio e o gateway de entrada do Istio 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 o Istio.
  3. Crie outro cluster do Google Kubernetes Engine no mesmo Google Cloud projeto.
  4. Ative o Cloud Service Mesh gerido no segundo cluster e implemente o gateway de entrada do Cloud Service Mesh.
  5. Implemente a Online Boutique no cluster com a Cloud Service Mesh para replicar a implementação do cluster com o Istio.
  6. Desvie 50% do tráfego de utilizadores do cluster com o Istio para o cluster com o Cloud Service Mesh através das capacidades de divisão de tráfego do Istio no cluster com o Istio.
  7. Conclua a migração do Istio para o Cloud Service Mesh apontando a entrada do sistema de nomes de domínio (DNS) do cluster com o Istio para o cluster com o Cloud Service Mesh.

O tráfego de utilizadores é dividido em 50/50 entre um cluster com o Istio e um cluster com o Cloud Service Mesh. 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 do Istio para o Cloud Service Mesh gerido:

  • Migração do plano de controlo canário: nesta estratégia, aprovisiona o Cloud Service Mesh gerido no mesmo cluster em que o Istio 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 Istio

    Crie o cluster e instale o Istio

    Na secção, cria o cluster que usa o Istio. 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-istio \
        --project=PROJECT_ID \
        --zone=us-central1-a \
        --machine-type=e2-standard-2 --num-nodes=3
      
    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-istio \
        cluster-with-istio
      
    3. Verifique se o contexto do cluster foi alterado:

      kubectl config get-contexts --output="name"
      
    4. Instale o Istio no cluster. Para simplificar, vai instalar o perfil predefinido do Istio e a versão que corresponde à sua instalação do istioctl.

      istioctl install
      

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

      O resultado é semelhante ao seguinte:

      This will install the Istio X.Y.Z default profile with ["Istio core" "Istiod" "Ingress gateways"] components into the cluster. Proceed? (y/N)
      ✔ Istio core installed
      ✔ Istiod installed
      ✔ Ingress gateways installed
      ✔ Installation complete
      Making this installation the default for injection and validation.
      

    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-istio \
        create namespace onlineboutique
      
    2. Implemente os 12 serviços da Online Boutique, que incluem um gerador de carga que imita o tráfego de utilizadores:

      kubectl \
        --namespace=onlineboutique \
        --context=cluster-with-istio \
        apply -f microservices-demo/release/kubernetes-manifests.yaml
      
    3. O passo anterior também implementou um serviço denominado frontend-external (do tipo LoadBalancer) ao qual é atribuído um endereço IP externo. No entanto, só quer permitir a entrada pública através da implementação do gateway de entrada do Istio. Elimine o recurso de serviço frontend-external:

      kubectl \
        --namespace=onlineboutique \
        --context=cluster-with-istio \
        delete service frontend-external
      
    4. Implemente um recurso do Istio Gateway e um recurso do Istio VirtualService para que o tráfego público aceda à Online Boutique:

      kubectl \
        --namespace=onlineboutique \
        --context=cluster-with-istio \
        apply -f microservices-demo/istio-manifests/frontend-gateway.yaml
      
    5. Obtenha o endereço IP externo do gateway de entrada do Istio:

      kubectl \
        --namespace istio-system \
        --context=cluster-with-istio \
        get service --output jsonpath='{.items[0].status.loadBalancer.ingress[0].ip}'
      
    6. Copie o endereço IP externo do serviço istio-ingressgateway e, em seguida, aceda ao mesmo através do 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 a malha de serviços na nuvem gerida e implementar a Online Boutique para replicar as implementações do cluster que usa o Istio.

    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 o Istio 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 malha de serviços na nuvem gerida. Para o conseguir, implementa dois recursos do Istio no cluster com o Istio:

    • Uma ServiceEntry para informar o Istio sobre o ponto final da loja online do cluster do Cloud Service Mesh gerido
    • um VirtualService para indicar ao gateway de entrada do Istio 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 o Istio:

      kubectl \
        --context cluster-with-istio \
        --namespace onlineboutique \
        apply -f anthos-service-mesh-samples/docs/migrate-to-managed-asm/service-entry.yaml
      
    3. Implemente o VirtualService no cluster com o Istio:

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

      kubectl \
        --context cluster-with-istio \
        --namespace istio-system \
        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 do domínio (como example.com) para o endereço IP da entrada em execução no cluster com o Istio.

    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 Istio:

      gcloud container clusters delete cluster-with-istio \
        --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?