Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Horizontal Pod Autoscaling granulare in Kubernetes con le Container Resource Metrics

By Chimbu ChinnaduraiMay 2, 20244 min read

Questa pagina è disponibile anche in English, Deutsch, Español, Français, 日本語 e Português.

L'Horizontal Pod Autoscaler (HPA) di Kubernetes ha rivoluzionato la gestione dei workloads: scala in automatico i pod di deployment e statefulset in base all'utilizzo medio di CPU, di memoria o a qualsiasi altra metrica personalizzata, adattandoli alla domanda effettiva.

L'implementazione attuale

Per calcolare l'utilizzo delle risorse di un pod, il valore complessivo si ottiene sommando l'utilizzo di ciascun container al suo interno. Questo approccio, però, non è sempre adatto: ci sono workloads in cui l'utilizzo dei singoli container non è correlato o non varia allo stesso ritmo.

Pensiamo, ad esempio, a un sidecar container che gestisce i log: difficilmente consumerà risorse rilevanti, mentre il container principale dell'applicazione blog si farà carico della maggior parte del lavoro. In questo scenario l'HPA non scalerebbe in funzione del container critico, perché la metrica media del pod non rispecchia la situazione reale.

Scaling dell'HPA basato sull'utilizzo medio delle risorse di tutti i pod di un deployment

La nuova implementazione

Introdotta in Kubernetes v1.20 e ora promossa a stable nella v1.30, la funzionalità Container resource metrics permette all'HPA di basarsi sulle metriche dei singoli container all'interno di un pod. È sufficiente configurare l'HPA perché scali in funzione dell'utilizzo delle risorse (CPU, memoria, ecc.) di un container specifico.

Questa funzionalità consente di allocare le risorse in modo efficiente ed evita scaling superflui dovuti a un utilizzo elevato del pod causato da container non critici. Monitorando il consumo del container che eroga la funzionalità principale, ci si concentra sul workload che conta davvero, prendendo decisioni di scaling più mirate e prevenendo i colli di bottiglia sulle prestazioni.

Scaling dell'HPA basato sull'utilizzo medio delle risorse del container target su tutti i pod di un deployment

In questo articolo vedremo come usare le container resource metrics per scalare i deployment in una configurazione di pod multi-container.

Prerequisiti

  • Un cluster Kubernetes versione 1.27 o superiore.
  • Metrics Server installato sul cluster Kubernetes.
  • Kubectl installato sulla propria workstation.

Lo scaling con Container resource metrics in azione

  • Esegui il deploy di un deployment multi-container di esempio con il manifest qui sotto: cpu-stressor è il container principale, pensato per simulare stress CPU sui pod Kubernetes. Per maggiori dettagli sul tool cpu-stressor, consulta il repo Github. log-genertor è invece un container secondario di esempio nello stesso pod.

cat <<EOF | kubectl apply -f -
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: crm-scaling-demo
  labels:
    app: crm-scaling-demo
spec:
  selector:
    matchLabels:
      app: crm-scaling-demo
  template:
    metadata:
      labels:
        app: crm-scaling-demo
    spec:
      containers:
        - name: cpu-stressor
          image: narmidm/k8s-pod-cpu-stressor:1.0.0
          args:
            - "-cpu=0.5"
            - "-duration=3600s"
          resources:
            limits:
              cpu: "200m"
            requests:
              cpu: "100m"
        - name: log-generator
          image: busybox:1.28
          args: [/bin/sh, -c,\
                'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']
          resources:
            requests:
              cpu: "100m"
EOF

Pod di esempio e utilizzo delle risorse su tutti i container del pod

  • Crea una risorsa HorizontailPodAutoscaler che esegua lo scaling in base all'utilizzo CPU del container cpu-stressor anziché alle metriche complessive del pod.
cat <<EOF | kubectl apply -f -
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: crm-scaling-demo
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: crm-scaling-demo
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: ContainerResource #new-metrics-source
    containerResource:
      name: cpu
      container: cpu-stressor #container-name
      target:
        type: Utilization
        averageUtilization: 50
EOF

Esempio di configurazione HPA basata sulle metriche del container cpu-stressor

Nell'esempio precedente, il controller HPA scala il target in modo che l'utilizzo medio della CPU del container cpu-stressor in tutti i pod si attesti al 50%.

  • Aspetta che il container cpu-stressor inizi a simulare lo stress CPU: vedrai l'HPA ricalcolare il numero di pod sulla base dell'utilizzo CPU del container cpu-stressor.

Esempio di scaling HPA basato sulle metriche del container cpu-stressor

Demo dello scaling HPA basato sulle container resource metrics

Lo screenshot e il video mostrano uno scaling HPA riuscito basato sul container cpu-stressor in una configurazione di pod multi-container 🚀.

Con la promozione delle container resource metrics a stable in Kubernetes v1.30, oggi è possibile raggiungere un nuovo livello di precisione nell'horizontal pod autoscaling e garantire prestazioni applicative ottimali.

Spero che questo articolo ti sia stato utile. Per approfondire, ecco alcune risorse: