Configura la scalabilità automatica del pod orizzontale

Questo documento descrive come configurare la scalabilità automatica orizzontale dei pod per i carichi di lavoro senza stato esistenti in esecuzione nel cluster. La scalabilità automatica orizzontale dei pod regola automaticamente il numero di pod (repliche) in esecuzione per un'applicazione in base alla domanda in tempo reale, rimuovendo i pod quando il carico diminuisce e aggiungendo pod quando il carico aumenta. Questo scale in e scale out è fondamentale per garantire la disponibilità delle applicazioni, l'utilizzo efficiente delle risorse e il risparmio sui costi, in quanto adatta la capacità con precisione al traffico utente senza intervento manuale. Man mano che i requisiti dei carichi di lavoro dei container si evolvono, la scalabilità automatica dei pod elimina la necessità per gli operatori di monitorare costantemente le prestazioni e regolare manualmente il numero di pod.

Questa pagina è rivolta ad amministratori, architetti e operatori che gestiscono il ciclo di vita dell'infrastruttura tecnologica sottostante. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività comuni degli utenti GKE.

Scala un deployment

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

Esegui la scalabilità automatica dei pod di un deployment

Kubernetes offre la scalabilità automatica per eliminare la necessità di aggiornare manualmente il deployment quando la domanda si evolve. Completa i seguenti passaggi per eseguire la scalabilità automatica dei pod del 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 CPU nel deployment.

  2. Imposta il gestore della scalabilità automatica orizzontale dei pod nel 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 per il 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 di cui eseguire la scalabilità automatica.

    • CPU_PERCENT: l'utilizzo medio target della CPU da richiedere, espresso in percentuale, in tutti i pod.

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

    • MAX_NUMBER_REPLICAS: il limite superiore per il numero di pod che 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 per il 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 di CPU e memoria. Le metriche standard funzionano per la scalabilità generale, ma non sono utili per i carichi delle applicazioni specializzate.

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

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

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

  • Server Prometheus esistente: un server Prometheus deve essere già sottoposto a deployment e accessibile dalla rete all'interno del cluster (il controller HPA non gestisce l'istanza di Prometheus stessa). Per ulteriori informazioni, consulta Come eseguire il deployment e configurare l'operatore Prometheus 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 abilitato.

Abilita e configura Prometheus

La procedura 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 osserva questi ConfigMap, li unisce e li applica automaticamente all'adattatore.

    Per ulteriori informazioni sulla definizione delle regole, consulta Configurazione di rilevamento e presentazione delle metriche 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 server Prometheus richiede l'autenticazione, ad esempio la sicurezza del livello di trasporto reciproco (mTLS), crea un secret Kubernetes in 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" ai metadata per la risorsa personalizzata Cluster.

    2. Aggiungi la sezione spec.metricsAdapter per definire l'URL di Prometheus e fare 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 di 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 di Prometheus Adapter nello spazio dei nomi kube-system.

  5. Utilizza le metriche personalizzate per la scalabilità automatica orizzontale dei pod creando una risorsa HorizontalPodAutoscaler che abbia 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 dovrebbe essere simile all'esempio seguente:

    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 disabilitare l'utilizzo di Prometheus con la scalabilità automatica orizzontale dei pod, rimuovi la sezione spec.metricsAdapter dalla risorsa personalizzata Cluster.