Configurar o escalonamento automático horizontal de pods

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:

  1. 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.

  2. 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_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 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.

  3. Verifique o status atual do escalonador automático horizontal de pods:

    kubectl get hpa
    

    O 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 objetos Pod replicados 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:

  1. 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_second no campo data:

    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>>)'
    
  2. 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-credentials
    
  3. Atualize o recurso personalizado do cluster:

    1. Adicione a anotação preview.baremetal.cluster.gke.io/metrics-adapter: "true" ao metadata do recurso personalizado do cluster.

    2. Adicione a seção spec.metricsAdapter para 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.yaml
      

      Se a instância do Prometheus não exigir autenticação, omita a seção metricsAdapter.prometheus.auth da especificação do cluster.

  4. Aplique o recurso personalizado do cluster atualizado.

    O controlador implanta automaticamente o adaptador do Prometheus no namespace kube-system.

  5. 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.