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.
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
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
.
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.
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.
Implemente o balanceador de carga:
kubectl apply -f k8s/service.yaml -n=NAMESPACE
Substituir
NAMESPACE
porhello-namespace
.Aguarde que seja atribuído 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