Configura la scalabilità automatica del pod orizzontale

La scalabilità automatica orizzontale dei pod ti consente di regolare automaticamente il numero di pod in esecuzione per i workload stateless esistenti nel tuo cluster in base alla domanda in tempo reale. Il gestore della scalabilità automatica aggiunge pod quando il carico aumenta e li rimuove quando la domanda diminuisce, il che ti aiuta a mantenere la disponibilità dell'applicazione, a utilizzare le risorse in modo efficiente e a controllare i costi senza interventi manuali. Puoi eseguire la scalabilità in base alle metriche delle risorse standard, come l'utilizzo della CPU, o alle metriche delle applicazioni personalizzate di Prometheus, come i tassi di richieste HTTP.

Scala un deployment

Utilizza la funzionalità di scalabilità di Kubernetes per scalare in modo appropriato la quantità di pod in esecuzione nel tuo deployment.

Scala automaticamente i pod di un deployment

Kubernetes offre la scalabilità automatica per eliminare la necessità di aggiornare manualmente il deployment quando la domanda evolve. Completa i seguenti passaggi per scalare automaticamente i pod del tuo deployment:

  1. Per assicurarti che il gestore della scalabilità automatica orizzontale dei pod possa misurare correttamente la percentuale di CPU, imposta la richiesta di risorse della CPU sul tuo deployment.

  2. Imposta il gestore della scalabilità automatica orizzontale dei pod nel tuo deployment:

    kubectl --kubeconfig CLUSTER_KUBECONFIG \
        -n NAMESPACE \
        autoscale deployment DEPLOYMENT_NAME \
        --cpu-percent=CPU_PERCENT \
        --min=MIN_NUMBER_REPLICAS \
        --max=MAX_NUMBER_REPLICAS
    

    Sostituisci quanto segue:

    • CLUSTER_KUBECONFIG: il file kubeconfig del cluster.

    • NAMESPACE: lo spazio dei nomi. Per i cluster condivisi, deve essere uno spazio dei nomi del progetto. Per i cluster standard, può essere qualsiasi spazio dei nomi.

    • DEPLOYMENT_NAME: il nome del deployment da scalare automaticamente.

    • CPU_PERCENT: l'utilizzo medio della CPU target da richiedere, rappresentato come percentuale, su tutti i pod.

    • MIN_NUMBER_REPLICAS: il limite inferiore per il numero di pod di cui il gestore della scalabilità automatica può eseguire il provisioning.

    • MAX_NUMBER_REPLICAS: il limite massimo per il numero di pod di cui il gestore della scalabilità automatica può eseguire il provisioning.

  3. Controlla lo stato attuale del gestore della scalabilità automatica orizzontale dei pod:

    kubectl get hpa
    

    L'output è simile al seguente:

    NAME              REFERENCE                          TARGET    MINPODS   MAXPODS   REPLICAS   AGE
    DEPLOYMENT_NAME   Deployment/DEPLOYMENT_NAME/scale   0% / 50%  1         10        1          18s
    

Scala manualmente i pod di un deployment

Se preferisci scalare manualmente un deployment, esegui:

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    -n NAMESPACE \
    scale deployment DEPLOYMENT_NAME \
    --replicas NUMBER_OF_REPLICAS

Sostituisci quanto segue:

  • CLUSTER_KUBECONFIG: il file kubeconfig del cluster.

  • NAMESPACE: lo spazio dei nomi. Per i cluster condivisi, deve essere uno spazio dei nomi del progetto. Per i cluster standard, può essere qualsiasi spazio dei nomi.

  • DEPLOYMENT_NAME: il nome del deployment in cui eseguire la scalabilità automatica.

  • DEPLOYMENT_NAME: il numero di oggetti Pod replicati nel deployment.

Utilizza le metriche personalizzate di Prometheus per la scalabilità automatica

Per impostazione predefinita, la scalabilità automatica orizzontale dei pod utilizza metriche delle risorse standard, come l'utilizzo della CPU e della memoria. Le metriche standard funzionano per la scalabilità generale, ma non sono utili per i carichi di applicazioni specializzate.

Quando utilizzi la scalabilità automatica orizzontale dei pod con metriche personalizzate di Prometheus, puoi scalare i workload in base a metriche specifiche dell'applicazione, come tassi di richieste HTTP, profondità della coda e latenza di elaborazione. Il cluster può rispondere in modo più accurato alla domanda reale sfruttando i dati dettagliati già raccolti dallo stack di monitoraggio di Prometheus.

Prerequisiti per l'utilizzo di Prometheus con la scalabilità automatica orizzontale dei pod

Prima di attivare la funzionalità, devono essere soddisfatte le seguenti condizioni:

  • Server Prometheus esistente: un server Prometheus deve essere già stato sottoposto a deployment e deve essere accessibile dalla rete all'interno del cluster (il controller HPA non gestisce l'istanza Prometheus stessa). Per saperne di più, consulta How to deploy and configure the Prometheus Operator in Kubernetes.

  • Autorizzazioni amministrative: devi disporre delle autorizzazioni necessarie per modificare la risorsa personalizzata Cluster.

  • Nessun conflitto API: un controllo preflight verifica che nessun altro componente abbia già registrato un APIService per custom.metrics.k8s.io. Se esiste un conflitto, l'adattatore non può essere attivato.

Abilita e configura Prometheus

Il processo prevede la definizione delle regole delle metriche e l'aggiornamento della configurazione del cluster:

  1. Crea uno o più ConfigMap delle regole delle metriche.

    Definisci le regole basate su PromQL per le metriche personalizzate in uno o più ConfigMap all'interno dello spazio dei nomi del cluster di destinazione. Il controller controlla questi ConfigMap, li unisce e li applica automaticamente all'adattatore.

    Per saperne di più sulla definizione delle regole, consulta Metrics Discovery and Presentation Configuration in kubernetes-sigs/prometheus-adapter.

    L'esempio seguente mostra un ConfigMap con regole definite per http_requests_per_second nel 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 il tuo server Prometheus richiede l'autenticazione, ad esempio la sicurezza del livello di trasporto reciproco (mTLS), crea un secret Kubernetes nel formato kubeconfig contenente le credenziali necessarie.

    L'esempio seguente mostra un secret che supporta l'autenticazione di base:

    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. Aggiorna la risorsa personalizzata Cluster:

    1. Aggiungi l'annotazione preview.baremetal.cluster.gke.io/metrics-adapter: "true" a metadata per la risorsa personalizzata Cluster.

    2. Aggiungi la sezione spec.metricsAdapter per definire l'URL di Prometheus e fai riferimento ai ConfigMap delle regole.

      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 l'istanza Prometheus non richiede l'autenticazione, puoi omettere la sezione metricsAdapter.prometheus.auth dalla specifica del cluster.

  4. Applica la risorsa personalizzata Cluster aggiornata.

    Il controller esegue automaticamente il deployment dell'adattatore Prometheus nello spazio dei nomi kube-system.

  5. Utilizza le metriche personalizzate per la scalabilità automatica orizzontale dei pod creando una risorsa HorizontalPodAutoscaler che ha come target le metriche personalizzate definite nei campi rules di ConfigMap.

    L'esempio di ConfigMap di un passaggio precedente ha definito una metrica personalizzata http_requests_per_second. Per utilizzare questa metrica, la risorsa HorizontalPodAutoscaler deve essere simile al seguente esempio:

    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
    

Disabilita Prometheus

Per disattivare l'utilizzo di Prometheus con la scalabilità automatica orizzontale dei pod, rimuovi la sezione spec.metricsAdapter dalla risorsa personalizzata Cluster.