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:

  1. Configurar o seu Google Cloud projeto.
  2. Criar um cluster do GKE com o número mínimo de vCPUs exigido pela malha de serviço na nuvem.
  3. Registar o cluster do GKE na frota do seu projeto.
  4. Aprovisionamento da malha de serviços na nuvem gerida no cluster através da API Fleet.
  5. Implementar um gateway de entrada para expor a aplicação.
  6. 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.
  7. 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.

Os novos Google Cloud utilizadores podem ser elegíveis para uma avaliação gratuita.

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

  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 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 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 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 the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  8. Tome nota do seu ID do projeto.
  9. 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:

    • 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 na parte superior da janela do Cloud Shell.

      • Emacs, Vim ou Nano, aos quais acede a partir da linha de comandos no Cloud Shell.

    In the Google Cloud console, activate Cloud Shell.

    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

    1. Certifique-se de que tem as seguintes ferramentas instaladas:

    2. Autentique com a CLI do Google Cloud:

      gcloud auth login --project PROJECT_ID
      
    3. Atualize os componentes:

      gcloud components update
      

    Crie um cluster do GKE

    1. 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
      
    2. 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.
      
    3. Defina o contexto atual de kubectl para o cluster.

      kubectl config set-context CLUSTER_NAME
      

      Resultado esperado:

      Context "CLUSTER_NAME" created.
      

    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.

    1. 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.
      
    2. 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.
      
    3. 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.
      
    4. 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 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/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'
      

    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.

    1. 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
      
    2. 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

      1. 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

      2. Aplique a etiqueta de revisão ao espaço de nomes. No comando seguinte, REVISION é o valor da etiqueta de revisão istiod 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 etiqueta istio.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 etiqueta istio.io/rev e a etiqueta istio-injection, todos os comandos kubectl 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 erro ImagePullBackOff quando o gateway tenta extrair a imagem auto. Esta imagem deve ser substituída pelo webhook.

    3. Transfira o ficheiro de configuração .yaml do gateway de entrada de exemplo do repositório.anthos-service-mesh-packages

    4. 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
      

    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.

    1. 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
      
    2. 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 entrada

      Etiquetas 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
      
    3. Implemente a aplicação de exemplo no cluster.

      1. 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
        
      2. 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
        
      3. 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
        

    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.

    1. Implemente um Gateway e um VirtualService para o serviço de frontend

      kubectl 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
      
    2. 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.

    3. Visite a aplicação no seu navegador para confirmar a instalação:

      http://EXTERNAL_IP/
      

    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.

    1. Na Google Cloud consola, aceda a Cloud Service Mesh.

      Aceda ao Cloud Service Mesh

    2. Selecione o Google Cloud projeto na lista pendente da barra de menu.

    3. Se tiver mais do que uma malha de serviços, selecione a malha na lista pendente Malha de serviços.

    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.

    • Se quiser manter o cluster e remover o exemplo da loja online:

      1. 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
        
      2. 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:

      1. Execute o seguinte comando:

        gcloud container clusters delete CLUSTER_NAME \
            --project=PROJECT_ID \
            --zone=CLUSTER_LOCATION
        
      2. 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].
        

    O que se segue?