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:
- 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.
- Implemente a aplicação de exemplo Online Boutique no cluster com a malha de serviços na nuvem no cluster.
- Crie outro cluster do Google Kubernetes Engine no mesmo Google Cloud projeto.
- 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.
- 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.
- 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.
- 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.
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
- 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-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
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
Verifique se o contexto do cluster foi alterado:
kubectl config get-contexts --output="name"
Transfira a versão que instala o Cloud Service Mesh 1.25.4 para o diretório de trabalho atual:
curl https://storage.googleapis.com/csm-artifacts/asm/asmcli_1.25 > 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
Torne o script
asmcli
executável:chmod +x asmcli
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.
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
Use a etiqueta
istio.io/rev=asm-1254-0
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-in-cluster-asm \ label --overwrite namespace asm-ingress istio.io/rev=asm-1254-0
O resultado é semelhante ao seguinte:
namespace/asm-ingress labeled
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
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
Use a etiqueta
istio.io/rev=asm-1254-0
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-in-cluster-asm \ label --overwrite namespace onlineboutique istio.io/rev=asm-1254-0
O resultado é semelhante ao seguinte:
namespace/onlineboutique labeled
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
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}'
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.
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 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.
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 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
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
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.
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.
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 Cloud Service Mesh no cluster:
gcloud container clusters delete cluster-with-in-cluster-asm \ --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 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.
Implemente o gateway de entrada do Cloud Service Mesh
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 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.
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 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:
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