L’optimisation des coûts et la mise à l’échelle d’EKS avec Karpenter
L’optimisation des coûts et la mise à l’échelle d’EKS avec Karpenter

L’optimisation des coûts et la mise à l’échelle d’EKS avec Karpenter

Un grand challenge pour les organisations dans le contexte actuel est de pouvoir assurer la disponibilité de leurs applications sur le cloud tout en contrôlant les coûts. Karpenter, un autoscaler de cluster Kubernetes open-source, s’impose comme un outil puissant dans cet objectif, pour la mise à l’échelle intelligente des clusters EKS. Karpenter : de quoi s’agit-il ? Comment fonctionne-t-il ? Découvrons ça dans la suite 👇

Pourquoi Karpenter ? Les limites des clusters autoscalers standards

La mise à l’échelle traditionnelle au sein d’un cluster EKS se base principalement sur l’interaction avec les groupes d'autoscaling. Lors d’un trafic croissant, les pods sont planifiés sur les nœuds disponibles du cluster. Une fois que les nœuds existants sont saturés, les pods sont alors en attente. Le cluster autoscaler communique avec l’autoscaling group pour déployer de nouvelles instances selon les groupes de nœuds prédéfinis.

Étapes de mise à l’échelle traditionnelle
Étapes de mise à l’échelle traditionnelle

Ce processus est lent et asynchrone. Il présente aussi un manque de flexibilité puisque les nœuds créés vont être de même type et taille, peu importe la charge des pods qui sont en attente de planification. Les métriques sur lesquelles se base “Cluster Autoscaler” sont également limitées et peu flexibles par rapport à Karpenter.

Qu'est-ce que Karpenter ?

Karpenter est un outil open-source d’autoscaling qui offre une mise à l'échelle intelligente et personnalisable des clusters Kubernetes.

Il simplifie et automatise la gestion des nœuds, et s'adresse directement à l'API de la flotte AWS EC2 pour provisionner les nœuds.

Étapes de mise à l’échelle avec Karpenter
Étapes de mise à l’échelle avec Karpenter

Bien évidemment, le principal rôle de Karpenter est l’autoscaling, mais Karpenter est aussi un outil efficace d'optimisation de coûts. Il permet également de gérer les upgrades sur les clusters.

Comment fonctionne Karpenter ?

Karpenter analyse les besoins des pods en temps réels et provisionne les instances EC2 les plus appropriées pour répondre à ces besoins. Il peut provisionner des instances on-demand mais aussi des instances spot pour s’adapter aux différents types de charges de travail.

Prérequis d’installation

  1. AWS CLI
  2. kubectl - Kubernetes CLI
  3. eksctl (>= v0.180.0) - AWS EKS CLI
  4. helm - Kubernetes package manager

Installation de Karpenter Karpenter s’installe sur les clusters EKS en utilisant une chart

HELM : https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/

Les principales fonctionnalités de Karpenter

Voici un aperçu des principales fonctionnalités de Karpenter.

  • Flexibilité sur le choix des instances :
  • Karpenter se base sur des ressources de type NodePools qui permettent de définir le nombre limite ainsi que les caractéristiques des instances à provisionner lors de la mise à l’échelle (type, famille, nombre de CPU, la génération, etc.). La notion de poids dans les NodePools: si un pod correspond à plusieurs NodePools, celui avec le poids le plus élevé est choisi.

Exemple d’un fichier
Exemple d’un fichier YAML d’un NodePool
  • Gestion des interruptions spot avec Karpenter:
  • L'une des principales caractéristiques de Karpenter est sa capacité à utiliser des instances spot.

    Les instances spot sont beaucoup moins chères que les instances on-demand, ce qui permet de réduire les coûts considérablement, sauf qu'elles peuvent être retirées par AWS à tout moment après un délai de deux minutes.

    Karpenter gère ce risque d'interruptions sans la nécessité de définir des stratégies de monitoring ou de remplacement supplémentaires.

    💡

    Les instances spots ne sont pas toujours le meilleur choix pour tous les workloads. C’est le cas principalement pour les charges de travail qui sont tolérantes aux pannes ou qui peuvent supporter des interruptions. Exemples de cas d’utilisations : Les traitements par lots, les pipelines CI/CD, les applications stateless, etc.

  • Respect des contraintes de planification :
  • Karpenter est compatible avec toutes les contraintes de placements des pods standards de kubernetes: les sélecteurs de nœuds, les affinités des nœuds, les tâches et les tolérances, etc. Les nœuds provisionnés par Karpenter auront également des étiquettes propres à lui (Exemple : karpenter.sh/capacity-type).

    Ces étiquettes peuvent être utilisées par les sélecteurs et les affinités de nœuds pour bien définir des contraintes de planification.

  • Optimisation des coûts :
  • Karpenter permet d'optimiser l'utilisation des nœuds et de consolider les coûts à mesure que le besoin évolue. Par exemple, si vous avez une première instance saturée, une deuxième moyennement utilisée, et deux dernières sous-utilisées, Karpenter va repositionner les pods des instances sous-utilisées sur celles qui sont moyennement utilisées. Ainsi, vous aurez deux instances optimisées et il va libérer les deux dernières.

image
image

Prenons un autre exemple de situation : si on a une première instance saturée et deux dernières sous-utilisées, même en déplaçant le dernier pod sur la deuxième instance, cette dernière resterait sous-utilisée. Karpenter peut alors provisionner une instance plus petite (une M5 large) pour planifier les pods et optimiser davantage les coûts du cluster.

image
image

Karpenter Drift : pour assurer les corrections et les mises à niveau

La fonctionnalité "drift" de Karpenter permet d’assurer la correspondance entre ce qui est déployé dans le cluster et l'intention de déploiement définie en détectant et corrigeant les divergences.

  • Détection et correction de drift
  • Si vous avez configuré votre NodePool afin qu’il provisionne un type d’instance particulier et que, dans le futur, vous changez de type d’instance, Karpenter détectera automatiquement un drift dès que la modification sera appliquée et il fera le nécessaire pour correspondre les instances provisionnées avec la définition des NodePools.

  • Mise à jour des clusters
  • Karpenter peut aussi être utilisé dans le cas de mise à jour de cluster. Si vous décidez par exemple de passer votre control plane de la version 1.29 à la 1.30, Karpenter va détecter qu'il y a une différence entre les instances EC2 actuellement déployées, qui ont un kubelet en version 1.29. Karpenter possède un parameter store qui lui permet de monitorer les différentes AMI compatibles avec cette version de kubelet et fera une upgrade en mode “progressive roll-out” des différentes instances sans intervention manuelle, et de manière sécurisée.

  • Planification des interruptions
  • Karpenter met à disposition des solutions pour minimiser les impacts des mises à jour sur la disponibilité des applications. Par exemple, si une application est protégée par un Pod Disruption Budget (PDB) qui n’autorise qu’un seul pod indisponible à un instant T, Karpenter respectera cette contrainte en évitant de déprovisionner plus de pods que permis. Pour les applications critiques ou longues, une annotation "karpenter.sh/do-not-disrupt" peut être utilisée pour empêcher toute interruption.

Limitations de Karpenter :

Cependant, Karpenter, malgré ses nombreux avantages en tant que provisioner de nœuds dynamiques pour Kubernetes, présente certaines limitations qu'il est important de connaître :

  • Configuration complexe : la configuration des NodePools de Karpenter peut être complexes pour les utilisateurs non familiers de Kubernetes.
  • Support des fournisseurs de cloud : Karpenter est principalement conçu pour AWS, avec un support limité pour les autres fournisseurs de cloud.
  • Gestion des coûts : la gestion des coûts nécessite une configuration précise des tolérances et des interruptions pour ne pas avoir des problèmes de surprovisioning.

Conclusion

En conclusion de cette article, Karpenter représente une avancée significative dans les technologies d'autoscaling disponibles pour Kubernetes. Il permet une gestion des ressources dynamiques, rentable en termes de coûts, efficace et robuste. En adoptant Karpenter, les entreprises peuvent non seulement réduire leurs dépenses en matière de ressources sur le cloud, mais aussi améliorer leur efficacité opérationnelle et leur maintenabilité. La complexité des environnements cloud ne cessant de croître, nous sommes convaincus que des outils comme Karpenter joueront un rôle essentiel pour garantir l'utilisation optimale des ressources et la maîtrise des coûts Pour ces raisons nous conseillons donc à nos clients exploitant des clusters Kubernetes à fort enjeux de scalabilité de considérer Karpenter comme un outil essentiel à avoir dans sa toolbox Cloud & DevOps et, à minima, à garder dans le viseur de leur radar de veille technologique.

Ressources utiles

- Getting started with Karpenter: https://karpenter.sh/docs/getting-started/getting-started-with-karpenter/

- Introducing Karpenter an open-source high performance Kubernetes cluster autoscaler: https://aws.amazon.com/blogs/aws/introducing-karpenter-an-open-source-high-performance-kubernetes-cluster-autoscaler/

- Github repository for Karpenter Provider on AWS for Terraform: https://github.com/aws/karpenter-provider-aws

- Karpenter best practices for EKS: https://aws.github.io/aws-eks-best-practices/karpenter/

Article issu de notre participation à AWS Summit

Merci pour votre lecture. Cet article vous a plu, partagez sur vos réseaux 😉

Tarek Jarrar - Octobre 20, 2024

image