Implemente uma app com o GKE Autopilot e o Spanner

Este tutorial descreve como implementar uma aplicação Web contentorizada num cluster do Google Kubernetes Engine (GKE) Autopilot e usar uma base de dados do Google Spanner no back-end para armazenar dados. A aplicação de exemplo gere uma tabela de jogadores. Pode adicionar e eliminar jogadores através da interface gráfica do utilizador (GUI) da app.

O Spanner é um serviço de base de dados relacional totalmente gerido, escalável horizontalmente e distribuído globalmente que oferece transações ACID e semântica SQL sem comprometer o desempenho e a elevada disponibilidade.

Antes de ler esta página, certifique-se de que conhece o Kubernetes.

Porquê o GKE e o Spanner

Enquanto programador, pode não querer perder tempo a determinar a quantidade de recursos de armazenamento e computação de que a sua aplicação precisa, a prever o consumo de RAM e CPU durante períodos de flutuações na procura ou a preocupar-se com falhas da aplicação em períodos de pico de carga.

Ao usar o GKE Autopilot como um serviço Kubernetes totalmente gerido e o Spanner como um serviço de base de dados totalmente gerido, pode desenvolver e implementar apps mais rapidamente numa infraestrutura estável que simplifica a configuração e a gestão de recursos. O GKE Autopilot processa a configuração e o escalamento da infraestrutura para alojar a sua app adicionando ou removendo nós do cluster, com base nos requisitos no momento da execução. Da mesma forma, o Spanner pode ser dimensionado dinamicamente para mais ou menos com uma intervenção manual mínima, à medida que os requisitos de armazenamento ou computação mudam.

Por exemplo, considere que está a lançar o próximo jogo de sucesso que espera que se torne viral e, por isso, atraia um grande volume de tráfego Web durante a semana de lançamento. O Spanner pode ajudar a acomodar este débito crescente, oferecendo a capacidade de aumentar, diminuir ou realocar instantaneamente recursos de computação, mantendo ainda a disponibilidade máxima da aplicação com o GKE Autopilot.

Objetivos

Neste tutorial, vai aprender a:

  • Crie uma base de dados do Spanner que armazene um registo de jogadores.

  • Implemente uma app Web de exemplo denominada hello-app-cloud-spanner com uma interface gráfica do utilizador.

A tabela seguinte descreve os Google Cloud recursos que cria ou usa, as variáveis com as quais são identificados e os valores prescritos para eles para efeitos deste tutorial:

Recurso Variável Valor
Google Cloud ID do projeto PROJECT_ID

O ID do projeto gerado quando cria um projeto.

Exemplo: my-gcp-project

Região de computação COMPUTE_REGION

A região do Compute Engine onde quer criar a instância do Spanner e o cluster do GKE. Recomendamos que escolha uma região mais próxima da localização geográfica dos seus clientes, mas, para este tutorial, use us-west1.

Instância do Spanner - hello-instance
Base de dados do Spanner - hello-database
Cluster do GKE Autopilot CLUSTER_NAME hello-cluster
Namespace do Kubernetes NAMESPACE hello-namespace
Conta de serviço do Kubernetes KSA_NAME ksa-helloapp
Conta de serviço do IAM GSA_NAME gsa-helloapp
ID do projeto da conta de serviço de IAM GSA_PROJECT O seu Google Cloud PROJECT_ID.

Para efeitos deste tutorial, recomendamos que crie novos recursos, o que facilita a eliminação dos mesmos sem riscos depois de implementar a app de exemplo. No entanto, se tiver espaços de nomes, contas de serviço da IAM e contas de serviço do Kubernetes existentes, pode usá-los.

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 as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

Certifique-se de que cumpre os seguintes pré-requisitos:

Selecione ou crie um projeto

Pode usar um projeto existente ou criar um novo para este tutorial.

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

  5. Verify that billing is enabled for your Google Cloud project.

  6. Ative as APIs

    Enable the Artifact Registry, Compute Engine, GKE, and IAM Service Account Credentials 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

    Configure o Cloud Shell

    Neste tutorial, vai usar a Cloud Shell para executar comandos gcloud e kubectl. O Cloud Shell é um ambiente de shell para gerir recursos alojados no Google Cloud. Vem pré-instalado com a CLI do Google Cloud e a ferramenta de linha de comandos kubectl.

    In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    É aberta uma sessão do Cloud Shell num frame na parte inferior da consola.

    Antes de executar comandos neste tutorial, certifique-se de que o projeto predefinido está definido como o ID do projeto onde quer implementar a app de exemplo. Se ainda não estiver definido, execute o seguinte comando no Cloud Shell:

    gcloud config set project PROJECT_ID
    

    Substitua PROJECT_ID pelo seu ID do projeto.

    Conceda funções de IAM

    Certifique-se de que a sua Google Cloud conta tem as funções de IAM necessárias para este tutorial.

    Make sure that you have the following role or roles on the project: roles/iam.serviceAccountAdmin, roles/serviceusage.serviceUsageConsumer, roles/iam.serviceAccountUser, roles/iam.securityAdmin, roles/spanner.admin, roles/container.admin

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Aceder ao IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.

    5. Na lista Selecionar uma função, selecione uma função.
    6. Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
    7. Clique em Guardar.
    8. Configure o Spanner

      Para configurar o Spanner, tem de criar uma instância do Spanner e uma base de dados do Spanner.

      Crie uma instância do Spanner

      Uma instância do Spanner é uma atribuição de recursos que é usada por bases de dados do Spanner criadas nessa instância.

      Crie uma instância do Spanner denominada hello-instance com uma configuração regional e uma capacidade de computação de 100 unidades de processamento.

      gcloud spanner instances create hello-instance \
          --config=regional-COMPUTE_REGION \
          --description="Spanner sample instance" \
          --processing-units=100
      

      Substitua COMPUTE_REGION por us-west1 para este tutorial.

      Crie uma base de dados do Spanner

      Uma base de dados do Spanner inclui as suas tabelas, vistas e índices. Uma base de dados herda propriedades da respetiva instância principal, como a configuração (regional ou multirregional), a capacidade de computação disponível e o armazenamento.

      Crie uma base de dados do Spanner denominada hello-database com uma tabela denominada Players através do dialeto GoogleSQL. Execute a seguinte consulta no Cloud Shell:

      gcloud spanner databases create hello-database \
          --instance=hello-instance \
          --database-dialect=GOOGLE_STANDARD_SQL \
          --ddl="CREATE TABLE Players (
              PlayerUuid STRING(36) NOT NULL,
              FirstName STRING(1024),
              LastName STRING(1024),
              BirthDate DATE) PRIMARY KEY(PlayerUuid)"
      

      Crie um cluster do GKE Autopilot

      Depois de configurar o Spanner, crie um cluster do Autopilot e use a Workload Identity Federation para GKE para aceder à sua base de dados de forma segura e gerível.

      Crie um cluster do Autopilot com o nome hello-cluster. Os clusters do Autopilot têm a federação de identidade da carga de trabalho para o GKE ativada por predefinição.

      gcloud container clusters create-auto CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION
      

      Substitua o seguinte:

      • CLUSTER_NAME: hello-cluster
      • CONTROL_PLANE_LOCATION: a região do Compute Engine do plano de controlo do cluster. Para este tutorial, use a mesma região, us-west1, onde criou a instância do Spanner. Recomendamos que crie a instância do Spanner e o cluster do GKE Autopilot na mesma região para reduzir a latência.

      A criação do cluster pode demorar até 8 a 10 minutos.

      O resultado é semelhante ao seguinte:

      NAME: hello-cluster
      LOCATION: us-west1
      MASTER_VERSION: 1.26.5-gke.1200
      MASTER_IP: 192.0.2.1
      MACHINE_TYPE: e2-medium
      NODE_VERSION: 1.26.5-gke.1200
      NUM_NODES: 3
      STATUS: RUNNING
      

      Configure o cluster para usar a federação de identidades de cargas de trabalho para o GKE

      Configure o cluster para autenticar no Google Cloud usando a Federação de identidades de carga de trabalho para o GKE antes de implementar a app.

      1. Obtenha credenciais para aceder ao seu cluster:

        gcloud container clusters get-credentials CLUSTER_NAME \
          --location=CONTROL_PLANE_LOCATION
        

        Substitua o seguinte:

        • CLUSTER_NAME: hello-cluster
        • CONTROL_PLANE_LOCATION: us-west1

        Isto atualiza um ficheiro kubeconfig com as credenciais e as informações do ponto final adequadas para apontar kubectl para o seu cluster.

      2. Crie um espaço de nomes para usar na conta de serviço do Kubernetes. Também pode usar o espaço de nomes predefinido ou qualquer espaço de nomes existente.

        kubectl create namespace NAMESPACE
        

        Substitua NAMESPACE por hello-namespace, o nome do novo espaço de nomes que está a criar.

      3. Crie uma conta de serviço do Kubernetes para a sua aplicação usar:

        kubectl create serviceaccount KSA_NAME \
          --namespace NAMESPACE
        

        Substitua o seguinte:

        • KSA_NAME: ksa-helloapp, o nome da nova conta de serviço do Kubernetes que está a criar.
        • NAMESPACE: hello-namespace
      4. Crie uma conta de serviço do IAM para a sua aplicação:

        gcloud iam service-accounts create GSA_NAME \
          --project=GSA_PROJECT
        

        Substitua o seguinte:

        • GSA_NAME: gsa-helloapp, o nome da nova conta de serviço da IAM que está a criar.
        • GSA_PROJECT: o ID do seu Google Cloud projeto. Neste tutorial, está a criar a conta de serviço de IAM no mesmo Google Cloud projeto onde está a implementar a app de exemplo. Por isso, GSA_PROJECT e Google Cloud PROJECT_ID são iguais.
      5. Adicione uma associação de políticas IAM para a sua conta de serviço IAM para ler e escrever no Spanner:

        gcloud projects add-iam-policy-binding PROJECT_ID \
          --member "serviceAccount:GSA_NAME@PROJECT_ID.iam.gserviceaccount.com" \
          --role "roles/spanner.admin"
        

        Substitua o seguinte:

        • PROJECT_ID: o ID do seu Google Cloud projeto
        • GSA_NAME: gsa-helloapp

        Exemplo:

        gcloud projects add-iam-policy-binding my-gcp-project \
          --member "serviceAccount:gsa-helloapp@my-gcp-project.iam.gserviceaccount.com" \
          --role "roles/spanner.admin"
      6. Permita que a conta de serviço do Kubernetes use a identidade da conta de serviço da IAM adicionando uma associação de políticas da IAM entre as duas contas de serviço. Esta associação permite que a conta de serviço do Kubernetes atue como a conta de serviço do IAM, para que a conta de serviço do Kubernetes possa ler e escrever no Spanner.

        gcloud iam service-accounts add-iam-policy-binding GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:PROJECT_ID.svc.id.goog[NAMESPACE/KSA_NAME]"
        

        Substitua o seguinte:

        • GSA_NAME: gsa-helloapp
        • GSA_PROJECT: o ID do seu Google Cloud projeto
        • PROJECT_ID: o ID do seu Google Cloud projeto
        • NAMESPACE: hello-namespace
        • KSA_NAME: ksa-helloapp

        Exemplo:

        gcloud iam service-accounts add-iam-policy-binding gsa-helloapp@my-gcp-project.iam.gserviceaccount.com \
          --role roles/iam.workloadIdentityUser \
          --member "serviceAccount:my-gcp-project.svc.id.goog[hello-namespace/ksa-helloapp]"
      7. Anotar a conta de serviço do Kubernetes com o endereço de email da conta de serviço do IAM. Isto permite que a sua app de exemplo saiba que conta de serviço usar para aceder aos serviços Google Cloud . Assim, quando a app usa quaisquer bibliotecas cliente de APIs Google padrão para aceder a serviços, usa essa conta de serviço da IAM. Google Cloud

        kubectl annotate serviceaccount KSA_NAME \
          --namespace NAMESPACE \
          iam.gke.io/gcp-service-account=GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com
        

        Substitua o seguinte:

        • KSA_NAME: ksa-helloapp
        • NAMESPACE: hello-namespace
        • GSA_NAME: gsa-helloapp
        • GSA_PROJECT: o ID do seu Google Cloud projeto

        Exemplo:

        kubectl annotate serviceaccount ksa-helloapp \
          --namespace hello-namespace \
          iam.gke.io/gcp-service-account=gsa-helloapp@my-gcp-project.iam.gserviceaccount.com

      Implemente a app de exemplo no cluster

      Agora que configurou o GKE e o Spanner com os serviços e a autenticação necessários, já pode implementar a app de exemplohello-app-cloud-spanner.

      1. Clone a app de exemplo do repositório do GitHub para o Cloud Shell:

        git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
        
      2. Inicie o Cloud Shell Editor clicando em Botão do editor de código Abrir editor na barra de ferramentas da janela do terminal.

        Para mais informações, consulte o artigo Vista geral da interface do editor do Cloud Shell.

      3. Abra o painel Explorador do editor do Cloud Shell e procure o diretório kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s.

      4. Abra o ficheiro deployment.yaml e atualize o campo serviceAccountName substituindo <KSA_NAME> por ksa-helloapp, o nome da sua conta de serviço do Kubernetes.

        Edite o YAML para atualizar KSA_NAME.
        Figura 1. Atualize o nome da conta de serviço do Kubernetes no ficheiro de implementação.
      5. Feche o editor do Cloud Shell e regresse ao terminal do Cloud Shell.

      6. No terminal do Cloud Shell, navegue para o diretório hello-app-cloud-spanner:

        cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
        
      7. Implemente a aplicação:

        kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
        

        Substituir NAMESPACE por hello-namespace.

      8. Aguarde a implementação da aplicação com STATUS como Running:

        kubectl get pods -n=NAMESPACE --watch
        

        Substituir NAMESPACE por hello-namespace.

        O resultado é semelhante ao seguinte:

        NAME                                       READY   STATUS              RESTARTS   AGE
        hello-app-cloud-spanner-765c9b8779-lfcrc   0/1     ContainerCreating   0          87s
        hello-app-cloud-spanner-765c9b8779-lfcrc   1/1     Running             0          3m15s
        
      9. Prima Ctrl+C no teclado para regressar à linha de comandos e executar mais comandos.

      Exponha a app de exemplo à Internet

      Para expor um serviço do Kubernetes fora do cluster, crie um serviço do tipo LoadBalancer. Este tipo de serviço gera um endereço IP do balanceador de carga externo para os seus pods, acessível através da Internet.

      1. Implemente o balanceador de carga:

        kubectl apply -f k8s/service.yaml -n=NAMESPACE
        

        Substituir NAMESPACE por hello-namespace.

      2. Aguarde a atribuição de um endereço IP externo:

        kubectl get service -n=NAMESPACE --watch
        

        Substituir NAMESPACE por hello-namespace.

      3. Depois de atribuído, copie o EXTERNAL-IP (por exemplo, 203.0.113.0) e abra-o num navegador. É aberta uma interface Web que apresenta e gere a base de dados de jogadores.

      4. Pode usar a GUI da app para criar ou eliminar registos de jogadores, e estes são guardados na base de dados do Spanner.

        Adicione ou elimine jogadores.
        Figura 2. Criar ou eliminar jogadores no registo.

        Execute a seguinte consulta para verificar se a base de dados do Spanner foi atualizada com as suas entradas:

        gcloud spanner databases execute-sql hello-database \
          --instance=hello-instance \
          --sql="SELECT * FROM Players LIMIT 10"
        

        O resultado é semelhante ao seguinte:

        PlayerUuid: a1f34bbf-929c-498d-8b16-39bbb29d70e3
        FirstName: John
        LastName: Smith
        BirthDate: 1997-07-12
        
        PlayerUuid: d634e157-96ea-45f2-be3f-fb907ced188e
        FirstName: Jane
        LastName: Doe
        BirthDate: 2013-07-12
        

      Limpar

      Para evitar incorrer em custos na sua conta do Google Cloud pelos recursos usados neste tutorial, elimine o projeto que contém os recursos ou mantenha o projeto e elimine os recursos individuais.

      Elimine o projeto

      A forma mais fácil de evitar a faturação é eliminar o projeto que criou para este tutorial.

    9. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    10. In the project list, select the project that you want to delete, and then click Delete.
    11. In the dialog, type the project ID, and then click Shut down to delete the project.
    12. Se eliminou o projeto, a limpeza está concluída. Se não eliminou o projeto, avance para a eliminação dos recursos do GKE e do Spanner.

      Elimine recursos do GKE

      1. Elimine o serviço. Esta ação anula a atribuição do balanceador de carga criado para o seu serviço: Google Cloud

        kubectl delete service hello-app-cloud-spanner -n=NAMESPACE
        

        Substituir NAMESPACE por hello-namespace.

      2. Elimine o cluster do GKE. Isto elimina os recursos que constituem um cluster, como as instâncias de computação, os discos e os recursos de rede:

        gcloud container clusters delete CLUSTER_NAME --location=CONTROL_PLANE_LOCATION
        

      Elimine recursos do Spanner

      1. Elimine a base de dados do Spanner:

        gcloud spanner databases delete hello-database --instance=hello-instance
        
      2. Elimine a instância do Spanner:

        gcloud spanner instances delete hello-instance
        

      O que se segue?