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:
- 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.
- Implemente a aplicação de exemplo Online Boutique no cluster com o Istio.
- Crie outro cluster do Google Kubernetes Engine no mesmo Google Cloud projeto.
- Ative o Cloud Service Mesh gerido no segundo cluster e implemente o gateway de entrada do Cloud Service Mesh.
- Implemente a Online Boutique no cluster com a Cloud Service Mesh para replicar a implementação do cluster com o Istio.
- 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.
- 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.
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
- 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.
-
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. -
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 theresourcemanager.projects.create
permission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
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 theserviceusage.services.enable
permission. Learn how to grant roles. 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
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
Verifique se o contexto do cluster foi alterado:
kubectl config get-contexts --output="name"
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.
Vai implementar a Online Boutique num namespace separado denominado
onlineboutique
. Crie o espaço de nomes:kubectl \ --context cluster-with-istio \ create namespace onlineboutique
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
O passo anterior também implementou um serviço denominado
frontend-external
(do tipoLoadBalancer
) 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çofrontend-external
:kubectl \ --namespace=onlineboutique \ --context=cluster-with-istio \ delete service frontend-external
Implemente um recurso do Istio
Gateway
e um recurso do IstioVirtualService
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
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}'
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.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
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
Verifique se o contexto do cluster foi alterado:
kubectl config get-contexts --output="name"
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.
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.
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.
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
oucontrolPlaneManagement.state: PROVISIONING
, tem de executar novamente o comando anterior a cada poucos minutos até vercontrolPlaneManagement.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'
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
Use a etiqueta
istio.io/rev=asm-managed
para adicionar o espaço de nomesasm-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'
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
Vai implementar a Online Boutique num namespace separado denominado
onlineboutique
. Crie o espaço de nomes:kubectl \ --context cluster-with-csm \ create namespace onlineboutique
Use a etiqueta
istio.io/rev=asm-managed
para adicionar o espaço de nomesonlineboutique
à 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'
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
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}'
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}' \ )
- 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.
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
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
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
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.
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.
Aceda à Online Boutique visitando o nome do domínio no seu navegador de Internet.
Minimize o tempo de vida (TTL) do registo de DNS para garantir que pode reverter rapidamente a entrada de DNS se precisar de reverter.
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.
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
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
- Saiba mais sobre a Managed Cloud Service Mesh.
- Saiba mais sobre as práticas recomendadas de segurança da Cloud Service Mesh.
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 terminal 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.
Implemente a loja online
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.
Implemente o gateway de entrada do Cloud Service Mesh
Implemente a loja online
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:
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).
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
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