Chapitre 9. Quotas
9.1. Quotas de ressources par projet
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
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
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
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
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
core-object-counts.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: core-object-counts spec: hard: configmaps: "10" 1 persistentvolumeclaims: "4" 2 replicationcontrollers: "20" 3 secrets: "10" 4 services: "10" 5 services.loadbalancers: "2" 6
- 1
- Le nombre total d'objets
ConfigMap
qui 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
LoadBalancer
qui 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
- 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" 1 requests.cpu: "1" 2 requests.memory: 1Gi 3 limits.cpu: "2" 4 limits.memory: 2Gi 5
- 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" 1 scopes: - BestEffort 2
compute-resources-long-running.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources-long-running spec: hard: pods: "4" 1 limits.cpu: "4" 2 limits.memory: "2Gi" 3 scopes: - NotTerminating 4
- 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.activeDeadlineSeconds
est défini surnil
. Les pods de construction relèvent deNotTerminating
à moins que la politiqueRestartNever
ne soit appliquée.
compute-resources-time-bound.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: compute-resources-time-bound spec: hard: pods: "2" 1 limits.cpu: "1" 2 limits.memory: "1Gi" 3 scopes: - Terminating 4
- 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" 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 requests.ephemeral-storage: 2Gi 8 limits.ephemeral-storage: 4Gi 9
- 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
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
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-resources
pour 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=4
Exemple de sortie
resourcequota "test" created
Cet 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 test
Exemple 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
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 0
Dans 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.yaml
Exemple de sortie
apiVersion: v1 kind: ResourceQuota metadata: name: gpu-quota namespace: nvidia spec: hard: requests.nvidia.com/gpu: 1
Créer le quota :
# oc create -f gpu-quota.yaml
Exemple de sortie
resourcequota/gpu-quota created
Vérifiez que le quota de l'espace de noms est correct :
# oc describe quota gpu-quota -n nvidia
Exemple de sortie
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 0 1
Dé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: 1
Créer la capsule :
# oc create -f gpu-pod.yaml
Vérifiez que le module est en cours d'exécution :
# oc get pods
Exemple de sortie
NAME READY STATUS RESTARTS AGE gpu-pod-s46h7 1/1 Running 0 1m
Vérifiez que le compteur du quota
Used
est correct :# oc describe quota gpu-quota -n nvidia
Exemple de sortie
Name: gpu-quota Namespace: nvidia Resource Used Hard -------- ---- ---- requests.nvidia.com/gpu 1 1
Tentative 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.yaml
Exemple 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=1
Ce 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
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 demoproject
Exemple de sortie
NAME AGE besteffort 11m compute-resources 2m core-object-counts 29m
Décrivez le quota qui vous intéresse, par exemple le quota
core-object-counts
:$ oc describe quota core-object-counts -n demoproject
Exemple 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
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.yaml
Ajoutez 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.yaml
modifié dans l'espace de nomsopenshift-config
:$ oc create -f template.yaml -n openshift-config
NotePour 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-config
Modifier 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
spec
de la ressource de configuration du projet pour inclure les paramètresprojectRequestTemplate
etname
. 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 resourcequotas
Décrivez en détail le quota de ressources :
oc describe resourcequotas <resource_quota_name>