7.3. Restreindre la consommation des ressources par des plages de limites
Par défaut, les conteneurs s'exécutent avec des ressources de calcul non limitées sur un cluster OpenShift Container Platform. Avec les plages de limites, vous pouvez restreindre la consommation de ressources pour des objets spécifiques dans un projet :
- des pods et des conteneurs : Vous pouvez définir des exigences minimales et maximales en matière de CPU et de mémoire pour les pods et leurs conteneurs.
-
Flux d'images : Vous pouvez limiter le nombre d'images et de balises dans un objet
ImageStream
. - Images : Vous pouvez limiter la taille des images qui peuvent être transférées vers un registre interne.
- Réclamations de volumes persistants (PVC) : Vous pouvez limiter la taille des PVC qui peuvent être demandés.
Si un pod ne respecte pas les contraintes imposées par la plage de limites, le pod ne peut pas être créé dans l'espace de noms.
7.3.1. À propos des plages de limites
Une plage de limites, définie par un objet LimitRange
, restreint la consommation de ressources dans un projet. Dans le projet, vous pouvez définir des limites de ressources spécifiques pour un pod, un conteneur, une image, un flux d'images ou une revendication de volume persistant (PVC).
Toutes les demandes de création et de modification de ressources sont évaluées par rapport à chaque objet LimitRange
du projet. Si la ressource ne respecte pas l'une des contraintes énumérées, elle est rejetée.
L'illustration suivante montre un objet de plage de limites pour tous les composants : pod, conteneur, image, flux d'images ou PVC. Vous pouvez configurer des limites pour l'un ou l'ensemble de ces composants dans le même objet. Vous créez un objet de plage de limites différent pour chaque projet dans lequel vous souhaitez contrôler les ressources.
Objet de la plage de limites d'un échantillon pour un conteneur
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" spec: limits: - type: "Container" max: cpu: "2" memory: "1Gi" min: cpu: "100m" memory: "4Mi" default: cpu: "300m" memory: "200Mi" defaultRequest: cpu: "200m" memory: "100Mi" maxLimitRequestRatio: cpu: "10"
7.3.1.1. Limites des composants
Les exemples suivants montrent les paramètres de la plage de limites pour chaque composant. Les exemples sont divisés pour plus de clarté. Vous pouvez créer un seul objet LimitRange
pour un ou tous les composants si nécessaire.
7.3.1.1.1. Limites des conteneurs
Une plage de limites vous permet de spécifier le minimum et le maximum de CPU et de mémoire que chaque conteneur d'un pod peut demander pour un projet spécifique. Si un conteneur est créé dans le projet, les demandes de CPU et de mémoire du conteneur dans la spécification Pod
doivent être conformes aux valeurs définies dans l'objet LimitRange
. Si ce n'est pas le cas, le module n'est pas créé.
-
La demande et la limite du processeur ou de la mémoire du conteneur doivent être supérieures ou égales à la contrainte de ressource
min
pour les conteneurs spécifiés dans l'objetLimitRange
. La demande et la limite du processeur ou de la mémoire du conteneur doivent être inférieures ou égales à la contrainte de ressource
max
pour les conteneurs spécifiés dans l'objetLimitRange
.Si l'objet
LimitRange
définit une unité centralemax
, il n'est pas nécessaire de définir une valeur d'unité centralerequest
dans la spécificationPod
. Mais vous devez spécifier une valeur de CPUlimit
qui satisfasse la contrainte de CPU maximale spécifiée dans la plage de limites.Le rapport entre les limites des conteneurs et les demandes doit être inférieur ou égal à la valeur
maxLimitRequestRatio
pour les conteneurs, spécifiée dans l'objetLimitRange
.Si l'objet
LimitRange
définit une contraintemaxLimitRequestRatio
, tout nouveau conteneur doit avoir une valeurrequest
et une valeurlimit
. OpenShift Container Platform calcule le ratio limite/demande en divisant la valeurlimit
par la valeurrequest
. Cette valeur doit être un nombre entier non négatif supérieur à 1.Par exemple, si un conteneur a
cpu: 500
dans la valeurlimit
etcpu: 100
dans la valeurrequest
, le ratio limite/demande pourcpu
est5
. Ce ratio doit être inférieur ou égal à la valeurmaxLimitRequestRatio
.
Si la spécification Pod
ne précise pas de limite ou de mémoire de ressource de conteneur, les valeurs de CPU et de mémoire de default
ou defaultRequest
pour les conteneurs spécifiés dans l'objet de plage de limites sont attribuées au conteneur.
Conteneur LimitRange
définition de l'objet
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "Container" max: cpu: "2" 2 memory: "1Gi" 3 min: cpu: "100m" 4 memory: "4Mi" 5 default: cpu: "300m" 6 memory: "200Mi" 7 defaultRequest: cpu: "200m" 8 memory: "100Mi" 9 maxLimitRequestRatio: cpu: "10" 10
- 1
- Le nom de l'objet LimitRange.
- 2
- La quantité maximale de CPU qu'un conteneur unique dans un pod peut demander.
- 3
- Quantité maximale de mémoire qu'un conteneur unique d'un module peut demander.
- 4
- La quantité minimale de CPU qu'un conteneur unique dans un pod peut demander.
- 5
- Quantité minimale de mémoire qu'un conteneur unique d'un module peut demander.
- 6
- La quantité par défaut de CPU qu'un conteneur peut utiliser si elle n'est pas spécifiée dans la spécification
Pod
. - 7
- La quantité de mémoire par défaut qu'un conteneur peut utiliser si elle n'est pas spécifiée dans la spécification
Pod
. - 8
- La quantité par défaut de CPU qu'un conteneur peut demander si elle n'est pas spécifiée dans la spécification
Pod
. - 9
- La quantité de mémoire par défaut qu'un conteneur peut demander si elle n'est pas spécifiée dans la spécification
Pod
. - 10
- Rapport maximum entre la limite et la demande pour un conteneur.
7.3.1.1.2. Limites du pod
Une plage de limites vous permet de spécifier les limites minimales et maximales de CPU et de mémoire pour tous les conteneurs d'un pod dans un projet donné. Pour créer un conteneur dans le projet, les demandes de CPU et de mémoire du conteneur dans la spécification Pod
doivent être conformes aux valeurs définies dans l'objet LimitRange
. Si ce n'est pas le cas, le module n'est pas créé.
Si la spécification Pod
ne précise pas de limite ou de mémoire de ressource de conteneur, les valeurs de CPU et de mémoire de default
ou defaultRequest
pour les conteneurs spécifiés dans l'objet de plage de limites sont attribuées au conteneur.
Pour tous les conteneurs d'un module, les conditions suivantes doivent être remplies :
-
La demande et la limite du processeur ou de la mémoire du conteneur doivent être supérieures ou égales aux contraintes de ressources de
min
pour les pods spécifiés dans l'objetLimitRange
. -
La demande et la limite du processeur ou de la mémoire du conteneur doivent être inférieures ou égales aux contraintes de ressources de
max
pour les pods spécifiés dans l'objetLimitRange
. -
Le rapport entre les limites des conteneurs et les demandes doit être inférieur ou égal à la contrainte
maxLimitRequestRatio
spécifiée dans l'objetLimitRange
.
Pod LimitRange
définition de l'objet
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "Pod" max: cpu: "2" 2 memory: "1Gi" 3 min: cpu: "200m" 4 memory: "6Mi" 5 maxLimitRequestRatio: cpu: "10" 6
- 1
- Le nom de l'objet de la plage de limites.
- 2
- La quantité maximale de CPU qu'un pod peut demander pour tous les conteneurs.
- 3
- La quantité maximale de mémoire qu'un pod peut demander pour tous les conteneurs.
- 4
- La quantité minimale de CPU qu'un pod peut demander à tous les conteneurs.
- 5
- La quantité minimale de mémoire qu'un pod peut demander à tous les conteneurs.
- 6
- Rapport maximum entre la limite et la demande pour un conteneur.
7.3.1.1.3. Limites d'images
Un objet LimitRange
vous permet de spécifier la taille maximale d'une image qui peut être poussée vers un registre d'images OpenShift.
Lorsque l'on pousse des images vers un registre d'images OpenShift, les points suivants doivent être respectés :
-
max
La taille de l'image doit être inférieure ou égale à la taille des images spécifiée dans l'objetLimitRange
.
Image LimitRange
Définition de l'objet
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: openshift.io/Image max: storage: 1Gi 2
Pour éviter que des blobs dépassant la limite ne soient téléchargés vers le registre, ce dernier doit être configuré pour appliquer des quotas.
La taille de l'image n'est pas toujours disponible dans le manifeste d'une image téléchargée. C'est particulièrement le cas pour les images construites avec Docker 1.10 ou plus et poussées vers un registre v2. Si une telle image est tirée avec un ancien daemon Docker, le manifeste de l'image est converti par le registre en schéma v1 sans les informations de taille. Aucune limite de stockage fixée sur les images ne les empêche d'être téléchargées.
La question est en cours de traitement.
7.3.1.1.4. Limites du flux d'images
Un objet LimitRange
vous permet de spécifier des limites pour les flux d'images.
Pour chaque flux d'images, les conditions suivantes doivent être remplies :
-
Le nombre de balises d'image dans une spécification
ImageStream
doit être inférieur ou égal à la contrainteopenshift.io/image-tags
dans l'objetLimitRange
. -
Le nombre de références uniques aux images dans une spécification
ImageStream
doit être inférieur ou égal à la contrainteopenshift.io/images
dans l'objet limit range.
Définition de l'objet Imagestream LimitRange
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: openshift.io/ImageStream max: openshift.io/image-tags: 20 2 openshift.io/images: 30 3
La ressource openshift.io/image-tags
représente des références d'images uniques. Les références possibles sont an ImageStreamTag
, an ImageStreamImage
et a DockerImage
. Les balises peuvent être créées à l'aide des commandes oc tag
et oc import-image
. Aucune distinction n'est faite entre les références internes et externes. Cependant, chaque référence unique étiquetée dans une spécification ImageStream
n'est comptée qu'une seule fois. Cette spécification ne limite en rien les accès à un registre interne d'images de conteneurs, mais elle est utile pour la restriction des balises.
La ressource openshift.io/images
représente des noms d'images uniques enregistrés dans le statut du flux d'images. Elle permet de restreindre le nombre d'images qui peuvent être poussées vers le registre d'images d'OpenShift. Les références internes et externes ne sont pas distinguées.
7.3.1.1.5. Limites des demandes d'indemnisation en cas de volume persistant
Un objet LimitRange
vous permet de restreindre le stockage demandé dans une revendication de volume persistant (PVC).
Pour toutes les demandes de volumes persistants d'un projet, les points suivants doivent être respectés :
-
La demande de ressources dans une revendication de volume persistant (PVC) doit être supérieure ou égale à la contrainte
min
pour les PVC qui est spécifiée dans l'objetLimitRange
. -
La demande de ressources dans une revendication de volume persistant (PVC) doit être inférieure ou égale à la contrainte
max
pour les PVC qui est spécifiée dans l'objetLimitRange
.
PVC LimitRange
définition de l'objet
apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "PersistentVolumeClaim" min: storage: "2Gi" 2 max: storage: "50Gi" 3
7.3.2. Création d'une plage de limites
Pour appliquer une plage de limites à un projet :
Créez un objet
LimitRange
avec les spécifications requises :apiVersion: "v1" kind: "LimitRange" metadata: name: "resource-limits" 1 spec: limits: - type: "Pod" 2 max: cpu: "2" memory: "1Gi" min: cpu: "200m" memory: "6Mi" - type: "Container" 3 max: cpu: "2" memory: "1Gi" min: cpu: "100m" memory: "4Mi" default: 4 cpu: "300m" memory: "200Mi" defaultRequest: 5 cpu: "200m" memory: "100Mi" maxLimitRequestRatio: 6 cpu: "10" - type: openshift.io/Image 7 max: storage: 1Gi - type: openshift.io/ImageStream 8 max: openshift.io/image-tags: 20 openshift.io/images: 30 - type: "PersistentVolumeClaim" 9 min: storage: "2Gi" max: storage: "50Gi"
- 1
- Spécifiez un nom pour l'objet
LimitRange
. - 2
- Pour définir les limites d'un module, spécifiez les demandes minimales et maximales de CPU et de mémoire, selon les besoins.
- 3
- Pour définir des limites pour un conteneur, spécifiez les demandes minimales et maximales de CPU et de mémoire selon les besoins.
- 4
- Facultatif. Pour un conteneur, indiquez la quantité par défaut de CPU ou de mémoire qu'un conteneur peut utiliser, si elle n'est pas spécifiée dans la spécification
Pod
. - 5
- Facultatif. Pour un conteneur, spécifiez la quantité par défaut de CPU ou de mémoire qu'un conteneur peut demander, si elle n'est pas spécifiée dans la spécification
Pod
. - 6
- Facultatif. Pour un conteneur, spécifier le rapport maximum entre la limite et la demande qui peut être spécifié dans la spécification
Pod
. - 7
- Pour définir les limites d'un objet Image, définissez la taille maximale d'une image qui peut être poussée vers un registre d'images OpenShift.
- 8
- Pour fixer des limites à un flux d'images, définissez le nombre maximum de balises et de références d'images pouvant figurer dans le fichier objet
ImageStream
, selon les besoins. - 9
- Pour définir les limites d'une demande de volume persistant, définissez la quantité minimale et maximale de stockage qui peut être demandée.
Créer l'objet :
oc create -f <limit_range_file> -n <project> $ oc create -f <limit_range_file> 1
- 1
- Indiquez le nom du fichier YAML que vous avez créé et le projet dans lequel vous souhaitez que les limites s'appliquent.
7.3.3. Visualisation d'une limite
Vous pouvez visualiser toutes les limites définies dans un projet en naviguant dans la console web jusqu'à la page Quota du projet.
Vous pouvez également utiliser l'interface de communication pour afficher les détails de la plage de limites :
Obtenir la liste des objets
LimitRange
définis dans le projet. Par exemple, pour un projet appelé demoproject:$ oc get limits -n demoproject
NAME CREATED AT resource-limits 2020-07-15T17:14:23Z
Décrivez l'objet
LimitRange
qui vous intéresse, par exemple la plage de limitesresource-limits
:$ oc describe limits resource-limits -n demoproject
Name: resource-limits Namespace: demoproject Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio ---- -------- --- --- --------------- ------------- ----------------------- Pod cpu 200m 2 - - - Pod memory 6Mi 1Gi - - - Container cpu 100m 2 200m 300m 10 Container memory 4Mi 1Gi 100Mi 200Mi - openshift.io/Image storage - 1Gi - - - openshift.io/ImageStream openshift.io/image - 12 - - - openshift.io/ImageStream openshift.io/image-tags - 10 - - - PersistentVolumeClaim storage - 50Gi - - -
7.3.4. Suppression d'une plage de limites
Pour supprimer tout objet LimitRange
actif afin de ne plus appliquer les limites dans un projet :
Exécutez la commande suivante :
oc delete limits <limit_name>