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-stressorest le container principal, conçu pour simuler une charge CPU sur les pods Kubernetes. Consultez le repo Github pour en savoir plus sur l'outilcpu-stressor. Lelog-generatorest 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
HorizontalPodAutoscalerqui pilote le scaling à partir de l'utilisation CPU du containercpu-stressorplutô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-stressorsimuler la charge CPU : le HPA recalcule alors le nombre de pods en fonction de l'utilisation CPU du containercpu-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 :