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: |
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 |
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:
- Compute Engine instances used by GKE
- Spanner
- Cloud Load Balancing
Para gerar uma estimativa de custos com base na sua utilização projetada,
use a calculadora de preços.
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.
- 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.
-
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.
-
In the Google Cloud console, go to the IAM page.
Go to IAM - Select the project.
-
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.
- For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.
-
In the Google Cloud console, go to the IAM page.
Aceder ao IAM - Selecione o projeto.
- Clique em Conceder acesso.
-
No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.
- Na lista Selecionar uma função, selecione uma função.
- Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
- Clique em Guardar.
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.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 apontarkubectl
para o seu cluster.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
porhello-namespace
, o nome do novo espaço de nomes que está a criar.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
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 CloudPROJECT_ID
são iguais.
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 projetoGSA_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"
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 projetoPROJECT_ID
: o ID do seu Google Cloud projetoNAMESPACE
: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]"
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
Clone a app de exemplo do repositório do GitHub para o Cloud Shell:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
Inicie o Cloud Shell Editor clicando em
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.
Abra o painel Explorador do editor do Cloud Shell e procure o diretório
kubernetes-engine-samples/databases/hello-app-cloud-spanner/k8s
.Abra o ficheiro
deployment.yaml
e atualize o camposerviceAccountName
substituindo<KSA_NAME>
porksa-helloapp
, o nome da sua conta de serviço do Kubernetes.Figura 1. Atualize o nome da conta de serviço do Kubernetes no ficheiro de implementação. Feche o editor do Cloud Shell e regresse ao terminal do Cloud Shell.
No terminal do Cloud Shell, navegue para o diretório
hello-app-cloud-spanner
:cd kubernetes-engine-samples/databases/hello-app-cloud-spanner
Implemente a aplicação:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACE
Substituir
NAMESPACE
porhello-namespace
.Aguarde a implementação da aplicação com
STATUS
comoRunning
:kubectl get pods -n=NAMESPACE --watch
Substituir
NAMESPACE
porhello-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
Prima Ctrl+C no teclado para regressar à linha de comandos e executar mais comandos.
Implemente o balanceador de carga:
kubectl apply -f k8s/service.yaml -n=NAMESPACE
Substituir
NAMESPACE
porhello-namespace
.Aguarde a atribuição de um endereço IP externo:
kubectl get service -n=NAMESPACE --watch
Substituir
NAMESPACE
porhello-namespace
.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.Pode usar a GUI da app para criar ou eliminar registos de jogadores, e estes são guardados na base de dados do Spanner.
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
- 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.
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
porhello-namespace
.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 a base de dados do Spanner:
gcloud spanner databases delete hello-database --instance=hello-instance
Elimine a instância do Spanner:
gcloud spanner instances delete hello-instance
- Saiba como criar um cluster do GKE para a instalação do Agones.
- Conheça as práticas recomendadas para usar o Spanner como uma base de dados de jogos.
- Saiba como pode implementar uma base de dados PostgreSQL de elevada disponibilidade no GKE.
- Conheça as práticas recomendadas para implementar bases de dados no GKE.
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.
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.
É 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
Grant the roles
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:
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.
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
.
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.
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.
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.