Este conjunto de tutoriais destina-se a administradores de TI e operadores que querem implementar, executar e gerir ambientes de aplicações modernos que são executados no Google Kubernetes Engine (GKE). À medida que avança neste conjunto de tutoriais, vai aprender a configurar a monitorização e os alertas, dimensionar cargas de trabalho e simular falhas, tudo isto usando a aplicação de microsserviços de exemplo do Cymbal Bank:
- Crie um cluster e implemente uma aplicação de exemplo
- Monitorize com o serviço gerido do Google Cloud para Prometheus
- Escalar cargas de trabalho (este tutorial)
- Simule uma falha
- Centralize a gestão da mudança
Vista geral e objetivos
Uma aplicação de consumidor, como o Cymbal Bank, tem frequentemente um número variável de utilizadores em diferentes momentos. Idealmente, o seu Website deve conseguir lidar com picos de tráfego sem ficar mais lento nem ter outros problemas, mas sem que a organização tenha de gastar dinheiro em recursos da nuvem de que não precisa realmente. Uma solução que Google Cloud permite isto é o dimensionamento automático.
Neste tutorial, vai aprender a configurar clusters e cargas de trabalho num cluster do GKE para dimensionar através de métricas do Kubernetes incorporadas e métricas personalizadas do Cloud Monitoring e Cloud Trace. Aprende a concluir as seguintes tarefas:
- Ative as métricas personalizadas no Cloud Monitoring para o Trace.
- As métricas personalizadas permitem-lhe dimensionar através de dados de monitorização adicionais ou entradas externas para além da perceção do cluster do Kubernetes, como o tráfego de rede ou os códigos de resposta HTTP.
- Configure o Horizontal Pod Autoscaler, uma funcionalidade do GKE que pode aumentar ou diminuir automaticamente o número de pods para uma carga de trabalho, consoante as métricas especificadas.
- Simule a carga da aplicação e veja a resposta do redimensionador automático de cluster e da escala automática horizontal de pods.
Custos
A ativação do GKE e a implementação da aplicação de exemplo do Cymbal Bank para esta série de tutoriais significa que incorre em custos por cluster para o GKE on Google Cloud , conforme indicado na nossa página de preços, até desativar o GKE ou eliminar o projeto.
Também é responsável por outros Google Cloud custos incorridos durante a execução da aplicação de exemplo do Cymbal Bank, como encargos de VMs do Compute Engine e do Trace.
Antes de começar
Para saber como dimensionar as suas implementações, tem de concluir o primeiro tutorial para criar um cluster do GKE que use o Autopilot e implementar a aplicação baseada em microsserviços de exemplo do Cymbal Bank.
Recomendamos que conclua este conjunto de tutoriais para apps escaláveis por ordem. À medida que avança no conjunto de tutoriais, aprende novas competências e usa produtos e serviços Google Cloud adicionais.
Também tem de criar uma conta de serviço do IAM e conceder algumas autorizações para que o redimensionador automático horizontal de pods funcione corretamente:
Crie uma conta de serviço do IAM. Esta conta de serviço é usada no tutorial para conceder acesso a métricas personalizadas que permitem ao HorizontalPodAutoscaler determinar quando aumentar ou diminuir a escala:
gcloud iam service-accounts create scalable-apps
Conceda acesso à conta de serviço do IAM para realizar as ações de escalabilidade necessárias:
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/cloudtrace.agent \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/monitoring.metricWriter \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" gcloud iam service-accounts add-iam-policy-binding "scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[default/default]"
O seguinte acesso é concedido à conta de serviço do IAM:
roles/cloudtrace.agent
: escreva dados de rastreio, como informações de latência, no rastreio.roles/monitoring.metricWriter
: escrever métricas no Cloud Monitoring.roles/iam.workloadIdentityUser
: Permitir que uma conta de serviço do Kubernetes use a federação de identidades da carga de trabalho para o GKE para atuar como a conta de serviço do IAM.
Configure a conta de serviço do Kubernetes no espaço de nomes
default
para atuar como a conta de serviço da IAM que criou:default
kubectl annotate serviceaccount default \ iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
Esta configuração permite que os pods que usam a conta de serviço do Kubernetes no espaço de nomes
default
acedam aos mesmos recursos que a conta de serviço do IAM.default
Google Cloud
Configure a recolha de métricas personalizadas
Pode configurar o Horizontal Pod Autoscaler para usar métricas básicas incorporadas do Kubernetes de CPU e memória, ou pode usar métricas personalizadas do Cloud Monitoring, como pedidos HTTP por segundo ou a quantidade de declarações SELECT
. As métricas personalizadas podem funcionar sem alterações à aplicação e dão ao seu cluster mais informações sobre o desempenho geral e as necessidades da aplicação. Neste tutorial, vai aprender a usar as métricas incorporadas e personalizadas.
Para permitir que o Horizontal Pod Autoscaler leia métricas personalizadas do Monitoring, tem de instalar o adaptador Custom Metrics - Stackdriver Adapter no seu cluster.
Implemente o adaptador de métricas personalizadas do Stackdriver no seu cluster:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml
Para permitir que o adaptador do Stackdriver obtenha métricas personalizadas do seu cluster, usa a Workload Identity Federation para o GKE. Esta abordagem usa uma conta de serviço do IAM que tem autorizações para ler métricas de monitorização.
Conceda à conta de serviço IAM a função
roles/monitoring.viewer
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer
Configure o adaptador do Stackdriver para usar a Workload Identity Federation para o GKE e a conta de serviço do IAM que tem autorizações para ler as métricas de monitorização:
gcloud iam service-accounts add-iam-policy-binding scalable-apps@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
O Kubernetes inclui o seu próprio sistema de contas de serviço para acesso num cluster. Para permitir que as suas aplicações se autentiquem em serviços e recursos fora dos seus clusters do Google Kubernetes Engine, como o Monitoring, usa a Workload Identity Federation para o GKE. Esta abordagem configura a conta de serviço do Kubernetes para usar a conta de serviço do IAM para o GKE.
Anotar 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=scalable-apps@PROJECT_ID.iam.gserviceaccount.com
Reinicie a implementação do adaptador do Stackdriver para aplicar as alterações:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
Configure o redimensionador automático horizontal de pods
O GKE Autopilot pode ser dimensionado de várias formas diferentes. Neste tutorial, vai ver como o cluster pode ser dimensionado através dos seguintes métodos:
- Redimensionador automático horizontal de pods: dimensiona o número de pods para uma carga de trabalho.
- Redimensionador automático de clusters: dimensiona os recursos de nós disponíveis no cluster.
Estes dois métodos podem funcionar em conjunto para que, à medida que o número de pods das suas aplicações muda, os recursos dos nós para suportar esses pods também mudem.
Estão disponíveis outras implementações para dimensionar pods que se baseiam no redimensionador automático horizontal de pods, e também pode usar o redimensionador automático vertical de pods para ajustar os pedidos de CPU e memória de um pod em vez do número de pods.
Neste tutorial, vai configurar o Horizontal Pod Autoscaler para a implementação userservice
usando métricas incorporadas e para a implementação frontend
usando métricas personalizadas.
Para as suas próprias aplicações, trabalhe com os programadores de aplicações e os engenheiros de plataforma para compreender as respetivas necessidades e configurar as regras do Horizontal Pod Autoscaler.
Dimensione a userservice
implementação
Quando o número de utilizadores da aplicação de exemplo do Cymbal Bank aumenta, o serviço userservice
consome mais recursos da CPU. Usa um objeto HorizontalPodAutoscaler
para controlar a forma como quer que a sua aplicação responda ao carregamento. No manifesto YAML para o HorizontalPodAutoscaler
, define a implementação para a qual o redimensionador automático horizontal de pods deve ser dimensionado, as métricas a monitorizar e o número mínimo e máximo de réplicas que quer executar.
Reveja o
HorizontalPodAutoscaler
manifesto de exemplo para auserservice
implementação:Este manifesto faz o seguinte:
- Define o número máximo de réplicas durante um aumento para
50
. - Define o número mínimo de durante uma redução para
5
. - Usa uma métrica do Kubernetes integrada para tomar decisões de escalabilidade. Neste exemplo, a métrica é a utilização da CPU e a utilização alvo é de 60%, o que evita a utilização excessiva e insuficiente.
- Define o número máximo de réplicas durante um aumento para
Aplique o manifesto ao cluster:
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
Dimensione a frontend
implementação
Na secção anterior, configurou a escala automática horizontal de pods na implementação com base nas métricas incorporadas do Kubernetes para a utilização da CPU.userservice
Para a implementação frontend
, é recomendável dimensionar com base no número de pedidos HTTP recebidos. Esta abordagem usa o adaptador do Stackdriver para ler métricas personalizadas do Monitoring para o objeto de entrada do balanceador de carga HTTP(S).
Reveja o
HorizontalPodAutoscaler
manifesto para afrontend
implementação:Este manifesto usa os seguintes campos:
spec.scaleTargetRef
: o recurso do Kubernetes a dimensionar.spec.minReplicas
: o número mínimo de réplicas, que é5
neste exemplo.spec.maxReplicas
: o número máximo de réplicas, que é25
neste exemplo.spec.metrics.*
: a métrica a usar. Neste exemplo, este é o número de pedidos HTTP por segundo, que é uma métrica personalizada da monitorização fornecida pelo adaptador que implementou.spec.metrics.external.metric.selector.matchLabels
: a etiqueta de recurso específica a filtrar ao ajustar a escala.
Encontre o nome da regra de encaminhamento no balanceador de carga do Ingress:
frontend
export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE
O resultado é semelhante ao seguinte:
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"
Este comando substitui
FORWARDING_RULE_NAME
pela regra de encaminhamento guardada.Aplique o manifesto ao cluster:
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
Simule o carregamento
Nesta secção, usa um gerador de carga para simular picos no tráfego e observar o aumento do número de réplicas e do número de nós para acomodar o aumento da carga ao longo do tempo. Em seguida, pode parar de gerar tráfego e observar a redução da escala da réplica e da contagem de nós em resposta.
Antes de começar, verifique o estado do redimensionador automático horizontal de pods e consulte o número de réplicas em utilização.
Obtenha o estado dos seus recursos
HorizontalPodAutoscaler
:kubectl get hpa
O resultado é semelhante ao seguinte, que mostra que existem 1 réplica
frontend
e 5 réplicasuserservice
:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s userservice Deployment/userservice 0%/60% 5 50 5 4m56s
A aplicação de exemplo do Cymbal Bank inclui um serviço
loadgenerator
. Este serviço envia continuamente pedidos que imitam utilizadores para o front-end e cria periodicamente novas contas e simula transações entre elas.Exponha a interface Web
loadgenerator
localmente. Use esta interface para simular a carga na aplicação de exemplo do Cymbal Bank:kubectl port-forward svc/loadgenerator 8080
Se vir uma mensagem de erro, tente novamente quando o Pod estiver em funcionamento.
Num navegador no computador, abra a interface Web do gerador de carga:
- Se estiver a usar uma shell local, abra um navegador e aceda a http://127.0.0.1:8080.
- Se estiver a usar o Cloud Shell, clique em Pré-visualização Web e, de seguida, clique em Pré-visualizar na porta 8080.
Na interface Web do gerador de carga, se o valor Falhas apresentar
100%
, conclua os seguintes passos para atualizar as definições de teste:- Clique no botão Parar junto ao contador da taxa de falhas.
- Em Estado, clique na opção Novo teste.
- Atualize o valor Host para o endereço IP da entrada do Cymbal Bank.
- Clique em Iniciar enxame.
Na interface Web do gerador de carga, clique no separador Gráficos para observar o desempenho ao longo do tempo. Analise o número de pedidos e a utilização de recursos.
Abra uma nova janela de terminal e monitorize a contagem de réplicas dos seus pods
frontend
euserservice
:kubectl get hpa -w
O número de réplicas aumenta à medida que a carga aumenta. As ações scaleUp podem demorar aproximadamente dez minutos, uma vez que o cluster reconhece que as métricas configuradas atingem o limite definido e usa o Horizontal Pod Autoscaler para aumentar o número de pods.
O exemplo de saída seguinte mostra que o número de réplicas aumentou à medida que o gerador de carga é executado:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17
Abra outra janela de terminal e verifique o número de nós no cluster:
gcloud container clusters list \ --filter='name=scalable-apps' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --location="CONTROL_PLANE_LOCATION"
Substitua
CONTROL_PLANE_LOCATION
pela localização do Compute Engine do plano de controlo do seu cluster. Indique uma região para clusters regionais ou uma zona para clusters zonais.O número de nós também aumentou da quantidade inicial para acomodar as novas réplicas. Este aumento no número de nós é baseado no GKE Autopilot. Não tem de configurar nada para esta escala de nós.
Abra a interface do gerador de carga e clique em Parar para terminar o teste.
Verifique novamente a quantidade de réplicas e a quantidade de nós e observe à medida que os números diminuem com a carga reduzida. A redução pode demorar algum tempo, uma vez que o período de estabilização predefinido para réplicas no recurso
HorizontalPodAutoscaler
do Kubernetes é de cinco minutos.
Num ambiente real, o número de nós e pods no seu ambiente seria automaticamente aumentado e diminuído da mesma forma que com esta carga simulada. A aplicação de exemplo do Cymbal Bank foi concebida para se adaptar a este tipo de dimensionamento. Consulte os operadores da app e a equipa de engenharia de fiabilidade do site (SRE) ou os programadores de aplicações para ver se as respetivas cargas de trabalho podem beneficiar destas funcionalidades de escalabilidade.
Limpar
O conjunto de tutoriais para o Cymbal Bank foi concebido para ser concluído um após o outro. À medida que avança no conjunto de tutoriais, aprende novas competências e usa Google Cloud produtos e serviços adicionais.
Se quiser fazer uma pausa antes de avançar para o tutorial seguinte e evitar incorrer em custos na sua Google Cloud conta pelos recursos usados neste tutorial Google Cloud , elimine o projeto que criou.
- 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.
O que se segue?
Saiba como simular uma falha no GKE no próximo tutorial.