Neste tutorial, mostramos como executar um aplicativo da Web apoiado por um banco de dados relacional altamente disponível em grande escala no Google Kubernetes Engine (GKE).
O aplicativo de amostra usado neste tutorial é o Bank of Anthos, um aplicativo da Web baseado em HTTP que simula a rede de processamento de pagamentos de um banco. O Bank of Anthos usa vários serviços para funcionar. O foco deste tutorial é o front-end do site e os bancos de dados relacionais do PostgreSQL que apoiam os serviços do Banco do Anthos. Para saber mais sobre o Bank of Anthos, incluindo a arquitetura e os serviços implantados, consulte Bank of Anthos no GitHub.
Objetivos
- Criar e configurar um cluster do GKE.
- Implantar um aplicativo da Web de exemplo e um banco de dados PostgreSQL altamente disponível.
- Configurar o escalonamento automático do aplicativo da Web e do banco de dados.
- Simule picos de tráfego usando um gerador de carga.
- Observe como os serviços são escalonados verticalmente e reduzidos.
Custos
Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços.
Ao concluir as tarefas descritas neste documento, é possível evitar o faturamento contínuo excluindo os recursos criados. Saiba mais em Limpeza.
Antes de começar
- 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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API:
gcloud services enable container.googleapis.com
- Instale a CLI do Helm (em inglês).
Prepare o ambiente
Clone o repositório de amostra usado neste tutorial:
git clone https://github.com/GoogleCloudPlatform/bank-of-anthos.git cd bank-of-anthos/
Defina as variáveis de ambiente:
PROJECT_ID=PROJECT_ID GSA_NAME=bank-of-anthos GSA_EMAIL=bank-of-anthos@${PROJECT_ID}.iam.gserviceaccount.com KSA_NAME=default
Substitua
PROJECT_ID
pelo ID do projeto do Google Cloud.
Configurar as contas de serviço e cluster
Crie um cluster:
gcloud container clusters create-auto bank-of-anthos --region=us-central1
O cluster pode levar até cinco minutos para ser iniciado.
Crie uma conta de serviço do IAM:
gcloud iam service-accounts create bank-of-anthos
Revogue o acesso à conta de serviço do IAM:
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/cloudtrace.agent \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/monitoring.metricWriter \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
Esta etapa concede o seguinte acesso:
roles/cloudtrace.agent
: grava dados de rastreamento, como informações de latência, no Trace.roles/monitoring.metricWriter
: grava métricas no Cloud Monitoring.roles/iam.workloadIdentityUser
: permite que uma conta de serviço do Kubernetes use a federação da identidade da carga de trabalho do GKE para atuar como a conta de serviço do IAM.
Configure a conta de serviço do Kubernetes
default
no namespacedefault
para atuar como a conta de serviço do IAM que você criou:kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
Isso permite que os pods que usam a conta de serviço
default
do Kubernetes no namespacedefault
acessem os mesmos recursos do Google Cloud que a conta de serviço do IAM.
Implante o banco do Anthos e o PostgreSQL
Nesta seção, você instalará o Bank of Anthos e um banco de dados PostgreSQL no modo altamente disponível (HA, na sigla em inglês), que permite escalonar réplicas automaticamente do servidor de banco de dados. Se você quiser ver os scripts, o gráfico Helm e os manifestos do Kubernetes usados nesta seção, verifique o repositório do Bank of Anthos no GitHub.
Implante o esquema do banco de dados e um script de linguagem de definição de dados (DDL, na sigla em inglês):
kubectl create configmap initdb \ --from-file=src/accounts/accounts-db/initdb/0-accounts-schema.sql \ --from-file=src/accounts/accounts-db/initdb/1-load-testdata.sql \ --from-file=src/ledger/ledger-db/initdb/0_init_tables.sql \ --from-file=src/ledger/ledger-db/initdb/1_create_transactions.sh
Instale o PostgreSQL usando a amostra de gráfico do Helm:
helm repo add bitnami https://charts.bitnami.com/bitnami helm install accounts-db bitnami/postgresql-ha \ --version 10.0.1 \ --values extras/postgres-hpa/helm-postgres-ha/values.yaml \ --set="postgresql.initdbScriptsCM=initdb" \ --set="postgresql.replicaCount=1" \ --wait
Este comando cria um cluster do PostgreSQL com uma contagem de réplicas inicial de 1. Mais adiante neste tutorial, você escalonará o cluster com base nas conexões recebidas. Esta operação pode levar dez minutos ou mais para ser concluída.
Implantar o Bank of Anthos:
kubectl apply -f extras/jwt/jwt-secret.yaml kubectl apply -f extras/postgres-hpa/kubernetes-manifests
Essa operação pode levar alguns minutos para ser concluída.
Checkpoint: validar sua configuração
Verifique se todos os pods do Bank of Anthos estão em execução:
kubectl get pods
O resultado será assim:
NAME READY STATUS accounts-db-pgpool-57ffc9d685-c7xs8 3/3 Running accounts-db-postgresql-0 1/1 Running balancereader-57b59769f8-xvp5k 1/1 Running contacts-54f59bb669-mgsqc 1/1 Running frontend-6f7fdc5b65-h48rs 1/1 Running ledgerwriter-cd74db4cd-jdqql 1/1 Running pgpool-operator-5f678457cd-cwbhs 1/1 Running transactionhistory-5b9b56b5c6-sz9qz 1/1 Running userservice-f45b46b49-fj7vm 1/1 Running
Verifique se você pode acessar o front-end do site:
Encontre o endereço IP externo do serviço
frontend
:kubectl get ingress frontend
O resultado será assim:
NAME CLASS HOSTS ADDRESS PORTS AGE frontend <none> * 203.0.113.9 80 12m
Em um navegador, acesse o endereço IP externo. A página de login do Bank do Anthos é exibida. Se tiver curiosidade, conheça o aplicativo.
Se você receber um erro 404, aguarde alguns minutos para que os microsserviços sejam provisionados e tente novamente.
Escalonar automaticamente o app da Web e o banco de dados PostgreSQL
O Autopilot do GKE escalona automaticamente os recursos de computação do cluster com base no número de cargas de trabalho no cluster. Para escalonar automaticamente o número de pods no cluster com base em métricas de recursos, é preciso implementar o escalonamento automático de pods horizontais do Kubernetes. É possível usar as métricas integradas de CPU e memória do Kubernetes ou as métricas personalizadas, como solicitações HTTP por segundo ou a quantidade de instruções SELECT, coletadas do Cloud Monitoring.
Nesta seção, você realizará as ações a seguir:
- Configurar o escalonamento automático horizontal de pods para os microsserviços do Bank of Anthos usando métricas integradas e personalizadas.
- Simule o carregamento no aplicativo do Bank of Anthos para acionar eventos de escalonamento automático.
- Observe como o número de pods e os nós no cluster são ajustados automaticamente em escala vertical de acordo com a carga.
Configurar a coleta de métricas personalizadas
Para ler métricas personalizadas do Monitoring, é necessário implantar o adaptador do adaptador de métricas personalizadas do Stackdriver no cluster.
Implante o adaptador:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
Configure o adaptador para usar a federação de identidade da carga de trabalho do GKE e obter as métricas:
Configure a conta de serviço do IAM:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Anote a conta de serviço do Kubernetes que o adaptador usa:
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com
Reinicie a implantação do adaptador para propagar as alterações:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
Configurar o escalonamento automático do banco de dados
Ao implantar o Bank of Anthos and PostgreSQL anteriormente
neste tutorial, o banco de dados foi implantado como um StatefulSet com uma réplica
de leitura/gravação principal para processar todas as instruções SQL recebidas. Nesta seção, você
configura o escalonamento automático horizontal de pods para adicionar novas réplicas somente leitura em espera para
processar instruções SELECT recebidas. Uma boa maneira de reduzir a carga em cada réplica é distribuir instruções SELECT, que são operações de leitura. A
implantação do PostgreSQL inclui uma ferramenta chamada Pgpool-II
que possibilita esse balanceamento
de carga e melhora a capacidade do sistema.
O PostgreSQL exporta a métrica de instrução SELECT como uma
métrica do Prometheus.
Você usará um exportador de métricas leve chamado prometheus-to-sd
para enviar essas métricas ao Cloud Monitoring em um formato compatível.
Revise o objeto
HorizontalPodAutoscaler
:Esse manifesto faz o seguinte:
- Define o número máximo de réplicas durante um escalonamento vertical como
5
. - Define o número mínimo de durante uma redução de escala como
1
. - Usa uma métrica externa para tomar decisões de escalonamento. Nesta amostra, a métrica é o número de instruções SELECT. Um evento de escalonamento vertical ocorre se a contagem de instruções SELECT recebida ultrapassar 15.
- Define o número máximo de réplicas durante um escalonamento vertical como
Aplique o manifesto ao cluster:
kubectl apply -f extras/postgres-hpa/hpa/postgresql-hpa.yaml
Configurar o escalonamento automático para a interface da Web
Em Implantar banco do Anthos e PostgreSQL, você implantou
a interface da Web do banco. Quando o número de usuários aumenta, o
serviço userservice
consome mais recursos de CPU. Nesta seção, você configurará o escalonamento automático horizontal de pods para a implantação userservice
quando os pods atuais usarem mais de 60% da CPU solicitada e para a implantação frontend
quando o número das solicitações HTTP recebidas para o balanceador de carga é
mais de cinco por segundo.
Configurar o escalonamento automático para a implantação de serviço do usuário
Revise o manifesto
HorizontalPodAutoscaler
da implantaçãouserservice
::Esse manifesto faz o seguinte:
- Define o número máximo de réplicas durante um escalonamento vertical como
50
. - Define o número mínimo de durante uma redução de escala como
5
. - Usa uma métrica integrada do Kubernetes para tomar decisões de escalonamento. Nesta amostra, a métrica é a utilização da CPU e a utilização de destino é 60%, o que evita o uso excessivo e insuficiente.
- Define o número máximo de réplicas durante um escalonamento vertical como
Aplique o manifesto ao cluster:
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
Configurar o escalonamento automático para a implantação de front-end
Revise o manifesto
HorizontalPodAutoscaler
da implantaçãouserservice
::Esse manifesto usa os seguintes campos:
spec.scaleTargetRef
: o recurso do Kubernetes a ser escalonado.spec.minReplicas
: o número mínimo de réplicas, que é5
nessa amostra.spec.maxReplicas
: o número máximo de réplicas, que é25
nessa amostra.spec.metrics.*
: a métrica a ser usada. Nesta amostra, esse é o número de solicitações HTTP por segundo, que é uma métrica personalizada do Cloud Monitoring fornecida pelo adaptador implantado.spec.metrics.external.metric.selector.matchLabels
: o rótulo de recursos específico a ser filtrado ao fazer o escalonamento automático.
Encontre o nome da regra de encaminhamento do balanceador de carga para a implantação
frontend
:export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE
O resultado será assim:
k8s2-fr-j76hrtv4-default-frontend-wvvf7381
Adicione a regra de encaminhamento ao manifesto:
sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"
Esse comando substitui
FORWARDING_RULE_NAME
pela regra de encaminhamento salva.Aplique o manifesto ao cluster:
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
Checkpoint: validar a configuração de escalonamento automático
Verifique o estado dos recursos HorizontalPodAutoscaler
:
kubectl get hpa
O resultado será assim:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
accounts-db-postgresql StatefulSet/accounts-db-postgresql 10905m/15 (avg) 1 5 2 5m2s
contacts Deployment/contacts 1%/70% 1 5 1 11m
frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s
userservice Deployment/userservice 0%/60% 5 50 5 4m56s
Neste ponto, o aplicativo e o escalonamento automático estão configurados. Agora, o front-end e o banco de dados podem ser escalonados com base nas métricas fornecidas.
Simular carga e observar o escalonamento do GKE
O Bank of Anthos inclui um serviço loadgenerator
que permite simular o tráfego
para testar o escalonamento do aplicativo sob carga. Nesta seção, você vai implantar o
serviço loadgenerator
, gerar uma carga e observar o escalonamento resultante.
Implantar o gerador de testes de carga
Crie uma variável de ambiente com o endereço IP do balanceador de carga do Bank of Anthos:
export LB_IP=$(kubectl get ingress frontend -o=jsonpath='{.status.loadBalancer.ingress[0].ip}') echo $LB_IP
O resultado será assim:
203.0.113.9
Adicione o endereço IP do balanceador de carga ao manifesto:
sed -i "s/FRONTEND_IP_ADDRESS/$LB_IP/g" "extras/postgres-hpa/loadgenerator.yaml"
Aplique o manifesto ao cluster:
kubectl apply -f extras/postgres-hpa/loadgenerator.yaml
O gerador de carga começa a adicionar um usuário a cada segundo, até 250 usuários.
Simular carga
Nesta seção, você usa um gerador de carga para simular picos no tráfego e observar o número de réplicas e a escala de nós para acomodar o aumento da carga ao longo do tempo. Depois, encerre o teste e observe a redução da contagem de réplicas e nós em resposta.
Exponha a interface da Web do gerador de carga localmente:
kubectl port-forward svc/loadgenerator 8080
Se uma mensagem de erro for exibida, tente novamente quando o pod estiver em execução.
Em um navegador, abra a interface da Web do gerador de carga.
- Se você estiver usando um shell local, abra um navegador e acesse http://127.0.0.1:8080.
- Se você estiver usando o Cloud Shell, clique em Visualização na Web e, em seguida, clique em Visualizar na porta 8080.
Clique na guia Gráficos para observar o desempenho ao longo do tempo.
Abra uma nova janela do terminal e observe a contagem de réplicas dos seus escalonadores automáticos de pods horizontais:
kubectl get hpa -w
O número de réplicas aumenta conforme a carga aumenta. O escalonamento pode levar aproximadamente dez minutos.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS accounts-db-postgresql StatefulSet/accounts-db-postgresql 8326m/15 (avg) 1 5 5 contacts Deployment/contacts 51%/70% 1 5 2 frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
Abra outra janela do terminal e verifique o número de nós no cluster:
gcloud container clusters list \ --filter='name=bank-of-anthos' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --region="us-central1"
O número de nós aumentou da quantidade inicial de três nós para acomodar as novas réplicas.
Abra a interface do gerador de carga e clique em Parada para finalizar o teste.
Verifique a contagem de réplicas e a contagem de nós novamente e observe como os números são reduzidos com a carga reduzida. A redução da escala pode levar algum tempo, porque a janela de estabilização padrão para réplicas no recurso
HorizontalPodAutoscaler
do Kubernetes é de cinco minutos. Para mais informações, consulte Janela de estabilização.
Limpar
Para evitar cobranças na sua conta do Google Cloud pelos recursos usados no tutorial, exclua o projeto que os contém ou mantenha o projeto e exclua os recursos individuais.
Excluir recursos individuais
O Google Cloud cria recursos, como balanceadores de carga, com base nos objetos do Kubernetes que você cria. Para excluir todos os recursos deste tutorial, faça o seguinte:
Exclua os recursos de amostra do Kubernetes:
kubectl delete \ -f extras/postgres-hpa/loadgenerator.yaml \ -f extras/postgres-hpa/hpa \ -f extras/postgres-hpa/kubernetes-manifests \ -f extras/jwt/jwt-secret.yaml \ -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
Exclua o banco de dados PostgreSQL:
helm uninstall accounts-db kubectl delete pvc -l "app.kubernetes.io/instance=accounts-db" kubectl delete configmaps initdb
Exclua o cluster do GKE e a conta de serviço do IAM:
gcloud iam service-accounts delete "bank-of-anthos@PROJECT_ID.iam.gserviceaccount.com" --quiet gcloud container clusters delete "bank-of-anthos" --region="us-central1" --quiet
Excluir o projeto
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID
A seguir
- Saiba mais sobre o escalonamento automático de pods verticais, que pode ser usado para ajustar automaticamente solicitações de recursos para cargas de trabalho de longa duração com recomendações baseadas no uso histórico.
- Saiba mais sobre o escalonamento automático horizontal de pods.