O escalonamento automático horizontal de pods permite ajustar automaticamente o número de pods em execução para cargas de trabalho sem estado no cluster com base na demanda em tempo real. O escalonador automático adiciona pods quando a carga aumenta e os remove quando a demanda cai, o que ajuda a manter a disponibilidade do aplicativo, usar os recursos de maneira eficiente e controlar os custos sem intervenção manual. É possível escalonar com base em métricas de recursos padrão, como utilização da CPU, ou em métricas de aplicativos personalizadas do Prometheus, como taxas de solicitação HTTP.
Escalonar uma implantação
Use a funcionalidade de escalonamento do Kubernetes para escalonar adequadamente a quantidade de pods em execução na implantação.
Escalonar automaticamente os 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 implantação:
Para garantir que o autoescalonador horizontal de pods possa medir adequadamente a porcentagem de CPU, defina a solicitação de recurso de CPU na implantação.
Defina o escalonador automático horizontal de pods na 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, precisa ser um namespace de projeto. Para clusters padrão, pode ser qualquer namespace.DEPLOYMENT_NAME: o nome da implantação que será escalonada automaticamente.CPU_PERCENT: a média desejada de utilização 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 máximo 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 preferir escalonar manualmente uma implantação, 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, precisa ser um namespace de projeto. Para clusters padrão, pode ser qualquer namespace.DEPLOYMENT_NAME: o nome da implantação em que o escalonamento automático será feito.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 uso de CPU e memória, por padrão. As métricas padrão funcionam para o 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 aproveitando os dados avançados já coletados pela 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 do Prometheus: um servidor do Prometheus precisa estar implantado e acessível pela rede no cluster (o controlador do HPA não gerencia a instância do Prometheus). Para mais informações, consulte Como implantar e configurar o operador do Prometheus 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, o adaptador não poderá ser ativado.
Ativar e configurar o Prometheus
O processo envolve a definição de regras de métricas e a atualização da 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 compatível com a 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 referenciar os ConfigMaps da regra.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
rulesdo ConfigMap.A amostra do 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.