Imposer des quotas CPU et RAM par namespace dans Kubernetes

Dans Kubernetes, il est essentiel de contrĂŽler l’utilisation des ressources, en particulier dans des environnements multi-tenant oĂč plusieurs Ă©quipes ou services partagent les mĂȘmes ressources. Pour cela, Kubernetes fournit un mĂ©canisme appelĂ© ResourceQuota qui permet d’imposer des limites sur la consommation des ressources (comme le CPU et la RAM) Ă  l’échelle d’un namespace. Cela garantit que les Pods dans un namespace donnĂ© ne dĂ©passent pas une certaine consommation et empĂȘche une saturation des ressources du cluster.

Dans cet article, nous allons explorer :

  1. Comment configurer un quota CPU et RAM pour un namespace.
  2. Comment automatiser l’application des quotas Ă  tous les namespaces.

Partie 1 : Imposer des quotas de ressources dans un namespace

Les ResourceQuotas sont des objets Kubernetes qui vous permettent de dĂ©finir des limites maximales d’utilisation de certaines ressources (comme le CPU, la RAM ou le nombre de Pods) dans un namespace.

Étape 1 : CrĂ©er un fichier ResourceQuota YAML

Pour commencer, vous devez définir un fichier YAML contenant le quota de ressources que vous souhaitez imposer.

Créez un fichier nommé resource-quota.yaml avec le contenu suivant :

apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota-cpu-mem
  namespace: <nom-du-namespace>  # Remplacez par votre namespace
spec:
  hard:
    requests.cpu: "4"        # Maximum de 4 CPU demandés dans le namespace
    requests.memory: "8Gi"   # Maximum de 8 Gi de mémoire demandée
    limits.cpu: "8"          # Limite maximale de 8 CPU
    limits.memory: "16Gi"    # Limite maximale de 16 Gi de mémoire

Explication :

  • requests.cpu et requests.memory : Ce sont les ressources rĂ©servĂ©es que les Pods peuvent demander. Si ces limites sont atteintes, plus aucun Pod ne pourra ĂȘtre programmĂ© dans le namespace sans dĂ©passer le quota.
  • limits.cpu et limits.memory : Ces valeurs dĂ©finissent la consommation maximale de CPU et de mĂ©moire qu’un Pod peut atteindre.

Étape 2 : Appliquer le ResourceQuota

Une fois le fichier YAML créé, appliquez-le à votre namespace avec la commande suivante :

kubectl apply -f resource-quota.yaml

Cela imposera des quotas Ă  ce namespace spĂ©cifique. Les nouveaux Pods qui demanderont plus de ressources que le quota ne pourront pas ĂȘtre créés.

Étape 3 : VĂ©rifier les quotas appliquĂ©s

Pour vérifier les quotas appliqués à un namespace, utilisez la commande suivante :

kubectl get resourcequota -n <nom-du-namespace>

Cela affichera le quota de ressources appliquĂ© ainsi que l’utilisation actuelle des ressources.

Exemple de retour :

NAME             CREATED AT
quota-cpu-mem    2024-10-01T10:30:00Z

Pour obtenir des dĂ©tails sur l’utilisation des ressources par rapport aux quotas :

kubectl describe resourcequota quota-cpu-mem -n <nom-du-namespace>

Partie 2 : Appliquer automatiquement des quotas Ă  tous les namespaces

Si vous gĂ©rez un cluster oĂč plusieurs Ă©quipes ou services crĂ©ent rĂ©guliĂšrement de nouveaux namespaces, il peut ĂȘtre fastidieux d’appliquer manuellement les quotas Ă  chaque namespace. Pour automatiser cette tĂąche, vous pouvez utiliser un script Bash ou un Admission Controller comme OPA Gatekeeper ou Kyverno.

Option 1 : Utiliser un script Bash pour appliquer les quotas Ă  tous les namespaces existants

Voici un exemple de script qui applique un quota de ressources Ă  tous les namespaces existants dans le cluster :

#!/bin/bash
for ns in $(kubectl get ns -o jsonpath='{.items[*].metadata.name}')
do
  kubectl apply -f <<EOF
apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota-cpu-mem
  namespace: $ns
spec:
  hard:
    requests.cpu: "4"
    requests.memory: "8Gi"
    limits.cpu: "8"
    limits.memory: "16Gi"
EOF
done

Explication :

  • Ce script parcourt tous les namespaces du cluster et applique un ResourceQuota identique Ă  chacun d’eux.
  • Vous pouvez exĂ©cuter ce script rĂ©guliĂšrement pour vous assurer que les quotas sont appliquĂ©s mĂȘme sur les nouveaux namespaces créés aprĂšs l’exĂ©cution initiale.

Option 2 : Utiliser Kyverno pour automatiser l’application

Un autre moyen plus puissant et flexible pour appliquer automatiquement des quotas est d’utiliser OPA Gatekeeper ou Kyverno. Ces outils permettent de dĂ©finir des politiques d’admission qui forcent certaines configurations Ă  ĂȘtre appliquĂ©es Ă  chaque namespace.

Voici un exemple de politique Kyverno qui impose un quota Ă  tous les namespaces :

apiVersion: kyverno.io/v1
kind: ClusterPolicy
metadata:
  name: enforce-quota
spec:
  rules:
  - name: enforce-resourcequota
    match:
      resources:
        kinds:
        - Namespace
    generate:
      kind: ResourceQuota
      name: quota-cpu-mem
      namespace: "{{request.object.metadata.name}}"
      synchronize: true
      spec:
        hard:
          requests.cpu: "4"
          requests.memory: "8Gi"
          limits.cpu: "8"
          limits.memory: "16Gi"

Étapes d’installation pour Kyverno :

  1. Installez Kyverno avec Helm (si vous ne l’avez pas dĂ©jĂ  fait) :
   helm repo add kyverno https://kyverno.github.io/kyverno/
   helm install kyverno kyverno/kyverno --namespace kyverno --create-namespace
  1. Appliquez la politique avec la commande suivante :
   kubectl apply -f enforce-quota.yaml

Avec cette politique, chaque fois qu’un nouveau namespace est créé, un quota sera automatiquement appliquĂ©.


Conclusion

Les quotas de ressources sont essentiels pour garantir une utilisation Ă©quitable des ressources dans un cluster Kubernetes multi-tenant. En utilisant des ResourceQuotas, vous pouvez contrĂŽler la consommation de CPU et de mĂ©moire dans chaque namespace. Si vous devez appliquer ces quotas Ă  plusieurs namespaces, vous pouvez utiliser des scripts d’automatisation ou des outils comme Kyverno pour imposer ces quotas automatiquement dĂšs la crĂ©ation d’un namespace.

Avec ces outils et techniques, vous assurez que votre cluster Kubernetes reste performant et que les ressources sont réparties équitablement entre les différents utilisateurs ou services.


Pour aller plus loin