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-clusterCONTROL_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_LOCATIONSubstitua o seguinte:
CLUSTER_NAME:hello-clusterCONTROL_PLANE_LOCATION:us-west1
Isto atualiza um ficheiro
kubeconfigcom as credenciais e as informações do ponto final adequadas para apontarkubectlpara 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 NAMESPACESubstitua
NAMESPACEporhello-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 NAMESPACESubstitua 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_PROJECTSubstitua 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_PROJECTe Google CloudPROJECT_IDsã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-helloappGSA_PROJECT: o ID do seu Google Cloud projetoPROJECT_ID: o ID do seu Google Cloud projetoNAMESPACE:hello-namespaceKSA_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.comSubstitua o seguinte:
KSA_NAME:ksa-helloappNAMESPACE:hello-namespaceGSA_NAME:gsa-helloappGSA_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.gitInicie 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.yamle atualize o camposerviceAccountNamesubstituindo<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-spannerImplemente a aplicação:
kubectl apply -f k8s/deployment.yaml -n=NAMESPACESubstituir
NAMESPACEporhello-namespace.Aguarde a implementação da aplicação com
STATUScomoRunning:kubectl get pods -n=NAMESPACE --watchSubstituir
NAMESPACEporhello-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 3m15sPrima 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=NAMESPACESubstituir
NAMESPACEporhello-namespace.Aguarde que seja atribuído um endereço IP externo:
kubectl get service -n=NAMESPACE --watchSubstituir
NAMESPACEporhello-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