Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Autoscaling horizontal fin des pods Kubernetes avec les métriques de ressources par container

By Chimbu ChinnaduraiMay 2, 20244 min read

Cette page est également disponible en English, Deutsch, Español, Italiano, 日本語 et Português.

Le Horizontal Pod Autoscaler (HPA) de Kubernetes a révolutionné la gestion des workloads en scalant automatiquement les pods des deployments et statefulsets selon l'utilisation moyenne du CPU, de la mémoire ou de toute autre métrique personnalisée que vous définissez, afin de coller à la demande.

Implémentation actuelle

Pour calculer l'utilisation des ressources d'un pod, on additionne la consommation de chacun de ses containers. Cette méthode peut toutefois s'avérer inadaptée aux workloads dont les containers ne sont pas étroitement corrélés ou n'évoluent pas au même rythme.

Prenons un container sidecar dédié à la gestion des logs : sa consommation de ressources reste minime, alors que le container applicatif principal absorbe l'essentiel de la charge. Le HPA ne se déclenchera pas en fonction de la consommation du container critique, car la métrique moyenne du pod risque de masquer la réalité.

Scaling HPA basé sur l'utilisation moyenne des ressources de tous les pods d'un deployment

Nouvelle implémentation

Introduite dans Kubernetes v1.20 et désormais stable en v1.30, la fonctionnalité Container resource metrics permet au HPA de cibler les métriques d'un container spécifique au sein d'un pod. Vous pouvez ainsi configurer le HPA pour scaler en fonction de l'utilisation des ressources (CPU, mémoire, etc.) d'un container précis du pod.

Cette approche permet d'allouer les ressources plus efficacement et d'éviter un scaling inutile provoqué par des containers non critiques. En surveillant la consommation du container qui assure les fonctionnalités cœur, vous restez focalisé sur le workload réel. Les décisions de scaling gagnent en pertinence et les goulots d'étranglement sont écartés.

Scaling HPA basé sur l'utilisation moyenne des ressources du container ciblé sur l'ensemble des pods d'un deployment

Dans cet article, je vous montre comment exploiter les métriques de ressources par container pour scaler vos deployments dans une configuration de pods multi-containers.

Prérequis

  • Un cluster Kubernetes en version 1.27 ou supérieure.
  • Le Metrics Server déployé sur le cluster Kubernetes.
  • Kubectl installé sur votre poste de travail.

Le scaling par métriques de ressources de container en pratique

  • Déployez un exemple de deployment multi-containers à l'aide du manifest ci-dessous. cpu-stressor est le container principal, conçu pour simuler une charge CPU sur les pods Kubernetes. Consultez le repo Github pour en savoir plus sur l'outil cpu-stressor. Le log-generator est un container secondaire d'exemple, présent dans le même 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

Exemple de pod et utilisation des ressources sur l'ensemble de ses containers

  • Créez une ressource HorizontalPodAutoscaler qui pilote le scaling à partir de l'utilisation CPU du container cpu-stressor plutôt que des métriques du 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

Exemple de configuration HPA basée sur les métriques du container cpu-stressor

Dans cet exemple, le contrôleur HPA ajuste la cible pour que l'utilisation moyenne du CPU dans le container cpu-stressor de l'ensemble des pods atteigne 50 %.

  • Laissez le container cpu-stressor simuler la charge CPU : le HPA recalcule alors le nombre de pods en fonction de l'utilisation CPU du container cpu-stressor.

Exemple de scaling HPA basé sur les métriques du container cpu-stressor

Démonstration du scaling HPA basé sur les métriques de ressources par container

La capture d'écran et la vidéo de démonstration illustrent un scaling HPA réussi à partir du container cpu-stressor dans une configuration de pods multi-containers🚀.

Avec le passage en stable des métriques de ressources par container dans Kubernetes v1.30, vous gagnez un nouveau niveau de précision sur l'autoscaling horizontal de vos pods et garantissez des performances applicatives optimales.

J'espère que cet article vous aura été utile. Pour aller plus loin, voici quelques ressources :