Neste documento, descrevemos como configurar o escalonamento automático horizontal de pods para cargas de trabalho sem estado em execução no cluster. O escalonamento automático horizontal de pods ajusta automaticamente o número de pods em execução (réplicas) de um aplicativo com base na demanda em tempo real, removendo pods quando a carga diminui e adicionando pods quando a carga aumenta. Esse escalonamento é crucial para garantir a disponibilidade do aplicativo, o uso eficiente de recursos e a economia de custos, combinando a capacidade precisamente com o tráfego de usuários sem intervenção manual. À medida que os requisitos de carga de trabalho do contêiner evoluem, o escalonamento automático de pods elimina a necessidade de os operadores monitorarem constantemente o desempenho e ajustarem manualmente as contagens de pods.
Esta página é destinada a administradores, arquitetos e operadores que gerenciam o ciclo de vida da infraestrutura de tecnologia subjacente. Para saber mais sobre papéis comuns e tarefas de exemplo referenciados no conteúdo do Google Cloud , consulte Funções e tarefas de usuário comuns do GKE Enterprise.
Escalonar uma implantação
Use a funcionalidade de escalonamento do Kubernetes para dimensionar adequadamente a quantidade de pods em execução na sua implantação.
Fazer o escalonamento automático dos pods de uma implantação
O Kubernetes oferece escalonamento automático para eliminar a necessidade de atualizar manualmente sua implantação quando a demanda evolui. Siga estas etapas para fazer o escalonamento automático dos pods da sua implantação:
Para garantir que o escalonador automático de pods horizontal possa medir adequadamente a porcentagem de CPU, defina a solicitação de recurso de CPU na sua implantação.
Defina o escalonador automático horizontal de pods na sua implantação:
kubectl --kubeconfig CLUSTER_KUBECONFIG \ -n NAMESPACE \ autoscale deployment DEPLOYMENT_NAME \ --cpu-percent=CPU_PERCENT \ --min=MIN_NUMBER_REPLICAS \ --max=MAX_NUMBER_REPLICASSubstitua:
CLUSTER_KUBECONFIG: o arquivo kubeconfig do cluster.NAMESPACE: o namespace. Para clusters compartilhados, esse valor precisa ser um namespace do projeto. Para clusters padrão, pode ser qualquer namespace.DEPLOYMENT_NAME: o nome da implantação a ser escalonada automaticamente.CPU_PERCENT: a meta de uso médio da CPU a ser solicitada, representada como uma porcentagem, em todos os pods.MIN_NUMBER_REPLICAS: o limite inferior para o número de pods que o escalonador automático pode provisionar.MAX_NUMBER_REPLICAS: o limite superior para o número de pods que o escalonador automático pode provisionar.
Verifique o status atual do escalonador automático horizontal de pods:
kubectl get hpaO resultado será o seguinte:
NAME REFERENCE TARGET MINPODS MAXPODS REPLICAS AGE DEPLOYMENT_NAME Deployment/DEPLOYMENT_NAME/scale 0% / 50% 1 10 1 18s
Escalonar manualmente os pods de uma implantação
Se você preferir escalonar uma implantação manualmente, execute:
kubectl --kubeconfig CLUSTER_KUBECONFIG \
-n NAMESPACE \
scale deployment DEPLOYMENT_NAME \
--replicas NUMBER_OF_REPLICAS
Substitua:
CLUSTER_KUBECONFIG: o arquivo kubeconfig do cluster.NAMESPACE: o namespace. Para clusters compartilhados, esse valor precisa ser um namespace do projeto. Para clusters padrão, pode ser qualquer namespace.DEPLOYMENT_NAME: o nome da implantação em que fazer o escalonamento automático.DEPLOYMENT_NAME: o número de objetosPodreplicados na implantação.
Usar métricas personalizadas do Prometheus para escalonamento automático
O escalonamento automático horizontal de pods usa métricas de recursos padrão, como utilização de CPU e memória, por padrão. As métricas padrão funcionam para escalonamento geral, mas não são úteis para cargas de aplicativos especializadas.
Ao usar o escalonamento automático horizontal de pods com métricas personalizadas do Prometheus, é possível escalonar cargas de trabalho com base em métricas específicas do aplicativo, como taxas de solicitação HTTP, profundidade da fila e latência de processamento. Seu cluster pode responder com mais precisão à demanda do mundo real usando os dados avançados já coletados pela sua pilha de monitoramento do Prometheus.
Pré-requisitos para usar o Prometheus com o escalonamento automático horizontal de pods
Antes de ativar o recurso, as seguintes condições precisam ser atendidas:
Servidor Prometheus atual: um servidor Prometheus já precisa estar implantado e acessível pela rede de dentro do cluster. O controlador HPA não gerencia a instância do Prometheus. Para mais informações, consulte Como implantar e configurar o Prometheus Operator no Kubernetes.
Permissões administrativas: você precisa ter as permissões necessárias para modificar o recurso personalizado do cluster.
Sem conflitos de API: uma verificação de simulação verifica se nenhum outro componente já registrou um APIService para
custom.metrics.k8s.io. Se houver um conflito, não será possível ativar o adaptador.
Ativar e configurar o Prometheus
O processo envolve definir regras de métricas e atualizar a configuração do cluster:
Crie um ou mais ConfigMaps de regras de métricas.
Defina as regras baseadas em PromQL para suas métricas personalizadas em um ou mais ConfigMaps no namespace do cluster de destino. O controlador monitora esses ConfigMaps, os mescla e os aplica automaticamente ao adaptador.
Para mais informações sobre como definir regras, consulte Configuração de descoberta e apresentação de métricas em kubernetes-sigs/prometheus-adapter.
O exemplo a seguir mostra um ConfigMap com regras definidas para
http_requests_per_secondno campodata:apiVersion: v1 kind: ConfigMap metadata: name: my-app-rules namespace: <cluster-namespace> data: config.yaml: | rules: - seriesQuery: 'http_requests_total' resources: overrides: namespace_name: {resource: "namespace"} pod_name: {resource: "pod"} name: matches: "^(.*)_total$" as: "${1}_per_second" metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'Se o servidor do Prometheus exigir autenticação, como Transport Layer Security mútuo (mTLS), crie um Secret do Kubernetes no formato kubeconfig com as credenciais necessárias.
O exemplo a seguir mostra um Secret que oferece suporte à autenticação básica:
apiVersion: v1 kind: Secret metadata: name: prometheus-auth-secret namespace: <cluster-namespace> annotations: baremetal.cluster.gke.io/mark-source: "true" type: Opaque stringData: config: authentication-credentialsAtualize o recurso personalizado do cluster:
Adicione a anotação
preview.baremetal.cluster.gke.io/metrics-adapter: "true"aometadatado recurso personalizado do cluster.Adicione a seção
spec.metricsAdapterpara definir o URL do Prometheus e fazer referência aos ConfigMaps de regras.apiVersion: baremetal.cluster.gke.io/v1 kind: Cluster metadata: name: <cluster-name> namespace: <cluster-namespace> annotations: preview.baremetal.cluster.gke.io/metrics-adapter: "true" spec: # ... other existing cluster configurations ... metricsAdapter: prometheus: url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090" orgID: "production-environment" auth: configSecretRef: name: prometheus-auth-secret key: config # This is the key within the Secret's 'data' field rules: configMapKeyRefs: - name: my-app-rules key: config.yaml # This is the key within the ConfigMap's 'data' field # - name: base-system-rules # key: config.yamlSe a instância do Prometheus não exigir autenticação, omita a seção
metricsAdapter.prometheus.authda especificação do cluster.
Aplique o recurso personalizado do cluster atualizado.
O controlador implanta automaticamente o adaptador do Prometheus no namespace
kube-system.Use as métricas personalizadas para o escalonamento automático horizontal de pods criando um recurso HorizontalPodAutoscaler que tenha como destino as métricas personalizadas definidas nos campos ConfigMaps
rules.O exemplo de ConfigMap de uma etapa anterior definiu uma métrica personalizada
http_requests_per_second. Para usar essa métrica, o recurso HorizontalPodAutoscaler precisa ser semelhante ao exemplo a seguir:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: <name> namespace: <namespace> spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: <workload-name> minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: http_requests_per_second target: type: AverageValue averageValue: 10
Desativar o Prometheus
Para desativar o uso do Prometheus com o escalonamento automático horizontal de pods, remova a seção
spec.metricsAdapter do recurso personalizado do cluster.