5.9. Allocation de ressources pour les nœuds d'un cluster OpenShift Container Platform


Pour assurer une planification plus fiable et minimiser le surengagement des ressources du nœud, réservez une partie des ressources CPU et mémoire aux composants sous-jacents du nœud, tels que kubelet et kube-proxy, et aux autres composants du système, tels que sshd et NetworkManager. En spécifiant les ressources à réserver, vous fournissez au planificateur davantage d'informations sur les ressources de CPU et de mémoire restantes qu'un nœud peut utiliser pour les pods. Vous pouvez permettre à OpenShift Container Platform de déterminer automatiquement les ressources optimales de mémoire et de CPU system-reserved pour vos nœuds ou vous pouvez déterminer et définir manuellement les meilleures ressources pour vos nœuds.

Important

Pour définir manuellement les valeurs des ressources, vous devez utiliser un CR de configuration de kubelet. Vous ne pouvez pas utiliser un CR de configuration de machine.

5.9.1. Comprendre comment allouer des ressources aux nœuds

Les ressources de CPU et de mémoire réservées aux composants de nœuds dans OpenShift Container Platform sont basées sur deux paramètres de nœuds :

ParamètresDescription

kube-reserved

Ce paramètre n'est pas utilisé avec OpenShift Container Platform. Ajoutez les ressources CPU et mémoire que vous avez prévu de réserver au paramètre system-reserved.

system-reserved

Ce paramètre identifie les ressources à réserver pour les composants du nœud et les composants du système, tels que CRI-O et Kubelet. Les paramètres par défaut dépendent des versions d'OpenShift Container Platform et de Machine Config Operator. Confirmez le paramètre par défaut systemReserved sur le référentiel machine-config-operator.

Si un indicateur n'est pas défini, les valeurs par défaut sont utilisées. Si aucun indicateur n'est défini, la ressource allouée correspond à la capacité du nœud telle qu'elle était avant l'introduction des ressources allouables.

Note

Les unités centrales spécifiquement réservées à l'aide du paramètre reservedSystemCPUs ne sont pas disponibles pour une allocation à l'aide des paramètres kube-reserved ou system-reserved.

5.9.1.1. Comment OpenShift Container Platform calcule les ressources allouées

La quantité allouée d'une ressource est calculée sur la base de la formule suivante :

[Allocatable] = [Node Capacity] - [system-reserved] - [Hard-Eviction-Thresholds]
Note

L'exclusion de Hard-Eviction-Thresholds de Allocatable améliore la fiabilité du système car la valeur de Allocatable est appliquée aux pods au niveau du nœud.

Si Allocatable est négatif, il est fixé à 0.

Chaque nœud indique les ressources système utilisées par l'exécution du conteneur et le kubelet. Pour simplifier la configuration du paramètre system-reserved, affichez l'utilisation des ressources pour le nœud en utilisant l'API de résumé du nœud. Le résumé du nœud est disponible à l'adresse /api/v1/nodes/<node>/proxy/stats/summary.

5.9.1.2. Comment les nœuds appliquent les contraintes de ressources

Le nœud peut limiter la quantité totale de ressources que les modules peuvent consommer en fonction de la valeur d'allocation configurée. Cette fonction améliore considérablement la fiabilité du nœud en empêchant les modules d'utiliser les ressources de CPU et de mémoire dont ont besoin les services système tels que le moteur d'exécution du conteneur et l'agent du nœud. Pour améliorer la fiabilité du nœud, les administrateurs doivent réserver des ressources en fonction d'un objectif d'utilisation des ressources.

Le nœud impose des contraintes de ressources en utilisant une nouvelle hiérarchie de cgroupes qui assure la qualité du service. Tous les pods sont lancés dans une hiérarchie de cgroup dédiée, séparée des démons du système.

Les administrateurs doivent traiter les démons système de la même manière que les pods qui ont une qualité de service garantie. Les démons système peuvent éclater au sein de leurs groupes de contrôle et ce comportement doit être géré dans le cadre des déploiements de clusters. Réservez des ressources de CPU et de mémoire aux démons système en spécifiant la quantité de ressources de CPU et de mémoire dans system-reserved.

L'application des limites de system-reserved peut empêcher les services système critiques de recevoir des ressources de CPU et de mémoire. Par conséquent, un service système critique peut être interrompu par le "out-of-memory killer". Il est recommandé d'appliquer system-reserved uniquement si vous avez profilé les nœuds de manière exhaustive afin de déterminer des estimations précises et si vous êtes certain que les services système critiques peuvent se rétablir si l'un des processus de ce groupe est interrompu par le tueur de mémoire.

5.9.1.3. Comprendre les seuils d'expulsion

Si un nœud subit une pression de mémoire, cela peut avoir un impact sur l'ensemble du nœud et sur tous les pods s'exécutant sur le nœud. Par exemple, un démon système qui utilise plus que la quantité de mémoire qui lui est réservée peut déclencher un événement de sortie de mémoire. Pour éviter ou réduire la probabilité d'événements de sortie de mémoire du système, le nœud fournit une gestion des ressources manquantes.

Vous pouvez réserver de la mémoire en utilisant l'option --eviction-hard. Le nœud tente d'expulser les modules chaque fois que la disponibilité de la mémoire sur le nœud tombe en dessous de la valeur absolue ou du pourcentage. Si les démons système n'existent pas sur un nœud, les modules sont limités à la mémoire capacity - eviction-hard. Pour cette raison, les ressources mises de côté en tant que tampon pour l'expulsion avant d'atteindre les conditions d'épuisement de la mémoire ne sont pas disponibles pour les modules.

L'exemple suivant illustre l'impact du nœud allouable pour la mémoire :

  • La capacité des nœuds est de 32Gi
  • --réservé au système est 3Gi
  • --eviction-hard est fixé à 100Mi.

Pour ce nœud, la valeur allouable effective du nœud est 28.9Gi. Si le nœud et les composants du système utilisent toutes leurs réservations, la mémoire disponible pour les pods est 28.9Gi, et le kubelet évince les pods lorsqu'elle dépasse ce seuil.

Si vous imposez l'allocation de nœuds, 28.9Gi, avec des cgroups de premier niveau, les pods ne peuvent jamais dépasser 28.9Gi. Les expulsions ne sont pas effectuées à moins que les démons du système ne consomment plus de 3.1Gi de mémoire.

Si les démons du système n'utilisent pas toute leur réservation, dans l'exemple ci-dessus, les pods devraient faire face à des destructions OOM memcg de leur cgroup limitant avant que les évictions de nœuds ne démarrent. Pour mieux appliquer la QoS dans cette situation, le nœud applique les seuils d'éviction durs au cgroup de niveau supérieur pour tous les pods devant être Node Allocatable Eviction Hard Thresholds.

Si les démons du système n'utilisent pas toute leur réserve, le nœud expulse les modules dès qu'ils consomment plus de 28.9Gi de mémoire. Si l'éviction n'a pas lieu à temps, un pod sera tué par OOM si les pods consomment 29Gi de mémoire.

5.9.1.4. Comment l'ordonnanceur détermine la disponibilité des ressources

L'ordonnanceur utilise la valeur de node.Status.Allocatable au lieu de node.Status.Capacity pour décider si un nœud sera candidat à l'ordonnancement de pods.

Par défaut, le nœud indique que la capacité de sa machine est entièrement planifiable par le cluster.

5.9.2. Attribution automatique de ressources aux nœuds

OpenShift Container Platform peut déterminer automatiquement les ressources optimales system-reserved CPU et mémoire pour les nœuds associés à un pool de configuration machine spécifique et mettre à jour les nœuds avec ces valeurs lorsque les nœuds démarrent. Par défaut, le CPU de system-reserved est 500m et la mémoire de system-reserved est 1Gi.

Pour déterminer et allouer automatiquement les ressources system-reserved sur les nœuds, créez une ressource personnalisée (CR) KubeletConfig pour définir le paramètre autoSizingReserved: true. Un script sur chaque nœud calcule les valeurs optimales pour les ressources réservées respectives sur la base de la capacité de CPU et de mémoire installée sur chaque nœud. Le script tient compte du fait qu'une augmentation de la capacité nécessite une augmentation correspondante des ressources réservées.

La détermination automatique des paramètres system-reserved optimaux garantit l'efficacité de votre cluster et prévient les défaillances de nœuds dues à la pénurie de ressources des composants du système, tels que CRI-O et kubelet, sans que vous ayez besoin de calculer et de mettre à jour manuellement les valeurs.

Cette fonction est désactivée par défaut.

Conditions préalables

  1. Obtenez l'étiquette associée à l'objet statique MachineConfigPool pour le type de nœud que vous souhaitez configurer en entrant la commande suivante :

    oc edit machineconfigpool <name> $ oc edit machineconfigpool <name>

    Par exemple :

    $ oc edit machineconfigpool worker

    Exemple de sortie

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 1
      name: worker
     ...

    1
    L'étiquette apparaît sous Labels.
    Astuce

    Si l'étiquette n'est pas présente, ajoutez une paire clé/valeur comme par exemple :

    $ oc label machineconfigpool worker custom-kubelet=small-pods

Procédure

  1. Créez une ressource personnalisée (CR) pour votre changement de configuration :

    Exemple de configuration pour un CR d'allocation de ressources

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: dynamic-node 1
    spec:
      autoSizingReserved: true 2
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 3

    1
    Attribuer un nom au CR.
    2
    Ajoutez le paramètre autoSizingReserved défini sur true pour permettre à OpenShift Container Platform de déterminer et d'allouer automatiquement les ressources system-reserved sur les nœuds associés à l'étiquette spécifiée. Pour désactiver l'allocation automatique sur ces nœuds, définissez ce paramètre à false.
    3
    Spécifiez l'étiquette du pool de configuration de la machine.

    L'exemple précédent active l'allocation automatique des ressources sur tous les nœuds de travail. OpenShift Container Platform draine les nœuds, applique la configuration kubelet et redémarre les nœuds.

  2. Créez le CR en entrant la commande suivante :

    oc create -f <nom_du_fichier>.yaml

Vérification

  1. Connectez-vous à un nœud que vous avez configuré en entrant la commande suivante :

    oc debug node/<node_name>
  2. Définir /host comme répertoire racine dans l'interpréteur de commandes de débogage :

    # chroot /host
  3. Consulter le fichier /etc/node-sizing.env:

    Exemple de sortie

    SYSTEM_RESERVED_MEMORY=3Gi
    SYSTEM_RESERVED_CPU=0.08

    Le kubelet utilise les valeurs de system-reserved dans le fichier /etc/node-sizing.env. Dans l'exemple précédent, les nœuds de travail se voient attribuer 0.08 CPU et 3 Gi de mémoire. L'apparition des valeurs optimales peut prendre plusieurs minutes.

5.9.3. Attribution manuelle de ressources aux nœuds

OpenShift Container Platform prend en charge les types de ressources CPU et mémoire pour l'allocation. Le type de ressource ephemeral-resource est également pris en charge. Pour le type cpu, vous spécifiez la quantité de ressources en unités de cœurs, telles que 200m, 0.5, ou 1. Pour memory et ephemeral-storage, vous spécifiez la quantité de ressources en unités d'octets, comme 200Ki, 50Mi ou 5Gi. Par défaut, l'unité centrale system-reserved est 500m et la mémoire system-reserved est 1Gi.

En tant qu'administrateur, vous pouvez définir ces valeurs en utilisant une ressource personnalisée (CR) de configuration kubelet par le biais d'un ensemble de paires <resource_type>=<resource_quantity> (par exemple, cpu=200m,memory=512Mi).

Important

Vous devez utiliser un CR de configuration de kubelet pour définir manuellement les valeurs des ressources. Vous ne pouvez pas utiliser un CR de configuration de machine.

Pour plus de détails sur les valeurs recommandées pour system-reserved, voir les valeurs recommandées pour les réserves du système.

Conditions préalables

  1. Obtenez l'étiquette associée au CRD statique MachineConfigPool pour le type de nœud que vous souhaitez configurer en entrant la commande suivante :

    oc edit machineconfigpool <name> $ oc edit machineconfigpool <name>

    Par exemple :

    $ oc edit machineconfigpool worker

    Exemple de sortie

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      creationTimestamp: "2022-11-16T15:34:25Z"
      generation: 4
      labels:
        pools.operator.machineconfiguration.openshift.io/worker: "" 1
      name: worker

    1
    L'étiquette apparaît sous Étiquettes.
    Astuce

    Si l'étiquette n'est pas présente, ajoutez une paire clé/valeur comme par exemple :

    $ oc label machineconfigpool worker custom-kubelet=small-pods

Procédure

  1. Créez une ressource personnalisée (CR) pour votre changement de configuration.

    Exemple de configuration pour un CR d'allocation de ressources

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: set-allocatable 1
    spec:
      machineConfigPoolSelector:
        matchLabels:
          pools.operator.machineconfiguration.openshift.io/worker: "" 2
      kubeletConfig:
        systemReserved: 3
          cpu: 1000m
          memory: 1Gi

    1
    Attribuer un nom au CR.
    2
    Spécifiez l'étiquette du pool de configuration de la machine.
    3
    Spécifiez les ressources à réserver pour les composants du nœud et du système.
  2. Exécutez la commande suivante pour créer le CR :

    oc create -f <nom_du_fichier>.yaml
Red Hat logoGithubRedditYoutubeTwitter

Apprendre

Essayez, achetez et vendez

Communautés

À propos de la documentation Red Hat

Nous aidons les utilisateurs de Red Hat à innover et à atteindre leurs objectifs grâce à nos produits et services avec un contenu auquel ils peuvent faire confiance.

Rendre l’open source plus inclusif

Red Hat s'engage à remplacer le langage problématique dans notre code, notre documentation et nos propriétés Web. Pour plus de détails, consultez leBlog Red Hat.

À propos de Red Hat

Nous proposons des solutions renforcées qui facilitent le travail des entreprises sur plusieurs plates-formes et environnements, du centre de données central à la périphérie du réseau.

© 2024 Red Hat, Inc.