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 :
- Comment configurer un quota CPU et RAM pour un namespace.
- Comment automatiser l’application des quotas Ă tous les namespaces.
Table of Contents
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
etrequests.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
etlimits.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 :
- 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
- 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
- Consultez la documentation officielle Kubernetes sur ResourceQuotas pour en apprendre plus.