Chapitre 9. Quotas
9.1. Quotas de ressources par projet Copier lienLien copié sur presse-papiers!
Un resource quota, défini par un objet ResourceQuota, fournit des contraintes qui limitent la consommation globale de ressources par projet. Il peut limiter la quantité d'objets pouvant être créés dans un projet par type, ainsi que la quantité totale de ressources de calcul et de stockage susceptibles d'être consommées par les ressources de ce projet.
Ce guide décrit le fonctionnement des quotas de ressources, la manière dont les administrateurs de clusters peuvent définir et gérer les quotas de ressources par projet, et la manière dont les développeurs et les administrateurs de clusters peuvent les visualiser.
9.1.1. Ressources gérées par quotas Copier lienLien copié sur presse-papiers!
Les paragraphes suivants décrivent l'ensemble des ressources de calcul et des types d'objets qui peuvent être gérés par un quota.
Un pod est dans un état terminal si status.phase in (Failed, Succeeded) est vrai.
| Nom de la ressource | Description |
|---|---|
|
|
La somme des demandes de CPU de tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
|
|
La somme des demandes de mémoire de tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
|
|
La somme des demandes de CPU de tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
|
|
La somme des demandes de mémoire de tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
|
| La somme des limites de CPU de tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
|
| La somme des limites de mémoire de tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
| Nom de la ressource | Description |
|---|---|
|
| La somme des demandes de stockage sur l'ensemble des réclamations de volumes persistants dans n'importe quel état ne peut pas dépasser cette valeur. |
|
| Le nombre total de réclamations de volumes persistants qui peuvent exister dans le projet. |
|
| La somme des demandes de stockage sur l'ensemble des réclamations de volumes persistants dans n'importe quel état qui ont une classe de stockage correspondante, ne peut pas dépasser cette valeur. |
|
| Le nombre total de réclamations de volumes persistants avec une classe de stockage correspondante qui peuvent exister dans le projet. |
|
|
La somme des demandes de stockage éphémère local pour tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
|
|
La somme des demandes de stockage éphémère pour tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
|
| La somme des limites de stockage éphémère de tous les pods dans un état non terminal ne peut pas dépasser cette valeur. |
| Nom de la ressource | Description |
|---|---|
|
| Le nombre total de pods dans un état non terminal qui peuvent exister dans le projet. |
|
| Le nombre total de contrôleurs de réplication qui peuvent exister dans le projet. |
|
| Nombre total de quotas de ressources pouvant exister dans le projet. |
|
| Le nombre total de services qui peuvent exister dans le projet. |
|
|
Le nombre total de services de type |
|
|
Le nombre total de services de type |
|
| Le nombre total de secrets qui peuvent exister dans le projet. |
|
|
Le nombre total d'objets |
|
| Le nombre total de réclamations de volumes persistants qui peuvent exister dans le projet. |
|
| Le nombre total de flux d'images qui peuvent exister dans le projet. |
9.1.2. Périmètre des quotas Copier lienLien copié sur presse-papiers!
Chaque quota peut être associé à un ensemble de scopes. Un quota ne mesure l'utilisation d'une ressource que si elle correspond à l'intersection des champs d'application énumérés.
L'ajout d'un champ d'application à un quota restreint l'ensemble des ressources auxquelles ce quota peut s'appliquer. La spécification d'une ressource en dehors de l'ensemble autorisé entraîne une erreur de validation.
| Champ d'application | Description |
|
|
Faire correspondre les pods qui ont la meilleure qualité de service pour |
|
|
Les pods qui n'ont pas la meilleure qualité de service pour |
Un champ d'application BestEffort limite un quota aux ressources suivantes :
-
pods
Un champ d'application NotBestEffort limite un quota au suivi des ressources suivantes :
-
pods -
memory -
requests.memory -
limits.memory -
cpu -
requests.cpu -
limits.cpu
9.1.3. Application des quotas Copier lienLien copié sur presse-papiers!
Après la création d'un quota de ressources pour un projet, le projet limite la possibilité de créer de nouvelles ressources susceptibles d'enfreindre la contrainte de quota jusqu'à ce qu'il ait calculé des statistiques d'utilisation mises à jour.
Après la création d'un quota et la mise à jour des statistiques d'utilisation, le projet accepte la création de nouveaux contenus. Lorsque vous créez ou modifiez des ressources, votre quota d'utilisation est incrémenté dès la demande de création ou de modification de la ressource.
Lorsque vous supprimez une ressource, l'utilisation de votre quota est décrémentée lors du prochain recalcul complet des statistiques de quota pour le projet. Un délai configurable détermine le temps nécessaire pour ramener les statistiques d'utilisation des quotas à la valeur observée actuellement dans le système.
Si les modifications du projet dépassent une limite de quota d'utilisation, le serveur refuse l'action et un message d'erreur approprié est renvoyé à l'utilisateur expliquant la contrainte de quota violée et les statistiques d'utilisation actuellement observées dans le système.
9.1.4. Demandes et limites Copier lienLien copié sur presse-papiers!
Lors de l'allocation des ressources informatiques, chaque conteneur peut spécifier une demande et une valeur limite pour le processeur, la mémoire et le stockage éphémère. Les quotas peuvent restreindre n'importe laquelle de ces valeurs.
Si le quota a une valeur spécifiée pour requests.cpu ou requests.memory, il faut que chaque conteneur entrant fasse une demande explicite pour ces ressources. Si le quota a une valeur spécifiée pour limits.cpu ou limits.memory, il faut que chaque conteneur entrant spécifie une limite explicite pour ces ressources.
9.1.5. Exemples de définitions de quotas de ressources Copier lienLien copié sur presse-papiers!
core-object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: core-object-counts
spec:
hard:
configmaps: "10"
persistentvolumeclaims: "4"
replicationcontrollers: "20"
secrets: "10"
services: "10"
services.loadbalancers: "2"
- 1
- Le nombre total d'objets
ConfigMapqui peuvent exister dans le projet. - 2
- Le nombre total de réclamations de volume persistantes (PVC) qui peuvent exister dans le projet.
- 3
- Le nombre total de contrôleurs de réplication qui peuvent exister dans le projet.
- 4
- Le nombre total de secrets qui peuvent exister dans le projet.
- 5
- Le nombre total de services qui peuvent exister dans le projet.
- 6
- Le nombre total de services de type
LoadBalancerqui peuvent exister dans le projet.
openshift-object-counts.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: openshift-object-counts
spec:
hard:
openshift.io/imagestreams: "10"
- 1
- Nombre total de flux d'images pouvant exister dans le projet.
compute-resources.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
spec:
hard:
pods: "4"
requests.cpu: "1"
requests.memory: 1Gi
limits.cpu: "2"
limits.memory: 2Gi
- 1
- Le nombre total de pods dans un état non terminal qui peuvent exister dans le projet.
- 2
- Sur l'ensemble des pods dans un état non terminal, la somme des demandes de CPU ne peut pas dépasser 1 cœur.
- 3
- Sur l'ensemble des pods dans un état non terminal, la somme des demandes de mémoire ne peut pas dépasser 1Gi.
- 4
- Pour tous les pods dans un état non terminal, la somme des limites de CPU ne peut pas dépasser 2 cœurs.
- 5
- Pour tous les pods dans un état non terminal, la somme des limites de mémoire ne peut pas dépasser 2Gi.
besteffort.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: besteffort
spec:
hard:
pods: "1"
scopes:
- BestEffort
compute-resources-long-running.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources-long-running
spec:
hard:
pods: "4"
limits.cpu: "4"
limits.memory: "2Gi"
scopes:
- NotTerminating
- 1
- Le nombre total de pods dans un état non terminal.
- 2
- Pour tous les pods dans un état non terminal, la somme des limites de CPU ne peut pas dépasser cette valeur.
- 3
- La somme des limites de mémoire de tous les pods dans un état non terminal ne peut pas dépasser cette valeur.
- 4
- Restreint le quota aux seuls pods correspondants pour lesquels
spec.activeDeadlineSecondsest défini surnil. Les pods de construction relèvent deNotTerminatingà moins que la politiqueRestartNeverne soit appliquée.
compute-resources-time-bound.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources-time-bound
spec:
hard:
pods: "2"
limits.cpu: "1"
limits.memory: "1Gi"
scopes:
- Terminating
- 1
- Le nombre total de pods dans un état de terminaison.
- 2
- Pour tous les pods en état de terminaison, la somme des limites de CPU ne peut pas dépasser cette valeur.
- 3
- La somme des limites de mémoire ne peut pas dépasser cette valeur pour tous les pods en état de terminaison.
- 4
- Restreint le quota aux seuls pods correspondants où
spec.activeDeadlineSeconds >=0. Par exemple, ce quota s'applique aux pods de construction ou de déploiement, mais pas aux pods de longue durée comme un serveur web ou une base de données.
storage-consumption.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: storage-consumption
spec:
hard:
persistentvolumeclaims: "10"
requests.storage: "50Gi"
gold.storageclass.storage.k8s.io/requests.storage: "10Gi"
silver.storageclass.storage.k8s.io/requests.storage: "20Gi"
silver.storageclass.storage.k8s.io/persistentvolumeclaims: "5"
bronze.storageclass.storage.k8s.io/requests.storage: "0"
bronze.storageclass.storage.k8s.io/persistentvolumeclaims: "0"
requests.ephemeral-storage: 2Gi
limits.ephemeral-storage: 4Gi
- 1
- Le nombre total de demandes de volumes persistants dans un projet
- 2
- Pour toutes les demandes de volume persistant d'un projet, la somme de l'espace de stockage demandé ne peut dépasser cette valeur.
- 3
- Pour toutes les demandes de volumes persistants d'un projet, la somme du stockage demandé dans la classe de stockage or ne peut pas dépasser cette valeur.
- 4
- Pour toutes les demandes de volumes persistants d'un projet, la somme du stockage demandé dans la classe de stockage argent ne peut pas dépasser cette valeur.
- 5
- Pour toutes les demandes de volumes persistants d'un projet, le nombre total de demandes dans la classe de stockage Silver ne peut pas dépasser cette valeur.
- 6
- Sur l'ensemble des demandes de volumes persistants d'un projet, la somme des espaces de stockage demandés dans la classe de stockage bronze ne peut pas dépasser cette valeur. Lorsque cette valeur est fixée à
0, cela signifie que la classe de stockage bronze ne peut pas demander de stockage. - 7
- Pour toutes les demandes de volumes persistants d'un projet, la somme du stockage demandé dans la classe de stockage bronze ne peut pas dépasser cette valeur. Lorsque cette valeur est fixée à
0, cela signifie que la classe de stockage bronze ne peut pas créer de demandes. - 8
- Sur l'ensemble des pods dans un état non terminal, la somme des demandes de stockage éphémère ne peut pas dépasser 2Gi.
- 9
- La somme des limites de stockage éphémère de tous les pods dans un état non terminal ne peut pas dépasser 4Gi.
9.1.6. Création d'un quota Copier lienLien copié sur presse-papiers!
Vous pouvez créer un quota pour limiter l'utilisation des ressources dans un projet donné.
Procédure
- Définir le quota dans un fichier.
Utilisez le fichier pour créer le quota et l'appliquer à un projet :
$ oc create -f <file> [-n <project_name>]Par exemple :
$ oc create -f core-object-counts.yaml -n demoproject
9.1.6.1. Création de quotas de nombre d'objets Copier lienLien copié sur presse-papiers!
Vous pouvez créer un quota de comptage d'objets pour tous les types de ressources standard à espace de noms sur OpenShift Container Platform, tels que les objets BuildConfig et DeploymentConfig. Un quota de comptage d'objets place un quota défini sur tous les types de ressources standard à espace de noms.
Lors de l'utilisation d'un quota de ressources, un objet est imputé au quota lors de sa création. Ces types de quotas sont utiles pour se protéger contre l'épuisement des ressources. Le quota ne peut être créé que s'il y a suffisamment de ressources disponibles dans le projet.
Procédure
Pour configurer un quota de comptage d'objets pour une ressource :
Exécutez la commande suivante :
$ oc create quota <name> \ --hard=count/<resource>.<group>=<quota>,count/<resource>.<group>=<quota>1 - 1
- La variable
<resource>est le nom de la ressource et<group>est le groupe API, le cas échéant. Utilisez la commandeoc api-resourcespour obtenir une liste des ressources et des groupes d'API qui leur sont associés.
Par exemple :
$ oc create quota test \ --hard=count/deployments.extensions=2,count/replicasets.extensions=4,count/pods=3,count/secrets=4Exemple de sortie
resourcequota "test" createdCet exemple limite les ressources répertoriées à la limite stricte de chaque projet du cluster.
Vérifiez que le quota a été créé :
$ oc describe quota testExemple de sortie
Name: test Namespace: quota Resource Used Hard -------- ---- ---- count/deployments.extensions 0 2 count/pods 0 3 count/replicasets.extensions 0 4 count/secrets 0 4
9.1.6.2. Définition d'un quota de ressources pour les ressources étendues Copier lienLien copié sur presse-papiers!
Le surengagement des ressources n'est pas autorisé pour les ressources étendues, vous devez donc spécifier requests et limits pour la même ressource étendue dans un quota. Actuellement, seuls les éléments de quota avec le préfixe requests. sont autorisés pour les ressources étendues. Voici un exemple de scénario permettant de définir un quota de ressources pour la ressource GPU nvidia.com/gpu.
Procédure
Déterminez le nombre de GPU disponibles sur un nœud de votre cluster. Par exemple, le nombre de GPU disponibles sur un nœud de votre cluster :
# oc describe node ip-172-31-27-209.us-west-2.compute.internal | egrep 'Capacity|Allocatable|gpu'Exemple de sortie
openshift.com/gpu-accelerator=true Capacity: nvidia.com/gpu: 2 Allocatable: nvidia.com/gpu: 2 nvidia.com/gpu 0 0Dans cet exemple, 2 GPU sont disponibles.
Fixer un quota dans l'espace de noms
nvidia. Dans cet exemple, le quota est de1:# cat gpu-quota.yamlExemple de sortie
apiVersion: v1 kind: ResourceQuota metadata: name: gpu-quota namespace: nvidia spec: hard: requests.nvidia.com/gpu: 1Créer le quota :
# oc create -f gpu-quota.yamlExemple de sortie
resourcequota/gpu-quota createdVérifiez que le quota de l'espace de noms est correct :
# oc describe quota gpu-quota -n nvidiaExemple de sortie
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 0 1Définir un pod qui demande un seul GPU. L'exemple de fichier de définition suivant s'appelle
gpu-pod.yaml:apiVersion: v1 kind: Pod metadata: generateName: gpu-pod- namespace: nvidia spec: restartPolicy: OnFailure containers: - name: rhel7-gpu-pod image: rhel7 env: - name: NVIDIA_VISIBLE_DEVICES value: all - name: NVIDIA_DRIVER_CAPABILITIES value: "compute,utility" - name: NVIDIA_REQUIRE_CUDA value: "cuda>=5.0" command: ["sleep"] args: ["infinity"] resources: limits: nvidia.com/gpu: 1Créer la capsule :
# oc create -f gpu-pod.yamlVérifiez que le module est en cours d'exécution :
# oc get podsExemple de sortie
NAME READY STATUS RESTARTS AGE gpu-pod-s46h7 1/1 Running 0 1mVérifiez que le compteur du quota
Usedest correct :# oc describe quota gpu-quota -n nvidiaExemple de sortie
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 1 1Tentative de création d'un second pod GPU dans l'espace de noms
nvidia. Celui-ci est techniquement disponible sur le nœud car il possède 2 GPU :# oc create -f gpu-pod.yamlExemple de sortie
Error from server (Forbidden): error when creating "gpu-pod.yaml": pods "gpu-pod-f7z2w" is forbidden: exceeded quota: gpu-quota, requested: requests.nvidia.com/gpu=1, used: requests.nvidia.com/gpu=1, limited: requests.nvidia.com/gpu=1Ce message d'erreur Forbidden est attendu parce que vous avez un quota de 1 GPU et que ce pod a essayé d'allouer un deuxième GPU, qui dépasse son quota.
9.1.7. Consultation d'un quota Copier lienLien copié sur presse-papiers!
Vous pouvez consulter les statistiques d'utilisation liées aux limites définies dans le quota d'un projet en naviguant dans la console web jusqu'à la page Quota du projet.
Vous pouvez également utiliser l'interface de gestion pour afficher les détails des quotas.
Procédure
Obtenir la liste des quotas définis dans le projet. Par exemple, pour un projet appelé
demoproject:$ oc get quota -n demoprojectExemple de sortie
NAME AGE besteffort 11m compute-resources 2m core-object-counts 29mDécrivez le quota qui vous intéresse, par exemple le quota
core-object-counts:$ oc describe quota core-object-counts -n demoprojectExemple de sortie
Name: core-object-counts Namespace: demoproject Resource Used Hard -------- ---- ---- configmaps 3 10 persistentvolumeclaims 0 4 replicationcontrollers 3 20 secrets 9 10 services 2 10
9.1.8. Configuration de quotas de ressources explicites Copier lienLien copié sur presse-papiers!
Configurer des quotas de ressources explicites dans un modèle de demande de projet pour appliquer des quotas de ressources spécifiques dans les nouveaux projets.
Conditions préalables
- Accès au cluster en tant qu'utilisateur ayant le rôle d'administrateur de cluster.
-
Installez le CLI OpenShift (
oc).
Procédure
Ajouter une définition de quota de ressources à un modèle de demande de projet :
Si un modèle de demande de projet n'existe pas dans un cluster :
Créez un modèle de projet bootstrap et produisez-le dans un fichier appelé
template.yaml:oc adm create-bootstrap-project-template -o yaml > template.yamlAjoutez une définition de quota de ressources à
template.yaml. L'exemple suivant définit un quota de ressources nommé "consommation de stockage". La définition doit être ajoutée avant la sectionparameters:dans le modèle :- apiVersion: v1 kind: ResourceQuota metadata: name: storage-consumption namespace: ${PROJECT_NAME} spec: hard: persistentvolumeclaims: "10"1 requests.storage: "50Gi"2 gold.storageclass.storage.k8s.io/requests.storage: "10Gi"3 silver.storageclass.storage.k8s.io/requests.storage: "20Gi"4 silver.storageclass.storage.k8s.io/persistentvolumeclaims: "5"5 bronze.storageclass.storage.k8s.io/requests.storage: "0"6 bronze.storageclass.storage.k8s.io/persistentvolumeclaims: "0"7 - 1
- Le nombre total de demandes de volumes persistants dans un projet.
- 2
- Pour toutes les demandes de volume persistant d'un projet, la somme de l'espace de stockage demandé ne peut dépasser cette valeur.
- 3
- Pour toutes les demandes de volumes persistants d'un projet, la somme du stockage demandé dans la classe de stockage or ne peut pas dépasser cette valeur.
- 4
- Pour toutes les demandes de volumes persistants d'un projet, la somme du stockage demandé dans la classe de stockage argent ne peut pas dépasser cette valeur.
- 5
- Pour toutes les demandes de volumes persistants d'un projet, le nombre total de demandes dans la classe de stockage Silver ne peut pas dépasser cette valeur.
- 6
- Sur l'ensemble des demandes de volumes persistants d'un projet, la somme des espaces de stockage demandés dans la classe de stockage bronze ne peut pas dépasser cette valeur. Lorsque cette valeur est fixée à
0, la classe de stockage bronze ne peut pas demander de stockage. - 7
- Sur l'ensemble des demandes de volumes persistants d'un projet, la somme du stockage demandé dans la classe de stockage bronze ne peut pas dépasser cette valeur. Lorsque cette valeur est définie sur
0, la classe de stockage bronze ne peut pas créer de demandes.
Créer un modèle de demande de projet à partir du fichier
template.yamlmodifié dans l'espace de nomsopenshift-config:$ oc create -f template.yaml -n openshift-configNotePour inclure la configuration en tant qu'annotation
kubectl.kubernetes.io/last-applied-configuration, ajoutez l'option--save-configà la commandeoc create.Par défaut, le modèle s'appelle
project-request.
Si un modèle de demande de projet existe déjà dans un cluster :
NoteSi vous gérez des objets de manière déclarative ou impérative au sein de votre cluster à l'aide de fichiers de configuration, modifiez le modèle de demande de projet existant à l'aide de ces fichiers.
Liste des modèles dans l'espace de noms
openshift-config:$ oc get templates -n openshift-configModifier un modèle de demande de projet existant :
oc edit template <project_request_template> -n openshift-config-
Ajoutez une définition de quota de ressources, telle que l'exemple précédent
storage-consumption, dans le modèle existant. La définition doit être ajoutée avant la sectionparameters:du modèle.
Si vous avez créé un modèle de demande de projet, faites-y référence dans la ressource de configuration du projet du cluster :
Accéder à la ressource de configuration du projet pour l'éditer :
En utilisant la console web :
-
Naviguez jusqu'à la page Administration
Cluster Settings. - Cliquez sur Configuration pour afficher toutes les ressources de configuration.
- Trouvez l'entrée pour Project et cliquez sur Edit YAML.
-
Naviguez jusqu'à la page Administration
En utilisant le CLI :
Modifier la ressource
project.config.openshift.io/cluster:$ oc edit project.config.openshift.io/cluster
Mettez à jour la section
specde la ressource de configuration du projet pour inclure les paramètresprojectRequestTemplateetname. L'exemple suivant fait référence au nom du modèle de demande de projet par défautproject-request:apiVersion: config.openshift.io/v1 kind: Project metadata: ... spec: projectRequestTemplate: name: project-request
Vérifier que le quota de ressources est appliqué lors de la création des projets :
Créer un projet :
oc new-project <nom_du_projet>Liste des quotas de ressources du projet :
$ oc get resourcequotasDécrivez en détail le quota de ressources :
oc describe resourcequotas <resource_quota_name>