Photo par Andrii Yalanskyi sur Shutterstock
Optimiser l'utilisation des ressources tout en préservant les performances applicatives est un défi sans fin sur Kubernetes. Estimer dès le départ la quantité de ressources dont une application a besoin n'a rien d'évident, et l'approche classique du redimensionnement CPU et/ou mémoire reste perturbatrice : elle impose de recréer les pods et risque d'affecter les workloads en cours d'exécution. À la clé : dégradation de service, indisponibilités et casse-tête opérationnels. C'est précisément là que des plateformes comme PerfectScale entrent en jeu, en analysant en continu la consommation des workloads et en identifiant les allocations optimales avant d'en arriver à des changements disruptifs.
Beaucoup attendaient avec impatience de pouvoir redimensionner des pods Kubernetes sans redémarrage. La fonctionnalité est disponible en Alpha depuis Kubernetes v1.27 et est passée en bêta avec v1.33. Elle s'appelle InPlacePodVerticalScaling : le champ resources des conteneurs d'un pod accepte désormais la modification des ressources cpu et memory, simplement en appliquant un patch sur la spec du pod en cours d'exécution.
Avantages du redimensionnement de pods à chaud :
- Moins d'indisponibilité : fini les interruptions et pertes de données potentielles liées au redémarrage des pods. Les opérations restent fluides et le service ininterrompu pour vos utilisateurs.
- Efficacité accrue : le right-sizing de vos pods est essentiel pour exploiter au mieux vos ressources.
InPlacePodVerticalScalingpermet d'allouer exactement ce qu'il faut, en évitant aussi bien le surprovisionnement (qui coûte cher) que le sous-provisionnement (qui pénalise les performances). - Plus d'agilité : la mise à l'échelle dynamique permet de réagir instantanément aux variations de la demande. Pic de trafic soudain ou job batch planifié, vos pods ajustent leur consommation de ressources en toute transparence, pour une performance et une réactivité optimales.
- Économies de coûts : en évitant le surprovisionnement et en optimisant l'usage des ressources, InPlacePodVerticalScaling se traduit directement par des économies, surtout dans les environnements cloud facturés à l'unité de ressource.
- Gestion simplifiée : piloter des déploiements complexes n'a rien de simple, mais InPlacePodVerticalScaling fluidifie le processus en supprimant les redémarrages manuels et en offrant une approche inédite de la gestion des ressources.
Dans cet article, je vais vous montrer comment tester le redimensionnement de pods à chaud. La fonctionnalité est en bêta depuis Kubernetes v1.33 et n'est pas recommandée en production. La communauté Kubernetes poursuit ses efforts pour la consolider, en améliorer les performances et la rendre robuste pour les environnements de production.
Le redimensionnement de pods à chaud en pratique
La fonctionnalité InPlacePodVerticalScaling est activée par défaut dans les clusters en v1.33. Vous pouvez l'activer explicitement dans un cluster minikube via la commande suivante, ou activer la feature gate correspondante dans votre cluster Kubernetes managé si elle ne l'est pas déjà.
minikube start --feature-gates=InPlacePodVerticalScaling=true
Déployons un pod d'exemple sur le cluster. La nouvelle restartPolicy dans la spec du pod permet de contrôler la manière dont les conteneurs sont gérés lors d'un redimensionnement de ressources.
Dans la configuration ci-dessous, la resizePolicy indique que toute modification de l'allocation mémoire impose un redémarrage du conteneur, alors qu'aucun redémarrage n'est requis pour les ressources CPU.
Le choix de redémarrer ou non un conteneur dépend de la capacité de l'application à exploiter la nouvelle ressource sans redémarrage. Par exemple, si la consommation mémoire est critique pour le bon fonctionnement de l'application, redémarrer le conteneur lors d'un changement de mémoire garantit qu'elle démarre avec la bonne quantité allouée. C'est une précaution qui évite bien des problèmes ou dysfonctionnements.
cat <<EOF | kubectl apply -f -
---
apiVersion: v1
kind: Pod
metadata:
labels:
run: nginx
name: nginx
spec:
containers:
- image: nginx
name: nginx
resizePolicy:
- resourceName: "memory"
restartPolicy: "RestartContainer"
- resourceName: "cpu"
restartPolicy: "NotRequired"
resources:
limits:
cpu: "300m"
memory: "1Gi"
requests:
cpu: "100m"
memory: "500Mi"
EOF
Attendez que le pod passe à l'état running, puis examinez sa configuration. Un nouveau champ allocatedResources apparaît dans containerStatuses au sein du statut du pod : il reflète les ressources de nœud actuellement allouées aux conteneurs.
Un autre champ, resources, a également été ajouté au statut du conteneur. Il reflète les requests et limits effectivement configurés sur les conteneurs en cours d'exécution, tels que remontés par le runtime de conteneurs.
Redimensionnement CPU
Ajustons les ressources CPU du pod avec la commande patch suivante et observons l'opération. La modification des ressources d'un pod passe désormais obligatoirement par la sous-ressource resize ; les versions kubectl v1.32+ prennent cet argument en charge.
kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"cpu" :"300m"},"limits": {"cpu" :"500m"}}}]}}'
Le statut d'une opération de redimensionnement est désormais exposé via deux conditions de pod :
PodResizePending: indique que Kubelet ne peut pas appliquer le redimensionnement immédiatement (par ex.reason: Deferreden cas d'impossibilité temporaire,reason: Infeasiblesi l'opération est impossible sur le nœud).PodResizeInProgress: indique que le redimensionnement est accepté et en cours d'application. Les erreurs rencontrées durant cette phase sont désormais remontées dans le message de cette condition avecreason: Error.
La communauté a amélioré le Pod Lifecycle Event Generator (PLEG) de Kubelet, ce qui lui permet de réagir et de finaliser les redimensionnements plus vite en bêta. Cela dit, le redimensionnement d'un pod peut parfois entrer en concurrence avec d'autres mises à jour de pods. Résultat : un certain délai avant l'activation du redimensionnement et la mise à jour des ressources du conteneur dans le statut du pod.
Redimensionnement mémoire
Poursuivons avec les ajustements de la ressource Memory ; le conteneur sera redémarré conformément à la restartPolicy.
kubectl patch pod nginx --subresource resize --patch '{"spec": {"containers": [{"name":"nginx", "resources":{"requests": {"memory" :"700Mi"}}}]}}'
La capture d'écran montre l'opération de redimensionnement réussie et le redémarrage du conteneur 🚀.
Cette fonctionnalité est encore en pleine maturation, mais des plateformes comme PerfectScale proposent déjà des workflows d'optimisation de niveau production, qui conjuguent sécurité, performance et maîtrise des coûts dans une gestion automatisée des ressources. Suivez les étapes décrites dans cet article pour la tester et en mesurer les bénéfices par vous-même.
J'espère que ce billet vous aura été utile. Pour aller plus loin, voici quelques ressources :