Crie um cluster do GKE com a malha de serviço do Google Cloud e a CLI gcloud
Neste tutorial, vai aprovisionar o Cloud Service Mesh gerido através da API Fleet do Google Kubernetes Engine (GKE) num novo cluster público do GKE. Este tutorial explica como:
- Configurar o seu Google Cloud projeto.
- Criar um cluster do GKE com o número mínimo de vCPUs exigido pela malha de serviço na nuvem.
- Registar o cluster do GKE na frota do seu projeto.
- Aprovisionamento da malha de serviços na nuvem gerida no cluster através da API Fleet.
- Implementar um gateway de entrada para expor a aplicação.
- Implementar uma aplicação de exemplo para poder ver os dados de telemetria nos painéis de controlo do Cloud Service Mesh na Google Cloud consola.
- Expor e aceder à aplicação de exemplo.
API Fleet
Este guia pressupõe que está familiarizado com as frotas, que são
agrupamentos lógicos de clusters do GKE e outros recursos que podem ser
geridos em conjunto. Uma frota é um conceito do GKE e não um conceito do Kubernetes. O registo de um cluster numa frota permite-lhe aprovisionar o Cloud Service Mesh gerido nesse cluster através do comando gcloud container fleet mesh update
.
A utilização de frotas é ativada pela API Fleet (gkehub.googleapis.com
), que
ativa quando inicia este tutorial.
Custos
Neste documento, usa os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
Quando terminar este início rápido, pode evitar a faturação contínua eliminando o cluster. 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 GKE, Fleet (GKE Hub), and Cloud Service Mesh 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 GKE, Fleet (GKE Hub), and Cloud Service Mesh 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. - Tome nota do seu ID do projeto.
O Cloud Shell inclui
gcloud
,kubectl
,git
e as outras ferramentas de linha de comandos de que precisa.O diretório $HOME do Cloud Shell tem 5 GB de espaço de armazenamento persistente.
Tem à sua escolha editores de texto:
Editor de código, ao qual acede clicando em edit na parte superior da janela do Cloud Shell.
Emacs, Vim ou Nano, aos quais acede a partir da linha de comandos no Cloud Shell.
Certifique-se de que tem as seguintes ferramentas instaladas:
Autentique com a CLI do Google Cloud:
gcloud auth login --project PROJECT_ID
Atualize os componentes:
gcloud components update
Execute o seguinte comando para criar o cluster com o número mínimo de vCPUs exigido pelo Cloud Service Mesh. No comando, substitua os marcadores de posição pelas seguintes informações:
- CLUSTER_NAME: o nome do cluster. O nome só pode conter carateres alfanuméricos em minúsculas e
-
, tem de começar por uma letra e terminar com um caráter alfanumérico, e não pode ter mais de 40 carateres. - PROJECT_ID: o ID do projeto no qual o cluster vai ser criado.
- CLUSTER_LOCATION: a
zona para o cluster, como
us-central1-a
.
gcloud container clusters create CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION \ --machine-type=e2-standard-4 \ --num-nodes=2 \ --workload-pool=PROJECT_ID.svc.id.goog
A criação do cluster demora vários minutos. Enquanto o cluster está a ser criado, o comando
gcloud
apresenta o seguinte:Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...working...
O resultado esperado da criação bem-sucedida é semelhante ao seguinte:
Creating cluster CLUSTER_NAME in CLUSTER_LOCATION...done. Created [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME]. To inspect the contents of your cluster, go to: https://console.cloud.google.com/kubernetes/workload_/gcloud/CLUSTER_LOCATION/CLUSTER_NAME?project=PROJECT_ID kubeconfig entry generated for CLUSTER_NAME. NAME: CLUSTER_NAME LOCATION: CLUSTER_LOCATION MASTER_VERSION: 1.20.10-gke.1600 MASTER_IP: 198.51.100.1 MACHINE_TYPE: e2-standard-4 NODE_VERSION: 1.20.10-gke.1600 NUM_NODES: 2 STATUS: RUNNING
- CLUSTER_NAME: o nome do cluster. O nome só pode conter carateres alfanuméricos em minúsculas e
Obtenha credenciais de autenticação para interagir com o cluster.
gcloud container clusters get-credentials CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Resultado esperado:
Fetching cluster endpoint and auth data. kubeconfig entry generated for CLUSTER_NAME.
Defina o contexto atual de
kubectl
para o cluster.kubectl config set-context CLUSTER_NAME
Resultado esperado:
Context "CLUSTER_NAME" created.
Ative o Cloud Service Mesh na frota do seu projeto.
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 Fleet do projeto:
gcloud container fleet memberships register CLUSTER_NAME-membership \ --gke-cluster=CLUSTER_LOCATION/CLUSTER_NAME \ --enable-workload-identity \ --project PROJECT_ID
O resultado é semelhante ao seguinte:
Waiting for membership to be created...done. Finished registering to the Fleet.
Aprovisione a malha de serviços na nuvem gerida no cluster através da API Fleet:
gcloud container fleet mesh update \ --management automatic \ --memberships CLUSTER_NAME-membership \ --project PROJECT_ID
O resultado é semelhante ao seguinte:
Waiting for Feature Service Mesh to be updated...done.
Verifique se a malha de serviços na nuvem gerida foi ativada para o cluster e está pronta a ser usada:
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/your-cluster-membership: mesh: management: MANAGEMENT_AUTOMATIC membershipStates: projects/123456789123/locations/global/memberships/your-cluster-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'
Crie um espaço de nomes para o gateway de entrada, se ainda não tiver um. Os gateways são cargas de trabalho do utilizador e, como prática recomendada, não devem ser implementados no espaço de nomes do plano de controlo. Substitua
GATEWAY_NAMESPACE
pelo nome do seu espaço de nomes.kubectl create namespace GATEWAY_NAMESPACE
Resultado esperado:
namespace/GATEWAY_NAMESPACE created
Ative a injeção automática no gateway. Os passos necessários dependem de querer usar etiquetas de injeção predefinidas (por exemplo,
istio-injection=enabled
) ou a etiqueta de revisão no espaço de nomes do gateway. A etiqueta de revisão e a etiqueta de revisão predefinidas são usadas pelo webhook do injetor sidecar para associar proxies injetados a uma revisão do plano de controlo específica.Etiquetas de injeção predefinidas
Aplique as etiquetas de injeção predefinidas ao espaço de nomes.
kubectl label namespace GATEWAY_NAMESPACE istio-injection=enabled istio.io/rev-
Etiqueta de revisão
Use o seguinte comando para localizar a etiqueta de revisão em
istiod
:kubectl get deploy -n istio-system -l app=istiod -o \ "jsonpath={.items[*].metadata.labels['istio\.io/rev']}{'\n'}"
O comando produz a etiqueta de revisão que corresponde à versão do Cloud Service Mesh, por exemplo:
asm-11910-9
Aplique a etiqueta de revisão ao espaço de nomes. No comando seguinte,
REVISION
é o valor da etiqueta de revisãoistiod
que anotou no passo anterior.kubectl label namespace GATEWAY_NAMESPACE \ istio.io/rev=REVISION --overwrite
Resultado esperado:
namespace/GATEWAY_NAMESPACE labeled
Pode ignorar a mensagem
"istio.io/rev" not found
no resultado. Isto significa que o espaço de nomes não tinha anteriormente a etiquetaistio.io/rev
, o que deve esperar em novas instalações do Cloud Service Mesh ou novas implementações. Uma vez que a injeção automática falha se um espaço de nomes tiver a etiquetaistio.io/rev
e a etiquetaistio-injection
, todos os comandoskubectl label
na documentação do Cloud Service Mesh especificam explicitamente ambas as etiquetas.Se o espaço de nomes do gateway não estiver etiquetado, os pods
istio-ingressgateway
falham com um erroImagePullBackOff
quando o gateway tenta extrair a imagemauto
. Esta imagem deve ser substituída pelo webhook.Transfira o ficheiro de configuração .yaml do gateway de entrada de exemplo do repositório.
anthos-service-mesh-packages
Aplique a configuração .yaml do gateway de entrada de exemplo tal como está ou modifique-a conforme necessário.
kubectl apply -n GATEWAY_NAMESPACE \ -f CONFIG_PATH/istio-ingressgateway
Resultado esperado:
deployment.apps/istio-ingressgateway created poddisruptionbudget.policy/istio-ingressgateway created horizontalpodautoscaler.autoscaling/istio-ingressgateway created role.rbac.authorization.k8s.io/istio-ingressgateway created rolebinding.rbac.authorization.k8s.io/istio-ingressgateway created service/istio-ingressgateway created serviceaccount/istio-ingressgateway created
Crie os espaços de nomes para a aplicação:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
Resultado esperado:
namespace/ad created namespace/cart created namespace/checkout created namespace/currency created namespace/email created namespace/frontend created namespace/loadgenerator created namespace/payment created namespace/product-catalog created namespace/recommendation created namespace/shipping created
Ative a injeção automática de sidecar (injeção automática). O comando necessário depende de querer usar etiquetas de injeção predefinidas (por exemplo,
istio-injection=enabled
) ou a mesma etiqueta de revisão que usou para anotar o espaço de nomes do gateway de entradaEtiquetas de injeção predefinidas
Aplique as etiquetas de injeção predefinidas ao espaço de nomes. No comando seguinte, GATEWAY_NAMESPACE é o mesmo valor que usou para anotar o espaço de nomes do gateway de entrada.
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio-injection=enabled istio.io/rev- done;
Resultado esperado:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Etiqueta de revisão
Aplique a etiqueta de revisão aos espaços de nomes da aplicação. No comando seguinte, REVISION é o mesmo valor que usou para anotar o espaço de nomes do gateway de entrada.
for ns in ad cart checkout currency email frontend loadgenerator payment product-catalog recommendation shipping; do kubectl label namespace $ns istio.io/rev=REVISION --overwrite done;
Resultado esperado:
namespace/ad labeled namespace/cart labeled namespace/checkout labeled namespace/currency labeled namespace/email labeled namespace/frontend labeled namespace/loadgenerator labeled namespace/payment labeled namespace/product-catalog labeled namespace/recommendation labeled namespace/shipping labeled
Implemente a aplicação de exemplo no cluster.
Crie as contas de serviço e as implementações:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/deployments
Resultado esperado:
serviceaccount/ad created deployment.apps/adservice created serviceaccount/cart created deployment.apps/cartservice created serviceaccount/checkout created deployment.apps/checkoutservice created serviceaccount/currency created deployment.apps/currencyservice created serviceaccount/email created deployment.apps/emailservice created serviceaccount/frontend created deployment.apps/frontend created serviceaccount/loadgenerator created deployment.apps/loadgenerator created serviceaccount/payment created deployment.apps/paymentservice created serviceaccount/product-catalog created deployment.apps/productcatalogservice created serviceaccount/recommendation created deployment.apps/recommendationservice created serviceaccount/shipping created deployment.apps/shippingservice created
Crie os serviços:
kubectl apply -f \ DIR_PATH/samples/online-boutique/kubernetes-manifests/services
Resultado esperado:
service/adservice created service/cartservice created service/checkoutservice created service/currencyservice created service/emailservice created service/frontend created service/frontend-external created service/paymentservice created service/productcatalogservice created service/recommendationservice created service/shippingservice created
Crie as entradas de serviço:
kubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
Resultado esperado:
serviceentry.networking.istio.io/allow-egress-googleapis created serviceentry.networking.istio.io/allow-egress-google-metadata created
Implemente um
Gateway
e umVirtualService
para o serviço de frontendkubectl apply -f \ DIR_PATH/samples/online-boutique/istio-manifests/frontend-gateway.yaml
Resultado esperado:
gateway.networking.istio.io/frontend-gateway created virtualservice.networking.istio.io/frontend-ingress created
Obtenha o endereço IP externo do gateway de entrada e substitua os marcadores de posição pelas seguintes informações:
- GATEWAY_SERVICE_NAME: o nome do serviço de gateway de entrada. Se implementou o gateway de exemplo sem modificações, o resultado seria
istio-ingressgateway
. - GATEWAY_NAMESPACE: o espaço de nomes no qual implementou o gateway de entrada:
kubectl get service GATEWAY_SERVICE_NAME \ -n GATEWAY_NAMESPACE
O resultado é semelhante ao seguinte:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE istio-ingressgateway LoadBalancer 10.19.247.233 35.239.7.64 80:31380/TCP,443:31390/TCP,31400:31400/TCP 27m
Neste exemplo, o endereço IP do gateway de entrada é
35.239.7.64
.- GATEWAY_SERVICE_NAME: o nome do serviço de gateway de entrada. Se implementou o gateway de exemplo sem modificações, o resultado seria
Visite a aplicação no seu navegador para confirmar a instalação:
http://EXTERNAL_IP/
Na Google Cloud consola, aceda a Cloud Service Mesh.
Selecione o Google Cloud projeto na lista pendente da barra de menu.
Se tiver mais do que uma malha de serviços, selecione a malha na lista pendente Malha de serviços.
Se quiser manter o cluster e remover o exemplo da loja online:
Elimine os espaços de nomes da aplicação:
kubectl delete -f DIR_PATH/samples/online-boutique/kubernetes-manifests/namespaces
Resultado esperado:
namespace "ad" deleted namespace "cart" deleted namespace "checkout" deleted namespace "currency" deleted namespace "email" deleted namespace "frontend" deleted namespace "loadgenerator" deleted namespace "payment" deleted namespace "product-catalog" deleted namespace "recommendation" deleted namespace "shipping" deleted
Elimine as entradas de serviço:
kubectl delete -f DIR_PATH/samples/online-boutique/istio-manifests/allow-egress-googleapis.yaml
Resultado esperado:
serviceentry.networking.istio.io "allow-egress-googleapis" deleted serviceentry.networking.istio.io "allow-egress-google-metadata" deleted
Se quiser evitar cobranças adicionais, elimine o cluster:
Execute o seguinte comando:
gcloud container clusters delete CLUSTER_NAME \ --project=PROJECT_ID \ --zone=CLUSTER_LOCATION
Na mensagem Do you want to continue (Y/n)?, introduza y.
Após alguns minutos, vê o seguinte resultado:
Deleting cluster CLUSTER_NAME...done. Deleted [https://container.googleapis.com/v1/projects/PROJECT_ID/zones/CLUSTER_LOCATION/clusters/CLUSTER_NAME].
- Para saber mais sobre o Cloud Service Mesh gerido, consulte o artigo Aprovisionar o Cloud Service Mesh gerido
- Para uma introdução rápida à CLI gcloud usada neste tutorial, consulte os comandos
gcloud
- Para saber como explorar a Cloud Service Mesh na Google Cloud consola, consulte o artigo Explorar a Cloud Service Mesh na Google Cloud consola
- Para explorar as funcionalidades opcionais da malha de serviços na nuvem, como o Cloud Trace, as imagens de proxy sem distribuição e a autenticação do utilizador final, consulte o artigo Ative funcionalidades opcionais na malha de serviços na nuvem gerida
- Para saber mais acerca da segurança no Cloud Service Mesh, consulte a vista geral da segurança do Cloud Service Mesh e as práticas recomendadas de segurança do Cloud Service Mesh
- Para saber mais acerca da telemetria na malha de serviços na nuvem, consulte a Vista geral da observabilidade
Instale as ferramentas necessárias
Pode executar a ferramenta no Cloud Shell ou na sua máquina local. O Cloud Shell pré-instala todas as ferramentas necessárias.
Cloud Shell
O Cloud Shell aprovisiona uma máquina virtual (VM) do Compute Engine g1-small que executa um sistema operativo Linux baseado em Debian. As vantagens da utilização do Cloud Shell são:
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Computador local
Crie um cluster do GKE
Aprovisione o Cloud Service Mesh
Se não fechou esta página desde que criou o cluster, os marcadores de posição têm os valores que introduziu para o comando gcloud container clusters create
.
Transfira o exemplo de código
Clone o repositório git que contém o código de exemplo usado neste tutorial:
git clone https://github.com/GoogleCloudPlatform/anthos-service-mesh-packages.git
As secções seguintes deste tutorial usam uma variável DIR_PATH.
Defina esta variável para o caminho do repositório anthos-service-mesh-packages
que clonou (por exemplo, ./anthos-service-mesh-packages
).
Implemente um gateway de entrada
O Cloud Service Mesh dá-lhe a opção de implementar e gerir gateways como parte da sua malha de serviços. Um gateway descreve um balanceador de carga que opera no limite da malha e recebe ligações HTTP/TCP de entrada ou saída. As gateways são proxies Envoy que lhe oferecem um controlo detalhado sobre o tráfego que entra e sai da malha.
Saiba mais acerca das práticas recomendadas para gateways.
Implemente o exemplo da Online Boutique
A aplicação de exemplo Online Boutique no repositório
anthos-service-mesh-packages
é modificada a partir do conjunto original de manifestos no repositório
microservices-demo
. Seguindo as práticas recomendadas, cada serviço é implementado num espaço de nomes separado
com uma conta de serviço única.
Expor e aceder à aplicação
Existem várias formas de expor a aplicação. Neste guia, vamos usar o gateway de entrada implementado acima para o fazer. Para outras formas de expor a aplicação Online Boutique, consulte a secção Expor e aceder à aplicação no guia Implementar a aplicação de exemplo Online Boutique.
Veja os painéis de controlo da malha de serviços
Depois de ter cargas de trabalho implementadas no cluster com os proxies sidecar injetados, pode explorar as páginas do Cloud Service Mesh na consola para ver todas as funcionalidades de observabilidade que o Cloud Service Mesh oferece. Google Cloud Tenha em atenção que os dados de telemetria demoram cerca de um ou dois minutos a serem apresentados naGoogle Cloud consola depois de implementar cargas de trabalho.
O acesso à Cloud Service Mesh na Google Cloud consola é controlado pela gestão de identidade e de acesso (IAM). Para aceder às páginas do Cloud Service Mesh, um proprietário do projeto tem de conceder aos utilizadores a função de editor ou visualizador do projeto, ou as funções mais restritivas descritas no artigo Controlar o acesso ao Cloud Service Mesh na Google Cloud consola.
Para saber mais, consulte o artigo Explorar a Cloud Service Mesh na Google Cloud consola.
Limpar
Antes de fazer a limpeza, se tiver interesse em saber mais sobre o TLS mútuo, consulte o artigo Cloud Service Mesh by example: mTLS.