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.

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 painel 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 que seja atribuído 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