Évolutivité et performance

OpenShift Container Platform 4.12

Mise à l'échelle de votre cluster OpenShift Container Platform et optimisation des performances dans les environnements de production

Red Hat OpenShift Documentation Team

Résumé

Ce document fournit des instructions pour la mise à l'échelle de votre cluster et l'optimisation des performances de votre environnement OpenShift Container Platform.

Chapitre 3. Utilisation de l'opérateur Node Tuning

Découvrez l'opérateur d'optimisation des nœuds et la manière dont vous pouvez l'utiliser pour gérer l'optimisation au niveau des nœuds en orchestrant le démon d'optimisation.

3.1. À propos de l'opérateur Node Tuning

L'opérateur d'optimisation des nœuds vous aide à gérer l'optimisation au niveau des nœuds en orchestrant le démon TuneD et à obtenir des performances à faible latence en utilisant le contrôleur de profil de performance. La majorité des applications à hautes performances nécessitent un certain niveau de réglage du noyau. Le Node Tuning Operator offre une interface de gestion unifiée aux utilisateurs de sysctls au niveau des nœuds et plus de flexibilité pour ajouter des réglages personnalisés en fonction des besoins de l'utilisateur.

L'opérateur gère le démon TuneD conteneurisé pour OpenShift Container Platform en tant qu'ensemble de démons Kubernetes. Il s'assure que la spécification de réglage personnalisé est transmise à tous les démons TuneD conteneurisés s'exécutant dans le cluster dans le format que les démons comprennent. Les démons s'exécutent sur tous les nœuds du cluster, un par nœud.

Les paramètres de niveau nœud appliqués par le démon TuneD conteneurisé sont annulés lors d'un événement qui déclenche un changement de profil ou lorsque le démon TuneD conteneurisé se termine de manière élégante en recevant et en gérant un signal de fin.

L'opérateur de réglage des nœuds utilise le contrôleur de profil de performance pour mettre en œuvre un réglage automatique afin d'obtenir des performances de faible latence pour les applications OpenShift Container Platform. L'administrateur du cluster configure un profil de performance pour définir des paramètres au niveau du nœud, tels que les suivants :

  • Mise à jour du noyau vers kernel-rt.
  • Choix des unités centrales de traitement pour l'entretien ménager.
  • Choix des unités centrales pour l'exécution des charges de travail.
Note

Actuellement, la désactivation de l'équilibrage de la charge du CPU n'est pas prise en charge par cgroup v2. Par conséquent, il se peut que vous n'obteniez pas le comportement souhaité des profils de performance si vous avez activé cgroup v2. L'activation de cgroup v2 n'est pas recommandée si vous utilisez des profils de performance.

L'opérateur Node Tuning fait partie de l'installation standard d'OpenShift Container Platform à partir de la version 4.1.

Note

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon était utilisé pour mettre en œuvre un réglage automatique afin d'obtenir des performances de faible latence pour les applications OpenShift. Dans OpenShift Container Platform 4.11 et les versions ultérieures, cette fonctionnalité fait partie de l'opérateur Node Tuning.

3.2. Accéder à un exemple de spécification de l'opérateur Node Tuning

Cette procédure permet d'accéder à un exemple de spécification de l'opérateur de réglage des nœuds.

Procédure

  • Exécutez la commande suivante pour accéder à un exemple de spécification de l'opérateur Node Tuning :

    $ oc get Tuned/default -o yaml -n openshift-cluster-node-tuning-operator

Le CR par défaut est destiné à fournir un réglage standard au niveau du nœud pour la plateforme OpenShift Container Platform et il ne peut être modifié que pour définir l'état de gestion de l'opérateur. Toute autre modification personnalisée de la CR par défaut sera écrasée par l'opérateur. Pour un réglage personnalisé, créez vos propres CR réglés. Les CR nouvellement créés seront combinés avec le CR par défaut et les réglages personnalisés appliqués aux nœuds d'OpenShift Container Platform en fonction des étiquettes de nœuds ou de pods et des priorités de profil.

Avertissement

Bien que dans certaines situations, la prise en charge des étiquettes de pods puisse être un moyen pratique de fournir automatiquement les réglages nécessaires, cette pratique est déconseillée et fortement déconseillée, en particulier dans les clusters à grande échelle. Le CR Tuned par défaut est livré sans correspondance d'étiquettes de pods. Si un profil personnalisé est créé avec la correspondance des étiquettes de pods, alors la fonctionnalité sera activée à ce moment-là. La fonctionnalité d'étiquetage de pods sera obsolète dans les versions futures de l'opérateur de tuning de nœuds.

3.3. Profils par défaut définis sur un cluster

Les profils par défaut définis sur un cluster sont les suivants.

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: default
  namespace: openshift-cluster-node-tuning-operator
spec:
  profile:
  - data: |
      [main]
      summary=Optimize systems running OpenShift (provider specific parent profile)
      include=-provider-${f:exec:cat:/var/lib/tuned/provider},openshift
    name: openshift
  recommend:
  - profile: openshift-control-plane
    priority: 30
    match:
    - label: node-role.kubernetes.io/master
    - label: node-role.kubernetes.io/infra
  - profile: openshift-node
    priority: 40

Depuis OpenShift Container Platform 4.9, tous les profils OpenShift TuneD sont livrés avec le package TuneD. Vous pouvez utiliser la commande oc exec pour voir le contenu de ces profils :

$ oc exec $tuned_pod -n openshift-cluster-node-tuning-operator -- find /usr/lib/tuned/openshift{,-control-plane,-node} -name tuned.conf -exec grep -H ^ {} \;

3.4. Vérification de l'application des profils TuneD

Vérifiez les profils TuneD appliqués à votre nœud de cluster.

$ oc get profile -n openshift-cluster-node-tuning-operator

Exemple de sortie

NAME             TUNED                     APPLIED   DEGRADED   AGE
master-0         openshift-control-plane   True      False      6h33m
master-1         openshift-control-plane   True      False      6h33m
master-2         openshift-control-plane   True      False      6h33m
worker-a         openshift-node            True      False      6h28m
worker-b         openshift-node            True      False      6h28m

  • NAME: Nom de l'objet Profil. Il y a un objet Profil par nœud et leurs noms correspondent.
  • TUNED: Nom du profil TuneD à appliquer.
  • APPLIED( True ) si le démon TuneD a appliqué le profil souhaité. (True/False/Unknown).
  • DEGRADEDle profil TuneD peut être modifié par l'intermédiaire de l'adresse suivante : True si des erreurs ont été signalées lors de l'application du profil TuneD (True/False/Unknown).
  • AGE: Temps écoulé depuis la création de l'objet Profil.

3.5. Spécification de réglage personnalisé

La ressource personnalisée (CR) de l'opérateur comporte deux sections principales. La première section, profile:, est une liste de profils TuneD et de leurs noms. La seconde, recommend:, définit la logique de sélection des profils.

Plusieurs spécifications de réglage personnalisées peuvent coexister en tant que CR multiples dans l'espace de noms de l'opérateur. L'existence de nouveaux CR ou la suppression d'anciens CR est détectée par l'Opérateur. Toutes les spécifications de réglage personnalisées existantes sont fusionnées et les objets appropriés pour les démons TuneD conteneurisés sont mis à jour.

Management state

L'état de gestion de l'opérateur est défini en ajustant le CR accordé par défaut. Par défaut, l'opérateur est en état de gestion et le champ spec.managementState n'est pas présent dans le CR accordé par défaut. Les valeurs valides pour l'état de gestion de l'opérateur sont les suivantes :

  • Géré : l'opérateur met à jour ses opérandes au fur et à mesure que les ressources de configuration sont mises à jour
  • Non géré : l'opérateur ignore les changements apportés aux ressources de configuration
  • Retiré : l'opérateur retire ses opérandes et les ressources qu'il a fournies

Profile data

La section profile: dresse la liste des profils TuneD et de leurs noms.

profile:
- name: tuned_profile_1
  data: |
    # TuneD profile specification
    [main]
    summary=Description of tuned_profile_1 profile

    [sysctl]
    net.ipv4.ip_forward=1
    # ... other sysctl's or other TuneD daemon plugins supported by the containerized TuneD

# ...

- name: tuned_profile_n
  data: |
    # TuneD profile specification
    [main]
    summary=Description of tuned_profile_n profile

    # tuned_profile_n profile settings

Recommended profiles

La logique de sélection de profile: est définie par la section recommend: du CR. La section recommend: est une liste d'éléments permettant de recommander les profils sur la base d'un critère de sélection.

recommend:
<recommend-item-1>
# ...
<recommend-item-n>

Les différents éléments de la liste :

- machineConfigLabels: 1
    <mcLabels> 2
  match: 3
    <match> 4
  priority: <priority> 5
  profile: <tuned_profile_name> 6
  operand: 7
    debug: <bool> 8
    tunedConfig:
      reapply_sysctl: <bool> 9
1
En option.
2
Un dictionnaire d'étiquettes clé/valeur MachineConfig. Les clés doivent être uniques.
3
En cas d'omission, la correspondance des profils est présumée, sauf si un profil ayant une priorité plus élevée correspond en premier ou si machineConfigLabels est défini.
4
Une liste facultative.
5
Ordre de priorité des profils. Les chiffres les plus bas signifient une priorité plus élevée (0 est la priorité la plus élevée).
6
Un profil TuneD à appliquer sur un match. Par exemple tuned_profile_1.
7
Configuration facultative de l'opérande.
8
Active ou désactive le débogage du démon TuneD. Les options sont true pour on ou false pour off. La valeur par défaut est false.
9
Active ou désactive la fonctionnalité reapply_sysctl pour le démon TuneD. Les options sont true pour on et false pour off.

<match> est une liste optionnelle définie récursivement comme suit :

- label: <label_name> 1
  value: <label_value> 2
  type: <label_type> 3
    <match> 4
1
Nom de l'étiquette du nœud ou du pod.
2
Valeur facultative de l'étiquette du nœud ou du pod. Si elle est omise, la présence de <label_name> suffit à établir une correspondance.
3
Type d'objet facultatif (node ou pod). En cas d'omission, node est considéré comme tel.
4
Une liste facultative <match>.

Si <match> n'est pas omis, toutes les sections imbriquées <match> doivent également être évaluées à true. Sinon, false est supposé et le profil avec la section <match> correspondante ne sera pas appliqué ou recommandé. Par conséquent, l'imbrication (sections <match> enfant) fonctionne comme un opérateur logique ET. Inversement, si un élément de la liste <match> correspond, toute la liste <match> est évaluée à true. La liste agit donc comme un opérateur logique OU.

Si machineConfigLabels est défini, la correspondance basée sur le pool de configuration de la machine est activée pour l'élément de liste recommend: donné. <mcLabels> spécifie les étiquettes d'une configuration de la machine. La configuration de la machine est créée automatiquement pour appliquer les paramètres de l'hôte, tels que les paramètres de démarrage du noyau, pour le profil <tuned_profile_name>. Il s'agit de trouver tous les pools de configuration de machine dont le sélecteur de configuration de machine correspond à <mcLabels> et de définir le profil <tuned_profile_name> sur tous les nœuds auxquels sont attribués les pools de configuration de machine trouvés. Pour cibler les nœuds qui ont à la fois un rôle de maître et de travailleur, vous devez utiliser le rôle de maître.

Les éléments de la liste match et machineConfigLabels sont reliés par l'opérateur logique OR. L'élément match est évalué en premier, en court-circuit. Par conséquent, s'il est évalué à true, l'élément machineConfigLabels n'est pas pris en compte.

Important

Lors de l'utilisation de la correspondance basée sur le pool de configuration machine, il est conseillé de regrouper les nœuds ayant la même configuration matérielle dans le même pool de configuration machine. Si cette pratique n'est pas respectée, les opérandes TuneD peuvent calculer des paramètres de noyau contradictoires pour deux nœuds ou plus partageant le même pool de configuration de machine.

Exemple : correspondance basée sur l'étiquette d'un nœud ou d'un pod

- match:
  - label: tuned.openshift.io/elasticsearch
    match:
    - label: node-role.kubernetes.io/master
    - label: node-role.kubernetes.io/infra
    type: pod
  priority: 10
  profile: openshift-control-plane-es
- match:
  - label: node-role.kubernetes.io/master
  - label: node-role.kubernetes.io/infra
  priority: 20
  profile: openshift-control-plane
- priority: 30
  profile: openshift-node

Le CR ci-dessus est traduit pour le démon TuneD conteneurisé dans son fichier recommend.conf en fonction des priorités du profil. Le profil ayant la priorité la plus élevée (10) est openshift-control-plane-es et, par conséquent, il est considéré en premier. Le démon TuneD conteneurisé fonctionnant sur un nœud donné vérifie s'il existe un pod fonctionnant sur le même nœud avec l'étiquette tuned.openshift.io/elasticsearch définie. Si ce n'est pas le cas, toute la section <match> est évaluée comme false. S'il existe un pod avec le label, pour que la section <match> soit évaluée comme true, le label du nœud doit également être node-role.kubernetes.io/master ou node-role.kubernetes.io/infra.

Si les étiquettes du profil ayant la priorité 10 correspondent, le profil openshift-control-plane-es est appliqué et aucun autre profil n'est pris en considération. Si la combinaison d'étiquettes nœud/pod ne correspond pas, le deuxième profil le plus prioritaire (openshift-control-plane) est pris en compte. Ce profil est appliqué si le pod TuneD conteneurisé fonctionne sur un nœud avec les étiquettes node-role.kubernetes.io/master ou node-role.kubernetes.io/infra.

Enfin, le profil openshift-node a la priorité la plus basse de 30. Il ne contient pas la section <match> et, par conséquent, correspondra toujours. Il sert de profil fourre-tout pour définir le profil openshift-node si aucun autre profil ayant une priorité plus élevée ne correspond à un nœud donné.

Decision workflow

Exemple : correspondance basée sur le pool de configuration de la machine

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: openshift-node-custom
  namespace: openshift-cluster-node-tuning-operator
spec:
  profile:
  - data: |
      [main]
      summary=Custom OpenShift node profile with an additional kernel parameter
      include=openshift-node
      [bootloader]
      cmdline_openshift_node_custom=+skew_tick=1
    name: openshift-node-custom

  recommend:
  - machineConfigLabels:
      machineconfiguration.openshift.io/role: "worker-custom"
    priority: 20
    profile: openshift-node-custom

Pour minimiser les redémarrages de nœuds, il faut étiqueter les nœuds cibles avec une étiquette que le sélecteur de nœuds du pool de configuration de la machine fera correspondre, puis créer le Tuned CR ci-dessus et enfin créer le pool de configuration de la machine personnalisé lui-même.

Cloud provider-specific TuneD profiles

Avec cette fonctionnalité, tous les nœuds spécifiques à un fournisseur de Cloud peuvent commodément se voir attribuer un profil TuneD spécifiquement adapté à un fournisseur de Cloud donné sur un cluster OpenShift Container Platform. Cela peut être accompli sans ajouter d'étiquettes de nœuds supplémentaires ou regrouper les nœuds dans des pools de configuration de machines.

Cette fonctionnalité tire parti des valeurs de l'objet de nœud spec.providerID sous la forme de <cloud-provider>://<cloud-provider-specific-id> et écrit le fichier /var/lib/tuned/provider avec la valeur <cloud-provider> dans les conteneurs d'opérandes NTO. Le contenu de ce fichier est ensuite utilisé par TuneD pour charger le profil provider-<cloud-provider> s'il existe.

Le profil openshift dont les profils openshift-control-plane et openshift-node héritent des paramètres est maintenant mis à jour pour utiliser cette fonctionnalité grâce à l'utilisation du chargement conditionnel de profil. Ni NTO ni TuneD ne fournissent actuellement de profils spécifiques aux fournisseurs de Cloud. Cependant, il est possible de créer un profil personnalisé provider-<cloud-provider> qui sera appliqué à tous les nœuds de cluster spécifiques au fournisseur de cloud.

Exemple de profil de fournisseur GCE Cloud

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: provider-gce
  namespace: openshift-cluster-node-tuning-operator
spec:
  profile:
  - data: |
      [main]
      summary=GCE Cloud provider-specific profile
      # Your tuning for GCE Cloud provider goes here.
    name: provider-gce

Note

En raison de l'héritage des profils, tout paramètre spécifié dans le profil provider-<cloud-provider> sera remplacé par le profil openshift et ses profils enfants.

3.6. Exemples de réglages personnalisés

Using TuneD profiles from the default CR

La CR suivante applique un réglage personnalisé au niveau du nœud pour les nœuds OpenShift Container Platform dont l'étiquette tuned.openshift.io/ingress-node-label est définie sur n'importe quelle valeur.

Exemple : réglage personnalisé à l'aide du profil openshift-control-plane TuneD

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: ingress
  namespace: openshift-cluster-node-tuning-operator
spec:
  profile:
  - data: |
      [main]
      summary=A custom OpenShift ingress profile
      include=openshift-control-plane
      [sysctl]
      net.ipv4.ip_local_port_range="1024 65535"
      net.ipv4.tcp_tw_reuse=1
    name: openshift-ingress
  recommend:
  - match:
    - label: tuned.openshift.io/ingress-node-label
    priority: 10
    profile: openshift-ingress

Important

Les auteurs de profils personnalisés sont fortement encouragés à inclure les profils de démon TuneD par défaut fournis avec le CR Tuned par défaut. L'exemple ci-dessus utilise le profil par défaut openshift-control-plane.

Using built-in TuneD profiles

Étant donné le succès du déploiement de l'ensemble des démons gérés par NTO, les opérandes TuneD gèrent tous la même version du démon TuneD. Pour obtenir la liste des profils TuneD intégrés pris en charge par le démon, interrogez n'importe quel module TuneD de la manière suivante :

$ oc exec $tuned_pod -n openshift-cluster-node-tuning-operator -- find /usr/lib/tuned/ -name tuned.conf -printf '%h\n' | sed 's|^.*/||'

Vous pouvez utiliser les noms de profil ainsi récupérés dans votre spécification de réglage personnalisé.

Exemple : utilisation du profil TuneD intégré de hpc-compute

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: openshift-node-hpc-compute
  namespace: openshift-cluster-node-tuning-operator
spec:
  profile:
  - data: |
      [main]
      summary=Custom OpenShift node profile for HPC compute workloads
      include=openshift-node,hpc-compute
    name: openshift-node-hpc-compute

  recommend:
  - match:
    - label: tuned.openshift.io/openshift-node-hpc-compute
    priority: 20
    profile: openshift-node-hpc-compute

En plus du profil intégré hpc-compute, l'exemple ci-dessus inclut le profil du démon openshift-node TuneD fourni avec le CR Tuned par défaut afin d'utiliser un réglage spécifique à OpenShift pour les nœuds de calcul.

3.7. Plugins de démon TuneD pris en charge

À l'exception de la section [main], les plugins TuneD suivants sont pris en charge lors de l'utilisation des profils personnalisés définis dans la section profile: du CR Tuned :

  • audio
  • cpu
  • disque
  • eeepc_she
  • modules
  • montures
  • net
  • planificateur
  • scsi_host
  • selinux
  • sysctl
  • sysfs
  • uSB
  • vidéo
  • vm
  • chargeur de démarrage

Certains de ces plugins offrent une fonctionnalité d'accord dynamique qui n'est pas prise en charge. Les plugins TuneD suivants ne sont actuellement pas pris en charge :

  • scénario
  • systemd
Avertissement

Le plugin TuneD bootloader est actuellement pris en charge sur les nœuds de travail Red Hat Enterprise Linux CoreOS (RHCOS) 8.x. Pour les nœuds de travail Red Hat Enterprise Linux (RHEL) 7.x, le plugin de chargeur de démarrage TuneD n'est actuellement pas pris en charge.

Voir Plugins TuneD disponibles et Démarrer avec TuneD pour plus d'informations.

3.8. Configuration de l'optimisation des nœuds dans un cluster hébergé

Important

Les plans de contrôle hébergés sont une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

Pour définir le réglage au niveau du nœud sur les nœuds de votre cluster hébergé, vous pouvez utiliser l'opérateur de réglage des nœuds. Dans les plans de contrôle hébergés, vous pouvez configurer l'optimisation des nœuds en créant des cartes de configuration contenant des objets Tuned et en référençant ces cartes de configuration dans vos pools de nœuds.

Procédure

  1. Créez une carte de configuration contenant un manifeste accordé valide et faites référence à ce manifeste dans un pool de nœuds. Dans l'exemple suivant, un manifeste Tuned définit un profil qui attribue la valeur 55 à vm.dirty_ratio sur les nœuds contenant l'étiquette de nœud tuned-1-node-label avec n'importe quelle valeur. Enregistrez le manifeste ConfigMap suivant dans un fichier nommé tuned-1.yaml:

        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: tuned-1
          namespace: clusters
        data:
          tuning: |
            apiVersion: tuned.openshift.io/v1
            kind: Tuned
            metadata:
              name: tuned-1
              namespace: openshift-cluster-node-tuning-operator
            spec:
              profile:
              - data: |
                  [main]
                  summary=Custom OpenShift profile
                  include=openshift-node
                  [sysctl]
                  vm.dirty_ratio="55"
                name: tuned-1-profile
              recommend:
              - priority: 20
                profile: tuned-1-profile
    Note

    Si vous n'ajoutez pas d'étiquettes à une entrée de la section spec.recommend de la spécification accordée, la correspondance basée sur le pool de nœuds est supposée, de sorte que le profil de priorité le plus élevé de la section spec.recommend est appliqué aux nœuds du pool. Bien que vous puissiez obtenir une correspondance plus fine basée sur les étiquettes de nœuds en définissant une valeur d'étiquette dans la section Tuned .spec.recommend.match, les étiquettes de nœuds ne seront pas conservées lors d'une mise à niveau, à moins que vous ne définissiez la valeur .spec.management.upgradeType du pool de nœuds sur InPlace.

  2. Créez l'objet ConfigMap dans le cluster de gestion :

    $ oc --kubeconfig="$MGMT_KUBECONFIG" create -f tuned-1.yaml
  3. Faites référence à l'objet ConfigMap dans le champ spec.tuningConfig de la réserve de nœuds, soit en modifiant une réserve de nœuds, soit en en créant une. Dans cet exemple, nous supposons que vous n'avez qu'un seul NodePool, nommé nodepool-1, qui contient 2 nœuds.

        apiVersion: hypershift.openshift.io/v1alpha1
        kind: NodePool
        metadata:
          ...
          name: nodepool-1
          namespace: clusters
        ...
        spec:
          ...
          tuningConfig:
          - name: tuned-1
        status:
        ...
    Note

    Vous pouvez référencer la même carte de configuration dans plusieurs pools de nœuds. Dans les plans de contrôle hébergés, l'opérateur d'accord de nœud ajoute un hachage du nom du pool de nœuds et de l'espace de noms au nom des CR accordés pour les distinguer. En dehors de ce cas, ne créez pas plusieurs profils TuneD du même nom dans différents CR accordés pour le même cluster hébergé.

Vérification

Maintenant que vous avez créé l'objet ConfigMap qui contient un manifeste Tuned et que vous l'avez référencé dans un manifeste NodePool, l'opérateur Node Tuning synchronise les objets Tuned dans le cluster hébergé. Vous pouvez vérifier quels objets Tuned sont définis et quels profils TuneD sont appliqués à chaque nœud.

  1. Liste des objets Tuned dans le cluster hébergé :

    $ oc --kubeconfig="$HC_KUBECONFIG" get Tuneds -n openshift-cluster-node-tuning-operator

    Exemple de sortie

    NAME       AGE
    default    7m36s
    rendered   7m36s
    tuned-1    65s

  2. Liste des objets Profile dans le cluster hébergé :

    $ oc --kubeconfig="$HC_KUBECONFIG" get Profiles -n openshift-cluster-node-tuning-operator

    Exemple de sortie

    NAME                           TUNED            APPLIED   DEGRADED   AGE
    nodepool-1-worker-1            tuned-1-profile  True      False      7m43s
    nodepool-1-worker-2            tuned-1-profile  True      False      7m14s

    Note

    Si aucun profil personnalisé n'est créé, le profil openshift-node est appliqué par défaut.

  3. Pour confirmer que le réglage a été appliqué correctement, lancez un shell de débogage sur un nœud et vérifiez les valeurs sysctl :

    $ oc --kubeconfig="$HC_KUBECONFIG" debug node/nodepool-1-worker-1 -- chroot /host sysctl vm.dirty_ratio

    Exemple de sortie

    vm.dirty_ratio = 55

3.9. Réglage avancé des nœuds pour les clusters hébergés en définissant les paramètres de démarrage du noyau

Important

Les plans de contrôle hébergés sont une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

Pour des réglages plus avancés dans les plans de contrôle hébergés, qui nécessitent la définition de paramètres d'amorçage du noyau, vous pouvez également utiliser l'opérateur de réglage des nœuds. L'exemple suivant montre comment créer un pool de nœuds avec d'énormes pages réservées.

Procédure

  1. Créez un objet ConfigMap qui contient un manifeste d'objet Tuned pour la création de 10 pages énormes d'une taille de 2 Mo. Enregistrez ce manifeste ConfigMap dans un fichier nommé tuned-hugepages.yaml:

        apiVersion: v1
        kind: ConfigMap
        metadata:
          name: tuned-hugepages
          namespace: clusters
        data:
          tuning: |
            apiVersion: tuned.openshift.io/v1
            kind: Tuned
            metadata:
              name: hugepages
              namespace: openshift-cluster-node-tuning-operator
            spec:
              profile:
              - data: |
                  [main]
                  summary=Boot time configuration for hugepages
                  include=openshift-node
                  [bootloader]
                  cmdline_openshift_node_hugepages=hugepagesz=2M hugepages=50
                name: openshift-node-hugepages
              recommend:
              - priority: 20
                profile: openshift-node-hugepages
    Note

    Le champ .spec.recommend.match est intentionnellement laissé vide. Dans ce cas, l'objet Tuned est appliqué à tous les nœuds du pool de nœuds dans lequel l'objet ConfigMap est référencé. Regroupez les nœuds ayant la même configuration matérielle dans le même pool de nœuds. Sinon, les opérandes TuneD peuvent calculer des paramètres de noyau contradictoires pour deux nœuds ou plus qui partagent le même pool de nœuds.

  2. Créez l'objet ConfigMap dans le cluster de gestion :

    $ oc --kubeconfig="$MGMT_KUBECONFIG" create -f tuned-hugepages.yaml
  3. Créez un fichier YAML de manifeste NodePool, personnalisez le type de mise à niveau de NodePool et faites référence à l'objet ConfigMap que vous avez créé dans la section spec.tuningConfig. Créez le manifeste NodePool et enregistrez-le dans un fichier nommé hugepages-nodepool.yaml à l'aide du CLI hypershift:

        NODEPOOL_NAME=hugepages-example
        INSTANCE_TYPE=m5.2xlarge
        NODEPOOL_REPLICAS=2
    
        hypershift create nodepool aws \
          --cluster-name $CLUSTER_NAME \
          --name $NODEPOOL_NAME \
          --node-count $NODEPOOL_REPLICAS \
          --instance-type $INSTANCE_TYPE \
          --render > hugepages-nodepool.yaml
  4. Dans le fichier hugepages-nodepool.yaml, définissez .spec.management.upgradeType comme InPlace, et définissez .spec.tuningConfig comme faisant référence à l'objet tuned-hugepages ConfigMap que vous avez créé.

        apiVersion: hypershift.openshift.io/v1alpha1
        kind: NodePool
        metadata:
          name: hugepages-nodepool
          namespace: clusters
          ...
        spec:
          management:
            ...
            upgradeType: InPlace
          ...
          tuningConfig:
          - name: tuned-hugepages
    Note

    Pour éviter de recréer inutilement des nœuds lorsque vous appliquez les nouveaux objets MachineConfig, définissez .spec.management.upgradeType sur InPlace. Si vous utilisez le type de mise à niveau Replace, les nœuds sont entièrement supprimés et de nouveaux nœuds peuvent les remplacer lorsque vous appliquez les nouveaux paramètres d'amorçage du noyau calculés par l'opérande TuneD.

  5. Créez le site NodePool dans le cluster de gestion :

    $ oc --kubeconfig="$MGMT_KUBECONFIG" create -f hugepages-nodepool.yaml

Vérification

Une fois les nœuds disponibles, le démon TuneD conteneurisé calcule les paramètres d'amorçage du noyau requis en fonction du profil TuneD appliqué. Une fois que les nœuds sont prêts et redémarrent une fois pour appliquer l'objet MachineConfig généré, vous pouvez vérifier que le profil TuneD est appliqué et que les paramètres d'amorçage du noyau sont définis.

  1. Liste des objets Tuned dans le cluster hébergé :

    $ oc --kubeconfig="$HC_KUBECONFIG" get Tuneds -n openshift-cluster-node-tuning-operator

    Exemple de sortie

    NAME                 AGE
    default              123m
    hugepages-8dfb1fed   1m23s
    rendered             123m

  2. Liste des objets Profile dans le cluster hébergé :

    $ oc --kubeconfig="$HC_KUBECONFIG" get Profiles -n openshift-cluster-node-tuning-operator

    Exemple de sortie

    NAME                           TUNED                      APPLIED   DEGRADED   AGE
    nodepool-1-worker-1            openshift-node             True      False      132m
    nodepool-1-worker-2            openshift-node             True      False      131m
    hugepages-nodepool-worker-1    openshift-node-hugepages   True      False      4m8s
    hugepages-nodepool-worker-2    openshift-node-hugepages   True      False      3m57s

    Les deux nœuds de travail du nouveau site NodePool sont dotés du profil openshift-node-hugepages.

  3. Pour confirmer que le réglage a été appliqué correctement, démarrez un shell de débogage sur un nœud et vérifiez /proc/cmdline.

    $ oc --kubeconfig="$HC_KUBECONFIG" debug node/nodepool-1-worker-1 -- chroot /host cat /proc/cmdline

    Exemple de sortie

    BOOT_IMAGE=(hd0,gpt3)/ostree/rhcos-... hugepagesz=2M hugepages=50

Ressources supplémentaires

Pour plus d'informations sur les plans de contrôle hébergés, voir Plans de contrôle hébergés pour Red Hat OpenShift Container Platform (Technology Preview).

Chapitre 4. Utilisation du gestionnaire de CPU et du gestionnaire de topologie

Le gestionnaire de CPU gère des groupes de CPU et limite les charges de travail à des CPU spécifiques.

CPU Manager est utile pour les charges de travail qui présentent certaines de ces caractéristiques :

  • Exiger le plus de temps possible de l'unité centrale.
  • Sont sensibles aux défaillances de la mémoire cache du processeur.
  • Sont des applications réseau à faible latence.
  • Coordonnez-vous avec d'autres processus et profitez du partage de la mémoire cache d'un seul processeur.

Le gestionnaire de topologie recueille des indices auprès du gestionnaire de CPU, du gestionnaire de périphériques et d'autres fournisseurs d'indices afin d'aligner les ressources de pods, telles que les CPU, les VF SR-IOV et d'autres ressources de périphériques, pour toutes les classes de qualité de service (QoS) sur le même nœud d'accès à la mémoire non uniforme (NUMA).

Le gestionnaire de topologie utilise les informations topologiques provenant des indices collectés pour décider si un module peut être accepté ou rejeté sur un nœud, en fonction de la politique configurée du gestionnaire de topologie et des ressources de module demandées.

Topology Manager est utile pour les charges de travail qui utilisent des accélérateurs matériels pour prendre en charge l'exécution critique en termes de latence et le calcul parallèle à haut débit.

Pour utiliser le gestionnaire de topologie, vous devez configurer le gestionnaire de CPU avec la politique static.

4.1. Configuration du gestionnaire de CPU

Procédure

  1. Facultatif : Étiqueter un nœud :

    # oc label node perf-node.example.com cpumanager=true
  2. Modifiez le site MachineConfigPool des nœuds pour lesquels le gestionnaire de CPU doit être activé. Dans cet exemple, tous les travailleurs ont activé le gestionnaire de CPU :

    # oc edit machineconfigpool worker
  3. Ajouter une étiquette au pool de configuration de la machine de travail :

    metadata:
      creationTimestamp: 2020-xx-xxx
      generation: 3
      labels:
        custom-kubelet: cpumanager-enabled
  4. Créez une ressource personnalisée (CR) KubeletConfig, cpumanager-kubeletconfig.yaml. Référez-vous à l'étiquette créée à l'étape précédente pour que les nœuds corrects soient mis à jour avec la nouvelle configuration du kubelet. Voir la section machineConfigPoolSelector:

    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: cpumanager-enabled
    spec:
      machineConfigPoolSelector:
        matchLabels:
          custom-kubelet: cpumanager-enabled
      kubeletConfig:
         cpuManagerPolicy: static 1
         cpuManagerReconcilePeriod: 5s 2
    1
    Spécifier une politique :
    • none. Cette politique active explicitement le schéma d'affinité CPU par défaut existant, ne fournissant aucune affinité au-delà de ce que le planificateur fait automatiquement. Il s'agit de la stratégie par défaut.
    • static. Cette politique autorise les conteneurs dans les pods garantis avec des demandes de CPU entières. Elle limite également l'accès aux CPU exclusifs sur le nœud. Si static, vous devez utiliser une minuscule s.
    2
    Facultatif. Indiquez la fréquence de rapprochement du gestionnaire de CPU. La valeur par défaut est 5s.
  5. Créer la configuration dynamique du kubelet :

    # oc create -f cpumanager-kubeletconfig.yaml

    Cela ajoute la fonction CPU Manager à la configuration du kubelet et, si nécessaire, le Machine Config Operator (MCO) redémarre le nœud. Pour activer le gestionnaire de CPU, un redémarrage n'est pas nécessaire.

  6. Vérifier la configuration du kubelet fusionné :

    # oc get machineconfig 99-worker-XXXXXX-XXXXX-XXXX-XXXXX-kubelet -o json | grep ownerReference -A7

    Exemple de sortie

           "ownerReferences": [
                {
                    "apiVersion": "machineconfiguration.openshift.io/v1",
                    "kind": "KubeletConfig",
                    "name": "cpumanager-enabled",
                    "uid": "7ed5616d-6b72-11e9-aae1-021e1ce18878"
                }
            ]

  7. Consultez le travailleur pour obtenir la mise à jour de kubelet.conf:

    # oc debug node/perf-node.example.com
    sh-4.2# cat /host/etc/kubernetes/kubelet.conf | grep cpuManager

    Exemple de sortie

    cpuManagerPolicy: static        1
    cpuManagerReconcilePeriod: 5s   2

    1
    cpuManagerPolicy est défini lorsque vous créez le CR KubeletConfig.
    2
    cpuManagerReconcilePeriod est défini lorsque vous créez le CR KubeletConfig.
  8. Créer un pod qui demande un ou plusieurs cœurs. Les limites et les demandes doivent avoir une valeur CPU égale à un entier. Il s'agit du nombre de cœurs qui seront dédiés à ce module :

    # cat cpumanager-pod.yaml

    Exemple de sortie

    apiVersion: v1
    kind: Pod
    metadata:
      generateName: cpumanager-
    spec:
      containers:
      - name: cpumanager
        image: gcr.io/google_containers/pause-amd64:3.0
        resources:
          requests:
            cpu: 1
            memory: "1G"
          limits:
            cpu: 1
            memory: "1G"
      nodeSelector:
        cpumanager: "true"

  9. Créer la capsule :

    # oc create -f cpumanager-pod.yaml
  10. Vérifiez que le pod est planifié sur le nœud que vous avez étiqueté :

    # oc describe pod cpumanager

    Exemple de sortie

    Name:               cpumanager-6cqz7
    Namespace:          default
    Priority:           0
    PriorityClassName:  <none>
    Node:  perf-node.example.com/xxx.xx.xx.xxx
    ...
     Limits:
          cpu:     1
          memory:  1G
        Requests:
          cpu:        1
          memory:     1G
    ...
    QoS Class:       Guaranteed
    Node-Selectors:  cpumanager=true

  11. Vérifiez que l'adresse cgroups est correctement configurée. Obtenir l'ID du processus (PID) du processus pause:

    # ├─init.scope
    │ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 17
    └─kubepods.slice
      ├─kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice
      │ ├─crio-b5437308f1a574c542bdf08563b865c0345c8f8c0b0a655612c.scope
      │ └─32706 /pause

    Les pods du niveau de qualité de service (QoS) Guaranteed sont placés à l'intérieur du site kubepods.slice. Les pods des autres niveaux de QoS se retrouvent dans les enfants cgroups de kubepods:

    # cd /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice/crio-b5437308f1ad1a7db0574c542bdf08563b865c0345c86e9585f8c0b0a655612c.scope
    # for i in `ls cpuset.cpus tasks` ; do echo -n "$i "; cat $i ; done

    Exemple de sortie

    cpuset.cpus 1
    tasks 32706

  12. Vérifiez la liste des unités centrales autorisées pour la tâche :

    # grep ^Cpus_allowed_list /proc/32706/status

    Exemple de sortie

     Cpus_allowed_list:    1

  13. Vérifiez qu'un autre pod (dans ce cas, le pod du niveau de qualité de service burstable ) sur le système ne peut pas fonctionner sur le cœur alloué au pod Guaranteed:

    # cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc494a073_6b77_11e9_98c0_06bba5c387ea.slice/crio-c56982f57b75a2420947f0afc6cafe7534c5734efc34157525fa9abbf99e3849.scope/cpuset.cpus
    0
    # oc describe node perf-node.example.com

    Exemple de sortie

    ...
    Capacity:
     attachable-volumes-aws-ebs:  39
     cpu:                         2
     ephemeral-storage:           124768236Ki
     hugepages-1Gi:               0
     hugepages-2Mi:               0
     memory:                      8162900Ki
     pods:                        250
    Allocatable:
     attachable-volumes-aws-ebs:  39
     cpu:                         1500m
     ephemeral-storage:           124768236Ki
     hugepages-1Gi:               0
     hugepages-2Mi:               0
     memory:                      7548500Ki
     pods:                        250
    -------                               ----                           ------------  ----------  ---------------  -------------  ---
      default                                 cpumanager-6cqz7               1 (66%)       1 (66%)     1G (12%)         1G (12%)       29m
    
    Allocated resources:
      (Total limits may be over 100 percent, i.e., overcommitted.)
      Resource                    Requests          Limits
      --------                    --------          ------
      cpu                         1440m (96%)       1 (66%)

    Cette VM dispose de deux cœurs de processeur. Le paramètre system-reserved réserve 500 millicores, ce qui signifie que la moitié d'un cœur est soustraite de la capacité totale du nœud pour obtenir la quantité Node Allocatable. Vous pouvez voir que Allocatable CPU est de 1500 millicores. Cela signifie que vous pouvez exécuter l'un des pods du gestionnaire de CPU, puisque chacun d'entre eux prendra un cœur entier. Un cœur entier est équivalent à 1000 millicores. Si vous essayez de planifier un deuxième module, le système acceptera le module, mais il ne sera jamais planifié :

    NAME                    READY   STATUS    RESTARTS   AGE
    cpumanager-6cqz7        1/1     Running   0          33m
    cpumanager-7qc2t        0/1     Pending   0          11s

4.2. Politiques du gestionnaire de topologie

Topology Manager aligne les ressources Pod de toutes les classes de qualité de service (QoS) en recueillant des indices topologiques auprès des fournisseurs d'indices, tels que CPU Manager et Device Manager, et en utilisant les indices recueillis pour aligner les ressources Pod.

Topology Manager prend en charge quatre politiques d'allocation, que vous attribuez dans la ressource personnalisée (CR) cpumanager-enabled:

none politique
Il s'agit de la stratégie par défaut, qui n'effectue aucun alignement topologique.
best-effort politique
Pour chaque conteneur d'un module avec la politique de gestion de la topologie best-effort, kubelet appelle chaque fournisseur d'indices pour connaître la disponibilité de ses ressources. À l'aide de ces informations, le gestionnaire de topologie enregistre l'affinité préférée du nœud NUMA pour ce conteneur. Si l'affinité n'est pas préférée, le gestionnaire de topologie le stocke et admet le pod au nœud.
restricted politique
Pour chaque conteneur d'un module avec la politique de gestion de la topologie restricted, kubelet appelle chaque fournisseur d'indices pour connaître la disponibilité de ses ressources. À l'aide de ces informations, le gestionnaire de topologie enregistre l'affinité préférée du nœud NUMA pour ce conteneur. Si l'affinité n'est pas préférée, le gestionnaire de topologie rejette ce pod du nœud, ce qui se traduit par un pod dans l'état Terminated avec un échec d'admission de pod.
single-numa-node politique
Pour chaque conteneur d'un pod avec la politique de gestion de la topologie single-numa-node, kubelet appelle chaque fournisseur d'indices pour connaître la disponibilité de ses ressources. À l'aide de ces informations, le gestionnaire de topologie détermine si une affinité avec un seul nœud NUMA est possible. Si c'est le cas, le pod est admis dans le nœud. Si une affinité de nœud NUMA unique n'est pas possible, le gestionnaire de topologie rejette le module du nœud. Le résultat est un pod en état Terminé avec un échec d'admission de pod.

4.3. Configuration du gestionnaire de topologie

Pour utiliser le gestionnaire de topologie, vous devez configurer une politique d'allocation dans la ressource personnalisée (CR) cpumanager-enabled. Ce fichier peut exister si vous avez configuré le Gestionnaire de CPU. Si le fichier n'existe pas, vous pouvez le créer.

Prequisites

  • Configurez la politique du gestionnaire de CPU pour qu'elle soit static.

Procédure

Pour activer Topololgy Manager :

  1. Configurer la politique d'allocation du gestionnaire de topologie dans la ressource personnalisée (CR) cpumanager-enabled.

    $ oc edit KubeletConfig cpumanager-enabled
    apiVersion: machineconfiguration.openshift.io/v1
    kind: KubeletConfig
    metadata:
      name: cpumanager-enabled
    spec:
      machineConfigPoolSelector:
        matchLabels:
          custom-kubelet: cpumanager-enabled
      kubeletConfig:
         cpuManagerPolicy: static 1
         cpuManagerReconcilePeriod: 5s
         topologyManagerPolicy: single-numa-node 2
    1
    Ce paramètre doit être static avec une minuscule s.
    2
    Spécifiez la politique d'allocation de Topology Manager que vous avez choisie. Ici, la politique est single-numa-node. Les valeurs acceptables sont : default, best-effort, restricted, single-numa-node.

4.4. Interactions des pods avec les politiques de Topology Manager

Les exemples de spécifications Pod ci-dessous permettent d'illustrer les interactions entre les pods et Topology Manager.

Le pod suivant s'exécute dans la classe de qualité de service BestEffort car aucune demande ou limite de ressources n'est spécifiée.

spec:
  containers:
  - name: nginx
    image: nginx

Le pod suivant fonctionne dans la classe de qualité de service Burstable car les demandes sont inférieures aux limites.

spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"

Si la politique sélectionnée est autre que none, Topology Manager ne tiendra compte d'aucune de ces spécifications Pod.

Le dernier exemple de pod ci-dessous s'exécute dans la classe de qualité de service garantie parce que les demandes sont égales aux limites.

spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
        example.com/device: "1"
      requests:
        memory: "200Mi"
        cpu: "2"
        example.com/device: "1"

Le gestionnaire de topologie prend en compte ce module. Le gestionnaire de topologie consulte les fournisseurs d'indices, à savoir le gestionnaire de CPU et le gestionnaire de périphériques, afin d'obtenir des indices topologiques pour le module.

Le gestionnaire de topologie utilisera ces informations pour stocker la meilleure topologie pour ce conteneur. Dans le cas de ce module, le gestionnaire de CPU et le gestionnaire de périphériques utiliseront ces informations stockées lors de la phase d'allocation des ressources.

Chapitre 5. Ordonnancement des charges de travail compatibles avec les NUMA

Découvrez l'ordonnancement NUMA-aware et comment vous pouvez l'utiliser pour déployer des charges de travail hautes performances dans un cluster OpenShift Container Platform.

Important

L'ordonnancement NUMA-aware est une fonctionnalité de l'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

L'opérateur de ressources NUMA vous permet de planifier des charges de travail hautes performances dans la même zone NUMA. Il déploie un agent d'exportation des ressources de nœuds qui signale les ressources NUMA de nœuds de cluster disponibles, et un planificateur secondaire qui gère les charges de travail.

5.1. À propos de l'ordonnancement NUMA

L'accès non uniforme à la mémoire (NUMA) est une architecture de plate-forme informatique qui permet à différents processeurs d'accéder à différentes régions de la mémoire à des vitesses différentes. La topologie des ressources NUMA fait référence à l'emplacement des unités centrales, de la mémoire et des périphériques PCI les uns par rapport aux autres dans le nœud de calcul. Les ressources co-localisées sont dites être dans le même NUMA zone. Pour les applications à haute performance, le cluster doit traiter les charges de travail des pods dans une seule zone NUMA.

L'architecture NUMA permet à une unité centrale dotée de plusieurs contrôleurs de mémoire d'utiliser toute la mémoire disponible dans les complexes d'unités centrales, quel que soit l'emplacement de la mémoire. Cela permet d'accroître la flexibilité au détriment des performances. Une unité centrale traitant une charge de travail utilisant une mémoire située en dehors de sa zone NUMA est plus lente qu'une charge de travail traitée dans une seule zone NUMA. En outre, pour les charges de travail soumises à des contraintes d'E/S, l'interface réseau située dans une zone NUMA éloignée ralentit la vitesse à laquelle les informations peuvent atteindre l'application. Les charges de travail à haute performance, telles que les charges de travail de télécommunications, ne peuvent pas fonctionner selon les spécifications dans ces conditions. L'ordonnancement NUMA-aware permet d'aligner les ressources de calcul du cluster (CPU, mémoire, périphériques) demandées dans la même zone NUMA afin de traiter efficacement les charges de travail sensibles à la latence ou très performantes. L'ordonnancement NUMA-aware améliore également la densité de pods par nœud de calcul pour une meilleure efficacité des ressources.

La logique de planification par défaut du planificateur de pods d'OpenShift Container Platform prend en compte les ressources disponibles de l'ensemble du nœud de calcul, et non des zones NUMA individuelles. Si l'alignement des ressources le plus restrictif est demandé dans le gestionnaire de topologie des kubelets, des conditions d'erreur peuvent survenir lors de l'admission du pod sur un nœud. Inversement, si l'alignement des ressources le plus restrictif n'est pas demandé, le module peut être admis dans le nœud sans que l'alignement des ressources soit correct, ce qui entraîne des performances moins bonnes ou imprévisibles. Par exemple, la création de pods avec des statuts Topology Affinity Error peut se produire lorsque le planificateur de pods prend des décisions de planification sous-optimales pour des charges de travail de pods garanties, car il ne sait pas si les ressources demandées par le pod sont disponibles. Les décisions d'inadéquation de l'ordonnancement peuvent entraîner des retards indéfinis dans le démarrage des modules. En outre, en fonction de l'état du cluster et de l'allocation des ressources, de mauvaises décisions d'ordonnancement de pods peuvent entraîner une charge supplémentaire sur le cluster en raison de l'échec des tentatives de démarrage.

L'opérateur de ressources NUMA déploie un planificateur secondaire de ressources NUMA personnalisé et d'autres ressources pour atténuer les lacunes du planificateur de pods par défaut d'OpenShift Container Platform. Le diagramme suivant fournit un aperçu de haut niveau de la planification de pods tenant compte de la NUMA.

Figure 5.1. Vue d'ensemble de l'ordonnancement NUMA

Diagram of NUMA-aware scheduling that shows how the various components interact with each other in the cluster
API NodeResourceTopology
L'API NodeResourceTopology décrit les ressources de la zone NUMA disponibles dans chaque nœud de calcul.
Ordonnanceur compatible avec les NUMA
L'ordonnanceur secondaire NUMA-aware reçoit des informations sur les zones NUMA disponibles de l'API NodeResourceTopology et planifie les charges de travail à haute performance sur un nœud où elles peuvent être traitées de manière optimale.
Exportateur de topologie de nœuds
L'exportateur de topologie de nœuds expose les ressources de la zone NUMA disponibles pour chaque nœud de calcul à l'API NodeResourceTopology. Le démon de l'exportateur de topologie de nœuds suit l'allocation des ressources de la kubelet à l'aide de l'API PodResources.
API PodResources
L'API PodResources est locale à chaque nœud et expose la topologie des ressources et les ressources disponibles au kubelet.

Ressources supplémentaires

5.2. Installation de l'opérateur de ressources NUMA

NUMA Resources Operator déploie des ressources qui vous permettent de planifier des charges de travail et des déploiements compatibles avec NUMA. Vous pouvez installer l'opérateur de ressources NUMA à l'aide de la CLI d'OpenShift Container Platform ou de la console Web.

5.2.1. Installation de l'opérateur de ressources NUMA à l'aide du CLI

En tant qu'administrateur de cluster, vous pouvez installer l'Opérateur à l'aide de la CLI.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Créer un espace de noms pour l'opérateur de ressources NUMA :

    1. Enregistrez le YAML suivant dans le fichier nro-namespace.yaml:

      apiVersion: v1
      kind: Namespace
      metadata:
        name: openshift-numaresources
    2. Créez le CR Namespace en exécutant la commande suivante :

      $ oc create -f nro-namespace.yaml
  2. Créez le groupe d'opérateurs pour l'opérateur de ressources NUMA :

    1. Enregistrez le YAML suivant dans le fichier nro-operatorgroup.yaml:

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: numaresources-operator
        namespace: openshift-numaresources
      spec:
        targetNamespaces:
        - openshift-numaresources
    2. Créez le CR OperatorGroup en exécutant la commande suivante :

      $ oc create -f nro-operatorgroup.yaml
  3. Créer l'abonnement pour l'opérateur de ressources NUMA :

    1. Enregistrez le YAML suivant dans le fichier nro-sub.yaml:

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: numaresources-operator
        namespace: openshift-numaresources
      spec:
        channel: "4.12"
        name: numaresources-operator
        source: redhat-operators
        sourceNamespace: openshift-marketplace
    2. Créez le CR Subscription en exécutant la commande suivante :

      $ oc create -f nro-sub.yaml

Vérification

  1. Vérifiez que l'installation a réussi en inspectant la ressource CSV dans l'espace de noms openshift-numaresources. Exécutez la commande suivante :

    $ oc get csv -n openshift-numaresources

    Exemple de sortie

    NAME                             DISPLAY                  VERSION   REPLACES   PHASE
    numaresources-operator.v4.12.2   numaresources-operator   4.12.2               Succeeded

5.2.2. Installation de l'opérateur de ressources NUMA à l'aide de la console Web

En tant qu'administrateur de cluster, vous pouvez installer l'opérateur de ressources NUMA à l'aide de la console Web.

Procédure

  1. Installez l'opérateur de ressources NUMA à l'aide de la console web d'OpenShift Container Platform :

    1. Dans la console Web OpenShift Container Platform, cliquez sur OperatorsOperatorHub.
    2. Choisissez NUMA Resources Operator dans la liste des opérateurs disponibles, puis cliquez sur Install.
  2. Facultatif : Vérifiez que l'opérateur de ressources NUMA a été installé avec succès :

    1. Passez à la page OperatorsInstalled Operators.
    2. Assurez-vous que NUMA Resources Operator est listé dans le projet default avec un Status de InstallSucceeded.

      Note

      Pendant l'installation, un opérateur peut afficher un état Failed. Si l'installation réussit par la suite avec un message InstallSucceeded, vous pouvez ignorer le message Failed.

      Si l'opérateur n'apparaît pas tel qu'il a été installé, il convient de poursuivre le dépannage :

      • Allez à la page OperatorsInstalled Operators et inspectez les onglets Operator Subscriptions et Install Plans pour voir s'il y a des défaillances ou des erreurs sous Status.
      • Allez sur la page WorkloadsPods et vérifiez les journaux pour les pods dans le projet default.

5.3. Création de la ressource personnalisée NUMAResourcesOperator

Une fois l'opérateur de ressources NUMA installé, créez la ressource personnalisée (CR) NUMAResourcesOperator qui demande à l'opérateur de ressources NUMA d'installer toute l'infrastructure de cluster nécessaire à la prise en charge du planificateur NUMA, y compris les jeux de démons et les API.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Installer l'opérateur de ressources NUMA.

Procédure

  1. Créez la ressource personnalisée MachineConfigPool qui permet de personnaliser les configurations des kubelets pour les nœuds de travail :

    1. Enregistrez le YAML suivant dans le fichier nro-machineconfig.yaml:

      apiVersion: machineconfiguration.openshift.io/v1
      kind: MachineConfigPool
      metadata:
        labels:
          cnf-worker-tuning: enabled
          machineconfiguration.openshift.io/mco-built-in: ""
          pools.operator.machineconfiguration.openshift.io/worker: ""
        name: worker
      spec:
        machineConfigSelector:
          matchLabels:
            machineconfiguration.openshift.io/role: worker
        nodeSelector:
          matchLabels:
            node-role.kubernetes.io/worker: ""
    2. Créez le CR MachineConfigPool en exécutant la commande suivante :

      $ oc create -f nro-machineconfig.yaml
  2. Créer la ressource personnalisée NUMAResourcesOperator:

    1. Enregistrez le YAML suivant dans le fichier nrop.yaml:

      apiVersion: nodetopology.openshift.io/v1alpha1
      kind: NUMAResourcesOperator
      metadata:
        name: numaresourcesoperator
      spec:
        nodeGroups:
        - machineConfigPoolSelector:
            matchLabels:
              pools.operator.machineconfiguration.openshift.io/worker: "" 1
      1
      Doit correspondre à l'étiquette appliquée aux nœuds de travail dans le CR MachineConfigPool correspondant.
    2. Créez le CR NUMAResourcesOperator en exécutant la commande suivante :

      $ oc create -f nrop.yaml

Vérification

Vérifiez que l'opérateur de ressources NUMA a été déployé avec succès en exécutant la commande suivante :

$ oc get numaresourcesoperators.nodetopology.openshift.io

Exemple de sortie

NAME                    AGE
numaresourcesoperator   10m

5.4. Déploiement de l'ordonnanceur de pods secondaire NUMA-aware

Après avoir installé l'opérateur de ressources NUMA, procédez comme suit pour déployer le planificateur de pods secondaire compatible NUMA :

  • Configurer la politique d'admission des pods pour le profil de machine requis
  • Créer le pool de configuration machine requis
  • Déployer l'ordonnanceur secondaire compatible NUMA

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Installer l'opérateur de ressources NUMA.

Procédure

  1. Créez la ressource personnalisée KubeletConfig qui configure la politique d'admission des pods pour le profil de la machine :

    1. Enregistrez le YAML suivant dans le fichier nro-kubeletconfig.yaml:

      apiVersion: machineconfiguration.openshift.io/v1
      kind: KubeletConfig
      metadata:
        name: cnf-worker-tuning
      spec:
        machineConfigPoolSelector:
          matchLabels:
            cnf-worker-tuning: enabled
        kubeletConfig:
          cpuManagerPolicy: "static" 1
          cpuManagerReconcilePeriod: "5s"
          reservedSystemCPUs: "0,1"
          memoryManagerPolicy: "Static" 2
          evictionHard:
            memory.available: "100Mi"
          kubeReserved:
            memory: "512Mi"
          reservedMemory:
            - numaNode: 0
              limits:
                memory: "1124Mi"
          systemReserved:
            memory: "512Mi"
          topologyManagerPolicy: "single-numa-node" 3
          topologyManagerScope: "pod"
      1
      Pour cpuManagerPolicy, static doit utiliser une minuscule s.
      2
      Pour memoryManagerPolicy, Static doit utiliser une majuscule S.
      3
      topologyManagerPolicy doit être réglé sur single-numa-node.
    2. Créez la ressource personnalisée (CR) KubeletConfig en exécutant la commande suivante :

      $ oc create -f nro-kubeletconfig.yaml
  2. Créer la ressource personnalisée NUMAResourcesScheduler qui déploie le planificateur de pods personnalisé NUMA-aware :

    1. Enregistrez le YAML suivant dans le fichier nro-scheduler.yaml:

      apiVersion: nodetopology.openshift.io/v1alpha1
      kind: NUMAResourcesScheduler
      metadata:
        name: numaresourcesscheduler
      spec:
        imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.12"
    2. Créez le CR NUMAResourcesScheduler en exécutant la commande suivante :

      $ oc create -f nro-scheduler.yaml

Vérification

Vérifiez que les ressources requises ont été déployées avec succès en exécutant la commande suivante :

$ oc get all -n openshift-numaresources

Exemple de sortie

NAME                                                    READY   STATUS    RESTARTS   AGE
pod/numaresources-controller-manager-7575848485-bns4s   1/1     Running   0          13m
pod/numaresourcesoperator-worker-dvj4n                  2/2     Running   0          16m
pod/numaresourcesoperator-worker-lcg4t                  2/2     Running   0          16m
pod/secondary-scheduler-56994cf6cf-7qf4q                1/1     Running   0          16m
NAME                                          DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                     AGE
daemonset.apps/numaresourcesoperator-worker   2         2         2       2            2           node-role.kubernetes.io/worker=   16m
NAME                                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/numaresources-controller-manager   1/1     1            1           13m
deployment.apps/secondary-scheduler                1/1     1            1           16m
NAME                                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/numaresources-controller-manager-7575848485   1         1         1       13m
replicaset.apps/secondary-scheduler-56994cf6cf                1         1         1       16m

5.5. Ordonnancement des charges de travail avec l'ordonnanceur NUMA-aware

Vous pouvez planifier des charges de travail avec le planificateur NUMA-aware à l'aide de Deployment CR qui spécifient les ressources minimales requises pour traiter la charge de travail.

L'exemple de déploiement suivant utilise l'ordonnancement NUMA-aware pour un exemple de charge de travail.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Installez l'opérateur de ressources NUMA et déployez l'ordonnanceur secondaire compatible NUMA.

Procédure

  1. Obtenez le nom de l'ordonnanceur NUMA-aware déployé dans le cluster en exécutant la commande suivante :

    $ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'

    Exemple de sortie

    topo-aware-scheduler

  2. Créez un CR Deployment qui utilise l'ordonnanceur nommé topo-aware-scheduler, par exemple :

    1. Enregistrez le YAML suivant dans le fichier nro-deployment.yaml:

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: numa-deployment-1
        namespace: openshift-numaresources
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: test
        template:
          metadata:
            labels:
              app: test
          spec:
            schedulerName: topo-aware-scheduler 1
            containers:
            - name: ctnr
              image: quay.io/openshifttest/hello-openshift:openshift
              imagePullPolicy: IfNotPresent
              resources:
                limits:
                  memory: "100Mi"
                  cpu: "10"
                requests:
                  memory: "100Mi"
                  cpu: "10"
            - name: ctnr2
              image: gcr.io/google_containers/pause-amd64:3.0
              imagePullPolicy: IfNotPresent
              command: ["/bin/sh", "-c"]
              args: [ "while true; do sleep 1h; done;" ]
              resources:
                limits:
                  memory: "100Mi"
                  cpu: "8"
                requests:
                  memory: "100Mi"
                  cpu: "8"
      1
      schedulerName doit correspondre au nom de l'ordonnanceur NUMA-aware déployé dans votre cluster, par exemple topo-aware-scheduler.
    2. Créez le CR Deployment en exécutant la commande suivante :

      $ oc create -f nro-deployment.yaml

Vérification

  1. Vérifiez que le déploiement s'est déroulé correctement :

    $ oc get pods -n openshift-numaresources

    Exemple de sortie

    NAME                                                READY   STATUS    RESTARTS   AGE
    numa-deployment-1-56954b7b46-pfgw8                  2/2     Running   0          129m
    numaresources-controller-manager-7575848485-bns4s   1/1     Running   0          15h
    numaresourcesoperator-worker-dvj4n                  2/2     Running   0          18h
    numaresourcesoperator-worker-lcg4t                  2/2     Running   0          16h
    secondary-scheduler-56994cf6cf-7qf4q                1/1     Running   0          18h

  2. Vérifiez que le site topo-aware-scheduler planifie le pod déployé en exécutant la commande suivante :

    $ oc describe pod numa-deployment-1-56954b7b46-pfgw8 -n openshift-numaresources

    Exemple de sortie

    Events:
      Type    Reason          Age   From                  Message
      ----    ------          ----  ----                  -------
      Normal  Scheduled       130m  topo-aware-scheduler  Successfully assigned openshift-numaresources/numa-deployment-1-56954b7b46-pfgw8 to compute-0.example.com

    Note

    Les déploiements qui demandent plus de ressources qu'il n'y en a de disponibles pour la planification échoueront avec une erreur MinimumReplicasUnavailable. Le déploiement réussit lorsque les ressources requises sont disponibles. Les pods restent dans l'état Pending jusqu'à ce que les ressources nécessaires soient disponibles.

  3. Vérifiez que les ressources allouées prévues sont répertoriées pour le nœud. Exécutez la commande suivante :

    $ oc describe noderesourcetopologies.topology.node.k8s.io

    Exemple de sortie

    ...
    
    Zones:
      Costs:
        Name:   node-0
        Value:  10
        Name:   node-1
        Value:  21
      Name:     node-0
      Resources:
        Allocatable:  39
        Available:    21 1
        Capacity:     40
        Name:         cpu
        Allocatable:  6442450944
        Available:    6442450944
        Capacity:     6442450944
        Name:         hugepages-1Gi
        Allocatable:  134217728
        Available:    134217728
        Capacity:     134217728
        Name:         hugepages-2Mi
        Allocatable:  262415904768
        Available:    262206189568
        Capacity:     270146007040
        Name:         memory
      Type:           Node

    1
    La capacité de Available est réduite en raison des ressources qui ont été allouées au pod garanti.

    Les ressources consommées par les pods garantis sont soustraites des ressources de nœuds disponibles répertoriées sous noderesourcetopologies.topology.node.k8s.io.

  4. Les allocations de ressources pour les modules ayant une qualité de service Best-effort ou Burstable (qosClass) ne sont pas reflétées dans les ressources des nœuds NUMA sous noderesourcetopologies.topology.node.k8s.io. Si les ressources consommées par un pod ne sont pas prises en compte dans le calcul des ressources du nœud, vérifiez que le pod a qosClass de Guaranteed en exécutant la commande suivante :

    $ oc get pod <pod_name> -n <pod_namespace> -o jsonpath="{ .status.qosClass }"

    Exemple de sortie

    Guaranteed

5.6. Résolution des problèmes liés à l'ordonnancement NUMA

Pour résoudre les problèmes courants liés à l'ordonnancement de pods NUMA-aware, procédez comme suit.

Conditions préalables

  • Installez le CLI OpenShift Container Platform (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges d'administrateur de cluster.
  • Installez l'opérateur de ressources NUMA et déployez l'ordonnanceur secondaire compatible NUMA.

Procédure

  1. Vérifiez que le CRD noderesourcetopologies est déployé dans le cluster en exécutant la commande suivante :

    $ oc get crd | grep noderesourcetopologies

    Exemple de sortie

    NAME                                                              CREATED AT
    noderesourcetopologies.topology.node.k8s.io                       2022-01-18T08:28:06Z

  2. Vérifiez que le nom de l'ordonnanceur NUMA-aware correspond au nom spécifié dans vos charges de travail NUMA-aware en exécutant la commande suivante :

    $ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'

    Exemple de sortie

    topo-aware-scheduler

  3. Vérifiez que les nœuds programmables compatibles NUMA ont reçu l'application noderesourcetopologies CR. Exécutez la commande suivante :

    $ oc get noderesourcetopologies.topology.node.k8s.io

    Exemple de sortie

    NAME                    AGE
    compute-0.example.com   17h
    compute-1.example.com   17h

    Note

    Le nombre de nœuds doit être égal au nombre de nœuds de travailleur configurés par la définition de travailleur du pool de configuration de la machine (mcp).

  4. Vérifiez la granularité de la zone NUMA pour tous les nœuds programmables en exécutant la commande suivante :

    $ oc get noderesourcetopologies.topology.node.k8s.io -o yaml

    Exemple de sortie

    apiVersion: v1
    items:
    - apiVersion: topology.node.k8s.io/v1alpha1
      kind: NodeResourceTopology
      metadata:
        annotations:
          k8stopoawareschedwg/rte-update: periodic
        creationTimestamp: "2022-06-16T08:55:38Z"
        generation: 63760
        name: worker-0
        resourceVersion: "8450223"
        uid: 8b77be46-08c0-4074-927b-d49361471590
      topologyPolicies:
      - SingleNUMANodeContainerLevel
      zones:
      - costs:
        - name: node-0
          value: 10
        - name: node-1
          value: 21
        name: node-0
        resources:
        - allocatable: "38"
          available: "38"
          capacity: "40"
          name: cpu
        - allocatable: "134217728"
          available: "134217728"
          capacity: "134217728"
          name: hugepages-2Mi
        - allocatable: "262352048128"
          available: "262352048128"
          capacity: "270107316224"
          name: memory
        - allocatable: "6442450944"
          available: "6442450944"
          capacity: "6442450944"
          name: hugepages-1Gi
        type: Node
      - costs:
        - name: node-0
          value: 21
        - name: node-1
          value: 10
        name: node-1
        resources:
        - allocatable: "268435456"
          available: "268435456"
          capacity: "268435456"
          name: hugepages-2Mi
        - allocatable: "269231067136"
          available: "269231067136"
          capacity: "270573244416"
          name: memory
        - allocatable: "40"
          available: "40"
          capacity: "40"
          name: cpu
        - allocatable: "1073741824"
          available: "1073741824"
          capacity: "1073741824"
          name: hugepages-1Gi
        type: Node
    - apiVersion: topology.node.k8s.io/v1alpha1
      kind: NodeResourceTopology
      metadata:
        annotations:
          k8stopoawareschedwg/rte-update: periodic
        creationTimestamp: "2022-06-16T08:55:37Z"
        generation: 62061
        name: worker-1
        resourceVersion: "8450129"
        uid: e8659390-6f8d-4e67-9a51-1ea34bba1cc3
      topologyPolicies:
      - SingleNUMANodeContainerLevel
      zones: 1
      - costs:
        - name: node-0
          value: 10
        - name: node-1
          value: 21
        name: node-0
        resources: 2
        - allocatable: "38"
          available: "38"
          capacity: "40"
          name: cpu
        - allocatable: "6442450944"
          available: "6442450944"
          capacity: "6442450944"
          name: hugepages-1Gi
        - allocatable: "134217728"
          available: "134217728"
          capacity: "134217728"
          name: hugepages-2Mi
        - allocatable: "262391033856"
          available: "262391033856"
          capacity: "270146301952"
          name: memory
        type: Node
      - costs:
        - name: node-0
          value: 21
        - name: node-1
          value: 10
        name: node-1
        resources:
        - allocatable: "40"
          available: "40"
          capacity: "40"
          name: cpu
        - allocatable: "1073741824"
          available: "1073741824"
          capacity: "1073741824"
          name: hugepages-1Gi
        - allocatable: "268435456"
          available: "268435456"
          capacity: "268435456"
          name: hugepages-2Mi
        - allocatable: "269192085504"
          available: "269192085504"
          capacity: "270534262784"
          name: memory
        type: Node
    kind: List
    metadata:
      resourceVersion: ""
      selfLink: ""

    1
    Chaque strophe sous zones décrit les ressources d'une seule zone NUMA.
    2
    resources décrit l'état actuel des ressources de la zone NUMA. Vérifiez que les ressources répertoriées sous items.zones.resources.available correspondent aux ressources exclusives de la zone NUMA allouées à chaque pod garanti.

5.6.1. Vérification des journaux de l'ordonnanceur NUMA-aware

Dépannez les problèmes liés à l'ordonnanceur NUMA-aware en examinant les journaux. Si nécessaire, vous pouvez augmenter le niveau de journalisation de l'ordonnanceur en modifiant le champ spec.logLevel de la ressource NUMAResourcesScheduler. Les valeurs acceptables sont Normal, Debug, et Trace, Trace étant l'option la plus verbeuse.

Note

Pour modifier le niveau de journalisation de l'ordonnanceur secondaire, supprimez la ressource de l'ordonnanceur en cours d'exécution et redéployez-la avec le niveau de journalisation modifié. L'ordonnanceur n'est pas disponible pour l'ordonnancement de nouvelles charges de travail pendant ce temps d'arrêt.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Supprimer la ressource NUMAResourcesScheduler en cours d'exécution :

    1. Obtenez le site actif NUMAResourcesScheduler en exécutant la commande suivante :

      $ oc get NUMAResourcesScheduler

      Exemple de sortie

      NAME                     AGE
      numaresourcesscheduler   90m

    2. Supprimez la ressource du planificateur secondaire en exécutant la commande suivante :

      $ oc delete NUMAResourcesScheduler numaresourcesscheduler

      Exemple de sortie

      numaresourcesscheduler.nodetopology.openshift.io "numaresourcesscheduler" deleted

  2. Enregistrez le YAML suivant dans le fichier nro-scheduler-debug.yaml. Cet exemple modifie le niveau de journalisation à Debug:

    apiVersion: nodetopology.openshift.io/v1alpha1
    kind: NUMAResourcesScheduler
    metadata:
      name: numaresourcesscheduler
    spec:
      imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.12"
      logLevel: Debug
  3. Créez la ressource Debug logging NUMAResourcesScheduler mise à jour en exécutant la commande suivante :

    $ oc create -f nro-scheduler-debug.yaml

    Exemple de sortie

    numaresourcesscheduler.nodetopology.openshift.io/numaresourcesscheduler created

Verification steps

  1. Vérifiez que l'ordonnanceur NUMA-aware a été déployé avec succès :

    1. Exécutez la commande suivante pour vérifier que le CRD a été créé avec succès :

      $ oc get crd | grep numaresourcesschedulers

      Exemple de sortie

      NAME                                                              CREATED AT
      numaresourcesschedulers.nodetopology.openshift.io                 2022-02-25T11:57:03Z

    2. Vérifiez que le nouvel ordonnanceur personnalisé est disponible en exécutant la commande suivante :

      $ oc get numaresourcesschedulers.nodetopology.openshift.io

      Exemple de sortie

      NAME                     AGE
      numaresourcesscheduler   3h26m

  2. Vérifiez que les journaux de l'ordonnanceur affichent le niveau de journal augmenté :

    1. Obtenez la liste des pods fonctionnant dans l'espace de noms openshift-numaresources en exécutant la commande suivante :

      $ oc get pods -n openshift-numaresources

      Exemple de sortie

      NAME                                               READY   STATUS    RESTARTS   AGE
      numaresources-controller-manager-d87d79587-76mrm   1/1     Running   0          46h
      numaresourcesoperator-worker-5wm2k                 2/2     Running   0          45h
      numaresourcesoperator-worker-pb75c                 2/2     Running   0          45h
      secondary-scheduler-7976c4d466-qm4sc               1/1     Running   0          21m

    2. Obtenez les journaux du module de planification secondaire en exécutant la commande suivante :

      $ oc logs secondary-scheduler-7976c4d466-qm4sc -n openshift-numaresources

      Exemple de sortie

      ...
      I0223 11:04:55.614788       1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.Namespace total 11 items received
      I0223 11:04:56.609114       1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.ReplicationController total 10 items received
      I0223 11:05:22.626818       1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.StorageClass total 7 items received
      I0223 11:05:31.610356       1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.PodDisruptionBudget total 7 items received
      I0223 11:05:31.713032       1 eventhandlers.go:186] "Add event for scheduled pod" pod="openshift-marketplace/certified-operators-thtvq"
      I0223 11:05:53.461016       1 eventhandlers.go:244] "Delete event for scheduled pod" pod="openshift-marketplace/certified-operators-thtvq"

5.6.2. Dépannage de l'exportateur de topologie de ressources

Dépanner les objets noderesourcetopologies pour lesquels des résultats inattendus se produisent en inspectant les journaux resource-topology-exporter correspondants.

Note

Il est recommandé de nommer les instances de l'exportateur de topologie de ressources NUMA dans le cluster en fonction des nœuds auxquels elles se réfèrent. Par exemple, un nœud de travail portant le nom worker doit avoir un objet noderesourcetopologies correspondant appelé worker.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Obtenir les daemonsets gérés par l'opérateur de ressources NUMA. Chaque daemonset a un nodeGroup correspondant dans le CR NUMAResourcesOperator. Exécutez la commande suivante :

    $ oc get numaresourcesoperators.nodetopology.openshift.io numaresourcesoperator -o jsonpath="{.status.daemonsets[0]}"

    Exemple de sortie

    {"name":"numaresourcesoperator-worker","namespace":"openshift-numaresources"}

  2. Obtenir l'étiquette du daemonset concerné en utilisant la valeur de name obtenue à l'étape précédente :

    $ oc get ds -n openshift-numaresources numaresourcesoperator-worker -o jsonpath="{.spec.selector.matchLabels}"

    Exemple de sortie

    {"name":"resource-topology"}

  3. Obtenez les pods en utilisant l'étiquette resource-topology en exécutant la commande suivante :

    $ oc get pods -n openshift-numaresources -l name=resource-topology -o wide

    Exemple de sortie

    NAME                                 READY   STATUS    RESTARTS   AGE    IP            NODE
    numaresourcesoperator-worker-5wm2k   2/2     Running   0          2d1h   10.135.0.64   compute-0.example.com
    numaresourcesoperator-worker-pb75c   2/2     Running   0          2d1h   10.132.2.33   compute-1.example.com

  4. Examinez les journaux du conteneur resource-topology-exporter s'exécutant sur le module de travail correspondant au nœud que vous dépannez. Exécutez la commande suivante :

    $ oc logs -n openshift-numaresources -c resource-topology-exporter numaresourcesoperator-worker-pb75c

    Exemple de sortie

    I0221 13:38:18.334140       1 main.go:206] using sysinfo:
    reservedCpus: 0,1
    reservedMemory:
      "0": 1178599424
    I0221 13:38:18.334370       1 main.go:67] === System information ===
    I0221 13:38:18.334381       1 sysinfo.go:231] cpus: reserved "0-1"
    I0221 13:38:18.334493       1 sysinfo.go:237] cpus: online "0-103"
    I0221 13:38:18.546750       1 main.go:72]
    cpus: allocatable "2-103"
    hugepages-1Gi:
      numa cell 0 -> 6
      numa cell 1 -> 1
    hugepages-2Mi:
      numa cell 0 -> 64
      numa cell 1 -> 128
    memory:
      numa cell 0 -> 45758Mi
      numa cell 1 -> 48372Mi

5.6.3. Correction d'une carte de configuration de l'exportateur de topologie de ressources manquante

Si vous installez l'opérateur de ressources NUMA dans un cluster dont les paramètres sont mal configurés, dans certaines circonstances, l'opérateur est indiqué comme étant actif, mais les journaux des pods du démon RTE (resource topology exporter) montrent que la configuration du RTE est manquante, par exemple :

Info: couldn't find configuration in "/etc/resource-topology-exporter/config.yaml"

Ce message indique que la configuration requise de kubeletconfig n'a pas été correctement appliquée dans le cluster, ce qui entraîne l'absence d'une RTE configmap. Par exemple, il manque une ressource personnalisée (CR) numaresourcesoperator-worker configmap dans le cluster suivant :

$ oc get configmap

Exemple de sortie

NAME                           DATA   AGE
0e2a6bd3.openshift-kni.io      0      6d21h
kube-root-ca.crt               1      6d21h
openshift-service-ca.crt       1      6d21h
topo-aware-scheduler-config    1      6d18h

Dans un groupe correctement configuré, oc get configmap renvoie également un CR numaresourcesoperator-worker configmap .

Conditions préalables

  • Installez le CLI OpenShift Container Platform (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges d'administrateur de cluster.
  • Installez l'opérateur de ressources NUMA et déployez l'ordonnanceur secondaire compatible NUMA.

Procédure

  1. Comparez les valeurs de spec.machineConfigPoolSelector.matchLabels dans kubeletconfig et de metadata.labels dans MachineConfigPool (mcp) worker CR à l'aide des commandes suivantes :

    1. Vérifiez les étiquettes kubeletconfig en exécutant la commande suivante :

      $ oc get kubeletconfig -o yaml

      Exemple de sortie

      machineConfigPoolSelector:
        matchLabels:
          cnf-worker-tuning: enabled

    2. Vérifiez les étiquettes mcp en exécutant la commande suivante :

      $ oc get mcp worker -o yaml

      Exemple de sortie

      labels:
        machineconfiguration.openshift.io/mco-built-in: ""
        pools.operator.machineconfiguration.openshift.io/worker: ""

      L'étiquette cnf-worker-tuning: enabled n'est pas présente dans l'objet MachineConfigPool.

  2. Modifiez le CR MachineConfigPool pour inclure l'étiquette manquante, par exemple :

    $ oc edit mcp worker -o yaml

    Exemple de sortie

    labels:
      machineconfiguration.openshift.io/mco-built-in: ""
      pools.operator.machineconfiguration.openshift.io/worker: ""
      cnf-worker-tuning: enabled

  3. Appliquez les changements d'étiquettes et attendez que le cluster applique la configuration mise à jour. Exécutez la commande suivante :

Vérification

  • Vérifier que le numaresourcesoperator-worker configmap CR manquant est appliqué :

    $ oc get configmap

    Exemple de sortie

    NAME                           DATA   AGE
    0e2a6bd3.openshift-kni.io      0      6d21h
    kube-root-ca.crt               1      6d21h
    numaresourcesoperator-worker   1      5m
    openshift-service-ca.crt       1      6d21h
    topo-aware-scheduler-config    1      6d18h

Chapitre 6. Mise à l'échelle de l'opérateur de surveillance des clusters

OpenShift Container Platform expose les métriques que l'opérateur de surveillance des clusters collecte et stocke dans la pile de surveillance basée sur Prometheus. En tant qu'administrateur, vous pouvez afficher des tableaux de bord pour les ressources système, les conteneurs et les métriques des composants dans la console Web d'OpenShift Container Platform en naviguant vers ObserveDashboards.

6.1. Exigences en matière de stockage de la base de données Prometheus

Red Hat a effectué plusieurs tests pour différentes tailles d'échelle.

Note

Les exigences de stockage de Prometheus ci-dessous ne sont pas normatives. Une consommation de ressources plus importante peut être observée dans votre cluster en fonction de l'activité de la charge de travail et de l'utilisation des ressources.

Tableau 6.1. Besoins de stockage de la base de données Prometheus en fonction du nombre de nœuds/podes dans le cluster

Nombre de nœudsNombre de goussesCroissance du stockage de Prométhée par jourCroissance du stockage de Prometheus par 15 joursEspace RAM (par taille d'échelle)Réseau (par élément de la base de données)

50

1800

6.3 GB

94 GB

6 GB

16 MB

100

3600

13 GB

195 GB

10 GB

26 MB

150

5400

19 GB

283 GB

12 GB

36 MB

200

7200

25 GB

375 GO

14 GB

46 MB

Environ 20 % de la taille prévue a été ajoutée comme frais généraux pour garantir que les besoins de stockage ne dépassent pas la valeur calculée.

Le calcul ci-dessus concerne l'opérateur de surveillance de cluster par défaut d'OpenShift Container Platform.

Note

L'utilisation du processeur a un impact mineur. Le ratio est d'environ 1 cœur sur 40 pour 50 nœuds et 1800 pods.

Recommendations for OpenShift Container Platform

  • Utiliser au moins trois nœuds d'infrastructure (infra).
  • Utilisez au moins trois nœuds openshift-container-storage avec des disques NVMe (non-volatile memory express).

6.2. Configuration de la surveillance des clusters

Vous pouvez augmenter la capacité de stockage du composant Prometheus dans la pile de surveillance des clusters.

Procédure

Augmenter la capacité de stockage de Prometheus :

  1. Créez un fichier de configuration YAML, cluster-monitoring-config.yaml. Par exemple :

    apiVersion: v1
    kind: ConfigMap
    data:
      config.yaml: |
        prometheusK8s:
          retention: {{PROMETHEUS_RETENTION_PERIOD}} 1
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          volumeClaimTemplate:
            spec:
              storageClassName: {{STORAGE_CLASS}} 2
              resources:
                requests:
                  storage: {{PROMETHEUS_STORAGE_SIZE}} 3
        alertmanagerMain:
          nodeSelector:
            node-role.kubernetes.io/infra: ""
          volumeClaimTemplate:
            spec:
              storageClassName: {{STORAGE_CLASS}} 4
              resources:
                requests:
                  storage: {{ALERTMANAGER_STORAGE_SIZE}} 5
    metadata:
      name: cluster-monitoring-config
      namespace: openshift-monitoring
    1
    Une valeur typique est PROMETHEUS_RETENTION_PERIOD=15d. Les unités sont mesurées en temps en utilisant l'un des suffixes suivants : s, m, h, d.
    2 4
    La classe de stockage pour votre cluster.
    3
    Une valeur typique est PROMETHEUS_STORAGE_SIZE=2000Gi. Les valeurs de stockage peuvent être des entiers simples ou des entiers à virgule fixe en utilisant l'un des suffixes suivants : E, P, T, G, M, K. Vous pouvez également utiliser les équivalents en puissance de deux : Ei, Pi, Ti, Gi, Mi, Ki.
    5
    Une valeur typique est ALERTMANAGER_STORAGE_SIZE=20Gi. Les valeurs de stockage peuvent être des entiers simples ou des entiers à virgule fixe en utilisant l'un des suffixes suivants : E, P, T, G, M, K. Vous pouvez également utiliser les équivalents en puissance de deux : Ei, Pi, Ti, Gi, Mi, Ki.
  2. Ajoutez des valeurs pour la période de rétention, la classe de stockage et les tailles de stockage.
  3. Enregistrer le fichier.
  4. Appliquez les modifications en exécutant le programme :

    $ oc create -f cluster-monitoring-config.yaml

Chapitre 7. Planifier votre environnement en fonction des maxima d'objets

Prenez en compte les maximums d'objets testés suivants lorsque vous planifiez votre cluster OpenShift Container Platform.

Ces lignes directrices sont basées sur la plus grande grappe possible. Pour les clusters plus petits, les maxima sont inférieurs. De nombreux facteurs influencent les seuils indiqués, notamment la version d'etcd ou le format des données de stockage.

Dans la plupart des cas, le dépassement de ces nombres entraîne une baisse des performances globales. Cela ne signifie pas nécessairement que la grappe échouera.

Avertissement

Les clusters qui subissent des changements rapides, tels que ceux qui ont de nombreux pods qui démarrent et s'arrêtent, peuvent avoir une taille maximale pratique inférieure à celle qui est documentée.

7.1. OpenShift Container Platform a testé les maximums de clusters pour les versions majeures

Note

Red Hat ne fournit pas de conseils directs sur le dimensionnement de votre cluster OpenShift Container Platform. En effet, pour déterminer si votre cluster est dans les limites supportées par OpenShift Container Platform, il faut prendre en compte tous les facteurs multidimensionnels qui limitent l'échelle du cluster.

OpenShift Container Platform prend en charge des maximums de clusters testés plutôt que des maximums absolus de clusters. Toutes les combinaisons de version d'OpenShift Container Platform, de charge de travail du plan de contrôle et de plugin réseau ne sont pas testées, de sorte que le tableau suivant ne représente pas une attente absolue d'échelle pour tous les déploiements. Il se peut qu'il ne soit pas possible d'atteindre une échelle maximale sur toutes les dimensions simultanément. Le tableau contient des maxima testés pour des charges de travail et des configurations de déploiement spécifiques, et sert de guide d'échelle pour ce à quoi on peut s'attendre avec des déploiements similaires.

Type maximum4.x maximum testé

Nombre de nœuds

2,000 [1]

Nombre de nacelles [2]

150,000

Nombre de pods par nœud

500 [3]

Nombre de pods par cœur

Il n'y a pas de valeur par défaut.

Nombre d'espaces de noms [4]

10,000

Nombre de constructions

10 000 (pod par défaut RAM 512 Mi) - Stratégie de construction Source-to-Image (S2I)

Nombre de pods par espace de noms [5]

25,000

Nombre de routes et de back ends par contrôleur d'entrée

2 000 euros par routeur

Nombre de secrets

80,000

Nombre de cartes de configuration

90,000

Nombre de services [6]

10,000

Nombre de services par espace de noms

5,000

Nombre de backends par service

5,000

Nombre de déploiements par espace de noms [5]

2,000

Nombre de configurations de construction

12,000

Nombre de définitions de ressources personnalisées (CRD)

512 [7]

  1. Les pods de pause ont été déployés pour mettre à l'épreuve les composants du plan de contrôle d'OpenShift Container Platform à l'échelle de 2000 nœuds. La capacité à évoluer vers des nombres similaires variera en fonction des paramètres spécifiques de déploiement et de charge de travail.
  2. Le nombre de modules affiché ici correspond au nombre de modules de test. Le nombre réel de modules dépend des besoins de l'application en matière de mémoire, d'unité centrale et de stockage.
  3. Ceci a été testé sur un cluster de 100 nœuds de travail avec 500 pods par nœud de travail. La valeur par défaut de maxPods est toujours de 250. Pour atteindre 500 maxPods, le cluster doit être créé avec un maxPods défini sur 500 en utilisant une configuration kubelet personnalisée. Si vous avez besoin de 500 user pods, vous avez besoin d'un hostPrefix de 22 parce qu'il y a 10-15 system pods déjà en cours d'exécution sur le nœud. Le nombre maximum de pods avec des réclamations de volumes persistants (PVC) dépend du backend de stockage à partir duquel les PVC sont alloués. Dans nos tests, seul OpenShift Data Foundation v4 (OCS v4) a été en mesure de satisfaire le nombre de pods par nœud discuté dans ce document.
  4. Lorsqu'il y a un grand nombre de projets actifs, etcd peut souffrir de mauvaises performances si l'espace-clé devient excessivement grand et dépasse le quota d'espace. Une maintenance périodique de etcd, y compris une défragmentation, est fortement recommandée pour libérer l'espace de stockage de etcd.
  5. Le système comporte un certain nombre de boucles de contrôle qui doivent passer en revue tous les objets d'un espace de noms donné en réaction à certains changements d'état. Le fait d'avoir un grand nombre d'objets d'un type donné dans un seul espace de noms peut rendre ces boucles coûteuses et ralentir le traitement des changements d'état. La limite suppose que le système dispose de suffisamment d'unité centrale, de mémoire et de disque pour répondre aux exigences de l'application.
  6. Chaque port de service et chaque back-end de service a une entrée correspondante dans iptables. Le nombre de back-ends d'un service donné a un impact sur la taille des objets des endpoints, ce qui a un impact sur la taille des données qui sont envoyées dans tout le système.
  7. OpenShift Container Platform a une limite de 512 définitions de ressources personnalisées (CRD), y compris celles installées par OpenShift Container Platform, les produits intégrant OpenShift Container Platform et les CRD créés par l'utilisateur. S'il y a plus de 512 CRD créés, il est possible que les demandes de commandes oc soient limitées.

7.1.1. Exemple de scénario

À titre d'exemple, 500 nœuds de travail (m5.2xl) ont été testés et sont pris en charge avec OpenShift Container Platform 4.12, le plugin réseau OVN-Kubernetes et les objets de charge de travail suivants :

  • 200 espaces de noms, en plus des valeurs par défaut
  • 60 pods par nœud ; 30 pods serveur et 30 pods client (30k au total)
  • 57 flux d'images/ns (11,4k au total)
  • 15 services/ns soutenus par les pods serveurs (3k au total)
  • 15 routes/ns soutenues par les services précédents (3k au total)
  • 20 secrets/ns (4k au total)
  • 10 cartes de configuration/ns (2k au total)
  • 6 politiques réseau/ns, y compris les règles de refus d'accès, d'autorisation d'accès à l'entrée et à l'intérieur de l'espace de nommage
  • 57 constructions/ns

Les facteurs suivants sont connus pour affecter la mise à l'échelle des charges de travail des clusters, positivement ou négativement, et doivent être pris en compte dans les chiffres d'échelle lors de la planification d'un déploiement. Pour plus d'informations et de conseils, contactez votre représentant commercial ou l'assistance Red Hat.

  • Nombre de pods par nœud
  • Nombre de conteneurs par gousse
  • Type de sondes utilisées (par exemple, vivacité/préparation, exec/http)
  • Nombre de politiques de réseau
  • Nombre de projets ou d'espaces de noms
  • Nombre de flux d'images par projet
  • Nombre de constructions par projet
  • Nombre de services/points de terminaison et type
  • Nombre d'itinéraires
  • Nombre de tessons
  • Nombre de secrets
  • Nombre de cartes de configuration
  • Taux d'appels à l'API, ou "churn" du cluster, qui est une estimation de la vitesse à laquelle les choses changent dans la configuration du cluster.

    • Requête Prometheus pour les demandes de création de pods par seconde sur des fenêtres de 5 minutes : sum(irate(apiserver_request_count{resource="pods",verb="POST"}[5m]))
    • Requête Prometheus pour toutes les demandes d'API par seconde sur des fenêtres de 5 minutes : sum(irate(apiserver_request_count{}[5m]))
  • Consommation de ressources du nœud de la grappe par l'unité centrale
  • Consommation de ressources de la mémoire par le nœud de la grappe

7.2. Environnement et configuration d'OpenShift Container Platform sur lesquels les maxima des clusters sont testés

7.2.1. Plate-forme en nuage AWS

NœudSaveurvCPURAM(GiB)Type de disqueTaille du disque (GiB)/IOSCompterRegion

Plan de contrôle/etcd [1]

r5.4xlarge

16

128

gp3

220

3

us-west-2

Infra [2]

m5.12xlarge

48

192

gp3

100

3

us-west-2

Charge de travail [3]

m5.4xlarge

16

64

gp3

500 [4]

1

us-west-2

Compute

m5.2xlarge

8

32

gp3

100

3/25/250/500 [5]

us-west-2

  1. les disques gp3 avec une performance de base de 3000 IOPS et 125 MiB par seconde sont utilisés pour les nœuds du plan de contrôle/etcd parce que etcd est sensible à la latence. Les volumes gp3 n'utilisent pas la performance en rafale.
  2. Les nœuds Infra sont utilisés pour héberger les composants de surveillance, d'entrée et de registre afin de s'assurer qu'ils disposent de suffisamment de ressources pour fonctionner à grande échelle.
  3. Le nœud de charge de travail est dédié à l'exécution des générateurs de charge de travail de performance et d'évolutivité.
  4. Une taille de disque plus importante est utilisée afin de disposer de suffisamment d'espace pour stocker les grandes quantités de données collectées lors des tests de performance et d'évolutivité.
  5. La grappe est mise à l'échelle par itérations et les tests de performance et d'évolutivité sont exécutés aux nombres de nœuds spécifiés.

7.2.2. Plate-forme IBM Power

NœudvCPURAM(GiB)Type de disqueTaille du disque (GiB)/IOSCompter

Plan de contrôle/etcd [1]

16

32

io1

120 / 10 IOPS par GiB

3

Infra [2]

16

64

gp2

120

2

Charge de travail [3]

16

256

gp2

120 [4]

1

Compute

16

64

gp2

120

2 à 100 [5]

  1. les disques io1 avec 120 / 10 IOPS par GiB sont utilisés pour les nœuds de plan de contrôle/etcd car etcd est intensif en E/S et sensible à la latence.
  2. Les nœuds Infra sont utilisés pour héberger les composants de surveillance, d'entrée et de registre afin de s'assurer qu'ils disposent de suffisamment de ressources pour fonctionner à grande échelle.
  3. Le nœud de charge de travail est dédié à l'exécution des générateurs de charge de travail de performance et d'évolutivité.
  4. Une taille de disque plus importante est utilisée afin de disposer de suffisamment d'espace pour stocker les grandes quantités de données collectées lors des tests de performance et d'évolutivité.
  5. La grappe est échelonnée en itérations.

7.2.3. Plate-forme IBM zSystems

NœudvCPU [4]RAM(GiB)[5]Type de disqueTaille du disque (GiB)/IOSCompter

Plan de contrôle/etcd [1,2]

8

32

ds8k

300 / LCU 1

3

Calculer [1,3]

8

32

ds8k

150 / LCU 2

4 nœuds (échelonnés à 100/250/500 pods par nœud)

  1. Les nœuds sont répartis entre deux unités de contrôle logique (LCU) afin d'optimiser la charge d'E/S sur disque des nœuds du plan de contrôle/etcd, car etcd est gourmand en E/S et sensible à la latence. La demande d'E/S d'Etcd ne doit pas interférer avec d'autres charges de travail.
  2. Quatre nœuds de calcul sont utilisés pour les tests en effectuant plusieurs itérations avec 100/250/500 pods en même temps. Tout d'abord, des pods au ralenti ont été utilisés pour évaluer si les pods peuvent être instanciés. Ensuite, une charge de travail client/serveur exigeante en termes de réseau et de CPU a été utilisée pour évaluer la stabilité du système sous contrainte. Les modules clients et serveurs ont été déployés par paire et chaque paire a été répartie sur deux nœuds de calcul.
  3. Aucun nœud de charge de travail séparé n'a été utilisé. La charge de travail simule une charge de travail de microservice entre deux nœuds de calcul.
  4. Le nombre physique de processeurs utilisés est de six installations intégrées pour Linux (IFL).
  5. La mémoire physique totale utilisée est de 512 GiB.

7.3. Comment planifier votre environnement en fonction des maximums de grappes testés ?

Important

La sursouscription des ressources physiques sur un nœud affecte les garanties de ressources que le planificateur Kubernetes effectue lors du placement des pods. Découvrez les mesures à prendre pour éviter les échanges de mémoire.

Certains des maximums testés ne sont étendus qu'à une seule dimension. Ils varient lorsque de nombreux objets sont en cours d'exécution sur le cluster.

Les chiffres indiqués dans cette documentation sont basés sur la méthodologie de test, l'installation, la configuration et les réglages de Red Hat. Ces chiffres peuvent varier en fonction de votre propre configuration et de vos environnements.

Lors de la planification de votre environnement, déterminez le nombre de pods par nœud :

required pods per cluster / pods per node = total number of nodes needed

Par défaut, le nombre maximal de pods par nœud est de 250. Cependant, le nombre de pods pouvant être installés sur un nœud dépend de l'application elle-même. Prenez en compte les besoins de l'application en termes de mémoire, de CPU et de stockage, comme décrit dans "Comment planifier votre environnement en fonction des besoins de l'application".

Exemple de scénario

Si vous souhaitez étendre votre cluster à 2200 pods par cluster, vous aurez besoin d'au moins cinq nœuds, en supposant qu'il y ait au maximum 500 pods par nœud :

2200 / 500 = 4.4

Si vous augmentez le nombre de nœuds à 20, la distribution des pods passe à 110 pods par nœud :

2200 / 20 = 110

Où ?

required pods per cluster / total number of nodes = expected pods per node

OpenShift Container Platform est livré avec plusieurs pods système, tels que SDN, DNS, Operators, et d'autres, qui s'exécutent sur chaque nœud de travail par défaut. Par conséquent, le résultat de la formule ci-dessus peut varier.

7.4. Comment planifier votre environnement en fonction des exigences de l'application

Prenons un exemple d'environnement d'application :

Type de cosseQuantité de goussesMémoire maximaleCœurs de l'unité centraleStockage permanent

apache

100

500 MO

0.5

1 GB

node.js

200

1 GB

1

1 GB

postgresql

100

1 GB

2

10 GB

JBoss EAP

100

1 GB

1

1 GB

Exigences extrapolées : 550 cœurs de CPU, 450 Go de RAM et 1,4 To de stockage.

La taille de l'instance pour les nœuds peut être modulée à la hausse ou à la baisse, selon vos préférences. Les nœuds sont souvent surchargés en ressources. Dans ce scénario de déploiement, vous pouvez choisir d'exécuter des nœuds supplémentaires plus petits ou moins de nœuds plus grands pour fournir la même quantité de ressources. Des facteurs tels que l'agilité opérationnelle et le coût par instance doivent être pris en compte.

Type de nœudQuantitéCPUsRAM (GB)

Nœuds (option 1)

100

4

16

Nœuds (option 2)

50

8

32

Nœuds (option 3)

25

16

64

Certaines applications se prêtent bien aux environnements de surengagement, d'autres non. La plupart des applications Java et des applications qui utilisent d'énormes pages sont des exemples d'applications qui ne permettraient pas un surengagement. Cette mémoire ne peut pas être utilisée pour d'autres applications. Dans l'exemple ci-dessus, l'environnement serait sur-engagé à environ 30 %, un ratio courant.

Les modules d'application peuvent accéder à un service en utilisant des variables d'environnement ou le DNS. Si l'on utilise des variables d'environnement, pour chaque service actif, les variables sont injectées par le kubelet lorsqu'un pod est exécuté sur un nœud. Un serveur DNS conscient du cluster surveille l'API Kubernetes pour les nouveaux services et crée un ensemble d'enregistrements DNS pour chacun d'entre eux. Si le DNS est activé dans l'ensemble de votre cluster, tous les pods devraient automatiquement être en mesure de résoudre les services par leur nom DNS. La découverte de services à l'aide du DNS peut être utilisée si vous devez aller au-delà de 5000 services. Lorsque vous utilisez des variables d'environnement pour la découverte de services, la liste d'arguments dépasse la longueur autorisée après 5000 services dans un espace de noms, les pods et les déploiements commenceront alors à échouer. Désactivez les liens de service dans le fichier de spécification de service du déploiement pour résoudre ce problème :

---
apiVersion: template.openshift.io/v1
kind: Template
metadata:
  name: deployment-config-template
  creationTimestamp:
  annotations:
    description: This template will create a deploymentConfig with 1 replica, 4 env vars and a service.
    tags: ''
objects:
- apiVersion: apps.openshift.io/v1
  kind: DeploymentConfig
  metadata:
    name: deploymentconfig${IDENTIFIER}
  spec:
    template:
      metadata:
        labels:
          name: replicationcontroller${IDENTIFIER}
      spec:
        enableServiceLinks: false
        containers:
        - name: pause${IDENTIFIER}
          image: "${IMAGE}"
          ports:
          - containerPort: 8080
            protocol: TCP
          env:
          - name: ENVVAR1_${IDENTIFIER}
            value: "${ENV_VALUE}"
          - name: ENVVAR2_${IDENTIFIER}
            value: "${ENV_VALUE}"
          - name: ENVVAR3_${IDENTIFIER}
            value: "${ENV_VALUE}"
          - name: ENVVAR4_${IDENTIFIER}
            value: "${ENV_VALUE}"
          resources: {}
          imagePullPolicy: IfNotPresent
          capabilities: {}
          securityContext:
            capabilities: {}
            privileged: false
        restartPolicy: Always
        serviceAccount: ''
    replicas: 1
    selector:
      name: replicationcontroller${IDENTIFIER}
    triggers:
    - type: ConfigChange
    strategy:
      type: Rolling
- apiVersion: v1
  kind: Service
  metadata:
    name: service${IDENTIFIER}
  spec:
    selector:
      name: replicationcontroller${IDENTIFIER}
    ports:
    - name: serviceport${IDENTIFIER}
      protocol: TCP
      port: 80
      targetPort: 8080
    clusterIP: ''
    type: ClusterIP
    sessionAffinity: None
  status:
    loadBalancer: {}
parameters:
- name: IDENTIFIER
  description: Number to append to the name of resources
  value: '1'
  required: true
- name: IMAGE
  description: Image to use for deploymentConfig
  value: gcr.io/google-containers/pause-amd64:3.0
  required: false
- name: ENV_VALUE
  description: Value to use for environment variables
  generate: expression
  from: "[A-Za-z0-9]{255}"
  required: false
labels:
  template: deployment-config-template

Le nombre de modules d'application pouvant être exécutés dans un espace de noms dépend du nombre de services et de la longueur du nom du service lorsque les variables d'environnement sont utilisées pour la découverte des services. ARG_MAX sur le système définit la longueur maximale des arguments pour un nouveau processus et elle est fixée à 2097152 octets (2 MiB) par défaut. Le Kubelet injecte des variables d'environnement dans chaque pod programmé pour s'exécuter dans l'espace de noms, y compris :

  • <SERVICE_NAME>_SERVICE_HOST=<IP>
  • <SERVICE_NAME>_SERVICE_PORT=<PORT>
  • <SERVICE_NAME>_PORT=tcp://<IP>:<PORT>
  • <SERVICE_NAME>_PORT_<PORT>_TCP=tcp://<IP>:<PORT>
  • <SERVICE_NAME>_PORT_<PORT>_TCP_PROTO=tcp
  • <SERVICE_NAME>_PORT_<PORT>_TCP_PORT=<PORT>
  • <SERVICE_NAME>_PORT_<PORT>_TCP_ADDR=<ADDR>

Les pods de l'espace de noms commenceront à échouer si la longueur de l'argument dépasse la valeur autorisée et si le nombre de caractères dans le nom d'un service a un impact. Par exemple, dans un espace de noms comprenant 5000 services, la limite du nom de service est de 33 caractères, ce qui vous permet d'exécuter 5000 pods dans l'espace de noms.

Chapitre 8. Optimiser le stockage

L'optimisation du stockage permet de minimiser l'utilisation du stockage sur l'ensemble des ressources. En optimisant le stockage, les administrateurs s'assurent que les ressources de stockage existantes fonctionnent de manière efficace.

8.1. Options de stockage permanent disponibles

Comprenez vos options de stockage persistant afin d'optimiser votre environnement OpenShift Container Platform.

Tableau 8.1. Options de stockage disponibles

Type de stockageDescriptionExamples

Bloc

  • Présenté au système d'exploitation (OS) comme un périphérique de bloc
  • Convient aux applications qui nécessitent un contrôle total du stockage et qui opèrent à bas niveau sur des fichiers en contournant le système de fichiers
  • Également appelé réseau de stockage (SAN)
  • Non partageable, ce qui signifie qu'un seul client à la fois peut monter un point d'extrémité de ce type

AWS EBS et VMware vSphere prennent en charge le provisionnement dynamique de volumes persistants (PV) de manière native dans OpenShift Container Platform.

Fichier

  • Présenté au système d'exploitation comme un export de système de fichiers à monter
  • Également appelé stockage en réseau (NAS)
  • La simultanéité, la latence, les mécanismes de verrouillage des fichiers et d'autres capacités varient considérablement entre les protocoles, les implémentations, les fournisseurs et les échelles.

RHEL NFS, NetApp NFS [1] et Vendor NFS

Objet

  • Accessible via un point d'extrémité de l'API REST
  • Configurable pour une utilisation dans le registre d'images OpenShift
  • Les applications doivent intégrer leurs pilotes dans l'application et/ou le conteneur.

AWS S3

  1. NetApp NFS prend en charge le provisionnement dynamique des PV lors de l'utilisation du plugin Trident.
Important

Actuellement, CNS n'est pas pris en charge dans OpenShift Container Platform 4.12.

8.3. Gestion du stockage des données

Le tableau suivant résume les principaux répertoires dans lesquels les composants d'OpenShift Container Platform écrivent des données.

Tableau 8.3. Principaux répertoires pour le stockage des données de OpenShift Container Platform

AnnuaireNotesTailleCroissance attendue

/var/log

Fichiers journaux pour tous les composants.

10 à 30 Go.

Les fichiers journaux peuvent croître rapidement ; leur taille peut être gérée en augmentant la taille des disques ou en utilisant la rotation des journaux.

/var/lib/etcd

Utilisé pour le stockage etcd lors du stockage de la base de données.

Moins de 20 Go.

La base de données peut atteindre 8 Go.

S'adaptera lentement à l'environnement. Stockage des métadonnées uniquement.

20-25 Go supplémentaires pour chaque 8 Go de mémoire supplémentaire.

/var/lib/containers

Il s'agit du point de montage du runtime CRI-O. Stockage utilisé pour les runtimes de conteneurs actifs, y compris les pods, et le stockage des images locales. Il n'est pas utilisé pour le stockage du registre.

50 Go pour un nœud avec 16 Go de mémoire. Notez que ce dimensionnement ne doit pas être utilisé pour déterminer les exigences minimales d'un cluster.

20-25 Go supplémentaires pour chaque 8 Go de mémoire supplémentaire.

La croissance est limitée par la capacité de fonctionnement des conteneurs.

/var/lib/kubelet

Stockage de volume éphémère pour les pods. Il s'agit de tout ce qui est monté dans un conteneur au moment de l'exécution. Cela inclut les variables d'environnement, les secrets kube et les volumes de données qui ne sont pas soutenus par des volumes persistants.

Varies

Minime si les pods nécessitant du stockage utilisent des volumes persistants. En cas d'utilisation d'un stockage éphémère, ce nombre peut augmenter rapidement.

8.4. Ressources supplémentaires

Chapitre 9. Optimisation de l'acheminement

Le routeur HAProxy d'OpenShift Container Platform peut être dimensionné ou configuré pour optimiser les performances.

9.1. Performances de base du contrôleur d'entrée (routeur)

Le contrôleur d'entrée de la plateforme OpenShift Container, ou routeur, est le point d'entrée du trafic d'entrée pour les applications et les services qui sont configurés à l'aide de routes et d'entrées.

Lorsque l'on évalue les performances d'un routeur HAProxy unique en termes de requêtes HTTP traitées par seconde, les performances varient en fonction de nombreux facteurs. En particulier :

  • Mode de maintien/fermeture HTTP
  • Type d'itinéraire
  • Prise en charge du client de reprise de session TLS
  • Nombre de connexions simultanées par route cible
  • Nombre de routes cibles
  • Taille des pages du serveur dorsal
  • Infrastructure sous-jacente (solution réseau/SDN, CPU, etc.)

Bien que les performances dans votre environnement spécifique varient, les tests du laboratoire Red Hat sur une instance de cloud public de taille 4 vCPU/16GB RAM. Un routeur HAProxy unique gérant 100 routes terminées par des backends servant des pages statiques de 1kB est capable de gérer le nombre suivant de transactions par seconde.

Dans les scénarios du mode "keep-alive" de HTTP :

EncryptionLoadBalancerServiceHostNetwork

aucun

21515

29622

bord

16743

22913

traversée

36786

53295

ré-encrypter

21583

25198

Dans les scénarios de fermeture HTTP (pas de keep-alive) :

EncryptionLoadBalancerServiceHostNetwork

aucun

5719

8273

bord

2729

4069

traversée

4121

5344

ré-encrypter

2320

2941

La configuration par défaut du contrôleur d'entrée a été utilisée avec le champ spec.tuningOptions.threadCount défini sur 4. Deux stratégies différentes de publication des points finaux ont été testées : Load Balancer Service et Host Network. La reprise de session TLS a été utilisée pour les itinéraires cryptés. Avec HTTP keep-alive, un seul routeur HAProxy est capable de saturer un NIC de 1 Gbit avec des pages d'une taille aussi petite que 8 kB.

Lorsque le système est exécuté sur du métal nu avec des processeurs modernes, vous pouvez vous attendre à des performances environ deux fois supérieures à celles de l'instance de nuage public ci-dessus. Cette surcharge est introduite par la couche de virtualisation en place sur les nuages publics et s'applique également à la virtualisation basée sur les nuages privés. Le tableau suivant indique le nombre d'applications à utiliser derrière le routeur :

Number of applicationsApplication type

5-10

fichier statique/serveur web ou proxy de mise en cache

100-1000

les applications générant un contenu dynamique

En général, HAProxy peut prendre en charge des routes pour un maximum de 1 000 applications, en fonction de la technologie utilisée. Les performances du contrôleur d'entrée peuvent être limitées par les capacités et les performances des applications qui se trouvent derrière lui, comme la langue ou le contenu statique par rapport au contenu dynamique.

La mise en commun des entrées, ou routeurs, devrait être utilisée pour servir davantage de routes vers les applications et contribuer à la mise à l'échelle horizontale du niveau de routage.

Pour plus d'informations sur la répartition des entrées, voir Configuration de la répartition du contrôleur d'entrée à l'aide d'étiquettes d'itinéraire et Configuration de la répartition du contrôleur d'entrée à l'aide d'étiquettes d'espace de noms.

Vous pouvez modifier le déploiement du contrôleur d'ingestion à l'aide des informations fournies dans la section Définition du nombre de threads du contrôleur d'ing estion et des paramètres de configuration du contrôleur d'ing estion pour les délais d'attente, ainsi que d'autres configurations de réglage dans la spécification du contrôleur d'ingestion.

9.2. Configuration des sondes de disponibilité, de préparation et de démarrage du contrôleur d'entrée

Les administrateurs de cluster peuvent configurer les valeurs de délai d'attente pour les sondes de disponibilité, de préparation et de démarrage du kubelet pour les déploiements de routeurs qui sont gérés par le contrôleur d'entrée de la plateforme OpenShift Container (routeur). Les sondes de disponibilité et de préparation du routeur utilisent la valeur de temporisation par défaut de 1 seconde, qui est trop courte lorsque les performances du réseau ou de l'exécution sont gravement dégradées. Les délais d'attente des sondes peuvent entraîner des redémarrages intempestifs du routeur qui interrompent les connexions des applications. La possibilité de définir des valeurs de délai plus importantes peut réduire le risque de redémarrages inutiles et non désirés.

Vous pouvez mettre à jour la valeur timeoutSeconds dans les paramètres livenessProbe, readinessProbe et startupProbe du conteneur de routeur.

ParamètresDescription

livenessProbe

Le site livenessProbe signale au kubelet si un pod est mort et doit être redémarré.

readinessProbe

Le site readinessProbe indique si un pod est sain ou malsain. Lorsque la sonde de disponibilité signale un pod malsain, le kubelet marque le pod comme n'étant pas prêt à accepter du trafic. Par la suite, les points d'extrémité de ce module sont marqués comme n'étant pas prêts, et ce statut se propage au kube-proxy. Sur les plateformes en nuage dotées d'un équilibreur de charge configuré, le kube-proxy communique avec l'équilibreur de charge du nuage pour qu'il n'envoie pas de trafic au nœud contenant ce module.

startupProbe

Le site startupProbe donne au pod routeur jusqu'à 2 minutes pour s'initialiser avant que le kubelet ne commence à envoyer les sondes de disponibilité et de préparation du routeur. Ce temps d'initialisation permet d'éviter que les routeurs ayant de nombreux itinéraires ou points d'extrémité ne redémarrent prématurément.

Important

L'option de configuration du délai d'attente est une technique de réglage avancée qui peut être utilisée pour contourner les problèmes. Cependant, ces problèmes doivent être diagnostiqués et éventuellement faire l'objet d'un dossier d'assistance ou d'une question Jira pour tout problème entraînant un dépassement du délai d'attente des sondes.

L'exemple suivant montre comment vous pouvez corriger directement le déploiement du routeur par défaut pour définir un délai d'attente de 5 secondes pour les sondes de disponibilité et d'état de préparation :

$ oc -n openshift-ingress patch deploy/router-default --type=strategic --patch='{"spec":{"template":{"spec":{"containers":[{"name":"router","livenessProbe":{"timeoutSeconds":5},"readinessProbe":{"timeoutSeconds":5}}]}}}}'

Vérification

$ oc -n openshift-ingress describe deploy/router-default | grep -e Liveness: -e Readiness:
    Liveness:   http-get http://:1936/healthz delay=0s timeout=5s period=10s #success=1 #failure=3
    Readiness:  http-get http://:1936/healthz/ready delay=0s timeout=5s period=10s #success=1 #failure=3

9.3. Configuration de l'intervalle de recharge de HAProxy

Lorsque vous mettez à jour une route ou un point d'extrémité associé à une route, le routeur OpenShift Container Platform met à jour la configuration de HAProxy. Ensuite, HAProxy recharge la configuration mise à jour pour que ces modifications prennent effet. Lorsque HAProxy se recharge, il génère un nouveau processus qui gère les nouvelles connexions à l'aide de la configuration mise à jour.

HAProxy maintient l'ancien processus en cours d'exécution pour gérer les connexions existantes jusqu'à ce qu'elles soient toutes fermées. Lorsque d'anciens processus ont des connexions de longue durée, ils peuvent accumuler et consommer des ressources.

L'intervalle minimum de rechargement de HAProxy par défaut est de cinq secondes. Vous pouvez configurer un contrôleur d'entrée à l'aide de son champ spec.tuningOptions.reloadInterval pour définir un intervalle de recharge minimum plus long.

Avertissement

La définition d'une valeur élevée pour l'intervalle minimum de rechargement de HAProxy peut entraîner une latence dans l'observation des mises à jour des itinéraires et de leurs points d'extrémité. Pour réduire ce risque, évitez de définir une valeur supérieure à la latence tolérable pour les mises à jour.

Procédure

  • Modifiez l'intervalle minimum de rechargement de HAProxy du contrôleur d'entrée par défaut pour le porter à 15 secondes en exécutant la commande suivante :

    $ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"tuningOptions":{"reloadInterval":"15s"}}}'

Chapitre 10. Optimiser la mise en réseau

Le SDN OpenShift utilise OpenvSwitch, des tunnels LAN virtuels extensibles (VXLAN), des règles OpenFlow et iptables. Ce réseau peut être réglé en utilisant des trames jumbo, des contrôleurs d'interface réseau (NIC) offloads, des files d'attente multiples et des paramètres ethtool.

OVN-Kubernetes utilise Geneve (Generic Network Virtualization Encapsulation) au lieu de VXLAN comme protocole de tunnel.

VXLAN offre des avantages par rapport aux VLAN, tels qu'une augmentation des réseaux de 4096 à plus de 16 millions, et une connectivité de couche 2 à travers les réseaux physiques. Cela permet à tous les pods derrière un service de communiquer entre eux, même s'ils fonctionnent sur des systèmes différents.

VXLAN encapsule tout le trafic tunnelé dans des paquets UDP (User Datagram Protocol). Toutefois, cela entraîne une augmentation de l'utilisation de l'unité centrale. Ces paquets externes et internes sont soumis aux règles normales de somme de contrôle pour garantir que les données ne sont pas corrompues pendant le transit. En fonction des performances de l'unité centrale, ce surcroît de traitement peut entraîner une réduction du débit et une augmentation de la latence par rapport aux réseaux traditionnels non superposés.

Les performances des CPU Cloud, VM et bare metal peuvent être capables de gérer un débit réseau bien supérieur à 1 Gbps. Lors de l'utilisation de liens à bande passante plus élevée, tels que 10 ou 40 Gbps, des performances réduites peuvent se produire. Il s'agit d'un problème connu dans les environnements basés sur VXLAN et qui n'est pas spécifique aux conteneurs ou à OpenShift Container Platform. Tout réseau reposant sur des tunnels VXLAN aura des performances similaires en raison de l'implémentation de VXLAN.

Si vous souhaitez aller au-delà d'un Gbps, c'est possible :

  • Évaluer les plugins réseau qui mettent en œuvre différentes techniques de routage, telles que le protocole de passerelle frontalière (BGP).
  • Utiliser des adaptateurs réseau compatibles avec la charge VXLAN. VXLAN-offload déplace le calcul de la somme de contrôle des paquets et le surcoût associé de l'unité centrale du système vers un matériel dédié sur l'adaptateur réseau. Cela libère des cycles de CPU pour les pods et les applications, et permet aux utilisateurs d'utiliser toute la bande passante de leur infrastructure réseau.

Le VXLAN-offload ne réduit pas la latence. Cependant, l'utilisation du CPU est réduite même dans les tests de latence.

10.1. Optimiser le MTU pour votre réseau

Il existe deux unités de transmission maximale (MTU) importantes : la MTU du contrôleur d'interface réseau (NIC) et la MTU du réseau en grappe.

Le MTU de la carte réseau n'est configuré qu'au moment de l'installation d'OpenShift Container Platform. Le MTU doit être inférieur ou égal à la valeur maximale supportée par le NIC de votre réseau. Si vous optimisez le débit, choisissez la valeur la plus élevée possible. Si vous optimisez la latence, choisissez une valeur plus faible.

Le MTU du plugin réseau OpenShift SDN doit être inférieur au MTU du NIC d'au moins 50 octets. Cela tient compte de l'en-tête de la couche SDN. Ainsi, sur un réseau Ethernet normal, cette valeur doit être fixée à 1450. Sur un réseau Ethernet à trame jumbo, elle doit être réglée sur 8950. Ces valeurs doivent être réglées automatiquement par l'opérateur de réseau de cluster en fonction du MTU configuré de la carte d'interface réseau. Par conséquent, les administrateurs de clusters ne mettent généralement pas à jour ces valeurs. Les environnements Amazon Web Services (AWS) et bare-metal prennent en charge les réseaux Ethernet à trame jumbo. Ce paramètre améliore le débit, en particulier avec le protocole de contrôle de transmission (TCP).

Pour OVN et Geneve, le MTU doit être inférieur au MTU du NIC de 100 octets au minimum.

Note

Cet en-tête de recouvrement de 50 octets est pertinent pour le plugin réseau SDN d'OpenShift. D'autres solutions SDN peuvent nécessiter une valeur supérieure ou inférieure.

10.3. Impact d'IPsec

Étant donné que le chiffrement et le déchiffrement des hôtes des nœuds utilisent l'énergie du processeur, les performances sont affectées à la fois en termes de débit et d'utilisation du processeur sur les nœuds lorsque le chiffrement est activé, quel que soit le système de sécurité IP utilisé.

IPSec crypte le trafic au niveau de la charge utile IP, avant qu'il n'atteigne la carte réseau, protégeant ainsi les champs qui seraient autrement utilisés pour le délestage de la carte réseau. Cela signifie que certaines fonctions d'accélération de la carte réseau peuvent ne pas être utilisables lorsque l'IPSec est activé, ce qui entraînera une diminution du débit et une augmentation de l'utilisation de l'unité centrale.

10.4. Ressources supplémentaires

Chapitre 11. Optimisation de l'utilisation de l'unité centrale avec l'encapsulation de l'espace de noms de montage

Vous pouvez optimiser l'utilisation du CPU dans les clusters OpenShift Container Platform en utilisant l'encapsulation mount namespace pour fournir un espace de noms privé pour les processus kubelet et CRI-O. Cela réduit les ressources CPU du cluster utilisées par systemd sans différence de fonctionnalité.

Important

L'encapsulation de l'espace de noms de montage est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes d'un point de vue fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

11.1. Encapsulation des espaces de noms des montages

Les espaces de noms de montage sont utilisés pour isoler les points de montage afin que les processus dans différents espaces de noms ne puissent pas voir les fichiers des autres. L'encapsulation est le processus qui consiste à déplacer les espaces de noms de montage Kubernetes vers un autre emplacement où ils ne seront pas constamment analysés par le système d'exploitation hôte.

Le système d'exploitation hôte utilise systemd pour analyser en permanence tous les espaces de noms de montage : à la fois les montages Linux standard et les nombreux montages que Kubernetes utilise pour fonctionner. L'implémentation actuelle de kubelet et de CRI-O utilise l'espace de noms de premier niveau pour tous les points de montage de l'exécution du conteneur et de kubelet. Cependant, l'encapsulation de ces points de montage spécifiques aux conteneurs dans un espace de noms privé réduit la charge de travail de systemd sans différence de fonctionnalité. L'utilisation d'un espace de noms de montage distinct pour CRI-O et kubelet permet d'encapsuler les montages spécifiques aux conteneurs à partir de toute interaction avec systemd ou d'autres systèmes d'exploitation hôtes.

Cette capacité à réaliser potentiellement une optimisation majeure du CPU est désormais disponible pour tous les administrateurs d'OpenShift Container Platform. L'encapsulation peut également améliorer la sécurité en stockant les points de montage spécifiques à Kubernetes dans un emplacement à l'abri de l'inspection par des utilisateurs non privilégiés.

Les diagrammes suivants illustrent une installation Kubernetes avant et après l'encapsulation. Les deux scénarios montrent des exemples de conteneurs dont les paramètres de propagation des montages sont bidirectionnels, host-to-container et none.

Before encapsulation

Ici, nous voyons systemd, les processus du système d'exploitation hôte, kubelet et le runtime du conteneur partager un seul espace de noms de montage.

  • systemd, les processus du système d'exploitation hôte, kubelet et le runtime du conteneur ont tous accès à tous les points de montage et en ont la visibilité.
  • Le conteneur 1, configuré avec la propagation bidirectionnelle des montages, peut accéder aux montages de systemd et de l'hôte, aux montages de kubelet et de CRI-O. Un montage provenant du conteneur 1, tel que /run/a, est visible par systemd, les processus du système d'exploitation hôte, kubelet, le runtime du conteneur et d'autres conteneurs configurés avec une propagation de montage hôte à conteneur ou bidirectionnelle (comme dans le conteneur 2).
  • Le conteneur 2, configuré avec la propagation des montages d'hôte à conteneur, peut accéder aux montages de systemd et d'hôte, ainsi qu'aux montages de kubelet et de CRI-O. Un montage provenant du conteneur 2, tel que /run/b, n'est visible pour aucun autre contexte.
  • Le conteneur 3, configuré sans propagation des montages, n'a aucune visibilité sur les points de montage externes. Un montage provenant du conteneur 3, tel que /run/c, n'est visible pour aucun autre contexte.

Le diagramme suivant illustre l'état du système après l'encapsulation.

After encapsulation
  • Le processus principal de systemd n'est plus consacré à l'analyse inutile des points de montage spécifiques à Kubernetes. Il ne surveille que les points de montage spécifiques au système et les points de montage de l'hôte.
  • Les processus du système d'exploitation hôte ne peuvent accéder qu'aux points de montage de systemd et de l'hôte.
  • L'utilisation d'un espace de noms de montage distinct pour CRI-O et kubelet sépare complètement tous les montages spécifiques aux conteneurs de toute interaction avec systemd ou tout autre système d'exploitation hôte.
  • Le comportement du conteneur 1 est inchangé, sauf qu'un montage qu'il crée, tel que /run/a, n'est plus visible par systemd ou les processus du système d'exploitation de l'hôte. Il est toujours visible pour kubelet, CRI-O et d'autres conteneurs avec une propagation de montage hôte à conteneur ou bidirectionnelle configurée (comme le conteneur 2).
  • Le comportement des conteneurs 2 et 3 reste inchangé.

11.2. Configuration de l'encapsulation de l'espace de noms de montage

Vous pouvez configurer l'encapsulation de l'espace de noms de montage de manière à ce qu'un cluster fonctionne avec moins de ressources.

Note

L'encapsulation de l'espace de noms de montage est une fonctionnalité de l'aperçu technologique et elle est désactivée par défaut. Pour l'utiliser, vous devez l'activer manuellement.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  1. Créer un fichier appelé mount_namespace_config.yaml avec le YAML suivant :

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 99-kubens-master
    spec:
      config:
        ignition:
          version: 3.2.0
        systemd:
          units:
          - enabled: true
            name: kubens.service
    ---
    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: worker
      name: 99-kubens-worker
    spec:
      config:
        ignition:
          version: 3.2.0
        systemd:
          units:
          - enabled: true
            name: kubens.service
  2. Appliquez l'espace de noms mount MachineConfig CR en exécutant la commande suivante :

    $ oc apply -f mount_namespace_config.yaml

    Exemple de sortie

    machineconfig.machineconfiguration.openshift.io/99-kubens-master created
    machineconfig.machineconfiguration.openshift.io/99-kubens-worker created

  3. La CR MachineConfig peut prendre jusqu'à 30 minutes pour finir d'être appliquée dans le cluster. Vous pouvez vérifier l'état de la CR MachineConfig en exécutant la commande suivante :

    $ oc get mcp

    Exemple de sortie

    NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
    master   rendered-master-03d4bc4befb0f4ed3566a2c8f7636751   False     True       False      3              0                   0                     0                      45m
    worker   rendered-worker-10577f6ab0117ed1825f8af2ac687ddf   False     True       False      3              1                   1

  4. Attendez que la CR MachineConfig soit appliquée avec succès sur tous les nœuds de plan de contrôle et de travail après l'exécution de la commande suivante :

    $ oc wait --for=condition=Updated mcp --all --timeout=30m

    Exemple de sortie

    machineconfigpool.machineconfiguration.openshift.io/master condition met
    machineconfigpool.machineconfiguration.openshift.io/worker condition met

Vérification

Pour vérifier l'encapsulation d'un hôte de cluster, exécutez les commandes suivantes :

  1. Ouvrez un shell de débogage sur l'hôte du cluster :

    oc debug node/<node_name>
  2. Ouvrez une session chroot:

    sh-4.4# chroot /host
  3. Vérifiez l'espace de noms de montage de systemd :

    sh-4.4# readlink /proc/1/ns/mnt

    Exemple de sortie

    mnt:[4026531953]

  4. Vérifier l'espace de noms du montage kubelet :

    sh-4.4# readlink /proc/$(pgrep kubelet)/ns/mnt

    Exemple de sortie

    mnt:[4026531840]

  5. Vérifiez l'espace de noms de la monture CRI-O :

    sh-4.4# readlink /proc/$(pgrep crio)/ns/mnt

    Exemple de sortie

    mnt:[4026531840]

Ces commandes renvoient les espaces de noms de montage associés à systemd, kubelet et à l'exécution du conteneur. Dans OpenShift Container Platform, l'exécution du conteneur est CRI-O.

L'encapsulation est effective si systemd se trouve dans un espace de noms de montage différent de kubelet et CRI-O, comme dans l'exemple ci-dessus. L'encapsulation n'est pas effective si les trois processus se trouvent dans le même espace de noms de montage.

11.3. Inspection des espaces de noms encapsulés

Vous pouvez inspecter les points de montage spécifiques à Kubernetes dans le système d'exploitation hôte du cluster à des fins de débogage ou d'audit en utilisant le script kubensenter disponible dans Red Hat Enterprise Linux CoreOS (RHCOS).

Les sessions shell SSH vers l'hôte du cluster sont dans l'espace de noms par défaut. Pour inspecter les points de montage spécifiques à Kubernetes dans une invite du shell SSH, vous devez exécuter le script kubensenter en tant que root. Le script kubensenter est conscient de l'état de l'encapsulation du montage, et peut être exécuté en toute sécurité même si l'encapsulation n'est pas activée.

Note

oc debug les sessions shell distantes démarrent par défaut dans l'espace de noms Kubernetes. Vous n'avez pas besoin d'exécuter kubensenter pour inspecter les points de montage lorsque vous utilisez oc debug.

Si la fonction d'encapsulation n'est pas activée, les commandes kubensenter findmnt et findmnt produisent le même résultat, qu'elles soient exécutées dans une session oc debug ou dans une invite du shell SSH.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez configuré l'accès SSH à l'hôte du cluster.

Procédure

  1. Ouvrez un shell SSH distant vers l'hôte du cluster. Par exemple :

    ssh core@<node_name>
  2. Exécutez les commandes à l'aide du script kubensenter fourni en tant qu'utilisateur root. Pour exécuter une commande unique dans l'espace de noms Kubernetes, fournissez la commande et les arguments éventuels au script kubensenter. Par exemple, pour exécuter la commande findmnt dans l'espace de noms Kubernetes, exécutez la commande suivante :

    [core@control-plane-1 ~]$ sudo kubensenter findmnt

    Exemple de sortie

    kubensenter: Autodetect: kubens.service namespace found at /run/kubens/mnt
    TARGET                                SOURCE                 FSTYPE     OPTIONS
    /                                     /dev/sda4[/ostree/deploy/rhcos/deploy/32074f0e8e5ec453e56f5a8a7bc9347eaa4172349ceab9c22b709d9d71a3f4b0.0]
    |                                                            xfs        rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota
                                          shm                    tmpfs
    ...

  3. Pour démarrer un nouveau shell interactif dans l'espace de noms Kubernetes, exécutez le script kubensenter sans aucun argument :

    [core@control-plane-1 ~]$ sudo kubensenter

    Exemple de sortie

    kubensenter: Autodetect: kubens.service namespace found at /run/kubens/mnt

11.4. Exécution de services supplémentaires dans l'espace de noms encapsulé

Tout outil de surveillance qui s'appuie sur la capacité à s'exécuter dans le système d'exploitation hôte et à avoir une visibilité sur les points de montage créés par kubelet, CRI-O ou les conteneurs eux-mêmes, doit entrer dans l'espace de noms de montage de conteneur pour voir ces points de montage. Le script kubensenter fourni avec OpenShift Container Platform exécute une autre commande à l'intérieur du point de montage Kubernetes et peut être utilisé pour adapter les outils existants.

Le script kubensenter est conscient de l'état de la fonctionnalité d'encapsulation du montage et peut être exécuté en toute sécurité même si l'encapsulation n'est pas activée. Dans ce cas, le script exécute la commande fournie dans l'espace de noms mount par défaut.

Par exemple, si un service systemd doit s'exécuter dans le nouvel espace de noms Kubernetes mount, modifiez le fichier de service et utilisez la ligne de commande ExecStart= avec kubensenter.

[Unit]
Description=Example service
[Service]
ExecStart=/usr/bin/kubensenter /path/to/original/command arg1 arg2

11.5. Ressources supplémentaires

Chapitre 12. Gestion d'hôtes "bare metal" (métal nu)

Lorsque vous installez OpenShift Container Platform sur un cluster bare metal, vous pouvez provisionner et gérer les nœuds bare metal en utilisant machine et machineset custom resources (CRs) pour les hôtes bare metal qui existent dans le cluster.

12.1. À propos des hôtes et nœuds bare metal

Pour provisionner un hôte bare metal de Red Hat Enterprise Linux CoreOS (RHCOS) en tant que nœud dans votre cluster, créez d'abord un objet custom resource (CR) MachineSet qui correspond au matériel de l'hôte bare metal. Les ensembles de machines de calcul de l'hôte bare metal décrivent les composants d'infrastructure spécifiques à votre configuration. Vous appliquez des étiquettes Kubernetes spécifiques à ces ensembles de machines de calcul, puis vous mettez à jour les composants d'infrastructure pour qu'ils s'exécutent uniquement sur ces machines.

Machine Les CR sont créés automatiquement lorsque vous mettez à l'échelle le site MachineSet contenant une annotation metal3.io/autoscale-to-hosts. OpenShift Container Platform utilise les CR Machine pour provisionner le nœud bare metal correspondant à l'hôte spécifié dans le CR MachineSet.

12.2. Maintenance des hôtes bare metal

Vous pouvez maintenir les détails des hôtes bare metal de votre cluster à partir de la console web d'OpenShift Container Platform. Naviguez vers ComputeBare Metal Hosts, et sélectionnez une tâche dans le menu déroulant Actions. Ici, vous pouvez gérer des éléments tels que les détails BMC, l'adresse MAC de démarrage pour l'hôte, activer la gestion de l'alimentation, etc. Vous pouvez également consulter les détails des interfaces réseau et des lecteurs de l'hôte.

Vous pouvez déplacer un hôte bare metal en mode maintenance. Lorsque vous mettez un hôte en mode maintenance, le planificateur déplace toutes les charges de travail gérées hors du nœud bare metal correspondant. Aucune nouvelle charge de travail n'est planifiée en mode maintenance.

Vous pouvez déprovisionner un hôte bare metal dans la console web. Le déprovisionnement d'un hôte permet d'effectuer les actions suivantes :

  1. Annote le CR de l'hôte bare metal avec cluster.k8s.io/delete-machine: true
  2. Réduire l'ensemble des machines de calcul associées
Note

La mise hors tension de l'hôte sans déplacement préalable de l'ensemble démon et des pods statiques non gérés vers un autre nœud peut entraîner une interruption de service et une perte de données.

12.2.1. Ajouter un hôte bare metal à la grappe à l'aide de la console web

Vous pouvez ajouter des hôtes en métal nu au cluster dans la console web.

Conditions préalables

  • Installer un cluster RHCOS sur du métal nu.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Dans la console web, naviguez vers ComputeBare Metal Hosts.
  2. Sélectionnez Add HostNew with Dialog.
  3. Spécifiez un nom unique pour le nouvel hôte bare metal.
  4. Régler l'adresse Boot MAC address.
  5. Régler l'adresse Baseboard Management Console (BMC) Address.
  6. Saisissez les informations d'identification de l'utilisateur pour le contrôleur de gestion de carte de base (BMC) de l'hôte.
  7. Sélectionnez pour mettre l'hôte sous tension après la création, puis sélectionnez Create.
  8. Augmentez le nombre de répliques pour qu'il corresponde au nombre de machines nues disponibles. Naviguez jusqu'à ComputeMachineSets, et augmentez le nombre de répliques de machines dans le cluster en sélectionnant Edit Machine count dans le menu déroulant Actions.
Note

Vous pouvez également gérer le nombre de nœuds en métal nu à l'aide de la commande oc scale et de l'ensemble de machines de calcul en métal nu approprié.

12.2.2. Ajouter un hôte bare metal au cluster en utilisant YAML dans la console web

Vous pouvez ajouter des hôtes bare metal au cluster dans la console web en utilisant un fichier YAML qui décrit l'hôte bare metal.

Conditions préalables

  • Installer une machine de calcul RHCOS sur une infrastructure bare metal pour l'utiliser dans le cluster.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Créez un CR Secret pour l'hôte bare metal.

Procédure

  1. Dans la console web, naviguez vers ComputeBare Metal Hosts.
  2. Sélectionnez Add HostNew from YAML.
  3. Copiez et collez le YAML ci-dessous, en modifiant les champs pertinents avec les détails de votre hôte :

    apiVersion: metal3.io/v1alpha1
    kind: BareMetalHost
    metadata:
      name: <bare_metal_host_name>
    spec:
      online: true
      bmc:
        address: <bmc_address>
        credentialsName: <secret_credentials_name>  1
        disableCertificateVerification: True 2
      bootMACAddress: <host_boot_mac_address>
    1
    credentialsName doit faire référence à un Secret CR valide. Le site baremetal-operator ne peut pas gérer l'hôte bare metal sans un site Secret valide référencé dans le site credentialsName. Pour plus d'informations sur les secrets et la manière de les créer, voir Comprendre les secrets.
    2
    Le réglage de disableCertificateVerification sur true désactive la validation d'hôte TLS entre le cluster et le contrôleur de gestion de carte de base (BMC).
  4. Sélectionnez Create pour enregistrer le YAML et créer le nouvel hôte bare metal.
  5. Augmentez le nombre de répliques pour qu'il corresponde au nombre d'hôtes bare metal disponibles. Naviguez jusqu'à ComputeMachineSets, et augmentez le nombre de machines dans le cluster en sélectionnant Edit Machine count dans le menu déroulant Actions.

    Note

    Vous pouvez également gérer le nombre de nœuds en métal nu à l'aide de la commande oc scale et de l'ensemble de machines de calcul en métal nu approprié.

12.2.3. Mise à l'échelle automatique des machines en fonction du nombre d'hôtes bare metal disponibles

Pour créer automatiquement le nombre d'objets Machine correspondant au nombre d'objets BareMetalHost disponibles, ajoutez une annotation metal3.io/autoscale-to-hosts à l'objet MachineSet.

Conditions préalables

  • Installez les machines de calcul RHCOS en métal nu pour les utiliser dans le cluster et créez les objets BareMetalHost correspondants.
  • Installez le CLI OpenShift Container Platform (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Annotez l'ensemble de machines de calcul que vous souhaitez configurer pour la mise à l'échelle automatique en ajoutant l'annotation metal3.io/autoscale-to-hosts. Remplacez <machineset> par le nom de l'ensemble de machines de calcul.

    $ oc annotate machineset <machineset> -n openshift-machine-api 'metal3.io/autoscale-to-hosts=<any_value>'

    Attendez que les nouvelles machines à échelle commencent à fonctionner.

Note

Lorsque vous utilisez un objet BareMetalHost pour créer une machine dans le cluster et que les étiquettes ou les sélecteurs sont ensuite modifiés sur le site BareMetalHost, l'objet BareMetalHost continue d'être compté dans le site MachineSet à partir duquel l'objet Machine a été créé.

12.2.4. Suppression des hôtes bare metal du nœud de provisionnement

Dans certaines circonstances, vous pouvez vouloir retirer temporairement les hôtes bare metal du nœud de provisionnement. Par exemple, pendant le provisionnement, lorsqu'un redémarrage de l'hôte bare metal est déclenché à l'aide de la console d'administration d'OpenShift Container Platform ou à la suite d'une mise à jour du pool de configuration des machines, OpenShift Container Platform se connecte au contrôleur d'accès à distance Dell intégré (iDrac) et émet une suppression de la file d'attente des tâches.

Pour éviter que la gestion du nombre d'objets Machine ne corresponde au nombre d'objets BareMetalHost disponibles, ajoutez une annotation baremetalhost.metal3.io/detached à l'objet MachineSet.

Note

Cette annotation n'a d'effet que pour les objets BareMetalHost qui sont dans l'état Provisioned, ExternallyProvisioned ou Ready/Available.

Conditions préalables

  • Installez les machines de calcul RHCOS en métal nu pour les utiliser dans le cluster et créez les objets BareMetalHost correspondants.
  • Installez le CLI OpenShift Container Platform (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Annotez l'ensemble de machines de calcul que vous souhaitez supprimer du nœud du provisionneur en ajoutant l'annotation baremetalhost.metal3.io/detached.

    $ oc annotate machineset <machineset> -n openshift-machine-api 'baremetalhost.metal3.io/detached'

    Attendez que les nouvelles machines démarrent.

    Note

    Lorsque vous utilisez un objet BareMetalHost pour créer une machine dans le cluster et que les étiquettes ou les sélecteurs sont ensuite modifiés sur le site BareMetalHost, l'objet BareMetalHost continue d'être compté dans le site MachineSet à partir duquel l'objet Machine a été créé.

  2. Dans le cas d'utilisation du provisionnement, supprimez l'annotation une fois le redémarrage terminé à l'aide de la commande suivante :

    $ oc annotate machineset <machineset> -n openshift-machine-api 'baremetalhost.metal3.io/detached-'

Chapitre 13. Ce que font les grandes pages et comment elles sont consommées par les applications

13.1. Ce que font les grandes pages

La mémoire est gérée par blocs appelés pages. Sur la plupart des systèmes, une page correspond à 4Ki. 1Mi de mémoire équivaut à 256 pages ; 1Gi de mémoire équivaut à 256 000 pages, et ainsi de suite. Les unités centrales de traitement disposent d'une unité de gestion de la mémoire intégrée qui gère une liste de ces pages au niveau matériel. Le Translation Lookaside Buffer (TLB) est une petite mémoire cache matérielle des correspondances entre les pages virtuelles et les pages physiques. Si l'adresse virtuelle transmise dans une instruction matérielle peut être trouvée dans le TLB, la correspondance peut être déterminée rapidement. Si ce n'est pas le cas, la TLB est manquée et le système revient à une traduction d'adresse plus lente, basée sur le logiciel, ce qui entraîne des problèmes de performance. La taille de la TLB étant fixe, le seul moyen de réduire le risque d'erreur de la TLB est d'augmenter la taille de la page.

Une page énorme est une page de mémoire dont la taille est supérieure à 4Ki. Sur les architectures x86_64, il existe deux tailles courantes de pages énormes : 2Mi et 1Gi. Les tailles varient sur les autres architectures. Pour utiliser les pages énormes, le code doit être écrit de manière à ce que les applications en soient conscientes. Les pages énormes transparentes (THP) tentent d'automatiser la gestion des pages énormes sans que l'application en ait connaissance, mais elles ont des limites. En particulier, elles sont limitées à des tailles de page de 2Mi. Les THP peuvent entraîner une dégradation des performances sur les nœuds à forte utilisation ou fragmentation de la mémoire en raison des efforts de défragmentation des THP, qui peuvent bloquer les pages de mémoire. Pour cette raison, certaines applications peuvent être conçues pour (ou recommander) l'utilisation d'énormes pages pré-allouées au lieu de THP.

Dans OpenShift Container Platform, les applications d'un pod peuvent allouer et consommer des pages énormes pré-allouées.

13.2. Comment les pages volumineuses sont consommées par les applications

Les nœuds doivent pré-allouer des pages volumineuses pour que le nœud puisse indiquer sa capacité de pages volumineuses. Un nœud ne peut pré-allouer des pages volumineuses que pour une seule taille.

Les pages volumineuses peuvent être consommées par le biais des exigences de ressources au niveau du conteneur en utilisant le nom de la ressource hugepages-<size>, où la taille est la notation binaire la plus compacte utilisant des valeurs entières prises en charge par un nœud particulier. Par exemple, si un nœud prend en charge des tailles de page de 2048 Ko, il expose une ressource planifiable hugepages-2Mi. Contrairement à l'unité centrale ou à la mémoire, les pages volumineuses ne permettent pas le surengagement.

apiVersion: v1
kind: Pod
metadata:
  generateName: hugepages-volume-
spec:
  containers:
  - securityContext:
      privileged: true
    image: rhel7:latest
    command:
    - sleep
    - inf
    name: example
    volumeMounts:
    - mountPath: /dev/hugepages
      name: hugepage
    resources:
      limits:
        hugepages-2Mi: 100Mi 1
        memory: "1Gi"
        cpu: "1"
  volumes:
  - name: hugepage
    emptyDir:
      medium: HugePages
1
Spécifiez la quantité de mémoire pour hugepages comme étant la quantité exacte à allouer. Ne spécifiez pas cette valeur comme étant la quantité de mémoire pour hugepages multipliée par la taille de la page. Par exemple, compte tenu d'une taille de page énorme de 2 Mo, si vous souhaitez utiliser 100 Mo de RAM soutenue par des pages énormes pour votre application, vous devez allouer 50 pages énormes. OpenShift Container Platform fait le calcul pour vous. Comme dans l'exemple ci-dessus, vous pouvez spécifier 100MB directement.

Allocating huge pages of a specific size

Certaines plates-formes prennent en charge plusieurs tailles de pages volumineuses. Pour allouer des pages volumineuses d'une taille spécifique, faites précéder les paramètres de la commande d'amorçage des pages volumineuses d'un paramètre de sélection de la taille des pages volumineuses hugepagesz=<size>. La valeur de <size> doit être spécifiée en octets avec un suffixe d'échelle facultatif [kKmMgG]. La taille par défaut des pages énormes peut être définie à l'aide du paramètre d'amorçage default_hugepagesz=<size>.

Huge page requirements

  • Les demandes de pages volumineuses doivent être égales aux limites. Il s'agit de la valeur par défaut si des limites sont spécifiées, mais que les demandes ne le sont pas.
  • Les pages volumineuses sont isolées au niveau du pod. L'isolation des conteneurs est prévue dans une prochaine itération.
  • EmptyDir les volumes soutenus par des pages volumineuses ne doivent pas consommer plus de mémoire de page volumineuse que la demande de pod.
  • Les applications qui consomment des pages volumineuses via shmget() avec SHM_HUGETLB doivent fonctionner avec un groupe supplémentaire qui correspond à proc/sys/vm/hugetlb_shm_group.

13.3. Consommation d'énormes pages de ressources à l'aide de l'API Downward

Vous pouvez utiliser l'API Downward pour injecter des informations sur les ressources de pages volumineuses consommées par un conteneur.

Vous pouvez injecter l'allocation des ressources sous la forme de variables d'environnement, d'un plugin de volume ou des deux. Les applications que vous développez et exécutez dans le conteneur peuvent déterminer les ressources disponibles en lisant les variables d'environnement ou les fichiers dans les volumes spécifiés.

Procédure

  1. Créez un fichier hugepages-volume-pod.yaml similaire à l'exemple suivant :

    apiVersion: v1
    kind: Pod
    metadata:
      generateName: hugepages-volume-
      labels:
        app: hugepages-example
    spec:
      containers:
      - securityContext:
          capabilities:
            add: [ "IPC_LOCK" ]
        image: rhel7:latest
        command:
        - sleep
        - inf
        name: example
        volumeMounts:
        - mountPath: /dev/hugepages
          name: hugepage
        - mountPath: /etc/podinfo
          name: podinfo
        resources:
          limits:
            hugepages-1Gi: 2Gi
            memory: "1Gi"
            cpu: "1"
          requests:
            hugepages-1Gi: 2Gi
        env:
        - name: REQUESTS_HUGEPAGES_1GI <.>
          valueFrom:
            resourceFieldRef:
              containerName: example
              resource: requests.hugepages-1Gi
      volumes:
      - name: hugepage
        emptyDir:
          medium: HugePages
      - name: podinfo
        downwardAPI:
          items:
            - path: "hugepages_1G_request" <.>
              resourceFieldRef:
                containerName: example
                resource: requests.hugepages-1Gi
                divisor: 1Gi

    <.> Spécifie de lire l'utilisation des ressources à partir de requests.hugepages-1Gi et d'exposer la valeur en tant que variable d'environnement REQUESTS_HUGEPAGES_1GI. <.> Spécifie de lire l'utilisation des ressources à partir de requests.hugepages-1Gi et d'exposer la valeur en tant que fichier /etc/podinfo/hugepages_1G_request.

  2. Créer le pod à partir du fichier hugepages-volume-pod.yaml:

    $ oc create -f hugepages-volume-pod.yaml

Vérification

  1. Vérifiez la valeur de la variable d'environnement REQUESTS_HUGEPAGES_1GI:

    $ oc exec -it $(oc get pods -l app=hugepages-example -o jsonpath='{.items[0].metadata.name}') \
         -- env | grep REQUESTS_HUGEPAGES_1GI

    Exemple de sortie

    REQUESTS_HUGEPAGES_1GI=2147483648

  2. Vérifier la valeur du fichier /etc/podinfo/hugepages_1G_request:

    $ oc exec -it $(oc get pods -l app=hugepages-example -o jsonpath='{.items[0].metadata.name}') \
         -- cat /etc/podinfo/hugepages_1G_request

    Exemple de sortie

    2

13.4. Configuration de pages volumineuses

Les nœuds doivent pré-allouer les pages volumineuses utilisées dans un cluster OpenShift Container Platform. Il existe deux façons de réserver des pages volumineuses : au démarrage et à l'exécution. La réservation au démarrage augmente les chances de succès car la mémoire n'a pas encore été fragmentée de manière significative. Le Node Tuning Operator prend actuellement en charge l'allocation de pages volumineuses au moment du démarrage sur des nœuds spécifiques.

13.4.1. Au moment du démarrage

Procédure

Pour minimiser les redémarrages de nœuds, l'ordre des étapes ci-dessous doit être respecté :

  1. Étiqueter tous les nœuds qui ont besoin du même réglage de pages énormes par une étiquette.

    oc label node <node_using_hugepages> node-role.kubernetes.io/worker-hp= $ oc label node <node_using_hugepages> node-role.kubernetes.io/worker-hp=
  2. Créez un fichier avec le contenu suivant et nommez-le hugepages-tuned-boottime.yaml:

    apiVersion: tuned.openshift.io/v1
    kind: Tuned
    metadata:
      name: hugepages 1
      namespace: openshift-cluster-node-tuning-operator
    spec:
      profile: 2
      - data: |
          [main]
          summary=Boot time configuration for hugepages
          include=openshift-node
          [bootloader]
          cmdline_openshift_node_hugepages=hugepagesz=2M hugepages=50 3
        name: openshift-node-hugepages
    
      recommend:
      - machineConfigLabels: 4
          machineconfiguration.openshift.io/role: "worker-hp"
        priority: 30
        profile: openshift-node-hugepages
    1
    Réglez le site name de la ressource accordée sur hugepages.
    2
    Définir la section profile pour allouer des pages volumineuses.
    3
    L'ordre des paramètres est important, car certaines plates-formes prennent en charge des pages volumineuses de différentes tailles.
    4
    Activer la correspondance basée sur le pool de configuration de la machine.
  3. Créer l'objet Tuned hugepages

    $ oc create -f hugepages-tuned-boottime.yaml
  4. Créez un fichier avec le contenu suivant et nommez-le hugepages-mcp.yaml:

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      name: worker-hp
      labels:
        worker-hp: ""
    spec:
      machineConfigSelector:
        matchExpressions:
          - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,worker-hp]}
      nodeSelector:
        matchLabels:
          node-role.kubernetes.io/worker-hp: ""
  5. Créer le pool de configuration de la machine :

    $ oc create -f hugepages-mcp.yaml

Avec suffisamment de mémoire non fragmentée, tous les nœuds du pool de configuration de la machine worker-hp devraient maintenant avoir 50 pages énormes de 2Mi allouées.

$ oc get node <node_using_hugepages> -o jsonpath="{.status.allocatable.hugepages-2Mi}"
100Mi
Avertissement

Le plugin TuneD bootloader est actuellement pris en charge sur les nœuds de travail Red Hat Enterprise Linux CoreOS (RHCOS) 8.x. Pour les nœuds de travail Red Hat Enterprise Linux (RHEL) 7.x, le plugin de chargeur de démarrage TuneD n'est actuellement pas pris en charge.

13.5. Désactivation des pages énormes transparentes

Les pages volumineuses transparentes (THP) tentent d'automatiser la plupart des aspects de la création, de la gestion et de l'utilisation des pages volumineuses. Comme THP gère automatiquement les pages volumineuses, cela n'est pas toujours optimal pour tous les types de charges de travail. THP peut entraîner une régression des performances, car de nombreuses applications gèrent elles-mêmes les pages volumineuses. Il convient donc d'envisager la désactivation de THP. Les étapes suivantes décrivent comment désactiver THP à l'aide de Node Tuning Operator (NTO).

Procédure

  1. Créez un fichier avec le contenu suivant et nommez-le thp-disable-tuned.yaml:

    apiVersion: tuned.openshift.io/v1
    kind: Tuned
    metadata:
      name: thp-workers-profile
      namespace: openshift-cluster-node-tuning-operator
    spec:
      profile:
      - data: |
          [main]
          summary=Custom tuned profile for OpenShift to turn off THP on worker nodes
          include=openshift-node
    
          [vm]
          transparent_hugepages=never
        name: openshift-thp-never-worker
    
      recommend:
      - match:
        - label: node-role.kubernetes.io/worker
        priority: 25
        profile: openshift-thp-never-worker
  2. Créer l'objet Tuned :

    $ oc create -f thp-disable-tuned.yaml
  3. Vérifier la liste des profils actifs :

    $ oc get profile -n openshift-cluster-node-tuning-operator

Vérification

  • Connectez-vous à l'un des nœuds et effectuez un contrôle THP régulier pour vérifier si les nœuds ont appliqué le profil avec succès :

    $ cat /sys/kernel/mm/transparent_hugepage/enabled

    Exemple de sortie

    always madvise [never]

Chapitre 14. Accord à faible latence

14.1. Comprendre la faible latence

L'émergence de l'Edge computing dans le domaine Telco / 5G joue un rôle clé dans la réduction des problèmes de latence et de congestion et dans l'amélioration des performances des applications.

En termes simples, la latence détermine la vitesse à laquelle les données (paquets) se déplacent de l'expéditeur au destinataire et reviennent à l'expéditeur après avoir été traitées par le destinataire. Le maintien d'une architecture de réseau avec un délai de latence le plus faible possible est essentiel pour répondre aux exigences de performance du réseau de la 5G. Par rapport à la technologie 4G, dont le temps de latence moyen est de 50 ms, la 5G vise à atteindre des temps de latence de 1 ms ou moins. Cette réduction du temps de latence multiplie par 10 le débit des réseaux sans fil.

De nombreuses applications déployées dans l'espace Telco nécessitent une faible latence qui ne peut tolérer qu'une perte de paquets nulle. Le réglage pour une perte de paquets nulle permet d'atténuer les problèmes inhérents qui dégradent les performances du réseau. Pour plus d'informations, voir Tuning for Zero Packet Loss dans Red Hat OpenStack Platform (RHOSP).

L'initiative Edge computing entre également en jeu pour réduire les taux de latence. Il s'agit d'être à la périphérie du nuage et plus proche de l'utilisateur. Cela réduit considérablement la distance entre l'utilisateur et les centres de données éloignés, ce qui permet de réduire les temps de réponse des applications et la latence des performances.

Les administrateurs doivent pouvoir gérer leurs nombreux sites Edge et services locaux de manière centralisée afin que tous les déploiements puissent fonctionner au coût de gestion le plus bas possible. Ils ont également besoin d'un moyen simple de déployer et de configurer certains nœuds de leur cluster pour des applications en temps réel à faible latence et à haute performance. Les nœuds à faible latence sont utiles pour des applications telles que Cloud-native Network Functions (CNF) et Data Plane Development Kit (DPDK).

OpenShift Container Platform fournit actuellement des mécanismes pour régler les logiciels sur un cluster OpenShift Container Platform pour un fonctionnement en temps réel et une faible latence (environ <20 microsecondes de temps de réaction). Cela inclut le réglage du noyau et des valeurs d'ensemble d'OpenShift Container Platform, l'installation d'un noyau et la reconfiguration de la machine. Mais cette méthode nécessite de configurer quatre opérateurs différents et d'effectuer de nombreuses configurations qui, lorsqu'elles sont effectuées manuellement, sont complexes et peuvent être sujettes à des erreurs.

OpenShift Container Platform utilise le Node Tuning Operator pour mettre en œuvre un réglage automatique afin d'obtenir des performances de faible latence pour les applications OpenShift Container Platform. L'administrateur du cluster utilise cette configuration de profil de performance qui facilite la réalisation de ces changements de manière plus fiable. L'administrateur peut spécifier s'il faut mettre à jour le noyau vers kernel-rt, réserver les CPU pour les tâches d'entretien du cluster et du système d'exploitation, y compris les conteneurs pod infra, et isoler les CPU pour les conteneurs d'application afin d'exécuter les charges de travail.

Note

Actuellement, la désactivation de l'équilibrage de la charge du CPU n'est pas prise en charge par cgroup v2. Par conséquent, il se peut que vous n'obteniez pas le comportement souhaité des profils de performance si vous avez activé cgroup v2. L'activation de cgroup v2 n'est pas recommandée si vous utilisez des profils de performance.

OpenShift Container Platform prend également en charge les indices de charge de travail pour le Node Tuning Operator qui peut régler le site PerformanceProfile pour répondre aux exigences des différents environnements industriels. Des indices de charge de travail sont disponibles pour highPowerConsumption (très faible latence au prix d'une consommation d'énergie accrue) et realTime (priorité donnée à une latence optimale). Une combinaison de paramètres true/false pour ces conseils peut être utilisée pour traiter les profils et les exigences de charge de travail spécifiques à l'application.

Les indices de charge de travail simplifient l'ajustement des performances aux paramètres sectoriels. Au lieu d'une approche "unique", les indices de charge de travail peuvent s'adapter aux schémas d'utilisation, par exemple en donnant la priorité à.. :

  • Faible latence
  • Capacité en temps réel
  • Utilisation efficace de l'énergie

Dans un monde idéal, tous ces éléments seraient prioritaires : dans la réalité, certains le sont au détriment d'autres. L'opérateur d'optimisation des nœuds est maintenant conscient des attentes de la charge de travail et est mieux à même de répondre aux exigences de la charge de travail. L'administrateur du cluster peut maintenant spécifier dans quel cas d'utilisation cette charge de travail s'inscrit. L'opérateur de réglage des nœuds utilise le site PerformanceProfile pour affiner les paramètres de performance de la charge de travail.

L'environnement dans lequel une application fonctionne influence son comportement. Pour un centre de données typique sans exigences strictes en matière de temps de latence, seul un réglage par défaut minimal est nécessaire pour permettre le partitionnement de l'unité centrale pour certains modules de charge de travail à haute performance. Pour les centres de données et les charges de travail où la latence est une priorité plus importante, des mesures sont toujours prises pour optimiser la consommation d'énergie. Les cas les plus complexes sont les clusters situés à proximité d'équipements sensibles à la latence, tels que les machines de production et les radios logicielles. Cette dernière catégorie de déploiement est souvent appelée "Far edge". Pour les déploiements en périphérie lointaine, une latence ultra-faible est la priorité absolue et est obtenue au détriment de la gestion de l'énergie.

Dans OpenShift Container Platform version 4.10 et les versions précédentes, l'opérateur Performance Addon était utilisé pour mettre en œuvre un réglage automatique afin d'obtenir des performances de faible latence. Désormais, cette fonctionnalité fait partie de l'opérateur Node Tuning.

14.1.1. À propos de l'hyperthreading pour les applications à faible latence et en temps réel

L'hyperthreading est une technologie de processeur Intel qui permet à un cœur de processeur physique de fonctionner comme deux cœurs logiques, exécutant simultanément deux threads indépendants. L'hyperthreading permet d'améliorer le débit du système pour certains types de charges de travail où le traitement parallèle est bénéfique. La configuration par défaut d'OpenShift Container Platform prévoit que l'hyperthreading est activé par défaut.

Pour les applications de télécommunications, il est important de concevoir l'infrastructure de l'application de manière à minimiser la latence autant que possible. L'hyperthreading peut ralentir les temps de performance et affecter négativement le débit pour les charges de travail à forte intensité de calcul qui nécessitent une faible latence. La désactivation de l'hyperthreading garantit des performances prévisibles et peut réduire les temps de traitement pour ces charges de travail.

Note

L'implémentation et la configuration de l'hyperthreading diffèrent selon le matériel sur lequel vous exécutez OpenShift Container Platform. Consultez les informations de réglage du matériel hôte concerné pour plus de détails sur l'implémentation de l'hyperthreading spécifique à ce matériel. La désactivation de l'hyperthreading peut augmenter le coût par cœur du cluster.

14.2. Approvisionnement des charges de travail en temps réel et à faible latence

De nombreuses industries et organisations ont besoin d'un calcul extrêmement performant et pourraient avoir besoin d'une latence faible et prévisible, en particulier dans les secteurs de la finance et des télécommunications. Pour ces industries, avec leurs exigences uniques, OpenShift Container Platform fournit le Node Tuning Operator pour mettre en œuvre un réglage automatique afin d'obtenir des performances de faible latence et un temps de réponse cohérent pour les applications OpenShift Container Platform.

L'administrateur du cluster peut utiliser cette configuration du profil de performance pour effectuer ces changements de manière plus fiable. L'administrateur peut spécifier s'il faut mettre à jour le noyau vers kernel-rt (temps réel), réserver les CPU pour les tâches de maintenance du cluster et du système d'exploitation, y compris les conteneurs pod infra, isoler les CPU pour les conteneurs d'application afin d'exécuter les charges de travail, et désactiver les CPU inutilisés afin de réduire la consommation d'énergie.

Avertissement

L'utilisation de sondes d'exécution en conjonction avec des applications qui nécessitent des CPU garantis peut provoquer des pics de latence. Il est recommandé d'utiliser d'autres sondes, telles qu'un ensemble de sondes réseau correctement configurées, comme alternative.

Note

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon était utilisé pour mettre en œuvre un réglage automatique afin d'obtenir des performances de faible latence pour les applications OpenShift. Dans OpenShift Container Platform 4.11 et les versions ultérieures, ces fonctions font partie de l'opérateur Node Tuning.

14.2.1. Limitations connues pour le temps réel

Note

Dans la plupart des déploiements, kernel-rt est pris en charge uniquement sur les nœuds de travail lorsque vous utilisez un cluster standard avec trois nœuds de plan de contrôle et trois nœuds de travail. Il existe des exceptions pour les nœuds compacts et uniques dans les déploiements de OpenShift Container Platform. Pour les installations sur un seul nœud, kernel-rt est pris en charge sur le seul nœud de plan de contrôle.

Pour utiliser pleinement le mode temps réel, les conteneurs doivent être exécutés avec des privilèges élevés. Voir Définir les capacités d'un conteneur pour plus d'informations sur l'octroi de privilèges.

OpenShift Container Platform limite les capacités autorisées, il se peut donc que vous deviez également créer un site SecurityContext.

Note

Cette procédure est entièrement prise en charge par les installations "bare metal" utilisant les systèmes Red Hat Enterprise Linux CoreOS (RHCOS).

L'établissement d'attentes correctes en matière de performances renvoie au fait que le noyau en temps réel n'est pas une panacée. Son objectif est un déterminisme cohérent, à faible latence, offrant des temps de réponse prévisibles. Le noyau en temps réel entraîne des frais généraux supplémentaires. Cela est dû principalement à la gestion des interruptions matérielles dans des threads programmés séparément. L'augmentation des frais généraux dans certaines charges de travail entraîne une dégradation du débit global. L'ampleur exacte de la dégradation dépend fortement de la charge de travail, allant de 0 % à 30 %. Cependant, c'est le coût du déterminisme.

14.2.2. Fournir à un travailleur des capacités en temps réel

  1. Facultatif : Ajoutez un nœud au cluster OpenShift Container Platform. Voir Définition des paramètres du BIOS pour le réglage du système.
  2. Ajoutez le label worker-rt aux nœuds de travail qui ont besoin de la capacité en temps réel en utilisant la commande oc.
  3. Créer un nouveau pool de configuration de machines pour les nœuds en temps réel :

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfigPool
    metadata:
      name: worker-rt
      labels:
        machineconfiguration.openshift.io/role: worker-rt
    spec:
      machineConfigSelector:
        matchExpressions:
          - {
               key: machineconfiguration.openshift.io/role,
               operator: In,
               values: [worker, worker-rt],
            }
      paused: false
      nodeSelector:
        matchLabels:
          node-role.kubernetes.io/worker-rt: ""

    Notez qu'un pool de configuration de machines worker-rt est créé pour le groupe de nœuds ayant l'étiquette worker-rt.

  4. Ajoutez le nœud au pool de configuration de la machine appropriée en utilisant les étiquettes de rôle de nœud.

    Note

    Vous devez décider quels nœuds sont configurés avec des charges de travail en temps réel. Vous pouvez configurer tous les nœuds de la grappe ou un sous-ensemble de nœuds. Le Node Tuning Operator qui s'attend à ce que tous les nœuds fassent partie d'un pool de configuration de machines dédiées. Si vous utilisez tous les nœuds, vous devez indiquer à l'opérateur de réglage des nœuds l'étiquette de rôle du nœud travailleur. Si vous utilisez un sous-ensemble, vous devez regrouper les nœuds dans un nouveau pool de configuration de machine.

  5. Créez le site PerformanceProfile avec l'ensemble approprié de noyaux d'entretien et realTimeKernel: enabled: true.
  6. Vous devez définir machineConfigPoolSelector dans PerformanceProfile:

      apiVersion: performance.openshift.io/v2
      kind: PerformanceProfile
      metadata:
       name: example-performanceprofile
      spec:
      ...
        realTimeKernel:
          enabled: true
        nodeSelector:
           node-role.kubernetes.io/worker-rt: ""
        machineConfigPoolSelector:
           machineconfiguration.openshift.io/role: worker-rt
  7. Vérifier qu'il existe un pool de configuration machine correspondant avec un label :

    $ oc describe mcp/worker-rt

    Exemple de sortie

    Name:         worker-rt
    Namespace:
    Labels:       machineconfiguration.openshift.io/role=worker-rt

  8. OpenShift Container Platform va commencer à configurer les nœuds, ce qui peut impliquer plusieurs redémarrages. Attendez que les nœuds s'installent. Cela peut prendre beaucoup de temps en fonction du matériel spécifique que vous utilisez, mais il faut compter 20 minutes par nœud.
  9. Vérifier que tout fonctionne comme prévu.

14.2.3. Vérification de l'installation du noyau en temps réel

Cette commande permet de vérifier que le noyau temps réel est installé :

$ oc get node -o wide

Notez le travailleur avec le rôle worker-rt qui contient la chaîne 4.18.0-305.30.1.rt7.102.el8_4.x86_64 cri-o://1.25.0-99.rhaos4.10.gitc3131de.el8:

NAME                               	STATUS   ROLES           	AGE 	VERSION                  	INTERNAL-IP
EXTERNAL-IP   OS-IMAGE                                       	KERNEL-VERSION
CONTAINER-RUNTIME
rt-worker-0.example.com	          Ready	 worker,worker-rt   5d17h   v1.25.0
128.66.135.107   <none>    	        Red Hat Enterprise Linux CoreOS 46.82.202008252340-0 (Ootpa)
4.18.0-305.30.1.rt7.102.el8_4.x86_64   cri-o://1.25.0-99.rhaos4.10.gitc3131de.el8
[...]

14.2.4. Créer une charge de travail en temps réel

Utilisez les procédures suivantes pour préparer une charge de travail qui utilisera les capacités en temps réel.

Procédure

  1. Créer un pod avec une classe QoS de Guaranteed.
  2. En option : Désactiver l'équilibrage de la charge du CPU pour DPDK.
  3. Attribuer un sélecteur de nœud approprié.

Lorsque vous écrivez vos applications, suivez les recommandations générales décrites dans la section Réglage et déploiement des applications.

14.2.5. Création d'un pod avec une classe de QoS de Guaranteed

Gardez les points suivants à l'esprit lorsque vous créez un pod auquel est attribuée une classe de qualité de service (QoS) de Guaranteed:

  • Chaque conteneur du pod doit avoir une limite de mémoire et une demande de mémoire, et elles doivent être identiques.
  • Chaque conteneur du pod doit avoir une limite et une demande de CPU, et elles doivent être identiques.

L'exemple suivant montre le fichier de configuration d'un module qui a un conteneur. Le conteneur a une limite de mémoire et une demande de mémoire, toutes deux égales à 200 MiB. Le conteneur a une limite de CPU et une demande de CPU, toutes deux égales à 1 CPU.

apiVersion: v1
kind: Pod
metadata:
  name: qos-demo
  namespace: qos-example
spec:
  containers:
  - name: qos-demo-ctr
    image: <image-pull-spec>
    resources:
      limits:
        memory: "200Mi"
        cpu: "1"
      requests:
        memory: "200Mi"
        cpu: "1"
  1. Créer la capsule :

    $ oc  apply -f qos-pod.yaml --namespace=qos-example
  2. Afficher des informations détaillées sur le pod :

    $ oc get pod qos-demo --namespace=qos-example --output=yaml

    Exemple de sortie

    spec:
      containers:
        ...
    status:
      qosClass: Guaranteed

    Note

    Si un conteneur spécifie sa propre limite de mémoire, mais ne spécifie pas de demande de mémoire, OpenShift Container Platform attribue automatiquement une demande de mémoire qui correspond à la limite. De même, si un conteneur spécifie sa propre limite de CPU, mais ne spécifie pas de demande de CPU, OpenShift Container Platform attribue automatiquement une demande de CPU qui correspond à la limite.

14.2.6. Optionnel : Désactivation de l'équilibrage de la charge du CPU pour DPDK

La fonctionnalité permettant de désactiver ou d'activer l'équilibrage de la charge du CPU est mise en œuvre au niveau du CRI-O. Le code sous le CRI-O ne désactive ou n'active l'équilibrage de la charge du CPU que lorsque les conditions suivantes sont remplies.

  • Le pod doit utiliser la classe d'exécution performance-<profile-name>. Vous pouvez obtenir le nom approprié en regardant le statut du profil de performance, comme indiqué ici :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    ...
    status:
      ...
      runtimeClass: performance-manual
Note

Actuellement, la désactivation de l'équilibrage de la charge du CPU n'est pas prise en charge par cgroup v2.

L'opérateur de réglage des nœuds est responsable de la création de l'extrait de configuration du gestionnaire d'exécution haute performance sous les nœuds concernés et de la création de la classe d'exécution haute performance sous le cluster. Son contenu sera le même que celui du gestionnaire d'exécution par défaut, sauf qu'il activera la fonctionnalité de configuration de l'équilibrage de la charge du processeur.

Pour désactiver l'équilibrage de la charge du CPU pour le pod, la spécification Pod doit inclure les champs suivants :

apiVersion: v1
kind: Pod
metadata:
  ...
  annotations:
    ...
    cpu-load-balancing.crio.io: "disable"
    ...
  ...
spec:
  ...
  runtimeClassName: performance-<profile_name>
  ...
Note

Ne désactivez l'équilibrage de la charge du CPU que lorsque la politique statique du gestionnaire de CPU est activée et pour les pods avec QoS garantie qui utilisent des CPU entiers. Dans le cas contraire, la désactivation de l'équilibrage de la charge du CPU peut affecter les performances d'autres conteneurs dans le cluster.

14.2.7. Attribution d'un sélecteur de nœud approprié

La meilleure façon d'assigner un pod à des nœuds est d'utiliser le même sélecteur de nœuds que celui utilisé par le profil de performance, comme indiqué ici :

apiVersion: v1
kind: Pod
metadata:
  name: example
spec:
  # ...
  nodeSelector:
    node-role.kubernetes.io/worker-rt: ""

Pour plus d'informations, voir Placer des pods sur des nœuds spécifiques à l'aide de sélecteurs de nœuds.

14.2.8. Programmation d'une charge de travail sur un travailleur doté de capacités en temps réel

Utilisez des sélecteurs d'étiquettes qui correspondent aux nœuds attachés au pool de configuration de machines qui a été configuré pour une faible latence par l'opérateur de réglage des nœuds. Pour plus d'informations, voir Affectation de pods à des nœuds.

14.2.9. Réduire la consommation d'énergie en mettant les unités centrales hors ligne

Vous pouvez généralement anticiper les charges de travail des télécommunications. Lorsque toutes les ressources de l'unité centrale ne sont pas nécessaires, l'opérateur Node Tuning vous permet de mettre hors ligne les unités centrales inutilisées afin de réduire la consommation d'énergie en mettant à jour manuellement le profil de performance.

Pour mettre hors ligne les unités centrales inutilisées, vous devez effectuer les tâches suivantes :

  1. Définissez les CPU hors ligne dans le profil de performance et enregistrez le contenu du fichier YAML :

    Exemple de profil de performance avec des unités centrales hors ligne

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: performance
    spec:
      additionalKernelArgs:
      - nmi_watchdog=0
      - audit=0
      - mce=off
      - processor.max_cstate=1
      - intel_idle.max_cstate=0
      - idle=poll
      cpu:
        isolated: "2-23,26-47"
        reserved: "0,1,24,25"
        offlined: “48-59” 1
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
      numa:
        topologyPolicy: single-numa-node
      realTimeKernel:
        enabled: true

    1
    Facultatif. Vous pouvez répertorier les unités centrales dans le champ offlined pour mettre hors ligne les unités centrales spécifiées.
  2. Appliquez le profil mis à jour en exécutant la commande suivante :

    $ oc apply -f my-performance-profile.yaml

14.2.10. En option : Configurations d'économie d'énergie

Vous pouvez activer l'économie d'énergie pour un nœud dont les charges de travail à faible priorité sont colocalisées avec des charges de travail à haute priorité sans avoir d'impact sur la latence ou le débit des charges de travail à haute priorité. L'économie d'énergie est possible sans modifier les charges de travail elles-mêmes.

Important

Cette fonctionnalité est prise en charge par les processeurs Intel Ice Lake et les générations suivantes. Les capacités du processeur peuvent avoir un impact sur la latence et le débit des charges de travail hautement prioritaires.

Lorsque vous configurez un nœud avec une configuration d'économie d'énergie, vous devez configurer les charges de travail hautement prioritaires avec une configuration de performance au niveau du pod, ce qui signifie que la configuration s'applique à tous les cœurs utilisés par le pod.

En désactivant les états P et les états C au niveau du pod, vous pouvez configurer les charges de travail hautement prioritaires pour obtenir les meilleures performances et la latence la plus faible.

Tableau 14.1. Configuration pour les charges de travail hautement prioritaires

AnnotationDescription
annotations:
  cpu-c-states.crio.io: "disable"
  cpu-freq-governor.crio.io: "<governor>"

Permet d'obtenir les meilleures performances pour un pod en désactivant les états C et en spécifiant le type de gouverneur pour la mise à l'échelle du CPU. Le gouverneur performance est recommandé pour les charges de travail hautement prioritaires.

Conditions préalables

  • Vous avez activé les états C et les états P contrôlés par le système d'exploitation dans le BIOS

Procédure

  1. Générer un PerformanceProfile avec per-pod-power-management fixé à true:

    $ podman run --entrypoint performance-profile-creator -v \
    /must-gather:/must-gather:z registry.redhat.io/openshift4/performance-addon-rhel8-operator:v4.12 \
    --mcp-name=worker-cnf --reserved-cpu-count=20 --rt-kernel=true \
    --split-reserved-cpus-across-numa=false --topology-manager-policy=single-numa-node \
    --must-gather-dir-path /must-gather -power-consumption-mode=low-latency \ 1
    --per-pod-power-management=true > my-performance-profile.yaml
    1
    L'adresse power-consumption-mode doit être default ou low-latency lorsque l'adresse per-pod-power-management est true.

    Exemple PerformanceProfile avec perPodPowerManagement

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
         name: performance
    spec:
        [.....]
        workloadHints:
            realTime: true
            highPowerConsumption: false
            perPodPowerManagement: true

  2. Définir le gouverneur par défaut de cpufreq comme argument supplémentaire du noyau dans la ressource personnalisée (CR) de PerformanceProfile:

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
         name: performance
    spec:
        ...
        additionalKernelArgs:
        - cpufreq.default_governor=schedutil 1
    1
    Il est recommandé d'utiliser le régulateur schedutil, mais il est possible d'utiliser d'autres régulateurs tels que les régulateurs ondemand ou powersave.
  3. Définissez la fréquence maximale de l'unité centrale sur le site TunedPerformancePatch CR :

    spec:
      profile:
      - data: |
          [sysfs]
          /sys/devices/system/cpu/intel_pstate/max_perf_pct = <x> 1
    1
    La valeur max_perf_pct contrôle la fréquence maximale que le pilote cpufreq est autorisé à définir en tant que pourcentage de la fréquence maximale supportée par le processeur. Cette valeur s'applique à tous les processeurs. Vous pouvez vérifier la fréquence maximale supportée sur /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq. Comme point de départ, vous pouvez utiliser un pourcentage qui plafonne tous les CPU à la fréquence All Cores Turbo. La fréquence All Cores Turbo est la fréquence à laquelle tous les cœurs fonctionneront lorsqu'ils seront tous occupés.
  4. Ajoutez les annotations souhaitées à vos pods de charge de travail hautement prioritaires. Les annotations remplacent les paramètres de default.

    Exemple d'annotation de charge de travail hautement prioritaire

    apiVersion: v1
    kind: Pod
    metadata:
      ...
      annotations:
        ...
        cpu-c-states.crio.io: "disable"
        cpu-freq-governor.crio.io: "<governor>"
        ...
      ...
    spec:
      ...
      runtimeClassName: performance-<profile_name>
      ...

  5. Redémarrer les pods.

Ressources supplémentaires

14.2.11. Gestion du traitement des interruptions de périphériques pour les unités centrales isolées à pods garantis

Le Node Tuning Operator peut gérer les CPU de l'hôte en les divisant en CPU réservés pour les tâches d'entretien du cluster et du système d'exploitation, y compris les conteneurs pod infra, et en CPU isolés pour les conteneurs d'application afin d'exécuter les charges de travail. Cela vous permet de définir les CPU pour les charges de travail à faible latence comme étant isolées.

Les interruptions de périphériques sont réparties entre toutes les unités centrales isolées et réservées afin d'éviter que les unités centrales ne soient surchargées, à l'exception des unités centrales pour lesquelles un module garanti est en cours d'exécution. Les CPU des pods garantis sont empêchés de traiter les interruptions de périphériques lorsque les annotations correspondantes sont définies pour le pod.

Dans le profil de performance, globallyDisableIrqLoadBalancing est utilisé pour gérer le traitement ou non des interruptions de périphériques. Pour certaines charges de travail, les CPU réservées ne sont pas toujours suffisantes pour traiter les interruptions de périphériques, et pour cette raison, les interruptions de périphériques ne sont pas globalement désactivées sur les CPU isolées. Par défaut, Node Tuning Operator ne désactive pas les interruptions de périphériques sur les unités centrales isolées.

Pour obtenir une faible latence pour les charges de travail, certains pods (mais pas tous) exigent que les CPU sur lesquels ils s'exécutent ne traitent pas les interruptions de périphériques. Une annotation de pod, irq-load-balancing.crio.io, est utilisée pour définir si les interruptions de périphériques sont traitées ou non. Lorsqu'il est configuré, CRI-O désactive les interruptions de périphérique tant que le module est en cours d'exécution.

14.2.11.1. Désactivation du quota CFS de l'unité centrale

Pour réduire l'étranglement du CPU pour les pods individuels garantis, créez une spécification de pod avec l'annotation cpu-quota.crio.io: "disable". Cette annotation désactive le quota CFS (completely fair scheduler) de l'unité centrale au moment de l'exécution du pod. La spécification de pod suivante contient cette annotation :

apiVersion: performance.openshift.io/v2
kind: Pod
metadata:
  annotations:
      cpu-quota.crio.io: "disable"
spec:
    runtimeClassName: performance-<profile_name>
...
Note

Ne désactivez le quota CFS CPU que lorsque la politique statique du gestionnaire de CPU est activée et pour les pods avec QoS garantie qui utilisent des CPU entiers. Dans le cas contraire, la désactivation du quota de CPU CFS peut affecter les performances d'autres conteneurs dans le cluster.

14.2.11.2. Désactivation de la gestion des interruptions globales de périphériques dans Node Tuning Operator

Pour configurer Node Tuning Operator afin qu'il désactive les interruptions de périphérique globales pour l'ensemble de CPU isolées, définissez le champ globallyDisableIrqLoadBalancing dans le profil de performance à true. Lorsque true, les annotations de pods conflictuelles sont ignorées. Avec false, les charges d'IRQ sont équilibrées entre tous les processeurs.

Un extrait de profil de performance illustre ce paramètre :

apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
  name: manual
spec:
  globallyDisableIrqLoadBalancing: true
...

14.2.11.3. Désactivation du traitement des interruptions pour les pods individuels

Pour désactiver le traitement des interruptions pour les pods individuels, assurez-vous que globallyDisableIrqLoadBalancing est défini sur false dans le profil de performance. Ensuite, dans la spécification du pod, définissez l'annotation du pod irq-load-balancing.crio.io sur disable. La spécification du pod suivante contient cette annotation :

apiVersion: performance.openshift.io/v2
kind: Pod
metadata:
  annotations:
      irq-load-balancing.crio.io: "disable"
spec:
    runtimeClassName: performance-<profile_name>
...

14.2.12. Mise à jour du profil de performance pour utiliser le traitement des interruptions de périphériques

Lorsque vous mettez à niveau la définition de ressource personnalisée (CRD) du profil de performance de l'opérateur Node Tuning de v1 ou v1alpha1 vers v2, globallyDisableIrqLoadBalancing est défini sur true pour les profils existants.

Note

globallyDisableIrqLoadBalancing permet de désactiver ou non l'équilibrage de la charge d'IRQ pour l'ensemble de CPU isolés. Lorsque l'option est définie sur true, elle désactive l'équilibrage de la charge d'IRQ pour l'ensemble de CPU isolés. Le réglage de l'option sur false permet d'équilibrer les IRQ sur tous les CPU.

14.2.12.1. Versions de l'API prises en charge

L'opérateur de réglage des nœuds prend en charge v2, v1, et v1alpha1 pour le champ apiVersion du profil de performance. Les API v1 et v1alpha1 sont identiques. L'API v2 comprend un champ booléen facultatif globallyDisableIrqLoadBalancing dont la valeur par défaut est false.

14.2.12.1.1. Mise à jour de l'API Node Tuning Operator de v1alpha1 à v1

Lors de la mise à niveau de la version API de l'opérateur de réglage des nœuds de v1alpha1 à v1, les profils de performance de v1alpha1 sont convertis à la volée à l'aide d'une stratégie de conversion "None" et servis à l'opérateur de réglage des nœuds avec la version API v1.

14.2.12.1.2. Mise à jour de l'API de l'opérateur Node Tuning de v1alpha1 ou v1 à v2

Lors d'une mise à niveau à partir d'une ancienne version de l'API Node Tuning Operator, les profils de performance v1 et v1alpha1 existants sont convertis à l'aide d'un webhook de conversion qui injecte le champ globallyDisableIrqLoadBalancing avec une valeur de true.

14.3. Réglage des nœuds pour une faible latence à l'aide du profil de performance

Le profil de performance vous permet de contrôler les aspects de réglage de la latence des nœuds qui appartiennent à un certain pool de configuration de machines. Après avoir spécifié vos paramètres, l'objet PerformanceProfile est compilé en plusieurs objets qui effectuent le réglage au niveau du nœud :

  • Un fichier MachineConfig qui manipule les nœuds.
  • Un fichier KubeletConfig qui configure le gestionnaire de topologie, le gestionnaire de CPU et les nœuds d'OpenShift Container Platform.
  • Le profil d'accord qui configure l'opérateur d'accord du nœud.

Vous pouvez utiliser un profil de performance pour spécifier s'il faut mettre à jour le noyau vers kernel-rt, allouer d'énormes pages et partitionner les CPU pour qu'ils effectuent des tâches ménagères ou exécutent des charges de travail.

Note

Vous pouvez créer manuellement l'objet PerformanceProfile ou utiliser le Performance Profile Creator (PPC) pour générer un profil de performance. Voir les ressources supplémentaires ci-dessous pour plus d'informations sur le PPC.

Exemple de profil de performance

apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
 name: performance
spec:
 cpu:
  isolated: "5-15" 1
  reserved: "0-4" 2
 hugepages:
  defaultHugepagesSize: "1G"
  pages:
  - size: "1G"
    count: 16
    node: 0
 realTimeKernel:
  enabled: true  3
 numa:  4
  topologyPolicy: "best-effort"
 nodeSelector:
  node-role.kubernetes.io/worker-cnf: "" 5

1
Ce champ permet d'isoler des unités centrales spécifiques à utiliser avec des conteneurs d'application pour les charges de travail.
2
Utilisez ce champ pour réserver des unités centrales spécifiques à utiliser avec des conteneurs infra pour l'entretien.
3
Utilisez ce champ pour installer le noyau en temps réel sur le nœud. Les valeurs valides sont true ou false. La valeur true installe le noyau en temps réel.
4
Ce champ permet de configurer la politique du gestionnaire de topologie. Les valeurs valides sont none (par défaut), best-effort, restricted et single-numa-node. Pour plus d'informations, voir Politiques du gestionnaire de topologie.
5
Utilisez ce champ pour spécifier un sélecteur de nœuds afin d'appliquer le profil de performance à des nœuds spécifiques.

Ressources supplémentaires

14.3.1. Configuration de pages volumineuses

Les nœuds doivent pré-allouer les pages volumineuses utilisées dans un cluster OpenShift Container Platform. Utilisez l'opérateur Node Tuning pour allouer des pages volumineuses sur un nœud spécifique.

OpenShift Container Platform fournit une méthode pour créer et allouer d'énormes pages. Node Tuning Operator fournit une méthode plus simple pour le faire en utilisant le profil de performance.

Par exemple, dans la section hugepages pages du profil de performance, vous pouvez spécifier plusieurs blocs de size, count et, éventuellement, node:

hugepages:
   defaultHugepagesSize: "1G"
   pages:
   - size:  "1G"
     count:  4
     node:  0 1
1
node est le nœud NUMA dans lequel les pages volumineuses sont allouées. Si vous omettez node, les pages sont réparties uniformément entre tous les nœuds NUMA.
Note

Attendez que le statut du pool de configuration de la machine concerné indique que la mise à jour est terminée.

Ce sont les seules étapes de configuration que vous devez effectuer pour allouer des pages volumineuses.

Vérification

  • Pour vérifier la configuration, consultez le fichier /proc/meminfo sur le nœud :

    $ oc debug node/ip-10-0-141-105.ec2.internal
    # grep -i huge /proc/meminfo

    Exemple de sortie

    AnonHugePages:    ###### ##
    ShmemHugePages:        0 kB
    HugePages_Total:       2
    HugePages_Free:        2
    HugePages_Rsvd:        0
    HugePages_Surp:        0
    Hugepagesize:       #### ##
    Hugetlb:            #### ##

  • Utilisez oc describe pour indiquer la nouvelle taille :

    $ oc describe node worker-0.ocp4poc.example.com | grep -i huge

    Exemple de sortie

                                       hugepages-1g=true
     hugepages-###:  ###
     hugepages-###:  ###

14.3.2. Allocation de plusieurs pages de grande taille

Vous pouvez demander des pages volumineuses de différentes tailles dans le même conteneur. Cela vous permet de définir des pods plus complexes composés de conteneurs ayant des besoins différents en matière de taille des pages.

Par exemple, vous pouvez définir les tailles 1G et 2M et l'opérateur Node Tuning configurera les deux tailles sur le nœud, comme illustré ci-dessous :

spec:
  hugepages:
    defaultHugepagesSize: 1G
    pages:
    - count: 1024
      node: 0
      size: 2M
    - count: 4
      node: 1
      size: 1G

14.3.3. Configuration d'un nœud pour l'équilibrage dynamique de la charge par IRQ

Configurez un nœud de cluster pour l'équilibrage de charge dynamique IRQ afin de contrôler quels cœurs peuvent recevoir des demandes d'interruption de périphérique (IRQ).

Conditions préalables

  • Pour l'isolation du noyau, tous les composants matériels du serveur doivent prendre en charge l'affinité IRQ. Pour plus d'informations, voir la section Additional resources.

Procédure

  1. Connectez-vous au cluster OpenShift Container Platform en tant qu'utilisateur disposant des privilèges cluster-admin.
  2. Définissez le profil de performance apiVersion pour utiliser performance.openshift.io/v2.
  3. Supprimez le champ globallyDisableIrqLoadBalancing ou attribuez-lui la valeur false.
  4. Définissez les CPU isolés et réservés appropriés. L'extrait suivant illustre un profil qui réserve 2 CPU. L'équilibrage de la charge des IRQ est activé pour les pods fonctionnant sur l'ensemble de CPU isolated:

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: dynamic-irq-profile
    spec:
      cpu:
        isolated: 2-5
        reserved: 0-1
    ...
    Note

    Lorsque vous configurez des CPU réservés et isolés, les conteneurs d'infrastructure dans les pods utilisent les CPU réservés et les conteneurs d'application utilisent les CPU isolés.

  5. Créez le pod qui utilise des CPU exclusifs et attribuez les annotations irq-load-balancing.crio.io et cpu-quota.crio.io à disable. Par exemple :

    apiVersion: v1
    kind: Pod
    metadata:
      name: dynamic-irq-pod
      annotations:
         irq-load-balancing.crio.io: "disable"
         cpu-quota.crio.io: "disable"
    spec:
      containers:
      - name: dynamic-irq-pod
        image: "registry.redhat.io/openshift4/cnf-tests-rhel8:v4.4.12"
        command: ["sleep", "10h"]
        resources:
          requests:
            cpu: 2
            memory: "200M"
          limits:
            cpu: 2
            memory: "200M"
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
      runtimeClassName: performance-dynamic-irq-profile
    ...
  6. Saisissez le pod runtimeClassName sous la forme performance-<profile_name>, où <profile_name> est le name du YAML PerformanceProfile, dans cet exemple, performance-dynamic-irq-profile.
  7. Définir le sélecteur de nœud pour cibler un travailleur cnf.
  8. Assurez-vous que le pod fonctionne correctement. Le statut doit être running, et le nœud cnf-worker correct doit être défini :

    $ oc get pod -o wide

    Résultats attendus

    NAME              READY   STATUS    RESTARTS   AGE     IP             NODE          NOMINATED NODE   READINESS GATES
    dynamic-irq-pod   1/1     Running   0          5h33m   <ip-address>   <node-name>   <none>           <none>

  9. Obtenir les unités centrales sur lesquelles le pod configuré pour l'équilibrage de charge dynamique IRQ fonctionne :

    $ oc exec -it dynamic-irq-pod -- /bin/bash -c "grep Cpus_allowed_list /proc/self/status | awk '{print $2}'"

    Résultats attendus

    Cpus_allowed_list:  2-3

  10. Assurez-vous que la configuration du nœud est appliquée correctement. Accédez au nœud par SSH pour vérifier la configuration.

    $ oc debug node/<node-name>

    Résultats attendus

    Starting pod/<node-name>-debug ...
    To use host binaries, run `chroot /host`
    
    Pod IP: <ip-address>
    If you don't see a command prompt, try pressing enter.
    
    sh-4.4#

  11. Vérifiez que vous pouvez utiliser le système de fichiers du nœud :

    sh-4.4# chroot /host

    Résultats attendus

    sh-4.4#

  12. Assurez-vous que le masque d'affinité CPU du système par défaut n'inclut pas les CPU dynamic-irq-pod, par exemple, les CPU 2 et 3.

    $ cat /proc/irq/default_smp_affinity

    Exemple de sortie

    33

  13. Assurez-vous que les IRQ du système ne sont pas configurées pour fonctionner sur les unités centrales dynamic-irq-pod:

    find /proc/irq/ -name smp_affinity_list -exec sh -c 'i="$1"; mask=$(cat $i); file=$(echo $i); echo $file: $mask' _ {} \;

    Exemple de sortie

    /proc/irq/0/smp_affinity_list: 0-5
    /proc/irq/1/smp_affinity_list: 5
    /proc/irq/2/smp_affinity_list: 0-5
    /proc/irq/3/smp_affinity_list: 0-5
    /proc/irq/4/smp_affinity_list: 0
    /proc/irq/5/smp_affinity_list: 0-5
    /proc/irq/6/smp_affinity_list: 0-5
    /proc/irq/7/smp_affinity_list: 0-5
    /proc/irq/8/smp_affinity_list: 4
    /proc/irq/9/smp_affinity_list: 4
    /proc/irq/10/smp_affinity_list: 0-5
    /proc/irq/11/smp_affinity_list: 0
    /proc/irq/12/smp_affinity_list: 1
    /proc/irq/13/smp_affinity_list: 0-5
    /proc/irq/14/smp_affinity_list: 1
    /proc/irq/15/smp_affinity_list: 0
    /proc/irq/24/smp_affinity_list: 1
    /proc/irq/25/smp_affinity_list: 1
    /proc/irq/26/smp_affinity_list: 1
    /proc/irq/27/smp_affinity_list: 5
    /proc/irq/28/smp_affinity_list: 1
    /proc/irq/29/smp_affinity_list: 0
    /proc/irq/30/smp_affinity_list: 0-5

Certains contrôleurs d'IRQ ne prennent pas en charge le rééquilibrage des IRQ et exposent toujours tous les CPU en ligne comme masque d'IRQ. Ces contrôleurs d'IRQ fonctionnent effectivement sur l'unité centrale 0. Pour plus d'informations sur la configuration de l'hôte, connectez-vous en SSH à l'hôte et exécutez la commande suivante, en remplaçant <irq-num> par le numéro de l'unité centrale que vous souhaitez interroger :

$ cat /proc/irq/<irq-num>/effective_affinity

14.3.3.1. Compatibilité matérielle avec l'affinité IRQ

Pour l'isolation du noyau, tous les composants matériels du serveur doivent prendre en charge l'affinité IRQ. Pour vérifier si les composants matériels de votre serveur prennent en charge l'affinité IRQ, consultez les spécifications matérielles du serveur ou contactez votre fournisseur de matériel.

OpenShift Container Platform prend en charge les périphériques matériels suivants pour l'équilibrage dynamique de la charge :

Tableau 14.2. Contrôleurs d'interface réseau pris en charge

FabricantModelID du vendeurID de l'appareil

Broadcom

BCM57414

14e4

16d7

Broadcom

BCM57508

14e4

1750

Intel

X710

8086

1572

Intel

XL710

8086

1583

Intel

XXV710

8086

158b

Intel

E810-CQDA2

8086

1592

Intel

E810-2CQDA2

8086

1592

Intel

E810-XXVDA2

8086

159b

Intel

E810-XXVDA4

8086

1593

Mellanox

Famille MT27700 [ConnectX-4]

15b3

1013

Mellanox

Famille MT27710 [ConnectX-4 Lx]

15b3

1015

Mellanox

Famille MT27800 [ConnectX-5]

15b3

1017

Mellanox

Famille MT28880 [ConnectX-5 Ex]

15b3

1019

Mellanox

Famille MT28908 [ConnectX-6]

15b3

101b

Mellanox

Famille MT2892 [ConnectX-6 Dx]

15b3

101d

Mellanox

Famille MT2894 [ConnectX-6 Lx]

15b3

101f

Mellanox

MT42822 BlueField-2 en mode NIC ConnectX-6

15b3

a2d6

Pensando

DSC-25 carte de services distribués 25G à double port pour pilote ionique

0x1dd8

0x1002

Pensando

DSC-100 carte de services distribués 100G à double port pour pilote ionique

0x1dd8

0x1003

Silicom

Famille STS

8086

1591

14.3.4. Configuration de l'hyperthreading pour un cluster

Pour configurer l'hyperthreading pour un cluster OpenShift Container Platform, définissez les threads CPU dans le profil de performance sur les mêmes cœurs que ceux configurés pour les pools de CPU réservés ou isolés.

Note

Si vous configurez un profil de performance et que vous modifiez par la suite la configuration de l'hyperthreading pour l'hôte, assurez-vous de mettre à jour les champs CPU isolated et reserved dans le PerformanceProfile YAML pour qu'ils correspondent à la nouvelle configuration.

Avertissement

La désactivation d'une configuration d'hyperthreading de l'hôte précédemment activée peut entraîner l'inexactitude des ID des cœurs de CPU répertoriés dans le fichier PerformanceProfile YAML. Cette configuration incorrecte peut entraîner l'indisponibilité du nœud car les CPU répertoriés ne peuvent plus être trouvés.

Conditions préalables

  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.
  • Installer le CLI OpenShift (oc).

Procédure

  1. Vérifiez quels threads s'exécutent sur quels processeurs pour l'hôte que vous souhaitez configurer.

    Vous pouvez voir quels threads sont en cours d'exécution sur les CPU hôtes en vous connectant au cluster et en exécutant la commande suivante :

    $ lscpu --all --extended

    Exemple de sortie

    CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ    MINMHZ
    0   0    0      0    0:0:0:0       yes    4800.0000 400.0000
    1   0    0      1    1:1:1:0       yes    4800.0000 400.0000
    2   0    0      2    2:2:2:0       yes    4800.0000 400.0000
    3   0    0      3    3:3:3:0       yes    4800.0000 400.0000
    4   0    0      0    0:0:0:0       yes    4800.0000 400.0000
    5   0    0      1    1:1:1:0       yes    4800.0000 400.0000
    6   0    0      2    2:2:2:0       yes    4800.0000 400.0000
    7   0    0      3    3:3:3:0       yes    4800.0000 400.0000

    Dans cet exemple, il y a huit cœurs logiques de CPU fonctionnant sur quatre cœurs physiques de CPU. CPU0 et CPU4 fonctionnent sur le Core0 physique, CPU1 et CPU5 fonctionnent sur le Core 1 physique, et ainsi de suite.

    Pour afficher les threads définis pour un cœur de processeur physique particulier (cpu0 dans l'exemple ci-dessous), ouvrez une invite de commande et exécutez la commande suivante :

    $ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list

    Exemple de sortie

    0-4

  2. Appliquez les CPU isolés et réservés dans le YAML PerformanceProfile. Par exemple, vous pouvez définir les cœurs logiques CPU0 et CPU4 comme isolated, et les cœurs logiques CPU1 à CPU3 et CPU5 à CPU7 comme reserved. Lorsque vous configurez des CPU réservés et isolés, les conteneurs d'infrastructure dans les pods utilisent les CPU réservés et les conteneurs d'application utilisent les CPU isolés.

    ...
      cpu:
        isolated: 0,4
        reserved: 1-3,5-7
    ...
    Note

    Les pools de CPU réservés et isolés ne doivent pas se chevaucher et doivent couvrir tous les cœurs disponibles dans le nœud de travail.

Important

L'hyperthreading est activé par défaut sur la plupart des processeurs Intel. Si vous activez l'hyperthreading, tous les threads traités par un cœur particulier doivent être isolés ou traités sur le même cœur.

14.3.4.1. Désactivation de l'hyperthreading pour les applications à faible latence

Lorsque vous configurez des clusters pour un traitement à faible latence, vous devez vous demander si vous souhaitez désactiver l'hyperthreading avant de déployer le cluster. Pour désactiver l'hyperthreading, procédez comme suit :

  1. Créez un profil de performance adapté à votre matériel et à votre topologie.
  2. Définir nosmt comme un argument supplémentaire du noyau. L'exemple de profil de performance suivant illustre ce paramètre :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: example-performanceprofile
    spec:
      additionalKernelArgs:
        - nmi_watchdog=0
        - audit=0
        - mce=off
        - processor.max_cstate=1
        - idle=poll
        - intel_idle.max_cstate=0
        - nosmt
      cpu:
        isolated: 2-3
        reserved: 0-1
      hugepages:
        defaultHugepagesSize: 1G
        pages:
          - count: 2
            node: 0
            size: 1G
      nodeSelector:
        node-role.kubernetes.io/performance: ''
      realTimeKernel:
        enabled: true
    Note

    Lorsque vous configurez des CPU réservés et isolés, les conteneurs d'infrastructure dans les pods utilisent les CPU réservés et les conteneurs d'application utilisent les CPU isolés.

14.3.5. Comprendre les indices de charge de travail

Le tableau suivant décrit l'impact des combinaisons de consommation d'énergie et de paramètres en temps réel sur la latence.

Note

Les indices de charge de travail suivants peuvent être configurés manuellement. Vous pouvez également utiliser les indices de charge de travail à l'aide du Créateur de profil de performance. Pour plus d'informations sur le profil de performance, voir la section "Création d'un profil de performance".

Paramètres du créateur du profil de performanceIndiceEnvironnementDescription

Défaut

workloadHints:
highPowerConsumption: false
realTime: false

Cluster à haut débit sans exigences de latence

Performances obtenues grâce au partitionnement de l'unité centrale uniquement.

Faible latence

workloadHints:
highPowerConsumption: false
realTime: true

Centres de données régionaux

Des économies d'énergie et une faible latence sont souhaitables : il faut trouver un compromis entre la gestion de l'énergie, la latence et le débit.

Très faible latence

workloadHints:
highPowerConsumption: true
realTime: true

Clusters de pointe, charges de travail critiques en termes de latence

Optimisé pour une latence minimale absolue et un déterminisme maximal au prix d'une consommation d'énergie accrue.

Gestion de l'alimentation par pod

workloadHints:
realTime: true
highPowerConsumption: false
perPodPowerManagement: true

Charges de travail critiques et non critiques

Permet la gestion de l'énergie par module.

Ressources supplémentaires

14.3.6. Configuration manuelle des indices de charge de travail

Procédure

  1. Créez un site PerformanceProfile adapté au matériel et à la topologie de l'environnement, comme décrit dans le tableau de la section "Comprendre les indices de charge de travail". Ajustez le profil pour qu'il corresponde à la charge de travail prévue. Dans cet exemple, nous réglons la latence pour qu'elle soit la plus faible possible.
  2. Ajoutez les indices de charge de travail highPowerConsumption et realTime. Les deux sont réglés sur true ici.

        apiVersion: performance.openshift.io/v2
        kind: PerformanceProfile
        metadata:
          name: workload-hints
        spec:
          ...
          workloadHints:
            highPowerConsumption: true 1
            realTime: true 2
    1
    Si highPowerConsumption est true, le nœud est réglé pour une latence très faible au prix d'une consommation d'énergie accrue.
    2
    Désactive certaines fonctions de débogage et de surveillance qui peuvent affecter la latence du système.

14.3.7. Limiter les CPU pour les conteneurs d'infrastructures et d'applications

Les tâches génériques de maintenance et de charge de travail utilisent les CPU d'une manière qui peut avoir un impact sur les processus sensibles à la latence. Par défaut, le moteur d'exécution des conteneurs utilise tous les processeurs en ligne pour exécuter tous les conteneurs ensemble, ce qui peut entraîner des changements de contexte et des pics de latence. Le partitionnement des CPU empêche les processus bruyants d'interférer avec les processus sensibles à la latence en les séparant les uns des autres. Le tableau suivant décrit comment les processus s'exécutent sur une unité centrale après avoir réglé le nœud à l'aide de l'opérateur de réglage du nœud :

Tableau 14.3. Affectation de l'unité centrale du processus

Type de processusDétails

Burstable et BestEffort pods

Fonctionne sur n'importe quelle unité centrale, sauf en cas de charge de travail à faible latence

Pods d'infrastructure

Fonctionne sur n'importe quelle unité centrale, sauf en cas de charge de travail à faible latence

Interruptions

Redirections vers des CPU réservés (optionnel dans OpenShift Container Platform 4.7 et plus)

Processus du noyau

Broches vers les unités centrales réservées

Pods de charge de travail sensibles aux temps de latence

Pins vers un ensemble spécifique d'unités centrales exclusives du pool isolé

Processus du système d'exploitation/services Systemd

Broches vers les unités centrales réservées

La capacité allouable des cœurs sur un nœud pour les pods de tous les types de processus QoS, Burstable, BestEffort, ou Guaranteed, est égale à la capacité du pool isolé. La capacité du pool réservé est retirée de la capacité totale des cœurs du nœud pour être utilisée par le cluster et les tâches ménagères du système d'exploitation.

Exemple 1

Un nœud a une capacité de 100 cœurs. À l'aide d'un profil de performance, l'administrateur de la grappe alloue 50 cœurs au pool isolé et 50 cœurs au pool réservé. L'administrateur de cluster attribue 25 cœurs aux pods QoS Guaranteed et 25 cœurs aux pods BestEffort ou Burstable. Cela correspond à la capacité du pool isolé.

Exemple 2

Un nœud a une capacité de 100 cœurs. À l'aide d'un profil de performance, l'administrateur de la grappe alloue 50 cœurs au pool isolé et 50 cœurs au pool réservé. L'administrateur de cluster attribue 50 cœurs aux pods QoS Guaranteed et un cœur pour les pods BestEffort ou Burstable. La capacité du pool isolé est ainsi dépassée d'un cœur. La planification des pods échoue en raison d'une capacité insuffisante de l'unité centrale.

Le modèle de partitionnement exact à utiliser dépend de nombreux facteurs tels que le matériel, les caractéristiques de la charge de travail et la charge prévue du système. Voici quelques exemples de cas d'utilisation :

  • Si la charge de travail sensible à la latence utilise un matériel spécifique, tel qu'un contrôleur d'interface réseau (NIC), assurez-vous que les CPU du pool isolé sont aussi proches que possible de ce matériel. Au minimum, vous devez placer la charge de travail dans le même nœud NUMA (Non-Uniform Memory Access).
  • Le pool réservé est utilisé pour gérer toutes les interruptions. Lorsque vous dépendez du réseau du système, allouez un pool de réserve suffisamment grand pour gérer toutes les interruptions de paquets entrants. Dans la version 4.12 et les versions ultérieures, les charges de travail peuvent éventuellement être qualifiées de sensibles.

La décision concernant les unités centrales spécifiques à utiliser pour les partitions réservées et isolées nécessite une analyse et des mesures détaillées. Des facteurs tels que l'affinité NUMA des périphériques et de la mémoire jouent un rôle. La sélection dépend également de l'architecture de la charge de travail et du cas d'utilisation spécifique.

Important

Les pools de CPU réservés et isolés ne doivent pas se chevaucher et doivent couvrir tous les cœurs disponibles dans le nœud de travail.

Pour garantir que les tâches ménagères et les charges de travail n'interfèrent pas les unes avec les autres, spécifiez deux groupes de CPU dans la section spec du profil de performance.

  • isolated - Spécifie les unités centrales pour les charges de travail des conteneurs d'application. Ces unités centrales ont la latence la plus faible. Les processus de ce groupe n'ont pas d'interruptions et peuvent, par exemple, atteindre une bande passante DPDK sans perte de paquets beaucoup plus élevée.
  • reserved - Spécifie les unités centrales pour les tâches d'entretien du cluster et du système d'exploitation. Les threads du groupe reserved sont souvent occupés. N'exécutez pas d'applications sensibles aux temps de latence dans le groupe reserved. Les applications sensibles aux temps de latence sont exécutées dans le groupe isolated.

Procédure

  1. Créer un profil de performance adapté au matériel et à la topologie de l'environnement.
  2. Ajoutez les paramètres reserved et isolated avec les CPU que vous souhaitez réserver et isoler pour les conteneurs d'infrastructure et d'application :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: infra-cpus
    spec:
      cpu:
        reserved: "0-4,9" 1
        isolated: "5-8" 2
      nodeSelector: 3
        node-role.kubernetes.io/worker: ""
    1
    Spécifiez les unités centrales destinées aux conteneurs infra pour effectuer les tâches de maintenance du cluster et du système d'exploitation.
    2
    Spécifiez les unités centrales destinées aux conteneurs d'application pour l'exécution des charges de travail.
    3
    Facultatif : Spécifiez un sélecteur de nœuds pour appliquer le profil de performance à des nœuds spécifiques.

14.4. Réduction des files d'attente NIC à l'aide de l'opérateur Node Tuning

L'opérateur de réglage des nœuds vous permet d'ajuster le nombre de files d'attente du contrôleur d'interface réseau (NIC) pour chaque périphérique réseau en configurant le profil de performance. Les files d'attente des périphériques réseau permettent de répartir les paquets entre différentes files d'attente physiques et chaque file d'attente dispose d'un fil d'exécution distinct pour le traitement des paquets.

Dans les systèmes en temps réel ou à faible latence, toutes les lignes de demande d'interruption (IRQ) inutiles reliées aux unités centrales isolées doivent être déplacées vers des unités centrales réservées ou de maintien.

Dans les déploiements avec des applications qui nécessitent un système, une mise en réseau OpenShift Container Platform ou dans les déploiements mixtes avec des charges de travail Data Plane Development Kit (DPDK), plusieurs files d'attente sont nécessaires pour obtenir un bon débit et le nombre de files d'attente NIC devrait être ajusté ou rester inchangé. Par exemple, pour obtenir une faible latence, le nombre de files d'attente NIC pour les charges de travail basées sur le DPDK doit être réduit au nombre de CPU réservés ou de maintenance.

Trop de files d'attente sont créées par défaut pour chaque unité centrale et elles ne s'intègrent pas dans les tables d'interruption des unités centrales de gestion lorsque l'on cherche à réduire la latence. La réduction du nombre de files d'attente permet un réglage correct. Un plus petit nombre de files d'attente signifie un plus petit nombre d'interruptions qui s'intègrent alors dans la table IRQ.

Note

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon permettait de régler automatiquement les performances des applications à faible latence. Dans OpenShift Container Platform 4.11 et les versions ultérieures, cette fonctionnalité fait partie de l'opérateur Node Tuning.

14.4.1. Ajuster les files d'attente NIC avec le profil de performance

Le profil de performance vous permet d'ajuster le nombre de files d'attente pour chaque périphérique réseau.

Périphériques réseau pris en charge :

  • Dispositifs de réseau non virtuels
  • Dispositifs de réseau prenant en charge plusieurs files d'attente (canaux)

Périphériques réseau non pris en charge :

  • Interfaces réseau purement logicielles
  • Dispositifs de blocage
  • Fonctions virtuelles Intel DPDK

Conditions préalables

  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.
  • Installez le CLI OpenShift (oc).

Procédure

  1. Connectez-vous au cluster OpenShift Container Platform exécutant Node Tuning Operator en tant qu'utilisateur disposant des privilèges cluster-admin.
  2. Créez et appliquez un profil de performance adapté à votre matériel et à votre topologie. Pour obtenir des conseils sur la création d'un profil, reportez-vous à la section "Création d'un profil de performances".
  3. Modifier le profil de performance créé :

    oc edit -f <votre_nom_de_profil>.yaml
  4. Remplir le champ spec avec l'objet net. La liste d'objets peut contenir deux champs :

    • userLevelNetworking est un champ obligatoire spécifié sous la forme d'un indicateur booléen. Si userLevelNetworking est true, le nombre de files d'attente correspond au nombre d'unités centrales réservées pour tous les périphériques pris en charge. La valeur par défaut est false.
    • devices est un champ facultatif spécifiant une liste de périphériques dont les files d'attente seront réglées sur le nombre de CPU réservé. Si la liste des périphériques est vide, la configuration s'applique à tous les périphériques du réseau. La configuration est la suivante :

      • interfaceName: Ce champ indique le nom de l'interface et prend en charge les caractères génériques de type shell, qui peuvent être positifs ou négatifs.

        • Les exemples de syntaxe des caractères génériques sont les suivants : <string> .*
        • Les règles négatives sont précédées d'un point d'exclamation. Pour appliquer les modifications apportées à la file d'attente du réseau à tous les périphériques autres que ceux de la liste d'exclusion, utilisez !<device>, par exemple, !eno1.
      • vendorID: L'ID du fournisseur de l'appareil réseau représenté par un nombre hexadécimal de 16 bits avec un préfixe 0x.
      • deviceID: L'ID de l'appareil réseau (modèle) représenté par un nombre hexadécimal de 16 bits avec un préfixe 0x.

        Note

        Lorsqu'un deviceID est spécifié, le vendorID doit également être défini. Un dispositif qui correspond à tous les identificateurs de dispositif spécifiés dans une entrée de dispositif interfaceName, vendorID, ou une paire de vendorID plus deviceID est qualifié de dispositif de réseau. Le nombre de files d'attente nettes de ce périphérique réseau est alors fixé au nombre d'unités centrales réservées.

        Lorsque deux dispositifs ou plus sont spécifiés, le nombre de files d'attente nettes est fixé à tout dispositif net correspondant à l'un d'entre eux.

  5. Définissez le nombre de files d'attente sur le nombre de CPU réservées pour tous les périphériques en utilisant cet exemple de profil de performance :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: manual
    spec:
      cpu:
        isolated: 3-51,54-103
        reserved: 0-2,52-54
      net:
        userLevelNetworking: true
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
  6. Définissez le nombre de files d'attente sur le nombre d'unités centrales réservées pour tous les périphériques correspondant à l'un des identifiants de périphérique définis en utilisant cet exemple de profil de performance :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: manual
    spec:
      cpu:
        isolated: 3-51,54-103
        reserved: 0-2,52-54
      net:
        userLevelNetworking: true
        devices:
        - interfaceName: “eth0”
        - interfaceName: “eth1”
        - vendorID: “0x1af4”
        - deviceID: “0x1000”
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
  7. Définissez le nombre de files d'attente sur le nombre de CPU réservées pour tous les périphériques commençant par le nom d'interface eth en utilisant cet exemple de profil de performance :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: manual
    spec:
      cpu:
        isolated: 3-51,54-103
        reserved: 0-2,52-54
      net:
        userLevelNetworking: true
        devices:
        - interfaceName: “eth*”
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
  8. Définissez le nombre de files d'attente sur le nombre d'unités centrales réservées pour tous les périphériques dont l'interface porte un nom autre que eno1 à l'aide de cet exemple de profil de performances :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: manual
    spec:
      cpu:
        isolated: 3-51,54-103
        reserved: 0-2,52-54
      net:
        userLevelNetworking: true
        devices:
        - interfaceName: “!eno1”
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
  9. Définissez le nombre de files d'attente sur le nombre de CPU réservées pour tous les périphériques ayant un nom d'interface eth0, vendorID de 0x1af4, et deviceID de 0x1000 en utilisant cet exemple de profil de performance :

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: manual
    spec:
      cpu:
        isolated: 3-51,54-103
        reserved: 0-2,52-54
      net:
        userLevelNetworking: true
        devices:
        - interfaceName: “eth0”
        - vendorID: “0x1af4”
        - deviceID: “0x1000”
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
  10. Appliquer le profil de performance mis à jour :

    oc apply -f <votre_nom_de_profil>.yaml

Ressources supplémentaires

14.4.2. Vérification de l'état de la file d'attente

Dans cette section, un certain nombre d'exemples illustrent différents profils de performance et la manière de vérifier que les changements sont appliqués.

Exemple 1

Dans cet exemple, le nombre de files d'attente nettes est défini sur le nombre de CPU réservé (2) pour les périphériques pris en charge par all.

La section correspondante du profil de performance est la suivante :

apiVersion: performance.openshift.io/v2
metadata:
  name: performance
spec:
  kind: PerformanceProfile
  spec:
    cpu:
      reserved: 0-1  #total = 2
      isolated: 2-8
    net:
      userLevelNetworking: true
# ...
  • Affichez l'état des files d'attente associées à un périphérique à l'aide de la commande suivante :

    Note

    Exécutez cette commande sur le nœud où le profil de performance a été appliqué.

    $ ethtool -l <device>
  • Vérifier l'état de la file d'attente avant l'application du profil :

    $ ethtool -l ens4

    Exemple de sortie

    Channel parameters for ens4:
    Pre-set maximums:
    RX:         0
    TX:         0
    Other:      0
    Combined:   4
    Current hardware settings:
    RX:         0
    TX:         0
    Other:      0
    Combined:   4

  • Vérifiez l'état de la file d'attente après l'application du profil :

    $ ethtool -l ens4

    Exemple de sortie

    Channel parameters for ens4:
    Pre-set maximums:
    RX:         0
    TX:         0
    Other:      0
    Combined:   4
    Current hardware settings:
    RX:         0
    TX:         0
    Other:      0
    Combined:   2 1

1
Le canal combiné montre que le nombre total de CPU réservés pour les périphériques pris en charge par all est de 2. Cela correspond à ce qui est configuré dans le profil de performance.

Exemple 2

Dans cet exemple, le nombre de files d'attente nettes est défini sur le nombre de CPU réservé (2) pour les périphériques réseau pris en charge par all avec une adresse spécifique vendorID.

La section correspondante du profil de performance est la suivante :

apiVersion: performance.openshift.io/v2
metadata:
  name: performance
spec:
  kind: PerformanceProfile
  spec:
    cpu:
      reserved: 0-1  #total = 2
      isolated: 2-8
    net:
      userLevelNetworking: true
      devices:
      - vendorID = 0x1af4
# ...
  • Affichez l'état des files d'attente associées à un périphérique à l'aide de la commande suivante :

    Note

    Exécutez cette commande sur le nœud où le profil de performance a été appliqué.

    $ ethtool -l <device>
  • Vérifiez l'état de la file d'attente après l'application du profil :

    $ ethtool -l ens4

    Exemple de sortie

    Channel parameters for ens4:
    Pre-set maximums:
    RX:         0
    TX:         0
    Other:      0
    Combined:   4
    Current hardware settings:
    RX:         0
    TX:         0
    Other:      0
    Combined:   2 1

1
Le nombre total d'unités centrales réservées pour tous les périphériques pris en charge avec vendorID=0x1af4 est de 2. Par exemple, s'il y a un autre périphérique réseau ens2 avec vendorID=0x1af4, il aura également un total de files d'attente nettes de 2. Cela correspond à ce qui est configuré dans le profil de performance.

Exemple 3

Dans cet exemple, le nombre de files d'attente nettes est défini sur le nombre d'unités centrales réservées (2) pour les périphériques réseau pris en charge par all qui correspondent à l'un des identifiants de périphérique définis.

La commande udevadm info permet d'obtenir un rapport détaillé sur un appareil. Dans cet exemple, les appareils sont les suivants

# udevadm info -p /sys/class/net/ens4
...
E: ID_MODEL_ID=0x1000
E: ID_VENDOR_ID=0x1af4
E: INTERFACE=ens4
...
# udevadm info -p /sys/class/net/eth0
...
E: ID_MODEL_ID=0x1002
E: ID_VENDOR_ID=0x1001
E: INTERFACE=eth0
...
  • Définissez les files d'attente nettes à 2 pour un appareil dont la valeur interfaceName est égale à eth0 et pour tous les appareils dont la valeur vendorID=0x1af4 présente le profil de performance suivant :

    apiVersion: performance.openshift.io/v2
    metadata:
      name: performance
    spec:
      kind: PerformanceProfile
        spec:
          cpu:
            reserved: 0-1  #total = 2
            isolated: 2-8
          net:
            userLevelNetworking: true
            devices:
            - interfaceName = eth0
            - vendorID = 0x1af4
    ...
  • Vérifiez l'état de la file d'attente après l'application du profil :

    $ ethtool -l ens4

    Exemple de sortie

    Channel parameters for ens4:
    Pre-set maximums:
    RX:         0
    TX:         0
    Other:      0
    Combined:   4
    Current hardware settings:
    RX:         0
    TX:         0
    Other:      0
    Combined:   2 1

    1
    Le nombre total d'unités centrales réservées pour tous les périphériques pris en charge avec vendorID=0x1af4 est fixé à 2. Par exemple, s'il existe un autre périphérique réseau ens2 avec vendorID=0x1af4, le nombre total de files d'attente nettes sera également fixé à 2. De même, un périphérique avec interfaceName égal à eth0 aura le nombre total de files d'attente nettes fixé à 2.

14.4.3. Journalisation associée à l'ajustement des files d'attente NIC

Les messages de logs détaillant les appareils assignés sont enregistrés dans les logs respectifs du démon Tuned. Les messages suivants peuvent être enregistrés dans le fichier /var/log/tuned/tuned.log:

  • Un message INFO est enregistré, détaillant les dispositifs attribués avec succès :

    INFO tuned.plugins.base: instance net_test (net): assigning devices ens1, ens2, ens3
  • Un message WARNING est enregistré si aucun des dispositifs ne peut être attribué :

    WARNING  tuned.plugins.base: instance net_test: no matching devices available

14.5. Débogage de l'état des réglages du CNF à faible latence

La ressource personnalisée (CR) PerformanceProfile contient des champs d'état permettant de signaler l'état des réglages et de déboguer les problèmes de dégradation de la latence. Ces champs indiquent les conditions qui décrivent l'état de la fonctionnalité de rapprochement de l'opérateur.

Un problème typique peut survenir lorsque l'état des pools de configuration de machines attachés au profil de performance est dégradé, ce qui entraîne une dégradation de l'état de PerformanceProfile. Dans ce cas, le pool de configuration de machines émet un message d'échec.

L'opérateur Node Tuning contient le champ d'état performanceProfile.spec.status.Conditions:

Status:
  Conditions:
    Last Heartbeat Time:   2020-06-02T10:01:24Z
    Last Transition Time:  2020-06-02T10:01:24Z
    Status:                True
    Type:                  Available
    Last Heartbeat Time:   2020-06-02T10:01:24Z
    Last Transition Time:  2020-06-02T10:01:24Z
    Status:                True
    Type:                  Upgradeable
    Last Heartbeat Time:   2020-06-02T10:01:24Z
    Last Transition Time:  2020-06-02T10:01:24Z
    Status:                False
    Type:                  Progressing
    Last Heartbeat Time:   2020-06-02T10:01:24Z
    Last Transition Time:  2020-06-02T10:01:24Z
    Status:                False
    Type:                  Degraded

Le champ Status contient Conditions qui spécifie les valeurs Type indiquant le statut du profil de performance :

Available
Toutes les configurations de machines et tous les profils accordés ont été créés avec succès et sont disponibles pour les composants du cluster chargés de les traiter (NTO, MCO, Kubelet).
Upgradeable
Indique si les ressources gérées par l'opérateur sont dans un état qui permet de les mettre à niveau en toute sécurité.
Progressing
Indique que le processus de déploiement du profil de performance a commencé.
Degraded

Indique une erreur si :

  • La validation du profil de performance a échoué.
  • La création de tous les composants pertinents n'a pas abouti.

Chacun de ces types contient les champs suivants :

Status
L'état pour le type spécifique (true ou false).
Timestamp
L'horodatage de la transaction.
Reason string
Le motif lisible par machine.
Message string
Raison lisible par l'homme décrivant l'état et les détails de l'erreur, le cas échéant.

14.5.1. Pools de configuration de machines

Un profil de performance et ses produits créés sont appliqués à un nœud en fonction d'un pool de configuration machine (MCP) associé. Le MCP contient des informations précieuses sur l'avancement de l'application des configurations de machine créées par les profils de performance qui englobent les args du noyau, la configuration de kube, l'allocation de pages énormes et le déploiement de rt-kernel. Le contrôleur de profil de performance surveille les changements dans le MCP et met à jour le statut du profil de performance en conséquence.

Les seules conditions renvoyées par le GPE à l'état de profil de performance sont celles où le GPE est Degraded, ce qui conduit à performaceProfile.status.condition.Degraded = true.

Exemple :

L'exemple suivant concerne un profil de performance auquel est associé un pool de configuration de machine (worker-cnf) qui a été créé pour lui :

  1. Le pool de configuration de la machine associée est dans un état dégradé :

    # oc get mcp

    Exemple de sortie

    NAME         CONFIG                                                 UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
    master       rendered-master-2ee57a93fa6c9181b546ca46e1571d2d       True      False      False      3              3                   3                     0                      2d21h
    worker       rendered-worker-d6b2bdc07d9f5a59a6b68950acf25e5f       True      False      False      2              2                   2                     0                      2d21h
    worker-cnf   rendered-worker-cnf-6c838641b8a08fff08dbd8b02fb63f7c   False     True       True       2              1                   1                     1                      2d20h

  2. La section describe du PCM en donne la raison :

    # oc describe mcp worker-cnf

    Exemple de sortie

      Message:               Node node-worker-cnf is reporting: "prepping update:
      machineconfig.machineconfiguration.openshift.io \"rendered-worker-cnf-40b9996919c08e335f3ff230ce1d170\" not
      found"
        Reason:                1 nodes are reporting degraded status on sync

  3. L'état dégradé devrait également apparaître dans le champ du profil de performance status marqué comme degraded = true:

    # oc describe performanceprofiles performance

    Exemple de sortie

    Message: Machine config pool worker-cnf Degraded Reason: 1 nodes are reporting degraded status on sync.
    Machine config pool worker-cnf Degraded Message: Node yquinn-q8s5v-w-b-z5lqn.c.openshift-gce-devel.internal is
    reporting: "prepping update: machineconfig.machineconfiguration.openshift.io
    \"rendered-worker-cnf-40b9996919c08e335f3ff230ce1d170\" not found".    Reason:  MCPDegraded
       Status:  True
       Type:    Degraded

14.6. Collecte de données de débogage de réglage à faible latence pour Red Hat Support

Lorsque vous ouvrez un dossier d'assistance, il est utile de fournir des informations de débogage sur votre cluster à l'équipe d'assistance de Red Hat.

L'outil must-gather vous permet de collecter des informations de diagnostic sur votre cluster OpenShift Container Platform, y compris le réglage des nœuds, la topologie NUMA et d'autres informations nécessaires pour déboguer les problèmes de configuration à faible latence.

Pour une assistance rapide, fournissez des informations de diagnostic pour OpenShift Container Platform et pour le réglage de la faible latence.

14.6.1. À propos de l'outil de collecte obligatoire

La commande CLI oc adm must-gather recueille les informations de votre cluster les plus susceptibles d'être nécessaires pour le débogage, telles que

  • Définitions des ressources
  • Journaux d'audit
  • Journaux de service

Vous pouvez spécifier une ou plusieurs images lorsque vous exécutez la commande en incluant l'argument --image. Lorsque vous spécifiez une image, l'outil collecte les données relatives à cette fonctionnalité ou à ce produit. Lorsque vous exécutez la commande oc adm must-gather, un nouveau module est créé sur le cluster. Les données sont collectées sur ce module et enregistrées dans un nouveau répertoire commençant par must-gather.local. Ce répertoire est créé dans votre répertoire de travail actuel.

14.6.2. A propos de la collecte de données de réglage à faible latence

Utilisez la commande CLI oc adm must-gather pour collecter des informations sur votre cluster, y compris les fonctionnalités et les objets associés au réglage de la faible latence, notamment :

  • Les espaces de noms et les objets enfants de l'opérateur d'optimisation des nœuds.
  • MachineConfigPool et les objets MachineConfig associés.
  • L'opérateur d'accord de nœud et les objets accordés associés.
  • Options de ligne de commande du noyau Linux.
  • Topologie CPU et NUMA
  • Informations de base sur les périphériques PCI et la localité NUMA.

Pour collecter des informations de débogage avec must-gather, vous devez spécifier l'image de l'opérateur Performance Addon must-gather:

--image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.12.
Note

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon permettait de régler automatiquement les performances des applications à faible latence. Dans OpenShift Container Platform 4.11 et les versions ultérieures, cette fonctionnalité fait partie de l'opérateur Node Tuning. Cependant, vous devez toujours utiliser l'image performance-addon-operator-must-gather lors de l'exécution de la commande must-gather.

14.6.3. Collecte de données sur des caractéristiques spécifiques

Vous pouvez obtenir des informations de débogage sur des fonctionnalités spécifiques en utilisant la commande CLI oc adm must-gather avec l'argument --image ou --image-stream. L'outil must-gather prend en charge plusieurs images, ce qui vous permet de recueillir des données sur plus d'une fonctionnalité en exécutant une seule commande.

Note

Pour collecter les données par défaut must-gather en plus des données relatives à des caractéristiques spécifiques, ajoutez l'argument --image-stream=openshift/must-gather.

Note

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon permettait de régler automatiquement les performances des applications à faible latence. Dans OpenShift Container Platform 4.11, ces fonctions font partie de l'opérateur Node Tuning. Cependant, vous devez toujours utiliser l'image performance-addon-operator-must-gather lors de l'exécution de la commande must-gather.

Conditions préalables

  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.
  • Le CLI (oc) de la plateforme de conteneurs OpenShift est installé.

Procédure

  1. Accédez au répertoire dans lequel vous souhaitez stocker les données must-gather.
  2. Exécutez la commande oc adm must-gather avec un ou plusieurs arguments --image ou --image-stream. Par exemple, la commande suivante rassemble à la fois les données par défaut de la grappe et les informations spécifiques à l'opérateur Node Tuning :

    $ oc adm must-gather \
     --image-stream=openshift/must-gather \ 1
    
     --image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.12 2
    1
    L'image par défaut de OpenShift Container Platform must-gather.
    2
    L'image must-gather pour les diagnostics de réglage à faible latence.
  3. Créez un fichier compressé à partir du répertoire must-gather qui a été créé dans votre répertoire de travail. Par exemple, sur un ordinateur utilisant un système d'exploitation Linux, exécutez la commande suivante :

     $ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ 1
    1
    Remplacez must-gather-local.5421342344627712289/ par le nom du répertoire.
  4. Joignez le fichier compressé à votre demande d'assistance sur le portail client de Red Hat.

Ressources supplémentaires

Chapitre 15. Réalisation de tests de latence pour la vérification de la plate-forme

Vous pouvez utiliser l'image de tests Cloud-native Network Functions (CNF) pour effectuer des tests de latence sur un cluster OpenShift Container Platform compatible CNF, où tous les composants nécessaires à l'exécution des charges de travail CNF sont installés. Exécutez les tests de latence pour valider le réglage des nœuds pour votre charge de travail.

L'image du conteneur cnf-tests est disponible à l'adresse registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12.

Important

L'image cnf-tests comprend également plusieurs tests qui ne sont pas pris en charge par Red Hat à l'heure actuelle. Seuls les tests de latence sont pris en charge par Red Hat.

15.1. Conditions préalables à l'exécution de tests de latence

Votre cluster doit remplir les conditions suivantes pour que vous puissiez effectuer les tests de latence :

  1. Vous avez configuré un profil de performance avec l'opérateur Node Tuning.
  2. Vous avez appliqué toutes les configurations CNF requises dans le cluster.
  3. Vous avez un MachineConfigPool CR préexistant appliqué dans le cluster. Le pool de travailleurs par défaut est worker-cnf.

Ressources supplémentaires

15.2. A propos du mode de découverte pour les tests de latence

Le mode découverte permet de valider le fonctionnement d'un cluster sans en modifier la configuration. Les configurations existantes de l'environnement sont utilisées pour les tests. Les tests peuvent trouver les éléments de configuration nécessaires et les utiliser pour exécuter les tests. Si les ressources nécessaires à l'exécution d'un test spécifique ne sont pas trouvées, le test est ignoré et un message approprié est envoyé à l'utilisateur. Une fois les tests terminés, aucun nettoyage des éléments de configuration préconfigurés n'est effectué et l'environnement de test peut être immédiatement utilisé pour un autre test.

Important

Lors de l'exécution des tests de latence, always exécute les tests avec -e DISCOVERY_MODE=true et -ginkgo.focus réglés sur le test de latence approprié. Si vous n'exécutez pas les tests de latence en mode découverte, la configuration du profil de performance de votre cluster live sera modifiée par l'exécution du test.

Limiter les nœuds utilisés lors des tests

Les nœuds sur lesquels les tests sont exécutés peuvent être limités en spécifiant une variable d'environnement NODES_SELECTOR, par exemple -e NODES_SELECTOR=node-role.kubernetes.io/worker-cnf. Toutes les ressources créées par le test sont limitées aux nœuds dont les étiquettes correspondent.

Note

Si vous souhaitez remplacer le groupe de travailleurs par défaut, passez la variable -e ROLE_WORKER_CNF=<custom_worker_pool> à la commande en spécifiant une étiquette appropriée.

15.3. Mesure de la latence

L'image cnf-tests utilise trois outils pour mesurer la latence du système :

  • hwlatdetect
  • cyclictest
  • oslat

Chaque outil a un usage spécifique. Utilisez les outils dans l'ordre pour obtenir des résultats de test fiables.

hwlatdetect
Mesure la ligne de base que le matériel bare-metal peut atteindre. Avant de procéder au test de latence suivant, assurez-vous que la latence signalée par hwlatdetect respecte le seuil requis, car vous ne pouvez pas corriger les pics de latence du matériel en réglant le système d'exploitation.
cyclocontrôle
Vérifie la latence de l'ordonnanceur du noyau en temps réel après que hwlatdetect a passé la validation. L'outil cyclictest programme un timer répété et mesure la différence entre le temps de déclenchement souhaité et le temps de déclenchement réel. Cette différence peut mettre en évidence des problèmes de base dans le réglage, causés par des interruptions ou des priorités de processus. L'outil doit fonctionner sur un noyau en temps réel.
oslat
Se comporte comme une application DPDK à forte intensité de CPU et mesure toutes les interruptions et perturbations de la boucle occupée qui simule un traitement de données à forte intensité de CPU.

Les tests introduisent les variables d'environnement suivantes :

Tableau 15.1. Variables d'environnement pour le test de latence

Variables d’environnementDescription

LATENCY_TEST_DELAY

Spécifie le temps en secondes après lequel le test commence à s'exécuter. Vous pouvez utiliser cette variable pour permettre à la boucle de réconciliation du gestionnaire de CPU de mettre à jour le pool de CPU par défaut. La valeur par défaut est 0.

LATENCY_TEST_CPUS

Spécifie le nombre de CPU que le pod exécutant les tests de latence utilise. Si vous ne définissez pas cette variable, la configuration par défaut inclut toutes les unités centrales isolées.

LATENCY_TEST_RUNTIME

Spécifie le temps en secondes pendant lequel le test de latence doit être exécuté. La valeur par défaut est de 300 secondes.

HWLATDETECT_MAXIMUM_LATENCY

Spécifie la latence matérielle maximale acceptable en microsecondes pour la charge de travail et le système d'exploitation. Si vous ne définissez pas la valeur de HWLATDETECT_MAXIMUM_LATENCY ou MAXIMUM_LATENCY, l'outil compare le seuil attendu par défaut (20μs) et la latence maximale réelle dans l'outil lui-même. Ensuite, le test échoue ou réussit en conséquence.

CYCLICTEST_MAXIMUM_LATENCY

Spécifie la latence maximale en microsecondes que tous les threads attendent avant de se réveiller pendant l'exécution de cyclictest. Si vous ne définissez pas la valeur de CYCLICTEST_MAXIMUM_LATENCY ou MAXIMUM_LATENCY, l'outil ne compare pas la latence maximale prévue et la latence maximale réelle.

OSLAT_MAXIMUM_LATENCY

Spécifie la latence maximale acceptable en microsecondes pour les résultats du test oslat. Si vous ne définissez pas la valeur de OSLAT_MAXIMUM_LATENCY ou MAXIMUM_LATENCY, l'outil ne compare pas la latence maximale prévue et la latence maximale réelle.

MAXIMUM_LATENCY

Variable unifiée qui spécifie la latence maximale acceptable en microsecondes. Applicable à tous les outils de latence disponibles.

LATENCY_TEST_RUN

Paramètre booléen qui indique si les tests doivent être exécutés. LATENCY_TEST_RUN est défini sur false par défaut. Pour exécuter les tests de latence, définissez cette valeur sur true.

Note

Les variables spécifiques à un outil de latence ont la priorité sur les variables unifiées. Par exemple, si OSLAT_MAXIMUM_LATENCY est réglé sur 30 microsecondes et MAXIMUM_LATENCY sur 10 microsecondes, le test oslat sera exécuté avec une latence maximale acceptable de 30 microsecondes.

15.4. Exécution des tests de latence

Exécutez les tests de latence du cluster pour valider le réglage des nœuds pour votre charge de travail Cloud-native Network Functions (CNF).

Important

Always exécuter les tests de latence avec DISCOVERY_MODE=true. Si vous ne le faites pas, la suite de tests apportera des modifications à la configuration du cluster en cours d'exécution.

Note

Lorsque vous exécutez les commandes podman en tant qu'utilisateur non root ou non privilégié, les chemins de montage peuvent échouer avec des erreurs permission denied. Pour que la commande podman fonctionne, ajoutez :Z à la création des volumes ; par exemple, -v $(pwd)/:/kubeconfig:Z. Cela permet à podman d'effectuer le réétiquetage SELinux approprié.

Procédure

  1. Ouvrez une invite dans le répertoire contenant le fichier kubeconfig.

    Vous fournissez à l'image de test un fichier kubeconfig dans le répertoire courant et la variable d'environnement $KUBECONFIG correspondante, montée par l'intermédiaire d'un volume. Cela permet au conteneur en cours d'exécution d'utiliser le fichier kubeconfig depuis l'intérieur du conteneur.

  2. Exécutez les tests de latence en entrant la commande suivante :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
  3. En option : Ajoutez -ginkgo.dryRun pour exécuter les tests de latence en mode "dry-run". Ceci est utile pour vérifier ce que les tests exécutent.
  4. Facultatif : Ajoutez -ginkgo.v pour exécuter les tests avec une verbosité accrue.
  5. Facultatif : Pour effectuer les tests de latence en fonction d'un profil de performance spécifique, exécutez la commande suivante, en remplaçant les valeurs appropriées :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e LATENCY_TEST_RUN=true -e FEATURES=performance -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \
    -e PERF_TEST_PROFILE=<performance_profile> registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh -ginkgo.focus="[performance]\ Latency\ Test"

    où :

    <performance_profile>
    Est le nom du profil de performance sur lequel vous souhaitez effectuer les tests de latence.
    Important

    Pour que les résultats des tests de latence soient valables, les tests doivent être effectués pendant au moins 12 heures.

15.4.1. Exécution de hwlatdetect

L'outil hwlatdetect est disponible dans le paquetage rt-kernel avec un abonnement normal à Red Hat Enterprise Linux (RHEL) 8.x.

Important

Always exécuter les tests de latence avec DISCOVERY_MODE=true. Si vous ne le faites pas, la suite de tests apportera des modifications à la configuration du cluster en cours d'exécution.

Note

Lorsque vous exécutez les commandes podman en tant qu'utilisateur non root ou non privilégié, les chemins de montage peuvent échouer avec des erreurs permission denied. Pour que la commande podman fonctionne, ajoutez :Z à la création des volumes ; par exemple, -v $(pwd)/:/kubeconfig:Z. Cela permet à podman d'effectuer le réétiquetage SELinux approprié.

Conditions préalables

  • Vous avez installé le noyau temps réel dans le cluster.
  • Vous vous êtes connecté à registry.redhat.io avec vos identifiants du portail client.

Procédure

  • Pour exécuter les tests hwlatdetect, lancez la commande suivante, en remplaçant les valeurs des variables par celles qui conviennent :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \
    -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="hwlatdetect"

    Le test hwlatdetect dure 10 minutes (600 secondes). Le test se déroule avec succès lorsque la latence maximale observée est inférieure à MAXIMUM_LATENCY (20 μs).

    Si les résultats dépassent le seuil de latence, le test échoue.

    Important

    Pour obtenir des résultats valables, le test doit durer au moins 12 heures.

    Exemple de sortie de panne

    running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=hwlatdetect
    I0908 15:25:20.023712      27 request.go:601] Waited for 1.046586367s due to client-side throttling, not priority and fairness, request: GET:https://api.hlxcl6.lab.eng.tlv2.redhat.com:6443/apis/imageregistry.operator.openshift.io/v1?timeout=32s
    Running Suite: CNF Features e2e integration tests
    =================================================
    Random Seed: 1662650718
    Will run 1 of 194 specs
    
    [...]
    
    • Failure [283.574 seconds]
    [performance] Latency Test
    /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:62
      with the hwlatdetect image
      /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:228
        should succeed [It]
        /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:236
    
        Log file created at: 2022/09/08 15:25:27
        Running on machine: hwlatdetect-b6n4n
        Binary: Built with gc go1.17.12 for linux/amd64
        Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg
        I0908 15:25:27.160620       1 node.go:39] Environment information: /proc/cmdline: BOOT_IMAGE=(hd1,gpt3)/ostree/rhcos-c6491e1eedf6c1f12ef7b95e14ee720bf48359750ac900b7863c625769ef5fb9/vmlinuz-4.18.0-372.19.1.el8_6.x86_64 random.trust_cpu=on console=tty0 console=ttyS0,115200n8 ignition.platform.id=metal ostree=/ostree/boot.1/rhcos/c6491e1eedf6c1f12ef7b95e14ee720bf48359750ac900b7863c625769ef5fb9/0 ip=dhcp root=UUID=5f80c283-f6e6-4a27-9b47-a287157483b2 rw rootflags=prjquota boot=UUID=773bf59a-bafd-48fc-9a87-f62252d739d3 skew_tick=1 nohz=on rcu_nocbs=0-3 tuned.non_isolcpus=0000ffff,ffffffff,fffffff0 systemd.cpu_affinity=4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 intel_iommu=on iommu=pt isolcpus=managed_irq,0-3 nohz_full=0-3 tsc=nowatchdog nosoftlockup nmi_watchdog=0 mce=off skew_tick=1 rcutree.kthread_prio=11 + +
        I0908 15:25:27.160830       1 node.go:46] Environment information: kernel version 4.18.0-372.19.1.el8_6.x86_64
        I0908 15:25:27.160857       1 main.go:50] running the hwlatdetect command with arguments [/usr/bin/hwlatdetect --threshold 1 --hardlimit 1 --duration 100 --window 10000000us --width 950000us]
        F0908 15:27:10.603523       1 main.go:53] failed to run hwlatdetect command; out: hwlatdetect:  test duration 100 seconds
           detector: tracer
           parameters:
                Latency threshold: 1us 1
                Sample window:     10000000us
                Sample width:      950000us
             Non-sampling period:  9050000us
                Output File:       None
    
        Starting test
        test finished
        Max Latency: 326us 2
        Samples recorded: 5
        Samples exceeding threshold: 5
        ts: 1662650739.017274507, inner:6, outer:6
        ts: 1662650749.257272414, inner:14, outer:326
        ts: 1662650779.977272835, inner:314, outer:12
        ts: 1662650800.457272384, inner:3, outer:9
        ts: 1662650810.697273520, inner:3, outer:2
    
    [...]
    
    JUnit report was created: /junit.xml/cnftests-junit.xml
    
    
    Summarizing 1 Failure:
    
    [Fail] [performance] Latency Test with the hwlatdetect image [It] should succeed
    /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:476
    
    Ran 1 of 194 Specs in 365.797 seconds
    FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped
    --- FAIL: TestTest (366.08s)
    FAIL

    1
    Vous pouvez configurer le seuil de latence en utilisant les variables d'environnement MAXIMUM_LATENCY ou HWLATDETECT_MAXIMUM_LATENCY.
    2
    Valeur maximale de la latence mesurée pendant le test.
Exemple de résultats du test hwlatdetect

Vous pouvez capturer les types de résultats suivants :

  • Les résultats bruts qui sont recueillis après chaque exécution pour créer un historique de l'impact de toute modification apportée tout au long de l'essai.
  • L'ensemble combiné des tests bruts avec les meilleurs résultats et paramètres de configuration.

Exemple de bons résultats

hwlatdetect: test duration 3600 seconds
detector: tracer
parameters:
Latency threshold: 10us
Sample window: 1000000us
Sample width: 950000us
Non-sampling period: 50000us
Output File: None

Starting test
test finished
Max Latency: Below threshold
Samples recorded: 0

L'outil hwlatdetect ne fournit un résultat que si l'échantillon dépasse le seuil spécifié.

Exemple de mauvais résultats

hwlatdetect: test duration 3600 seconds
detector: tracer
parameters:Latency threshold: 10usSample window: 1000000us
Sample width: 950000usNon-sampling period: 50000usOutput File: None

Starting tests:1610542421.275784439, inner:78, outer:81
ts: 1610542444.330561619, inner:27, outer:28
ts: 1610542445.332549975, inner:39, outer:38
ts: 1610542541.568546097, inner:47, outer:32
ts: 1610542590.681548531, inner:13, outer:17
ts: 1610543033.818801482, inner:29, outer:30
ts: 1610543080.938801990, inner:90, outer:76
ts: 1610543129.065549639, inner:28, outer:39
ts: 1610543474.859552115, inner:28, outer:35
ts: 1610543523.973856571, inner:52, outer:49
ts: 1610543572.089799738, inner:27, outer:30
ts: 1610543573.091550771, inner:34, outer:28
ts: 1610543574.093555202, inner:116, outer:63

La sortie de hwlatdetect montre que plusieurs échantillons dépassent le seuil. Cependant, la même sortie peut indiquer des résultats différents en fonction des facteurs suivants :

  • La durée du test
  • Le nombre de cœurs de l'unité centrale
  • Paramètres du micrologiciel de l'hôte
Avertissement

Avant de procéder au test de latence suivant, assurez-vous que la latence signalée par hwlatdetect respecte le seuil requis. Pour résoudre les problèmes de latence liés au matériel, vous devrez peut-être contacter le service d'assistance du fournisseur du système.

Les pics de latence ne sont pas tous liés au matériel. Veillez à régler le microprogramme de l'hôte pour répondre aux exigences de votre charge de travail. Pour plus d'informations, voir Définition des paramètres du microprogramme pour l'optimisation du système.

15.4.2. Test cyclique en cours d'exécution

L'outil cyclictest mesure la latence de l'ordonnanceur du noyau en temps réel sur les unités centrales spécifiées.

Important

Always exécuter les tests de latence avec DISCOVERY_MODE=true. Si vous ne le faites pas, la suite de tests apportera des modifications à la configuration du cluster en cours d'exécution.

Note

Lorsque vous exécutez les commandes podman en tant qu'utilisateur non root ou non privilégié, les chemins de montage peuvent échouer avec des erreurs permission denied. Pour que la commande podman fonctionne, ajoutez :Z à la création des volumes ; par exemple, -v $(pwd)/:/kubeconfig:Z. Cela permet à podman d'effectuer le réétiquetage SELinux approprié.

Conditions préalables

  • Vous vous êtes connecté à registry.redhat.io avec vos identifiants du portail client.
  • Vous avez installé le noyau temps réel dans le cluster.
  • Vous avez appliqué un profil de performance de cluster en utilisant Node Tuning Operator.

Procédure

  • Pour effectuer l'opération cyclictest, exécutez la commande suivante, en remplaçant les valeurs des variables par d'autres, le cas échéant :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \
    -e LATENCY_TEST_CPUS=10 -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="cyclictest"

    La commande exécute l'outil cyclictest pendant 10 minutes (600 secondes). Le test s'exécute avec succès lorsque la latence maximale observée est inférieure à MAXIMUM_LATENCY (dans cet exemple, 20 μs). Les pics de latence de 20 μs et plus ne sont généralement pas acceptables pour les charges de travail telco RAN.

    Si les résultats dépassent le seuil de latence, le test échoue.

    Important

    Pour obtenir des résultats valables, le test doit durer au moins 12 heures.

    Exemple de sortie de panne

    running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=cyclictest
    I0908 13:01:59.193776      27 request.go:601] Waited for 1.046228824s due to client-side throttling, not priority and fairness, request: GET:https://api.compute-1.example.com:6443/apis/packages.operators.coreos.com/v1?timeout=32s
    Running Suite: CNF Features e2e integration tests
    =================================================
    Random Seed: 1662642118
    Will run 1 of 194 specs
    
    [...]
    
    Summarizing 1 Failure:
    
    [Fail] [performance] Latency Test with the cyclictest image [It] should succeed
    /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:220
    
    Ran 1 of 194 Specs in 161.151 seconds
    FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped
    --- FAIL: TestTest (161.48s)
    FAIL

Exemple de résultats d'un test cyclique

La même sortie peut indiquer des résultats différents pour des charges de travail différentes. Par exemple, des pics allant jusqu'à 18μs sont acceptables pour les charges de travail de l'UD 4G, mais pas pour les charges de travail de l'UD 5G.

Exemple de bons résultats

running cmd: cyclictest -q -D 10m -p 1 -t 16 -a 2,4,6,8,10,12,14,16,54,56,58,60,62,64,66,68 -h 30 -i 1000 -m
# Histogram
000000 000000   000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000
000001 000000   000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000
000002 579506   535967  418614  573648  532870  529897  489306  558076  582350  585188  583793  223781  532480  569130  472250  576043
More histogram entries ...
# Total: 000600000 000600000 000600000 000599999 000599999 000599999 000599998 000599998 000599998 000599997 000599997 000599996 000599996 000599995 000599995 000599995
# Min Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002
# Avg Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002
# Max Latencies: 00005 00005 00004 00005 00004 00004 00005 00005 00006 00005 00004 00005 00004 00004 00005 00004
# Histogram Overflows: 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000
# Histogram Overflow at cycle number:
# Thread 0:
# Thread 1:
# Thread 2:
# Thread 3:
# Thread 4:
# Thread 5:
# Thread 6:
# Thread 7:
# Thread 8:
# Thread 9:
# Thread 10:
# Thread 11:
# Thread 12:
# Thread 13:
# Thread 14:
# Thread 15:

Exemple de mauvais résultats

running cmd: cyclictest -q -D 10m -p 1 -t 16 -a 2,4,6,8,10,12,14,16,54,56,58,60,62,64,66,68 -h 30 -i 1000 -m
# Histogram
000000 000000   000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000
000001 000000   000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000  000000
000002 564632   579686  354911  563036  492543  521983  515884  378266  592621  463547  482764  591976  590409  588145  589556  353518
More histogram entries ...
# Total: 000599999 000599999 000599999 000599997 000599997 000599998 000599998 000599997 000599997 000599996 000599995 000599996 000599995 000599995 000599995 000599993
# Min Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002
# Avg Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002
# Max Latencies: 00493 00387 00271 00619 00541 00513 00009 00389 00252 00215 00539 00498 00363 00204 00068 00520
# Histogram Overflows: 00001 00001 00001 00002 00002 00001 00000 00001 00001 00001 00002 00001 00001 00001 00001 00002
# Histogram Overflow at cycle number:
# Thread 0: 155922
# Thread 1: 110064
# Thread 2: 110064
# Thread 3: 110063 155921
# Thread 4: 110063 155921
# Thread 5: 155920
# Thread 6:
# Thread 7: 110062
# Thread 8: 110062
# Thread 9: 155919
# Thread 10: 110061 155919
# Thread 11: 155918
# Thread 12: 155918
# Thread 13: 110060
# Thread 14: 110060
# Thread 15: 110059 155917

15.4.3. Course à pied de l'oslat

Le test oslat simule une application DPDK à forte intensité de CPU et mesure toutes les interruptions et perturbations afin de tester la manière dont le cluster gère le traitement des données à forte intensité de CPU.

Important

Always exécuter les tests de latence avec DISCOVERY_MODE=true. Si vous ne le faites pas, la suite de tests apportera des modifications à la configuration du cluster en cours d'exécution.

Note

Lorsque vous exécutez les commandes podman en tant qu'utilisateur non root ou non privilégié, les chemins de montage peuvent échouer avec des erreurs permission denied. Pour que la commande podman fonctionne, ajoutez :Z à la création des volumes ; par exemple, -v $(pwd)/:/kubeconfig:Z. Cela permet à podman d'effectuer le réétiquetage SELinux approprié.

Conditions préalables

  • Vous vous êtes connecté à registry.redhat.io avec vos identifiants du portail client.
  • Vous avez appliqué un profil de performance de cluster en utilisant l'opérateur Node Tuning.

Procédure

  • Pour effectuer le test oslat, exécutez la commande suivante, en remplaçant les valeurs des variables par celles qui conviennent :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \
    -e LATENCY_TEST_CPUS=10 -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="oslat"

    LATENCY_TEST_CPUS spécifie la liste des unités centrales à tester avec la commande oslat.

    La commande exécute l'outil oslat pendant 10 minutes (600 secondes). Le test s'exécute avec succès lorsque la latence maximale observée est inférieure à MAXIMUM_LATENCY (20 μs).

    Si les résultats dépassent le seuil de latence, le test échoue.

    Important

    Pour obtenir des résultats valables, le test doit durer au moins 12 heures.

    Exemple de sortie de panne

    running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=oslat
    I0908 12:51:55.999393      27 request.go:601] Waited for 1.044848101s due to client-side throttling, not priority and fairness, request: GET:https://compute-1.example.com:6443/apis/machineconfiguration.openshift.io/v1?timeout=32s
    Running Suite: CNF Features e2e integration tests
    =================================================
    Random Seed: 1662641514
    Will run 1 of 194 specs
    
    [...]
    
    • Failure [77.833 seconds]
    [performance] Latency Test
    /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:62
      with the oslat image
      /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:128
        should succeed [It]
        /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:153
    
        The current latency 304 is bigger than the expected one 1 : 1
    
    [...]
    
    Summarizing 1 Failure:
    
    [Fail] [performance] Latency Test with the oslat image [It] should succeed
    /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:177
    
    Ran 1 of 194 Specs in 161.091 seconds
    FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped
    --- FAIL: TestTest (161.42s)
    FAIL

    1
    Dans cet exemple, la latence mesurée est en dehors de la valeur maximale autorisée.

15.5. Génération d'un rapport d'échec du test de latence

Utilisez les procédures suivantes pour générer un résultat de test de latence JUnit et un rapport d'échec de test.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  • Créez un rapport d'échec de test avec des informations sur l'état du cluster et les ressources pour le dépannage en passant le paramètre --report avec le chemin d'accès à l'endroit où le rapport est extrait :

    $ podman run -v $(pwd)/:/kubeconfig:Z -v $(pwd)/reportdest:<report_folder_path> \
    -e KUBECONFIG=/kubeconfig/kubeconfig  -e DISCOVERY_MODE=true -e FEATURES=performance \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh --report <report_folder_path> \
    -ginkgo.focus="\[performance\]\ Latency\ Test"

    où :

    <report_folder_path>
    Chemin d'accès au dossier dans lequel le rapport est généré.

15.6. Générer un rapport de test de latence JUnit

Utilisez les procédures suivantes pour générer un résultat de test de latence JUnit et un rapport d'échec de test.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  • Créez un rapport XML conforme à JUnit en passant le paramètre --junit ainsi que le chemin d'accès à l'endroit où le rapport est déposé :

    $ podman run -v $(pwd)/:/kubeconfig:Z -v $(pwd)/junitdest:<junit_folder_path> \
    -e KUBECONFIG=/kubeconfig/kubeconfig -e DISCOVERY_MODE=true -e FEATURES=performance \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh --junit <junit_folder_path> \
    -ginkgo.focus="\[performance\]\ Latency\ Test"

    où :

    <junit_folder_path>
    Le chemin d'accès au dossier dans lequel le rapport junit est généré

15.7. Exécution de tests de latence sur un cluster OpenShift à un nœud

Vous pouvez effectuer des tests de latence sur des clusters OpenShift à nœud unique.

Important

Always exécuter les tests de latence avec DISCOVERY_MODE=true. Si vous ne le faites pas, la suite de tests apportera des modifications à la configuration du cluster en cours d'exécution.

Note

Lorsque vous exécutez les commandes podman en tant qu'utilisateur non root ou non privilégié, les chemins de montage peuvent échouer avec des erreurs permission denied. Pour que la commande podman fonctionne, ajoutez :Z à la création des volumes ; par exemple, -v $(pwd)/:/kubeconfig:Z. Cela permet à podman d'effectuer le réétiquetage SELinux approprié.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  • Pour exécuter les tests de latence sur un cluster OpenShift à nœud unique, exécutez la commande suivante :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=master \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
    Note

    ROLE_WORKER_CNF=master est nécessaire car le maître est le seul pool de machines auquel le nœud appartient. Pour plus d'informations sur la configuration de MachineConfigPool pour les tests de latence, voir "Conditions préalables à l'exécution des tests de latence".

    Après l'exécution de la suite de tests, toutes les ressources en suspens sont nettoyées.

15.8. Exécution de tests de latence dans un cluster déconnecté

L'image de tests CNF peut exécuter des tests dans un cluster déconnecté qui n'est pas en mesure d'accéder à des registres externes. Cela nécessite deux étapes :

  1. Mise en miroir de l'image cnf-tests avec le registre personnalisé déconnecté.
  2. Demander aux tests de consommer les images du registre personnalisé déconnecté.

Mise en miroir des images dans un registre personnalisé accessible depuis le cluster

Un exécutable mirror est livré avec l'image afin de fournir les données requises par oc pour reproduire l'image de test dans un registre local.

  1. Exécutez cette commande à partir d'une machine intermédiaire qui a accès au cluster et au registre.redhat.io:

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    /usr/bin/mirror -registry <disconnected_registry> | oc image mirror -f -

    où :

    <registre_déconnecté>
    Le registre du miroir déconnecté est-il celui que vous avez configuré, par exemple, my.local.registry:5000/.
  2. Lorsque vous avez mis en miroir l'image cnf-tests dans le registre déconnecté, vous devez remplacer le registre d'origine utilisé pour récupérer les images lors de l'exécution des tests, par exemple :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e DISCOVERY_MODE=true -e FEATURES=performance -e IMAGE_REGISTRY="<disconnected_registry>" \
    -e CNF_TESTS_IMAGE="cnf-tests-rhel8:v4.12" \
    /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"

Configurer les tests pour qu'ils consomment des images provenant d'un registre personnalisé

Vous pouvez exécuter les tests de latence à l'aide d'une image de test personnalisée et d'un registre d'images en utilisant les variables CNF_TESTS_IMAGE et IMAGE_REGISTRY.

  • Pour configurer les tests de latence afin d'utiliser une image de test personnalisée et un registre d'images, exécutez la commande suivante :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e IMAGE_REGISTRY="<custom_image_registry>" \
    -e CNF_TESTS_IMAGE="<custom_cnf-tests_image>" \
    -e FEATURES=performance \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 /usr/bin/test-run.sh

    où :

    <registre_d'images_personnalisé>
    est le registre de l'image personnalisée, par exemple, custom.registry:5000/.
    <custom_cnf-tests_image>
    est l'image personnalisée de cnf-tests, par exemple, custom-cnf-tests-image:latest.

Mise en miroir des images vers le registre d'images OpenShift du cluster

OpenShift Container Platform fournit un registre d'images de conteneurs intégré, qui s'exécute comme une charge de travail standard sur le cluster.

Procédure

  1. Obtenir un accès externe au registre en l'exposant à l'aide d'une route :

    $ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
  2. Récupérez le point de terminaison du registre en exécutant la commande suivante :

    $ REGISTRY=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
  3. Créer un espace de noms pour exposer les images :

    $ oc create ns cnftests
  4. Mettre le flux d'images à la disposition de tous les espaces de noms utilisés pour les tests. Cela est nécessaire pour permettre aux espaces de noms de tests de récupérer les images du flux d'images cnf-tests. Exécutez les commandes suivantes :

    $ oc policy add-role-to-user system:image-puller system:serviceaccount:cnf-features-testing:default --namespace=cnftests
    $ oc policy add-role-to-user system:image-puller system:serviceaccount:performance-addon-operators-testing:default --namespace=cnftests
  5. Récupérez le nom secret de docker et le jeton d'authentification en exécutant les commandes suivantes :

    $ SECRET=$(oc -n cnftests get secret | grep builder-docker | awk {'print $1'}
    $ TOKEN=$(oc -n cnftests get secret $SECRET -o jsonpath="{.data['\.dockercfg']}" | base64 --decode | jq '.["image-registry.openshift-image-registry.svc:5000"].auth')
  6. Créez un fichier dockerauth.json, par exemple :

    $ echo "{\"auths\": { \"$REGISTRY\": { \"auth\": $TOKEN } }}" > dockerauth.json
  7. Effectuer la mise en miroir de l'image :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    registry.redhat.io/openshift4/cnf-tests-rhel8:4.12 \
    /usr/bin/mirror -registry $REGISTRY/cnftests |  oc image mirror --insecure=true \
    -a=$(pwd)/dockerauth.json -f -
  8. Exécutez les tests :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    -e DISCOVERY_MODE=true -e FEATURES=performance -e IMAGE_REGISTRY=image-registry.openshift-image-registry.svc:5000/cnftests \
    cnf-tests-local:latest /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"

Miroir d'un ensemble différent d'images de test

Vous pouvez éventuellement modifier les images en amont par défaut qui sont mises en miroir pour les tests de latence.

Procédure

  1. La commande mirror tente par défaut de refléter les images en amont. Ceci peut être surchargé en passant un fichier au format suivant à l'image :

    [
        {
            "registry": "public.registry.io:5000",
            "image": "imageforcnftests:4.12"
        }
    ]
  2. Transmettez le fichier à la commande mirror, par exemple en l'enregistrant localement sous images.json. Avec la commande suivante, le chemin local est monté dans /kubeconfig à l'intérieur du conteneur et peut être transmis à la commande mirror.

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 /usr/bin/mirror \
    --registry "my.local.registry:5000/" --images "/kubeconfig/images.json" \
    |  oc image mirror -f -

15.9. Résolution des erreurs avec le conteneur cnf-tests

Pour effectuer des tests de latence, le cluster doit être accessible depuis le conteneur cnf-tests.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  • Vérifiez que le cluster est accessible depuis l'intérieur du conteneur cnf-tests en exécutant la commande suivante :

    $ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \
    registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \
    oc get nodes

    Si cette commande ne fonctionne pas, il se peut qu'il y ait une erreur liée au DNS spanning across, à la taille du MTU ou à l'accès au pare-feu.

Chapitre 16. Amélioration de la stabilité des grappes dans les environnements à forte latence à l'aide de profils de latence des travailleurs

Tous les nœuds envoient des battements de cœur à l'opérateur du contrôleur Kubernetes (kube controller) dans le cluster OpenShift Container Platform toutes les 10 secondes, par défaut. Si le cluster ne reçoit pas de battements de cœur d'un nœud, OpenShift Container Platform répond à l'aide de plusieurs mécanismes par défaut.

Par exemple, si l'opérateur du gestionnaire de contrôleur Kubernetes perd le contact avec un nœud après une période configurée :

  1. Le contrôleur de nœuds sur le plan de contrôle met à jour l'état du nœud à Unhealthy et marque l'état du nœud Ready comme Unknown.
  2. En réponse, l'ordonnanceur arrête de programmer des pods sur ce nœud.
  3. Le contrôleur de nœuds sur site ajoute au nœud une tare node.kubernetes.io/unreachable avec un effet NoExecute et planifie l'éviction de tous les pods du nœud après cinq minutes, par défaut.

Ce comportement peut poser des problèmes si votre réseau est sujet à des problèmes de latence, en particulier si vous avez des nœuds à la périphérie du réseau. Dans certains cas, l'opérateur du gestionnaire de contrôleur Kubernetes peut ne pas recevoir de mise à jour d'un nœud sain en raison de la latence du réseau. L'opérateur du gestionnaire de contrôleur Kubernetes expulserait alors les pods du nœud, même si celui-ci est sain. Pour éviter ce problème, vous pouvez utiliser worker latency profiles pour ajuster la fréquence à laquelle le kubelet et le Kubernetes Controller Manager Operator attendent les mises à jour d'état avant d'agir. Ces ajustements permettent de s'assurer que votre cluster fonctionne correctement dans le cas où la latence du réseau entre le plan de contrôle et les nœuds de travail n'est pas optimale.

Ces profils de latence des travailleurs sont trois ensembles de paramètres prédéfinis avec des valeurs soigneusement ajustées qui vous permettent de contrôler la réaction du cluster aux problèmes de latence sans avoir à déterminer les meilleures valeurs manuellement.

Vous pouvez configurer les profils de latence des travailleurs lors de l'installation d'un cluster ou à tout moment lorsque vous constatez une augmentation de la latence dans votre réseau de clusters.

16.1. Comprendre les profils de latence des travailleurs

Les profils de latence des travailleurs sont des ensembles multiples de valeurs soigneusement ajustées pour les paramètres node-status-update-frequency, node-monitor-grace-period, default-not-ready-toleration-seconds et default-unreachable-toleration-seconds. Ces paramètres vous permettent de contrôler la réaction du cluster aux problèmes de latence sans avoir à déterminer manuellement les meilleures valeurs.

Tous les profils de latence des travailleurs configurent les paramètres suivants :

  • node-status-update-frequency. Spécifie le temps en secondes pendant lequel un kubelet met à jour son statut auprès de l'opérateur du gestionnaire de contrôleur Kubernetes.
  • node-monitor-grace-period. Spécifie la durée en secondes pendant laquelle l'opérateur Kubernetes Controller Manager attend une mise à jour d'un kubelet avant de marquer le nœud comme étant malsain et d'ajouter l'erreur node.kubernetes.io/not-ready ou node.kubernetes.io/unreachable au nœud.
  • default-not-ready-toleration-seconds. Spécifie la durée en secondes après le marquage d'un nœud insalubre que l'opérateur Kubernetes Controller Manager attend avant d'expulser les pods de ce nœud.
  • default-unreachable-toleration-seconds. Spécifie la durée en secondes pendant laquelle l'opérateur du gestionnaire de contrôle Kubernetes attend qu'un nœud soit marqué comme inaccessible avant d'expulser les pods de ce nœud.
Important

La modification manuelle du paramètre node-monitor-grace-period n'est pas possible.

Les opérateurs suivants surveillent les modifications apportées aux profils de latence des travailleurs et réagissent en conséquence :

  • L'opérateur de configuration de la machine (MCO) met à jour le paramètre node-status-update-frequency sur les nœuds de travail.
  • L'opérateur du gestionnaire de contrôleur Kubernetes met à jour le paramètre node-monitor-grace-period sur les nœuds du plan de contrôle.
  • L'opérateur du serveur API Kubernetes met à jour les paramètres default-not-ready-toleration-seconds et default-unreachable-toleration-seconds sur les nœuds de la plance de contrôle.

Bien que la configuration par défaut fonctionne dans la plupart des cas, OpenShift Container Platform propose deux autres profils de latence du travailleur pour les situations où le réseau connaît une latence plus élevée que d'habitude. Les trois profils de latence des travailleurs sont décrits dans les sections suivantes :

Profil de latence du travailleur par défaut

Avec le profil Default, chaque kubelet signale l'état de son nœud au Kubelet Controller Manager Operator (kube controller) toutes les 10 secondes. L'opérateur du gestionnaire du contrôleur de kubelet vérifie l'état du kubelet toutes les 5 secondes.

L'opérateur du gestionnaire de contrôle Kubernetes attend 40 secondes pour une mise à jour de l'état avant de considérer ce nœud comme malsain. Il marque le nœud avec la taint node.kubernetes.io/not-ready ou node.kubernetes.io/unreachable et expulse les pods sur ce nœud. Si un pod sur ce nœud a la tolérance NoExecute, le pod est expulsé en 300 secondes. Si le pod a le paramètre tolerationSeconds, l'expulsion attend la période spécifiée par ce paramètre.

ProfileComposantParamètresValeur

Défaut

kubelet

node-status-update-frequency

10s

Gestionnaire de contrôleur Kubelet

node-monitor-grace-period

40s

Serveur API Kubernetes

default-not-ready-toleration-seconds

300s

Serveur API Kubernetes

default-unreachable-toleration-seconds

300s

Profil de latence du travailleur moyen

Utilisez le profil MediumUpdateAverageReaction si la latence du réseau est légèrement plus élevée que d'habitude.

Le profil MediumUpdateAverageReaction réduit la fréquence des mises à jour des kubelets à 20 secondes et modifie la période d'attente de ces mises à jour par l'opérateur du contrôleur Kubernetes à 2 minutes. La période d'éviction d'un pod sur ce nœud est réduite à 60 secondes. Si le pod a le paramètre tolerationSeconds, l'éviction attend la période spécifiée par ce paramètre.

L'opérateur Kubernetes Controller Manager attend 2 minutes pour considérer qu'un nœud n'est pas sain. Une minute plus tard, le processus d'expulsion commence.

ProfileComposantParamètresValeur

Moyenne des mises à jour

kubelet

node-status-update-frequency

20s

Gestionnaire de contrôleur Kubelet

node-monitor-grace-period

2m

Serveur API Kubernetes

default-not-ready-toleration-seconds

60s

Serveur API Kubernetes

default-unreachable-toleration-seconds

60s

Profil de latence faible pour les travailleurs

Utilisez le profil LowUpdateSlowReaction si la latence du réseau est extrêmement élevée.

Le profil LowUpdateSlowReaction réduit la fréquence des mises à jour des kubelets à 1 minute et modifie la période d'attente de ces mises à jour par l'opérateur du contrôleur Kubernetes à 5 minutes. La période d'éviction d'un pod sur ce nœud est réduite à 60 secondes. Si le pod a le paramètre tolerationSeconds, l'éviction attend la période spécifiée par ce paramètre.

L'opérateur Kubernetes Controller Manager attend 5 minutes pour considérer qu'un nœud n'est pas sain. Dans une minute, le processus d'expulsion commence.

ProfileComposantParamètresValeur

Faible mise à jourRéaction lente

kubelet

node-status-update-frequency

1m

Gestionnaire de contrôleur Kubelet

node-monitor-grace-period

5m

Serveur API Kubernetes

default-not-ready-toleration-seconds

60s

Serveur API Kubernetes

default-unreachable-toleration-seconds

60s

16.2. Utilisation des profils de latence des travailleurs

Pour mettre en œuvre un profil de latence du travailleur afin de gérer la latence du réseau, modifiez l'objet node.config pour ajouter le nom du profil. Vous pouvez modifier le profil à tout moment lorsque la latence augmente ou diminue.

Vous devez déplacer un profil de latence de travailleur à la fois. Par exemple, vous ne pouvez pas passer directement du profil Default au profil LowUpdateSlowReaction. Vous devez d'abord passer du profil default au profil MediumUpdateAverageReaction, puis à LowUpdateSlowReaction. De même, lorsque vous revenez au profil par défaut, vous devez d'abord passer du profil bas au profil moyen, puis au profil par défaut.

Note

Vous pouvez également configurer les profils de latence des travailleurs lors de l'installation d'un cluster OpenShift Container Platform.

Procédure

Pour quitter le profil de latence par défaut du travailleur :

  1. Passer au profil de latence du travailleur moyen :

    1. Modifiez l'objet node.config:

      $ oc edit nodes.config/cluster
    2. Ajouter spec.workerLatencyProfile: MediumUpdateAverageReaction:

      Exemple d'objet node.config

      apiVersion: config.openshift.io/v1
      kind: Node
      metadata:
        annotations:
          include.release.openshift.io/ibm-cloud-managed: "true"
          include.release.openshift.io/self-managed-high-availability: "true"
          include.release.openshift.io/single-node-developer: "true"
          release.openshift.io/create-only: "true"
        creationTimestamp: "2022-07-08T16:02:51Z"
        generation: 1
        name: cluster
        ownerReferences:
        - apiVersion: config.openshift.io/v1
          kind: ClusterVersion
          name: version
          uid: 36282574-bf9f-409e-a6cd-3032939293eb
        resourceVersion: "1865"
        uid: 0c0f7a4c-4307-4187-b591-6155695ac85b
      spec:
        workerLatencyProfile: MediumUpdateAverageReaction 1
      
       ...

      1
      Spécifie la politique de latence du travailleur moyen.

      La programmation sur chaque nœud de travailleur est désactivée au fur et à mesure de l'application de la modification.

      Lorsque tous les nœuds reviennent à l'état Ready, vous pouvez utiliser la commande suivante pour vérifier dans le Kubernetes Controller Manager qu'elle a bien été appliquée :

      $ oc get KubeControllerManager -o yaml | grep -i workerlatency -A 5 -B 5

      Exemple de sortie

       ...
          - lastTransitionTime: "2022-07-11T19:47:10Z"
            reason: ProfileUpdated
            status: "False"
            type: WorkerLatencyProfileProgressing
          - lastTransitionTime: "2022-07-11T19:47:10Z" 1
            message: all static pod revision(s) have updated latency profile
            reason: ProfileUpdated
            status: "True"
            type: WorkerLatencyProfileComplete
          - lastTransitionTime: "2022-07-11T19:20:11Z"
            reason: AsExpected
            status: "False"
            type: WorkerLatencyProfileDegraded
          - lastTransitionTime: "2022-07-11T19:20:36Z"
            status: "False"
       ...

      1
      Spécifie que le profil est appliqué et actif.
  2. Optionnel : Passez au profil de faible latence du travailleur :

    1. Modifiez l'objet node.config:

      $ oc edit nodes.config/cluster
    2. Modifiez la valeur de spec.workerLatencyProfile en LowUpdateSlowReaction:

      Exemple d'objet node.config

      apiVersion: config.openshift.io/v1
      kind: Node
      metadata:
        annotations:
          include.release.openshift.io/ibm-cloud-managed: "true"
          include.release.openshift.io/self-managed-high-availability: "true"
          include.release.openshift.io/single-node-developer: "true"
          release.openshift.io/create-only: "true"
        creationTimestamp: "2022-07-08T16:02:51Z"
        generation: 1
        name: cluster
        ownerReferences:
        - apiVersion: config.openshift.io/v1
          kind: ClusterVersion
          name: version
          uid: 36282574-bf9f-409e-a6cd-3032939293eb
        resourceVersion: "1865"
        uid: 0c0f7a4c-4307-4187-b591-6155695ac85b
      spec:
        workerLatencyProfile: LowUpdateSlowReaction 1
      
       ...

      1
      Spécifie l'utilisation de la politique de faible latence du travailleur.

      La programmation sur chaque nœud de travailleur est désactivée au fur et à mesure de l'application de la modification.

Pour transformer le profil bas en profil moyen ou le profil moyen en profil bas, modifiez l'objet node.config et réglez le paramètre spec.workerLatencyProfile sur la valeur appropriée.

Chapitre 17. Topology Aware Lifecycle Manager pour les mises à jour des clusters

Vous pouvez utiliser le Topology Aware Lifecycle Manager (TALM) pour gérer le cycle de vie des logiciels de plusieurs clusters. TALM utilise les stratégies de Red Hat Advanced Cluster Management (RHACM) pour effectuer des changements sur les clusters cibles.

17.1. À propos de la configuration du gestionnaire du cycle de vie Topology Aware

Le Topology Aware Lifecycle Manager (TALM) gère le déploiement des politiques de Red Hat Advanced Cluster Management (RHACM) pour un ou plusieurs clusters d'OpenShift Container Platform. L'utilisation de TALM dans un grand réseau de clusters permet le déploiement progressif des politiques vers les clusters en lots limités. Cela permet de minimiser les éventuelles interruptions de service lors de la mise à jour. Avec TALM, vous pouvez contrôler les actions suivantes :

  • Le calendrier de la mise à jour
  • Le nombre de clusters gérés par RHACM
  • Le sous-ensemble de clusters gérés auquel les politiques doivent être appliquées
  • L'ordre de mise à jour des grappes
  • L'ensemble des politiques remédiées au cluster
  • L'ordre des politiques remédiées dans le cluster
  • L'affectation d'une grappe de canaris

Pour OpenShift à nœud unique, le Topology Aware Lifecycle Manager (TALM) offre les fonctionnalités suivantes :

  • Créer une sauvegarde d'un déploiement avant une mise à niveau
  • Mise en cache préalable des images pour les grappes à bande passante limitée

TALM prend en charge l'orchestration des mises à jour des y-streams et z-streams d'OpenShift Container Platform, ainsi que les opérations du deuxième jour sur les y-streams et z-streams.

17.2. A propos des politiques gérées utilisées avec Topology Aware Lifecycle Manager

Le Topology Aware Lifecycle Manager (TALM) utilise les stratégies RHACM pour les mises à jour des clusters.

TALM peut être utilisé pour gérer le déploiement de toute politique CR dont le champ remediationAction est défini sur inform. Les cas d'utilisation pris en charge sont les suivants :

  • Création manuelle par l'utilisateur de CR de politique
  • Politiques générées automatiquement à partir de la définition des ressources personnalisées (CRD) de PolicyGenTemplate

Pour les politiques qui mettent à jour un abonnement d'opérateur avec une approbation manuelle, TALM fournit une fonctionnalité supplémentaire qui approuve l'installation de l'opérateur mis à jour.

Pour plus d'informations sur les politiques gérées, voir Policy Overview dans la documentation RHACM.

Pour plus d'informations sur le CRD PolicyGenTemplate, voir la section "À propos du CRD PolicyGenTemplate" dans "Configuration des clusters gérés avec des stratégies et des ressources PolicyGenTemplate".

17.3. Installation du Topology Aware Lifecycle Manager à l'aide de la console web

Vous pouvez utiliser la console web d'OpenShift Container Platform pour installer le Topology Aware Lifecycle Manager.

Conditions préalables

  • Installer la dernière version de l'opérateur RHACM.
  • Mettre en place un hub cluster avec des registres déconnectés.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Dans la console web d'OpenShift Container Platform, naviguez vers OperatorsOperatorHub.
  2. Recherchez le site Topology Aware Lifecycle Manager dans la liste des opérateurs disponibles, puis cliquez sur Install.
  3. Conservez la sélection par défaut de Installation mode [\N- Tous les espaces de noms sur le cluster (par défaut)\N] et Installed Namespace (\N- openshift-operators\N) pour vous assurer que l'Opérateur est installé correctement.
  4. Cliquez sur Install.

Vérification

Pour confirmer que l'installation a réussi :

  1. Naviguez jusqu'à la page OperatorsInstalled Operators.
  2. Vérifiez que l'Opérateur est installé dans l'espace de noms All Namespaces et que son statut est Succeeded.

Si l'opérateur n'est pas installé correctement :

  1. Naviguez jusqu'à la page OperatorsInstalled Operators et vérifiez que la colonne Status ne contient pas d'erreurs ou de défaillances.
  2. Naviguez jusqu'à la page WorkloadsPods et vérifiez les journaux de tous les conteneurs du pod cluster-group-upgrades-controller-manager qui signalent des problèmes.

17.4. Installation du gestionnaire de cycle de vie Topology Aware à l'aide de la CLI

Vous pouvez utiliser le CLI OpenShift (oc) pour installer le Topology Aware Lifecycle Manager (TALM).

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Installer la dernière version de l'opérateur RHACM.
  • Mise en place d'un hub cluster avec un registre déconnecté.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Créer un CR Subscription:

    1. Définissez le CR Subscription et enregistrez le fichier YAML, par exemple talm-subscription.yaml:

      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: openshift-topology-aware-lifecycle-manager-subscription
        namespace: openshift-operators
      spec:
        channel: "stable"
        name: topology-aware-lifecycle-manager
        source: redhat-operators
        sourceNamespace: openshift-marketplace
    2. Créez le CR Subscription en exécutant la commande suivante :

      $ oc create -f talm-subscription.yaml

Vérification

  1. Vérifiez que l'installation a réussi en inspectant la ressource CSV :

    $ oc get csv -n openshift-operators

    Exemple de sortie

    NAME                                                   DISPLAY                            VERSION               REPLACES                           PHASE
    topology-aware-lifecycle-manager.4.12.x   Topology Aware Lifecycle Manager   4.12.x                                      Succeeded

  2. Vérifier que le TALM est opérationnel :

    $ oc get deploy -n openshift-operators

    Exemple de sortie

    NAMESPACE                                          NAME                                             READY   UP-TO-DATE   AVAILABLE   AGE
    openshift-operators                                cluster-group-upgrades-controller-manager        1/1     1            1           14s

17.5. À propos du CR ClusterGroupUpgrade

Le Topology Aware Lifecycle Manager (TALM) construit le plan de remédiation à partir de la CR ClusterGroupUpgrade pour un groupe de clusters. Vous pouvez définir les spécifications suivantes dans un CR ClusterGroupUpgrade:

  • Clusters dans le groupe
  • Blocage des CR ClusterGroupUpgrade
  • Liste des politiques gérées applicables
  • Nombre de mises à jour simultanées
  • Mises à jour des canaris applicables
  • Actions à effectuer avant et après la mise à jour
  • Calendrier de mise à jour

Vous pouvez contrôler l'heure de début d'une mise à jour en utilisant le champ enable dans le CR ClusterGroupUpgrade. Par exemple, si vous avez une fenêtre de maintenance programmée de quatre heures, vous pouvez préparer un CR ClusterGroupUpgrade avec le champ enable défini sur false.

Vous pouvez définir le délai d'attente en configurant le paramètre spec.remediationStrategy.timeout comme suit :

spec
  remediationStrategy:
          maxConcurrency: 1
          timeout: 240

Vous pouvez utiliser l'adresse batchTimeoutAction pour déterminer ce qui se passe si une mise à jour échoue pour un cluster. Vous pouvez spécifier continue pour ignorer le cluster défaillant et continuer à mettre à jour les autres clusters, ou abort pour arrêter la remédiation des politiques pour tous les clusters. Une fois le délai écoulé, TALM supprime toutes les politiques enforce pour s'assurer qu'aucune autre mise à jour n'est effectuée sur les clusters.

Pour appliquer les modifications, vous définissez le champ enabled sur true.

Pour plus d'informations, voir la section "Application des stratégies de mise à jour aux clusters gérés".

Au fur et à mesure que TALM remédie aux politiques vers les clusters spécifiés, le CR ClusterGroupUpgrade peut signaler des statuts vrais ou faux pour un certain nombre de conditions.

Note

Une fois que TALM a terminé la mise à jour d'un cluster, le cluster n'est plus mis à jour sous le contrôle du même CR ClusterGroupUpgrade. Vous devez créer un nouveau CR ClusterGroupUpgrade dans les cas suivants :

  • Lorsque vous devez à nouveau mettre à jour le cluster
  • Lorsque le cluster devient non conforme à la politique inform après avoir été mis à jour

17.5.1. Sélection des grappes

TALM construit un plan de remédiation et sélectionne les clusters en fonction des champs suivants :

  • Le champ clusterLabelSelector spécifie les étiquettes des grappes que vous souhaitez mettre à jour. Il s'agit d'une liste de sélecteurs d'étiquettes standard provenant de k8s.io/apimachinery/pkg/apis/meta/v1. Chaque sélecteur de la liste utilise soit des paires de valeurs d'étiquettes, soit des expressions d'étiquettes. Les correspondances de chaque sélecteur sont ajoutées à la liste finale des grappes avec les correspondances des champs clusterSelector et cluster.
  • Le champ clusters spécifie une liste de grappes à mettre à jour.
  • Le champ canaries spécifie les clusters pour les mises à jour canari.
  • Le champ maxConcurrency indique le nombre de grappes à mettre à jour dans un lot.

Vous pouvez utiliser les champs clusters, clusterLabelSelector, et clusterSelector ensemble pour créer une liste combinée de clusters.

Le plan de remédiation commence par les clusters listés dans le champ canaries. Chaque grappe canarienne forme un lot à grappe unique.

Exemple de ClusterGroupUpgrade CR avec l'activation de field réglée sur false

apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
  creationTimestamp: '2022-11-18T16:27:15Z'
  finalizers:
    - ran.openshift.io/cleanup-finalizer
  generation: 1
  name: talm-cgu
  namespace: talm-namespace
  resourceVersion: '40451823'
  uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
Spec:
  actions:
    afterCompletion:
      deleteObjects: true
    beforeEnable: {}
  backup: false
  clusters: 1
    - spoke1
  enable: false 2
  managedPolicies: 3
    - talm-policy
  preCaching: false
  remediationStrategy: 4
    canaries: 5
        - spoke1
    maxConcurrency: 2 6
    timeout: 240
  clusterLabelSelectors: 7
    - matchExpressions:
      - key: label1
      operator: In
      values:
        - value1a
        - value1b
  batchTimeoutAction: 8
status: 9
    computedMaxConcurrency: 2
    conditions:
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: All selected clusters are valid
        reason: ClusterSelectionCompleted
        status: 'True'
        type: ClustersSelected 10
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: Completed validation
        reason: ValidationCompleted
        status: 'True'
        type: Validated 11
      - lastTransitionTime: '2022-11-18T16:37:16Z'
        message: Not enabled
        reason: NotEnabled
        status: 'False'
        type: Progressing
    managedPoliciesForUpgrade:
      - name: talm-policy
        namespace: talm-namespace
    managedPoliciesNs:
      talm-policy: talm-namespace
    remediationPlan:
      - - spoke1
      - - spoke2
        - spoke3
    status:

1
Définit la liste des grappes à mettre à jour.
2
Le champ enable est défini sur false.
3
Répertorie l'ensemble des politiques définies par l'utilisateur pour remédier à la situation.
4
Définit les spécificités des mises à jour de la grappe.
5
Définit les clusters pour les mises à jour canari.
6
Définit le nombre maximal de mises à jour simultanées dans un lot. Le nombre de lots de remédiation est le nombre de clusters canaris, plus le nombre de clusters, à l'exception des clusters canaris, divisé par la valeur maxConcurrency. Les clusters qui sont déjà conformes à toutes les politiques gérées sont exclus du plan de remédiation.
7
Affiche les paramètres de sélection des grappes.
8
Contrôle ce qui se passe en cas de dépassement du délai d'exécution d'un lot. Les valeurs possibles sont abort ou continue. Si aucune valeur n'est spécifiée, la valeur par défaut est continue.
9
Affiche des informations sur l'état des mises à jour.
10
La condition ClustersSelected montre que toutes les grappes sélectionnées sont valides.
11
La condition Validated montre que toutes les grappes sélectionnées ont été validées.
Note

Toute défaillance au cours de la mise à jour d'une grappe canarienne interrompt le processus de mise à jour.

Lorsque le plan de remédiation est créé avec succès, vous pouvez définir le champ enable sur true et TALM commence à mettre à jour les clusters non conformes avec les politiques gérées spécifiées.

Note

Vous ne pouvez modifier les champs spec que si le champ enable du CR ClusterGroupUpgrade est défini sur false.

17.5.2. Valider

TALM vérifie que toutes les politiques gérées spécifiées sont disponibles et correctes, et utilise la condition Validated pour signaler l'état et les raisons comme suit :

  • true

    La validation est terminée.

  • false

    Les politiques sont manquantes ou invalides, ou une image de plate-forme invalide a été spécifiée.

17.5.3. Mise en cache préalable

Les clusters peuvent avoir une bande passante limitée pour accéder au registre des images de conteneurs, ce qui peut entraîner un dépassement de délai avant que les mises à jour ne soient terminées. Sur les clusters OpenShift à nœud unique, vous pouvez utiliser la mise en cache préalable pour éviter ce problème. La mise en cache préalable de l'image de conteneur commence lorsque vous créez un CR ClusterGroupUpgrade avec le champ preCaching défini sur true.

TALM utilise la condition PrecacheSpecValid pour signaler les informations d'état comme suit :

  • true

    La spécification relative à la mise en cache préalable est valide et cohérente.

  • false

    La spécification relative à la mise en cache préalable est incomplète.

TALM utilise la condition PrecachingSucceeded pour signaler les informations d'état comme suit :

  • true

    TALM a terminé le processus de pré-mise en cache. Si le pré-caching échoue pour un cluster, la mise à jour échoue pour ce cluster mais se poursuit pour tous les autres clusters. Un message vous informe de l'échec de la mise en cache pour l'un des clusters.

  • false

    La mise en cache est toujours en cours pour un ou plusieurs clusters ou a échoué pour tous les clusters.

Pour plus d'informations, voir la section "Using the container image pre-cache feature".

17.5.4. Création d'une sauvegarde

Pour OpenShift à nœud unique, TALM peut créer une sauvegarde d'un déploiement avant une mise à jour. Si la mise à jour échoue, vous pouvez récupérer la version précédente et restaurer un cluster à un état fonctionnel sans nécessiter un reprovisionnement des applications. Pour utiliser la fonctionnalité de sauvegarde, vous devez d'abord créer un CR ClusterGroupUpgrade avec le champ backup défini sur true. Pour garantir que le contenu de la sauvegarde est à jour, la sauvegarde n'est pas effectuée tant que vous n'avez pas défini le champ enable dans le CR ClusterGroupUpgrade sur true.

TALM utilise la condition BackupSucceeded pour signaler l'état et les raisons comme suit :

  • true

    La sauvegarde est terminée pour tous les clusters ou l'exécution de la sauvegarde s'est terminée mais a échoué pour un ou plusieurs clusters. Si la sauvegarde échoue pour un cluster, la mise à jour échoue pour ce cluster mais se poursuit pour tous les autres clusters.

  • false

    La sauvegarde est toujours en cours pour un ou plusieurs clusters ou a échoué pour tous les clusters.

Pour plus d'informations, voir la section "Création d'une sauvegarde des ressources du cluster avant la mise à niveau".

17.5.5. Mise à jour des grappes

TALM applique les politiques en suivant le plan de remédiation. L'application des politiques pour les lots suivants commence immédiatement après que tous les clusters du lot en cours sont conformes à toutes les politiques gérées. Si le lot s'arrête, TALM passe au lot suivant. La valeur du délai d'attente d'un lot est le champ spec.timeout divisé par le nombre de lots dans le plan de remédiation.

TALM utilise la condition Progressing pour signaler l'état et les raisons comme suit :

  • true

    TALM remédie aux politiques non conformes.

  • false

    La mise à jour n'est pas en cours. Les raisons possibles sont les suivantes :

    • Tous les clusters sont conformes à toutes les politiques gérées.
    • La mise à jour a été interrompue car la remédiation de la politique a pris trop de temps.
    • Les CR bloquants sont absents du système ou n'ont pas encore été achevés.
    • Le CR ClusterGroupUpgrade n'est pas activé.
    • La sauvegarde est toujours en cours.
Note

Les politiques gérées s'appliquent dans l'ordre dans lequel elles sont listées dans le champ managedPolicies du CR ClusterGroupUpgrade. Une politique gérée est appliquée aux grappes spécifiées à la fois. Lorsqu'un cluster est conforme à la politique actuelle, la politique gérée suivante lui est appliquée.

Exemple ClusterGroupUpgrade CR dans l'état Progressing

apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
  creationTimestamp: '2022-11-18T16:27:15Z'
  finalizers:
    - ran.openshift.io/cleanup-finalizer
  generation: 1
  name: talm-cgu
  namespace: talm-namespace
  resourceVersion: '40451823'
  uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
Spec:
  actions:
    afterCompletion:
      deleteObjects: true
    beforeEnable: {}
  backup: false
  clusters:
    - spoke1
  enable: true
  managedPolicies:
    - talm-policy
  preCaching: true
  remediationStrategy:
    canaries:
        - spoke1
    maxConcurrency: 2
    timeout: 240
  clusterLabelSelectors:
    - matchExpressions:
      - key: label1
      operator: In
      values:
        - value1a
        - value1b
  batchTimeoutAction:
status:
    clusters:
      - name: spoke1
        state: complete
    computedMaxConcurrency: 2
    conditions:
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: All selected clusters are valid
        reason: ClusterSelectionCompleted
        status: 'True'
        type: ClustersSelected
      - lastTransitionTime: '2022-11-18T16:27:15Z'
        message: Completed validation
        reason: ValidationCompleted
        status: 'True'
        type: Validated
      - lastTransitionTime: '2022-11-18T16:37:16Z'
        message: Remediating non-compliant policies
        reason: InProgress
        status: 'True'
        type: Progressing 1
    managedPoliciesForUpgrade:
      - name: talm-policy
        namespace: talm-namespace
    managedPoliciesNs:
      talm-policy: talm-namespace
    remediationPlan:
      - - spoke1
      - - spoke2
        - spoke3
    status:
      currentBatch: 2
      currentBatchRemediationProgress:
        spoke2:
          state: Completed
        spoke3:
          policyIndex: 0
          state: InProgress
      currentBatchStartedAt: '2022-11-18T16:27:16Z'
      startedAt: '2022-11-18T16:27:15Z'

1
Les champs Progressing montrent que TALM est en train de remédier aux politiques.

17.5.6. Mise à jour du statut

TALM utilise la condition Succeeded pour signaler l'état et les raisons comme suit :

  • true

    Tous les clusters sont conformes aux politiques de gestion spécifiées.

  • false

    La remédiation de la politique a échoué parce qu'il n'y avait pas de clusters disponibles pour la remédiation, ou parce que la remédiation de la politique a pris trop de temps pour l'une des raisons suivantes :

    • Le lot actuel contient des mises à jour canaris et le cluster dans le lot ne respecte pas toutes les politiques gérées dans le délai d'expiration du lot.
    • Les clusters n'ont pas respecté les politiques gérées dans la limite de la valeur timeout spécifiée dans le champ remediationStrategy.

Exemple ClusterGroupUpgrade CR dans l'état Succeeded

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-upgrade-complete
      namespace: default
    spec:
      clusters:
      - spoke1
      - spoke4
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status: 1
      clusters:
        - name: spoke1
          state: complete
        - name: spoke4
          state: complete
      conditions:
      - message: All selected clusters are valid
        reason: ClusterSelectionCompleted
        status: "True"
        type: ClustersSelected
      - message: Completed validation
        reason: ValidationCompleted
        status: "True"
        type: Validated
      - message: All clusters are compliant with all the managed policies
        reason: Completed
        status: "False"
        type: Progressing 2
      - message: All clusters are compliant with all the managed policies
        reason: Completed
        status: "True"
        type: Succeeded 3
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      remediationPlan:
      - - spoke1
      - - spoke4
      status:
        completedAt: '2022-11-18T16:27:16Z'
        startedAt: '2022-11-18T16:27:15Z'

2
Dans les champs Progressing, l'état est false car la mise à jour est terminée ; les clusters sont conformes à toutes les politiques gérées.
3
Les champs Succeeded indiquent que les validations se sont déroulées avec succès.
1
Le champ status comprend une liste de clusters et leurs statuts respectifs. Le statut d'un groupe peut être complete ou timedout.

Exemple ClusterGroupUpgrade CR dans l'état timedout

apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
  creationTimestamp: '2022-11-18T16:27:15Z'
  finalizers:
    - ran.openshift.io/cleanup-finalizer
  generation: 1
  name: talm-cgu
  namespace: talm-namespace
  resourceVersion: '40451823'
  uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
spec:
  actions:
    afterCompletion:
      deleteObjects: true
    beforeEnable: {}
  backup: false
  clusters:
    - spoke1
    - spoke2
  enable: true
  managedPolicies:
    - talm-policy
  preCaching: false
  remediationStrategy:
    maxConcurrency: 2
    timeout: 240
status:
  clusters:
    - name: spoke1
      state: complete
    - currentPolicy: 1
        name: talm-policy
        status: NonCompliant
      name: spoke2
      state: timedout
  computedMaxConcurrency: 2
  conditions:
    - lastTransitionTime: '2022-11-18T16:27:15Z'
      message: All selected clusters are valid
      reason: ClusterSelectionCompleted
      status: 'True'
      type: ClustersSelected
    - lastTransitionTime: '2022-11-18T16:27:15Z'
      message: Completed validation
      reason: ValidationCompleted
      status: 'True'
      type: Validated
    - lastTransitionTime: '2022-11-18T16:37:16Z'
      message: Policy remediation took too long
      reason: TimedOut
      status: 'False'
      type: Progressing
    - lastTransitionTime: '2022-11-18T16:37:16Z'
      message: Policy remediation took too long
      reason: TimedOut
      status: 'False'
      type: Succeeded 2
  managedPoliciesForUpgrade:
    - name: talm-policy
      namespace: talm-namespace
  managedPoliciesNs:
    talm-policy: talm-namespace
  remediationPlan:
    - - spoke1
      - spoke2
  status:
        startedAt: '2022-11-18T16:27:15Z'
        completedAt: '2022-11-18T20:27:15Z'

1
Si l'état d'un cluster est timedout, le champ currentPolicy indique le nom et l'état de la politique.
2
Le statut de succeeded est false et le message indique que la remédiation de la politique a pris trop de temps.

17.5.7. Blocage des CR de ClusterGroupUpgrade

Vous pouvez créer plusieurs CR ClusterGroupUpgrade et contrôler leur ordre d'application.

Par exemple, si vous créez ClusterGroupUpgrade CR C qui bloque le démarrage de ClusterGroupUpgrade CR A, ClusterGroupUpgrade CR A ne peut pas démarrer tant que le statut de ClusterGroupUpgrade CR C ne devient pas UpgradeComplete.

Un CR ClusterGroupUpgrade peut avoir plusieurs CR bloquants. Dans ce cas, tous les CR bloquants doivent être terminés avant que la mise à niveau du CR actuel puisse commencer.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Provisionner un ou plusieurs clusters gérés.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Créer des stratégies RHACM dans le cluster hub.

Procédure

  1. Enregistrez le contenu des CR ClusterGroupUpgrade dans les fichiers cgu-a.yaml, cgu-b.yaml et cgu-c.yaml.

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-a
      namespace: default
    spec:
      blockingCRs: 1
      - name: cgu-c
        namespace: default
      clusters:
      - spoke1
      - spoke2
      - spoke3
      enable: false
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      remediationStrategy:
        canaries:
        - spoke1
        maxConcurrency: 2
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR is not enabled
        reason: UpgradeNotStarted
        status: "False"
        type: Ready
      copiedPolicies:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      placementBindings:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      placementRules:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      remediationPlan:
      - - spoke1
      - - spoke2
    1
    Définit les CR de blocage. La mise à jour de cgu-a ne peut pas commencer tant que cgu-c n'est pas terminé.
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-b
      namespace: default
    spec:
      blockingCRs: 1
      - name: cgu-a
        namespace: default
      clusters:
      - spoke4
      - spoke5
      enable: false
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR is not enabled
        reason: UpgradeNotStarted
        status: "False"
        type: Ready
      copiedPolicies:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke4
      - - spoke5
      status: {}
    1
    La mise à jour de cgu-b ne peut pas commencer tant que cgu-a n'est pas terminée.
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-c
      namespace: default
    spec: 1
      clusters:
      - spoke6
      enable: false
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR is not enabled
        reason: UpgradeNotStarted
        status: "False"
        type: Ready
      copiedPolicies:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      managedPoliciesCompliantBeforeUpgrade:
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke6
      status: {}
    1
    La mise à jour cgu-c ne comporte pas de CR bloquante. Le TALM lance la mise à jour cgu-c lorsque le champ enable est défini sur true.
  2. Créez les CR ClusterGroupUpgrade en exécutant la commande suivante pour chaque CR concerné :

    $ oc apply -f <name>.yaml
  3. Lancez le processus de mise à jour en exécutant la commande suivante pour chaque CR concerné :

    $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/<name> \
    --type merge -p '{"spec":{"enable":true}}'

    Les exemples suivants montrent des CR ClusterGroupUpgrade où le champ enable est remplacé par true:

    Exemple pour cgu-a avec des CR bloquants

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-a
      namespace: default
    spec:
      blockingCRs:
      - name: cgu-c
        namespace: default
      clusters:
      - spoke1
      - spoke2
      - spoke3
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      remediationStrategy:
        canaries:
        - spoke1
        maxConcurrency: 2
        timeout: 240
    status:
      conditions:
      - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet
          completed: [cgu-c]' 1
        reason: UpgradeCannotStart
        status: "False"
        type: Ready
      copiedPolicies:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      placementBindings:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      placementRules:
      - cgu-a-policy1-common-cluster-version-policy
      - cgu-a-policy2-common-pao-sub-policy
      - cgu-a-policy3-common-ptp-sub-policy
      remediationPlan:
      - - spoke1
      - - spoke2
      status: {}

    1
    Affiche la liste des CR bloquants.

    Exemple pour cgu-b avec des CR bloquants

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-b
      namespace: default
    spec:
      blockingCRs:
      - name: cgu-a
        namespace: default
      clusters:
      - spoke4
      - spoke5
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet
          completed: [cgu-a]' 1
        reason: UpgradeCannotStart
        status: "False"
        type: Ready
      copiedPolicies:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy2-common-pao-sub-policy
        namespace: default
      - name: policy3-common-ptp-sub-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-b-policy1-common-cluster-version-policy
      - cgu-b-policy2-common-pao-sub-policy
      - cgu-b-policy3-common-ptp-sub-policy
      - cgu-b-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke4
      - - spoke5
      status: {}

    1
    Affiche la liste des CR bloquants.

    Exemple pour cgu-c avec des CR bloquants

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-c
      namespace: default
    spec:
      clusters:
      - spoke6
      enable: true
      managedPolicies:
      - policy1-common-cluster-version-policy
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      - policy4-common-sriov-sub-policy
      remediationStrategy:
        maxConcurrency: 1
        timeout: 240
    status:
      conditions:
      - message: The ClusterGroupUpgrade CR has upgrade policies that are still non compliant 1
        reason: UpgradeNotCompleted
        status: "False"
        type: Ready
      copiedPolicies:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      managedPoliciesCompliantBeforeUpgrade:
      - policy2-common-pao-sub-policy
      - policy3-common-ptp-sub-policy
      managedPoliciesForUpgrade:
      - name: policy1-common-cluster-version-policy
        namespace: default
      - name: policy4-common-sriov-sub-policy
        namespace: default
      placementBindings:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      placementRules:
      - cgu-c-policy1-common-cluster-version-policy
      - cgu-c-policy4-common-sriov-sub-policy
      remediationPlan:
      - - spoke6
      status:
        currentBatch: 1
        remediationPlanForBatch:
          spoke6: 0

    1
    La mise à jour du site cgu-c ne comporte pas de CR bloquants.

17.6. Mise à jour des politiques sur les clusters gérés

Le Topology Aware Lifecycle Manager (TALM) remédie à un ensemble de politiques inform pour les clusters spécifiés dans le CR ClusterGroupUpgrade. Le TALM remédie aux politiques inform en faisant des copies enforce des politiques RHACM gérées. Chaque politique copiée possède sa propre règle de placement RHACM et son propre lien de placement RHACM.

Un par un, TALM ajoute chaque cluster du lot actuel à la règle de placement qui correspond à la politique gérée applicable. Si un cluster est déjà conforme à une politique, le TALM passe à l'application de cette politique sur le cluster conforme. TALM passe ensuite à l'application de la politique suivante au cluster non conforme. Une fois que TALM a terminé les mises à jour d'un lot, tous les clusters sont supprimés des règles de placement associées aux politiques copiées. La mise à jour du lot suivant commence alors.

Si un cluster spoke ne signale aucun état de conformité à RHACM, les politiques gérées sur le cluster hub peuvent manquer d'informations d'état dont le TALM a besoin. TALM gère ces cas de la manière suivante :

  • Si le champ status.compliant d'une politique est manquant, TALM ignore la politique et ajoute une entrée de journal. Ensuite, TALM continue à regarder le champ status.status de la politique.
  • Si le site status.status d'une police est manquant, TALM produit une erreur.
  • Si le statut de conformité d'un cluster n'est pas indiqué dans le champ status.status de la politique, TALM considère que ce cluster n'est pas conforme à cette politique.

La valeur batchTimeoutAction de la CR ClusterGroupUpgrade détermine ce qui se passe en cas d'échec de la mise à niveau d'un cluster. Vous pouvez spécifier continue pour ignorer le cluster défaillant et continuer à mettre à niveau les autres clusters, ou spécifier abort pour arrêter la remédiation de la politique pour tous les clusters. Une fois le délai écoulé, TALM supprime toutes les politiques d'application pour s'assurer qu'aucune autre mise à jour n'est effectuée sur les clusters.

Pour plus d'informations sur les politiques du RHACM, voir Aperçu des politiques.

Ressources supplémentaires

Pour plus d'informations sur le CRD PolicyGenTemplate, voir À propos du CRD PolicyGenTemplate.

17.6.1. Appliquer des stratégies de mise à jour aux clusters gérés

Vous pouvez mettre à jour vos clusters gérés en appliquant vos politiques.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Provisionner un ou plusieurs clusters gérés.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Créer des stratégies RHACM dans le cluster hub.

Procédure

  1. Enregistrez le contenu du CR ClusterGroupUpgrade dans le fichier cgu-1.yaml.

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: cgu-1
      namespace: default
    spec:
      managedPolicies: 1
        - policy1-common-cluster-version-policy
        - policy2-common-nto-sub-policy
        - policy3-common-ptp-sub-policy
        - policy4-common-sriov-sub-policy
      enable: false
      clusters: 2
      - spoke1
      - spoke2
      - spoke5
      - spoke6
      remediationStrategy:
        maxConcurrency: 2 3
        timeout: 240 4
      batchTimeoutAction: 5
    1
    Le nom des politiques à appliquer.
    2
    La liste des clusters à mettre à jour.
    3
    Le champ maxConcurrency indique le nombre de grappes mises à jour en même temps.
    4
    Le délai de mise à jour en minutes.
    5
    Contrôle ce qui se passe en cas de dépassement du délai d'exécution d'un lot. Les valeurs possibles sont abort ou continue. Si aucune valeur n'est spécifiée, la valeur par défaut est continue.
  2. Créez le CR ClusterGroupUpgrade en exécutant la commande suivante :

    $ oc create -f cgu-1.yaml
    1. Vérifiez que le CR ClusterGroupUpgrade a été créé dans le cluster hub en exécutant la commande suivante :

      $ oc get cgu --all-namespaces

      Exemple de sortie

      NAMESPACE   NAME  AGE  STATE      DETAILS
      default     cgu-1 8m55 NotEnabled Not Enabled

    2. Vérifiez l'état de la mise à jour en exécutant la commande suivante :

      $ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq

      Exemple de sortie

      {
        "computedMaxConcurrency": 2,
        "conditions": [
          {
            "lastTransitionTime": "2022-02-25T15:34:07Z",
            "message": "Not enabled", 1
            "reason": "NotEnabled",
            "status": "False",
            "type": "Progressing"
          }
        ],
        "copiedPolicies": [
          "cgu-policy1-common-cluster-version-policy",
          "cgu-policy2-common-nto-sub-policy",
          "cgu-policy3-common-ptp-sub-policy",
          "cgu-policy4-common-sriov-sub-policy"
        ],
        "managedPoliciesContent": {
          "policy1-common-cluster-version-policy": "null",
          "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]",
          "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]",
          "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]"
        },
        "managedPoliciesForUpgrade": [
          {
            "name": "policy1-common-cluster-version-policy",
            "namespace": "default"
          },
          {
            "name": "policy2-common-nto-sub-policy",
            "namespace": "default"
          },
          {
            "name": "policy3-common-ptp-sub-policy",
            "namespace": "default"
          },
          {
            "name": "policy4-common-sriov-sub-policy",
            "namespace": "default"
          }
        ],
        "managedPoliciesNs": {
          "policy1-common-cluster-version-policy": "default",
          "policy2-common-nto-sub-policy": "default",
          "policy3-common-ptp-sub-policy": "default",
          "policy4-common-sriov-sub-policy": "default"
        },
        "placementBindings": [
          "cgu-policy1-common-cluster-version-policy",
          "cgu-policy2-common-nto-sub-policy",
          "cgu-policy3-common-ptp-sub-policy",
          "cgu-policy4-common-sriov-sub-policy"
        ],
        "placementRules": [
          "cgu-policy1-common-cluster-version-policy",
          "cgu-policy2-common-nto-sub-policy",
          "cgu-policy3-common-ptp-sub-policy",
          "cgu-policy4-common-sriov-sub-policy"
        ],
        "precaching": {
          "spec": {}
        },
        "remediationPlan": [
          [
            "spoke1",
            "spoke2"
          ],
          [
            "spoke5",
            "spoke6"
          ]
        ],
        "status": {}
      }

      1
      Le champ spec.enable dans le CR ClusterGroupUpgrade est mis à false.
    3. Vérifiez l'état des politiques en exécutant la commande suivante :

      $ oc get policies -A

      Exemple de sortie

      NAMESPACE   NAME                                                 REMEDIATION ACTION   COMPLIANCE STATE   AGE
      default     cgu-policy1-common-cluster-version-policy            enforce                                 17m 1
      default     cgu-policy2-common-nto-sub-policy                    enforce                                 17m
      default     cgu-policy3-common-ptp-sub-policy                    enforce                                 17m
      default     cgu-policy4-common-sriov-sub-policy                  enforce                                 17m
      default     policy1-common-cluster-version-policy                inform               NonCompliant       15h
      default     policy2-common-nto-sub-policy                        inform               NonCompliant       15h
      default     policy3-common-ptp-sub-policy                        inform               NonCompliant       18m
      default     policy4-common-sriov-sub-policy                      inform               NonCompliant       18m

      1
      Le champ spec.remediationAction des politiques actuellement appliquées aux clusters est défini sur enforce. Les politiques gérées en mode inform à partir de la CR ClusterGroupUpgrade restent en mode inform pendant la mise à jour.
  3. Remplacez la valeur du champ spec.enable par true en exécutant la commande suivante :

    $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-1 \
    --patch '{"spec":{"enable":true}}' --type=merge

Vérification

  1. Vérifiez à nouveau l'état de la mise à jour en exécutant la commande suivante :

    $ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq

    Exemple de sortie

    {
      "computedMaxConcurrency": 2,
      "conditions": [ 1
        {
          "lastTransitionTime": "2022-02-25T15:33:07Z",
          "message": "All selected clusters are valid",
          "reason": "ClusterSelectionCompleted",
          "status": "True",
          "type": "ClustersSelected",
          "lastTransitionTime": "2022-02-25T15:33:07Z",
          "message": "Completed validation",
          "reason": "ValidationCompleted",
          "status": "True",
          "type": "Validated",
          "lastTransitionTime": "2022-02-25T15:34:07Z",
          "message": "Remediating non-compliant policies",
          "reason": "InProgress",
          "status": "True",
          "type": "Progressing"
        }
      ],
      "copiedPolicies": [
        "cgu-policy1-common-cluster-version-policy",
        "cgu-policy2-common-nto-sub-policy",
        "cgu-policy3-common-ptp-sub-policy",
        "cgu-policy4-common-sriov-sub-policy"
      ],
      "managedPoliciesContent": {
        "policy1-common-cluster-version-policy": "null",
        "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]",
        "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]",
        "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]"
      },
      "managedPoliciesForUpgrade": [
        {
          "name": "policy1-common-cluster-version-policy",
          "namespace": "default"
        },
        {
          "name": "policy2-common-nto-sub-policy",
          "namespace": "default"
        },
        {
          "name": "policy3-common-ptp-sub-policy",
          "namespace": "default"
        },
        {
          "name": "policy4-common-sriov-sub-policy",
          "namespace": "default"
        }
      ],
      "managedPoliciesNs": {
        "policy1-common-cluster-version-policy": "default",
        "policy2-common-nto-sub-policy": "default",
        "policy3-common-ptp-sub-policy": "default",
        "policy4-common-sriov-sub-policy": "default"
      },
      "placementBindings": [
        "cgu-policy1-common-cluster-version-policy",
        "cgu-policy2-common-nto-sub-policy",
        "cgu-policy3-common-ptp-sub-policy",
        "cgu-policy4-common-sriov-sub-policy"
      ],
      "placementRules": [
        "cgu-policy1-common-cluster-version-policy",
        "cgu-policy2-common-nto-sub-policy",
        "cgu-policy3-common-ptp-sub-policy",
        "cgu-policy4-common-sriov-sub-policy"
      ],
      "precaching": {
        "spec": {}
      },
      "remediationPlan": [
        [
          "spoke1",
          "spoke2"
        ],
        [
          "spoke5",
          "spoke6"
        ]
      ],
      "status": {
        "currentBatch": 1,
        "currentBatchStartedAt": "2022-02-25T15:54:16Z",
        "remediationPlanForBatch": {
          "spoke1": 0,
          "spoke2": 1
        },
        "startedAt": "2022-02-25T15:54:16Z"
      }
    }

    1
    Reflète l'état d'avancement de la mise à jour du lot en cours. Exécutez à nouveau cette commande pour recevoir des informations actualisées sur l'état d'avancement.
  2. Si les politiques incluent des abonnements d'opérateurs, vous pouvez vérifier la progression de l'installation directement sur le cluster à nœud unique.

    1. Exportez le fichier KUBECONFIG du cluster à nœud unique dont vous souhaitez vérifier la progression de l'installation en exécutant la commande suivante :

      export KUBECONFIG=<cluster_kubeconfig_absolute_path>
    2. Vérifiez tous les abonnements présents sur le cluster à nœud unique et recherchez celui de la politique que vous essayez d'installer via le CR ClusterGroupUpgrade en exécutant la commande suivante :

      oc get subs -A | grep -i <nom_de_l'abonnement>

      Exemple de résultat pour la politique cluster-logging

      NAMESPACE                              NAME                         PACKAGE                      SOURCE             CHANNEL
      openshift-logging                      cluster-logging              cluster-logging              redhat-operators   stable

  3. Si l'une des stratégies gérées inclut une CR ClusterVersion, vérifiez l'état des mises à jour de la plate-forme dans le lot actuel en exécutant la commande suivante sur le cluster de rayons :

    $ oc get clusterversion

    Exemple de sortie

    NAME      VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
    version   4.9.5     True        True          43s     Working towards 4.9.7: 71 of 735 done (9% complete)

  4. Vérifiez l'abonnement de l'opérateur en exécutant la commande suivante :

    $ oc get subs -n <operator-namespace> <operator-subscription> -ojsonpath="{.status}"
  5. Vérifiez les plans d'installation présents sur le cluster à nœud unique associé à l'abonnement souhaité en exécutant la commande suivante :

    oc get installplan -n <subscription_namespace>

    Exemple de sortie pour cluster-logging Operator

    NAMESPACE                              NAME            CSV                                 APPROVAL   APPROVED
    openshift-logging                      install-6khtw   cluster-logging.5.3.3-4             Manual     true 1

    1
    Le champ Approval des plans d'installation est défini sur Manual et le champ Approved passe de false à true après l'approbation du plan d'installation par TALM.
    Note

    Lorsque TALM remédie à une politique contenant un abonnement, il approuve automatiquement tous les plans d'installation liés à cet abonnement. Lorsque plusieurs plans d'installation sont nécessaires pour amener l'opérateur à la dernière version connue, le TALM peut approuver plusieurs plans d'installation, en passant par une ou plusieurs versions intermédiaires pour arriver à la version finale.

  6. Vérifiez si la version du service de cluster pour l'opérateur de la politique que ClusterGroupUpgrade installe a atteint la phase Succeeded en exécutant la commande suivante :

    oc get csv -n <operator_namespace>

    Exemple de sortie pour OpenShift Logging Operator

    NAME                    DISPLAY                     VERSION   REPLACES   PHASE
    cluster-logging.5.4.2   Red Hat OpenShift Logging   5.4.2                Succeeded

17.7. Création d'une sauvegarde des ressources du cluster avant la mise à niveau

Pour OpenShift à nœud unique, le Topology Aware Lifecycle Manager (TALM) peut créer une sauvegarde d'un déploiement avant une mise à niveau. Si la mise à niveau échoue, vous pouvez récupérer la version précédente et restaurer un cluster à un état fonctionnel sans nécessiter un reprovisionnement des applications.

Pour utiliser la fonction de sauvegarde, vous devez d'abord créer un CR ClusterGroupUpgrade avec le champ backup défini sur true. Pour garantir que le contenu de la sauvegarde est à jour, la sauvegarde n'est pas effectuée tant que vous n'avez pas défini le champ enable dans le CR ClusterGroupUpgrade sur true.

TALM utilise la condition BackupSucceeded pour signaler l'état et les raisons comme suit :

  • true

    La sauvegarde est terminée pour tous les clusters ou l'exécution de la sauvegarde s'est terminée mais a échoué pour un ou plusieurs clusters. Si la sauvegarde échoue pour un cluster, la mise à jour ne se fait pas pour ce cluster.

  • false

    La sauvegarde est toujours en cours pour un ou plusieurs clusters ou a échoué pour tous les clusters. Le processus de sauvegarde s'exécutant dans les clusters de rayons peut avoir les statuts suivants :

    • PreparingToStart

      La première passe de réconciliation est en cours. Le TALM supprime toutes les ressources d'espace de noms de sauvegarde de rayon et de vue de hub qui ont été créées lors d'une tentative de mise à niveau qui a échoué.

    • Starting

      Les conditions préalables à la sauvegarde et la tâche de sauvegarde sont en cours de création.

    • Active

      La sauvegarde est en cours.

    • Succeeded

      La sauvegarde a réussi.

    • BackupTimeout

      La sauvegarde des artefacts est partiellement effectuée.

    • UnrecoverableError

      La sauvegarde s'est terminée avec un code de sortie non nul.

Note

Si la sauvegarde d'un cluster échoue et entre dans l'état BackupTimeout ou UnrecoverableError, la mise à jour du cluster ne se fait pas pour ce cluster. Les mises à jour des autres clusters ne sont pas affectées et se poursuivent.

17.7.1. Création d'un ClusterGroupUpgrade CR avec sauvegarde

Vous pouvez créer une sauvegarde d'un déploiement avant une mise à niveau sur des clusters OpenShift à nœud unique. Si la mise à niveau échoue, vous pouvez utiliser le script upgrade-recovery.sh généré par Topology Aware Lifecycle Manager (TALM) pour ramener le système à son état avant la mise à niveau. La sauvegarde se compose des éléments suivants :

Sauvegarde de la grappe
Un instantané de etcd et des manifestes de pods statiques.
Sauvegarde du contenu
Sauvegardes de dossiers, par exemple, /etc, /usr/local, /var/lib/kubelet.
Sauvegarde des fichiers modifiés
Tous les fichiers gérés par machine-config qui ont été modifiés.
Déploiement
Déploiement d'une épingle ostree.
Images (optionnel)
Toutes les images de conteneurs utilisées.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Provisionner un ou plusieurs clusters gérés.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Installez Red Hat Advanced Cluster Management (RHACM).
Note

Il est fortement recommandé de créer une partition de récupération. Voici un exemple de ressource personnalisée (CR) SiteConfig pour une partition de récupération de 50 Go :

nodes:
    - hostName: "snonode.sno-worker-0.e2e.bos.redhat.com"
    role: "master"
    rootDeviceHints:
        hctl: "0:2:0:0"
        deviceName: /dev/sda
........
........
    #Disk /dev/sda: 893.3 GiB, 959119884288 bytes, 1873281024 sectors
    diskPartition:
        - device: /dev/sda
        partitions:
        - mount_point: /var/recovery
            size: 51200
            start: 800000

Procédure

  1. Enregistrez le contenu du CR ClusterGroupUpgrade avec les champs backup et enable définis sur true dans le fichier clustergroupupgrades-group-du.yaml:

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: du-upgrade-4918
      namespace: ztp-group-du-sno
    spec:
      preCaching: true
      backup: true
      clusters:
      - cnfdb1
      - cnfdb2
      enable: true
      managedPolicies:
      - du-upgrade-platform-upgrade
      remediationStrategy:
        maxConcurrency: 2
        timeout: 240
  2. Pour lancer la mise à jour, appliquez le CR ClusterGroupUpgrade en exécutant la commande suivante :

    $ oc apply -f clustergroupupgrades-group-du.yaml

Vérification

  • Vérifiez l'état de la mise à niveau dans le cluster du concentrateur en exécutant la commande suivante :

    $ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'

    Exemple de sortie

    {
        "backup": {
            "clusters": [
                "cnfdb2",
                "cnfdb1"
        ],
        "status": {
            "cnfdb1": "Succeeded",
            "cnfdb2": "Failed" 1
        }
    },
    "computedMaxConcurrency": 1,
    "conditions": [
        {
            "lastTransitionTime": "2022-04-05T10:37:19Z",
            "message": "Backup failed for 1 cluster", 2
            "reason": "PartiallyDone", 3
            "status": "True", 4
            "type": "Succeeded"
        }
    ],
    "precaching": {
        "spec": {}
    },
    "status": {}

    1
    La sauvegarde a échoué pour un cluster.
    2
    Le message confirme que la sauvegarde a échoué pour un cluster.
    3
    La sauvegarde a été partiellement réussie.
    4
    Le processus de sauvegarde est terminé.

17.7.2. Récupération d'un cluster après l'échec d'une mise à niveau

Si la mise à niveau d'un cluster échoue, vous pouvez vous connecter manuellement au cluster et utiliser la sauvegarde pour remettre le cluster dans l'état où il se trouvait avant la mise à niveau. Il y a deux étapes :

Retour en arrière
Si la tentative de mise à niveau comprenait une modification du déploiement du système d'exploitation de la plate-forme, vous devez revenir à la version précédente avant d'exécuter le script de récupération.
Récupération
La récupération arrête les conteneurs et utilise les fichiers de la partition de sauvegarde pour relancer les conteneurs et restaurer les clusters.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Provisionner un ou plusieurs clusters gérés.
  • Installez Red Hat Advanced Cluster Management (RHACM).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Exécuter une mise à niveau configurée pour la sauvegarde.

Procédure

  1. Supprimez la ressource personnalisée (CR) ClusterGroupUpgrade créée précédemment en exécutant la commande suivante :

    $ oc delete cgu/du-upgrade-4918 -n ztp-group-du-sno
  2. Connectez-vous au cluster que vous souhaitez récupérer.
  3. Vérifiez l'état du déploiement du système d'exploitation de la plate-forme en exécutant la commande suivante :

    $ ostree admin status

    Exemples de résultats

    [root@lab-test-spoke2-node-0 core]# ostree admin status
    * rhcos c038a8f08458bbed83a77ece033ad3c55597e3f64edad66ea12fda18cbdceaf9.0
        Version: 49.84.202202230006-0
        Pinned: yes 1
        origin refspec: c038a8f08458bbed83a77ece033ad3c55597e3f64edad66ea12fda18cbdceaf9

    1
    Le déploiement actuel est verrouillé. Il n'est pas nécessaire de revenir sur le déploiement du système d'exploitation de la plate-forme.
    [root@lab-test-spoke2-node-0 core]# ostree admin status
    * rhcos f750ff26f2d5550930ccbe17af61af47daafc8018cd9944f2a3a6269af26b0fa.0
        Version: 410.84.202204050541-0
        origin refspec: f750ff26f2d5550930ccbe17af61af47daafc8018cd9944f2a3a6269af26b0fa
    rhcos ad8f159f9dc4ea7e773fd9604c9a16be0fe9b266ae800ac8470f63abc39b52ca.0 (rollback) 1
        Version: 410.84.202203290245-0
        Pinned: yes 2
        origin refspec: ad8f159f9dc4ea7e773fd9604c9a16be0fe9b266ae800ac8470f63abc39b52ca
    1
    Le déploiement du système d'exploitation de cette plate-forme est marqué pour un retour en arrière.
    2
    Le déploiement précédent est épinglé et peut être annulé.
  4. Pour déclencher un rollback du déploiement du système d'exploitation de la plate-forme, exécutez la commande suivante :

    $ rpm-ostree rollback -r
  5. La première phase de la récupération arrête les conteneurs et restaure les fichiers de la partition de sauvegarde dans les répertoires ciblés. Pour commencer la récupération, exécutez la commande suivante :

    $ /var/recovery/upgrade-recovery.sh
  6. Lorsque vous y êtes invité, redémarrez le cluster en exécutant la commande suivante :

    $ systemctl reboot
  7. Après le redémarrage, relancez la récupération en exécutant la commande suivante :

    $ /var/recovery/upgrade-recovery.sh  --resume
Note

Si l'utilitaire de récupération échoue, vous pouvez réessayer avec l'option --restart:

$ /var/recovery/upgrade-recovery.sh --restart

Vérification

  • Pour vérifier l'état de la récupération, exécutez la commande suivante :

    $ oc get clusterversion,nodes,clusteroperator

    Exemple de sortie

    NAME                                         VERSION   AVAILABLE   PROGRESSING   SINCE   STATUS
    clusterversion.config.openshift.io/version   4.9.23    True        False         86d     Cluster version is 4.9.23 1
    
    
    NAME                          STATUS   ROLES           AGE   VERSION
    node/lab-test-spoke1-node-0   Ready    master,worker   86d   v1.22.3+b93fd35 2
    
    NAME                                                                           VERSION   AVAILABLE   PROGRESSING   DEGRADED   SINCE   MESSAGE
    clusteroperator.config.openshift.io/authentication                             4.9.23    True        False         False      2d7h    3
    clusteroperator.config.openshift.io/baremetal                                  4.9.23    True        False         False      86d
    
    
    ..............

    1
    La version du cluster est disponible et contient la bonne version.
    2
    L'état du nœud est Ready.
    3
    La disponibilité de l'objet ClusterOperator est True.

17.8. Utilisation de la fonction de pré-cache de l'image du conteneur

Les clusters OpenShift à un seul nœud peuvent avoir une bande passante limitée pour accéder au registre des images de conteneurs, ce qui peut entraîner un dépassement de délai avant que les mises à jour ne soient terminées.

Note

L'heure de la mise à jour n'est pas fixée par TALM. Vous pouvez appliquer le CR ClusterGroupUpgrade au début de la mise à jour par application manuelle ou par automatisation externe.

La mise en cache préalable de l'image du conteneur commence lorsque le champ preCaching est défini sur true dans le CR ClusterGroupUpgrade.

TALM utilise la condition PrecacheSpecValid pour signaler les informations d'état comme suit :

  • true

    La spécification relative à la mise en cache préalable est valide et cohérente.

  • false

    La spécification relative à la mise en cache préalable est incomplète.

TALM utilise la condition PrecachingSucceeded pour signaler les informations d'état comme suit :

  • true

    TALM a terminé le processus de pré-mise en cache. Si le pré-caching échoue pour un cluster, la mise à jour échoue pour ce cluster mais se poursuit pour tous les autres clusters. Un message vous informe de l'échec de la mise en cache pour l'un des clusters.

  • false

    La mise en cache est toujours en cours pour un ou plusieurs clusters ou a échoué pour tous les clusters.

Une fois que le processus de mise en cache préalable a réussi, vous pouvez commencer à remédier aux politiques. Les actions de remédiation commencent lorsque le champ enable est défini sur true. En cas d'échec de la mise en cache préalable sur un cluster, la mise à niveau échoue pour ce cluster. Le processus de mise à niveau se poursuit pour tous les autres clusters dont le pré-cache a réussi.

Le processus de pré-cache peut se trouver dans les états suivants :

  • NotStarted

    Il s'agit de l'état initial auquel tous les clusters sont automatiquement assignés lors du premier passage de réconciliation du CR ClusterGroupUpgrade. Dans cet état, le TALM supprime tout espace de noms de pré-mise en cache et les ressources de vue du hub des clusters de rayons qui restent des mises à jour incomplètes précédentes. Le TALM crée ensuite une nouvelle ressource ManagedClusterView pour l'espace de noms de mise en cache préalable des rayons afin de vérifier sa suppression dans l'état PrecachePreparing.

  • PreparingToStart

    Le nettoyage des ressources restantes des précédentes mises à jour incomplètes est en cours.

  • Starting

    Les conditions préalables de la tâche de mise en cache et la tâche sont créées.

  • Active

    L'emploi est en état "actif".

  • Succeeded

    Le travail de pré-cache a réussi.

  • PrecacheTimeout

    La mise en cache de l'artefact est partiellement réalisée.

  • UnrecoverableError

    Le travail se termine avec un code de sortie non nul.

17.8.1. Création d'un ClusterGroupUpgrade CR avec mise en cache préalable

Pour OpenShift à nœud unique, la fonction de pré-cache permet aux images de conteneurs requises d'être présentes sur le cluster de rayons avant que la mise à jour ne commence.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Provisionner un ou plusieurs clusters gérés.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Enregistrez le contenu du CR ClusterGroupUpgrade avec le champ preCaching défini sur true dans le fichier clustergroupupgrades-group-du.yaml:

    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: du-upgrade-4918
      namespace: ztp-group-du-sno
    spec:
      preCaching: true 1
      clusters:
      - cnfdb1
      - cnfdb2
      enable: false
      managedPolicies:
      - du-upgrade-platform-upgrade
      remediationStrategy:
        maxConcurrency: 2
        timeout: 240
    1
    Le champ preCaching est défini sur true, ce qui permet à TALM d'extraire les images des conteneurs avant de lancer la mise à jour.
  2. Lorsque vous voulez commencer la mise en cache, appliquez le CR ClusterGroupUpgrade en exécutant la commande suivante :

    $ oc apply -f clustergroupupgrades-group-du.yaml

Vérification

  1. Vérifiez si le CR ClusterGroupUpgrade existe dans le cluster du concentrateur en exécutant la commande suivante :

    $ oc get cgu -A

    Exemple de sortie

    NAMESPACE          NAME              AGE   STATE        DETAILS
    ztp-group-du-sno   du-upgrade-4918   10s   InProgress   Precaching is required and not done 1

    1
    Le CR est créé.
  2. Vérifiez l'état de la tâche de mise en cache en exécutant la commande suivante :

    $ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'

    Exemple de sortie

    {
      "conditions": [
        {
          "lastTransitionTime": "2022-01-27T19:07:24Z",
          "message": "Precaching is required and not done",
          "reason": "InProgress",
          "status": "False",
          "type": "PrecachingSucceeded"
        },
        {
          "lastTransitionTime": "2022-01-27T19:07:34Z",
          "message": "Pre-caching spec is valid and consistent",
          "reason": "PrecacheSpecIsWellFormed",
          "status": "True",
          "type": "PrecacheSpecValid"
        }
      ],
      "precaching": {
        "clusters": [
          "cnfdb1" 1
          "cnfdb2"
        ],
        "spec": {
          "platformImage": "image.example.io"},
        "status": {
          "cnfdb1": "Active"
          "cnfdb2": "Succeeded"}
        }
    }

    1
    Affiche la liste des clusters identifiés.
  3. Vérifiez l'état de la tâche de mise en cache préalable en exécutant la commande suivante sur le cluster de rayons :

    $ oc get jobs,pods -n openshift-talo-pre-cache

    Exemple de sortie

    NAME                  COMPLETIONS   DURATION   AGE
    job.batch/pre-cache   0/1           3m10s      3m10s
    
    NAME                     READY   STATUS    RESTARTS   AGE
    pod/pre-cache--1-9bmlr   1/1     Running   0          3m10s

  4. Vérifiez l'état de ClusterGroupUpgrade CR en exécutant la commande suivante :

    $ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'

    Exemple de sortie

    "conditions": [
        {
          "lastTransitionTime": "2022-01-27T19:30:41Z",
          "message": "The ClusterGroupUpgrade CR has all clusters compliant with all the managed policies",
          "reason": "UpgradeCompleted",
          "status": "True",
          "type": "Ready"
        },
        {
          "lastTransitionTime": "2022-01-27T19:28:57Z",
          "message": "Precaching is completed",
          "reason": "PrecachingCompleted",
          "status": "True",
          "type": "PrecachingSucceeded" 1
        }

    1
    Les tâches de pré-cache sont terminées.

17.9. Dépannage du gestionnaire de cycle de vie Topology Aware

Le Topology Aware Lifecycle Manager (TALM) est un opérateur de OpenShift Container Platform qui remédie aux politiques RHACM. Lorsque des problèmes surviennent, utilisez la commande oc adm must-gather pour recueillir des détails et des journaux et pour prendre des mesures de débogage.

Pour plus d'informations sur les sujets connexes, voir la documentation suivante :

17.9.1. Dépannage général

Vous pouvez déterminer la cause du problème en répondant aux questions suivantes :

Pour vous assurer que la configuration de ClusterGroupUpgrade est fonctionnelle, vous pouvez procéder comme suit :

  1. Créez le CR ClusterGroupUpgrade avec le champ spec.enable défini sur false.
  2. Attendez que le statut soit mis à jour et répondez aux questions de dépannage.
  3. Si tout se passe comme prévu, réglez le champ spec.enable sur true dans le CR ClusterGroupUpgrade.
Avertissement

Après avoir attribué la valeur true au champ spec.enable dans la CR ClusterUpgradeGroup, la procédure de mise à jour commence et vous ne pouvez plus modifier les champs spec de la CR.

17.9.2. Impossible de modifier le CR ClusterUpgradeGroup

Enjeu
Vous ne pouvez pas modifier le CR ClusterUpgradeGroup après avoir activé la mise à jour.
Résolution

Relancez la procédure en procédant comme suit :

  1. Supprimez l'ancien ClusterGroupUpgrade CR en exécutant la commande suivante :

    $ oc delete cgu -n <ClusterGroupUpgradeCR_namespace> <ClusterGroupUpgradeCR_name>
  2. Vérifier et résoudre les problèmes existants avec les clusters et les politiques gérés.

    1. Assurez-vous que tous les clusters sont gérés et disponibles.
    2. Assurez-vous que toutes les politiques existent et que le champ spec.remediationAction est défini sur inform.
  3. Créez un nouveau CR ClusterGroupUpgrade avec les configurations correctes.

    oc apply -f <ClusterGroupUpgradeCR_YAML>

17.9.3. Politiques gérées

Vérification des politiques gérées sur le système

Enjeu
Vous voulez vérifier si vous avez les bonnes stratégies gérées sur le système.
Résolution

Exécutez la commande suivante :

$ oc get cgu lab-upgrade -ojsonpath='{.spec.managedPolicies}'

Exemple de sortie

["group-du-sno-validator-du-validator-policy", "policy2-common-nto-sub-policy", "policy3-common-ptp-sub-policy"]

Vérification du mode de remédiationAction

Enjeu
Vous voulez vérifier si le champ remediationAction est défini sur inform dans le spec des politiques gérées.
Résolution

Exécutez la commande suivante :

$ oc get policies --all-namespaces

Exemple de sortie

NAMESPACE   NAME                                                 REMEDIATION ACTION   COMPLIANCE STATE   AGE
default     policy1-common-cluster-version-policy                inform               NonCompliant       5d21h
default     policy2-common-nto-sub-policy                        inform               Compliant          5d21h
default     policy3-common-ptp-sub-policy                        inform               NonCompliant       5d21h
default     policy4-common-sriov-sub-policy                      inform               NonCompliant       5d21h

Vérification de l'état de conformité de la politique

Enjeu
Vous souhaitez vérifier l'état de conformité des politiques.
Résolution

Exécutez la commande suivante :

$ oc get policies --all-namespaces

Exemple de sortie

NAMESPACE   NAME                                                 REMEDIATION ACTION   COMPLIANCE STATE   AGE
default     policy1-common-cluster-version-policy                inform               NonCompliant       5d21h
default     policy2-common-nto-sub-policy                        inform               Compliant          5d21h
default     policy3-common-ptp-sub-policy                        inform               NonCompliant       5d21h
default     policy4-common-sriov-sub-policy                      inform               NonCompliant       5d21h

17.9.4. Clusters

Vérification de la présence de clusters gérés
Enjeu
Vous voulez vérifier si les clusters dans le CR ClusterGroupUpgrade sont des clusters gérés.
Résolution

Exécutez la commande suivante :

$ oc get managedclusters

Exemple de sortie

NAME            HUB ACCEPTED   MANAGED CLUSTER URLS                    JOINED   AVAILABLE   AGE
local-cluster   true           https://api.hub.example.com:6443        True     Unknown     13d
spoke1          true           https://api.spoke1.example.com:6443     True     True        13d
spoke3          true           https://api.spoke3.example.com:6443     True     True        27h

  1. Vous pouvez également consulter les journaux du gestionnaire TALM :

    1. Obtenez le nom du gestionnaire TALM en exécutant la commande suivante :

      $ oc get pod -n openshift-operators

      Exemple de sortie

      NAME                                                         READY   STATUS    RESTARTS   AGE
      cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp   2/2     Running   0          45m

    2. Vérifiez les journaux du gestionnaire TALM en exécutant la commande suivante :

      $ oc logs -n openshift-operators \
      cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager

      Exemple de sortie

      ERROR	controller-runtime.manager.controller.clustergroupupgrade	Reconciler error	{"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} 1
      sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem

      1
      Le message d'erreur indique que le cluster n'est pas un cluster géré.
Vérification de la disponibilité des clusters gérés
Enjeu
Vous voulez vérifier si les clusters gérés spécifiés dans le CR ClusterGroupUpgrade sont disponibles.
Résolution

Exécutez la commande suivante :

$ oc get managedclusters

Exemple de sortie

NAME            HUB ACCEPTED   MANAGED CLUSTER URLS                    JOINED   AVAILABLE   AGE
local-cluster   true           https://api.hub.testlab.com:6443        True     Unknown     13d
spoke1          true           https://api.spoke1.testlab.com:6443     True     True        13d 1
spoke3          true           https://api.spoke3.testlab.com:6443     True     True        27h 2

1 2
La valeur du champ AVAILABLE est True pour les clusters gérés.
Vérification du clusterLabelSelector
Enjeu
Vous voulez vérifier si le champ clusterLabelSelector spécifié dans le CR ClusterGroupUpgrade correspond à au moins un des clusters gérés.
Résolution

Exécutez la commande suivante :

oc get managedcluster --selector=upgrade=true 1
1
L'étiquette des clusters que vous souhaitez mettre à jour est upgrade:true.

Exemple de sortie

NAME            HUB ACCEPTED   MANAGED CLUSTER URLS                     JOINED    AVAILABLE   AGE
spoke1          true           https://api.spoke1.testlab.com:6443      True     True        13d
spoke3          true           https://api.spoke3.testlab.com:6443      True     True        27h

Vérification de la présence de grappes de canaris
Enjeu

Vous voulez vérifier si les clusters canaris sont présents dans la liste des clusters.

Exemple ClusterGroupUpgrade CR

spec:
    remediationStrategy:
        canaries:
        - spoke3
        maxConcurrency: 2
        timeout: 240
    clusterLabelSelectors:
      - matchLabels:
          upgrade: true

Résolution

Exécutez les commandes suivantes :

$ oc get cgu lab-upgrade -ojsonpath='{.spec.clusters}'

Exemple de sortie

["spoke1", "spoke3"]

  1. Vérifiez si les clusters canaris sont présents dans la liste des clusters qui correspondent aux étiquettes clusterLabelSelector en exécutant la commande suivante :

    $ oc get managedcluster --selector=upgrade=true

    Exemple de sortie

    NAME            HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED    AVAILABLE   AGE
    spoke1          true           https://api.spoke1.testlab.com:6443   True     True        13d
    spoke3          true           https://api.spoke3.testlab.com:6443   True     True        27h

Note

Un groupe peut être présent sur le site spec.clusters et correspondre à l'étiquette spec.clusterLabelSelector.

Vérification de l'état de la mise en cache sur les clusters de rayons
  1. Vérifiez l'état de la mise en cache préalable en exécutant la commande suivante sur le cluster de rayons :

    $ oc get jobs,pods -n openshift-talo-pre-cache

17.9.5. Stratégie d'assainissement

Vérification de la présence de remediationStrategy dans le CR ClusterGroupUpgrade
Enjeu
Vous voulez vérifier si le remediationStrategy est présent dans le ClusterGroupUpgrade CR.
Résolution

Exécutez la commande suivante :

$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy}'

Exemple de sortie

{"maxConcurrency":2, "timeout":240}

Vérification de la spécification de maxConcurrency dans le CR ClusterGroupUpgrade
Enjeu
Vous voulez vérifier si le maxConcurrency est spécifié dans le ClusterGroupUpgrade CR.
Résolution

Exécutez la commande suivante :

$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy.maxConcurrency}'

Exemple de sortie

2

17.9.6. Gestionnaire du cycle de vie tenant compte de la topologie

Vérification du message de condition et du statut dans le CR ClusterGroupUpgrade
Enjeu
Vous voulez vérifier la valeur du champ status.conditions dans le CR ClusterGroupUpgrade.
Résolution

Exécutez la commande suivante :

$ oc get cgu lab-upgrade -ojsonpath='{.status.conditions}'

Exemple de sortie

{"lastTransitionTime":"2022-02-17T22:25:28Z", "message":"Missing managed policies:[policyList]", "reason":"NotAllManagedPoliciesExist", "status":"False", "type":"Validated"}

Vérification des politiques copiées correspondantes
Enjeu
Vous voulez vérifier si chaque politique de status.managedPoliciesForUpgrade a une politique correspondante dans status.copiedPolicies.
Résolution

Exécutez la commande suivante :

$ oc get cgu lab-upgrade -oyaml

Exemple de sortie

status:
  …
  copiedPolicies:
  - lab-upgrade-policy3-common-ptp-sub-policy
  managedPoliciesForUpgrade:
  - name: policy3-common-ptp-sub-policy
    namespace: default

Vérifier si status.remediationPlan a été calculé
Enjeu
Vous voulez vérifier si status.remediationPlan est calculé.
Résolution

Exécutez la commande suivante :

$ oc get cgu lab-upgrade -ojsonpath='{.status.remediationPlan}'

Exemple de sortie

[["spoke2", "spoke3"]]

Erreurs dans le conteneur du gestionnaire TALM
Enjeu
Vous voulez vérifier les journaux du conteneur gestionnaire de TALM.
Résolution

Exécutez la commande suivante :

$ oc logs -n openshift-operators \
cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager

Exemple de sortie

ERROR	controller-runtime.manager.controller.clustergroupupgrade	Reconciler error	{"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} 1
sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem

1
Affiche l'erreur.
Les clusters ne sont pas conformes à certaines politiques après l'achèvement d'une CR ClusterGroupUpgrade
Enjeu

L'état de conformité de la politique que TALM utilise pour décider si une remédiation est nécessaire n'a pas encore été complètement mis à jour pour tous les clusters. Cela peut s'expliquer par les raisons suivantes

  • L'UGT a été lancée trop tôt après la création ou la mise à jour d'une politique.
  • La remédiation d'une politique affecte la conformité des politiques suivantes dans le CR ClusterGroupUpgrade.
Résolution
Créez une nouvelle application ClusterGroupUpdate CR avec les mêmes spécifications.

Ressources supplémentaires

Chapitre 18. Création d'un profil de performance

Découvrez le Performance Profile Creator (PPC) et la manière dont vous pouvez l'utiliser pour créer un profil de performance.

Note

Actuellement, la désactivation de l'équilibrage de la charge du CPU n'est pas prise en charge par cgroup v2. Par conséquent, il se peut que vous n'obteniez pas le comportement souhaité des profils de performance si vous avez activé cgroup v2. L'activation de cgroup v2 n'est pas recommandée si vous utilisez des profils de performance.

18.1. À propos du créateur de profil de performance

Le Performance Profile Creator (PPC) est un outil en ligne de commande, fourni avec le Node Tuning Operator, utilisé pour créer le profil de performance. L'outil utilise les données must-gather de la grappe et plusieurs arguments de profil fournis par l'utilisateur. Le PPC génère un profil de performance adapté à votre matériel et à votre topologie.

L'outil est exécuté selon l'une des méthodes suivantes :

  • Invoquer podman
  • Appel d'un script wrapper

18.1.1. Collecte de données sur votre cluster à l'aide de la commande must-gather

L'outil Performance Profile Creator (PPC) nécessite des données must-gather. En tant qu'administrateur d'une grappe, exécutez la commande must-gather pour obtenir des informations sur votre grappe.

Note

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon permettait de régler automatiquement les performances des applications à faible latence. Dans OpenShift Container Platform 4.11 et les versions ultérieures, cette fonctionnalité fait partie de l'opérateur Node Tuning. Cependant, vous devez toujours utiliser l'image performance-addon-operator-must-gather lors de l'exécution de la commande must-gather.

Conditions préalables

  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.
  • Accès à l'image de l'opérateur Performance Addon must gather.
  • L'OpenShift CLI (oc) est installé.

Procédure

  1. Facultatif : Vérifiez qu'il existe un pool de configuration machine correspondant avec une étiquette :

    $ oc describe mcp/worker-rt

    Exemple de sortie

    Name:         worker-rt
    Namespace:
    Labels:       machineconfiguration.openshift.io/role=worker-rt

  2. S'il n'existe pas d'étiquette correspondante, ajoutez une étiquette pour un pool de configuration de machine (MCP) qui correspond au nom du MCP :

    $ oc label mcp <mcp_name> <mcp_name>=""
  3. Accédez au répertoire dans lequel vous souhaitez stocker les données must-gather.
  4. Exécutez must-gather sur votre cluster :

    oc adm must-gather --image=<PAO_must_gather_image> --dest-dir=<dir> $ oc adm must-gather --image=<PAO_must_gather_image>
    Note

    La commande must-gather doit être exécutée avec l'image performance-addon-operator-must-gather. La sortie peut éventuellement être compressée. La sortie compressée est nécessaire si vous exécutez le script wrapper Performance Profile Creator.

    Exemple :

    oc adm must-gather --image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.12 --dest-dir=<path_to_must-gather>/must-gather

  5. Créer un fichier compressé à partir du répertoire must-gather:

    $ tar cvaf must-gather.tar.gz must-gather/

18.1.2. Exécuter le créateur de profil de performance à l'aide de podman

En tant qu'administrateur de cluster, vous pouvez exécuter podman et le Créateur de profil de performance pour créer un profil de performance.

Conditions préalables

  • Accès au cluster en tant qu'utilisateur ayant le rôle cluster-admin.
  • Un cluster installé sur du matériel bare-metal.
  • Un nœud avec podman et OpenShift CLI (oc) installés.
  • Accès à l'image de l'opérateur de réglage des nœuds.

Procédure

  1. Vérifiez le pool de configuration de la machine :

    $ oc get mcp

    Exemple de sortie

    NAME         CONFIG                                                 UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
    master       rendered-master-acd1358917e9f98cbdb599aea622d78b       True      False      False      3              3                   3                     0                      22h
    worker-cnf   rendered-worker-cnf-1d871ac76e1951d32b2fe92369879826   False     True       False      2              1                   1                     0                      22h

  2. Utilisez Podman pour vous authentifier sur registry.redhat.io:

    $ podman login registry.redhat.io
    Username: myrhusername
    Password: ************
  3. Facultatif : Affiche l'aide pour l'outil PPC :

    $ podman run --rm --entrypoint performance-profile-creator registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 -h

    Exemple de sortie

    A tool that automates creation of Performance Profiles
    
    Usage:
      performance-profile-creator [flags]
    
    Flags:
          --disable-ht                        Disable Hyperthreading
      -h, --help                              help for performance-profile-creator
          --info string                       Show cluster information; requires --must-gather-dir-path, ignore the other arguments. [Valid values: log, json] (default "log")
          --mcp-name string                   MCP name corresponding to the target machines (required)
          --must-gather-dir-path string       Must gather directory path (default "must-gather")
          --offlined-cpu-count int            Number of offlined CPUs
          --power-consumption-mode string     The power consumption mode.  [Valid values: default, low-latency, ultra-low-latency] (default "default")
          --profile-name string               Name of the performance profile to be created (default "performance")
          --reserved-cpu-count int            Number of reserved CPUs (required)
          --rt-kernel                         Enable Real Time Kernel (required)
          --split-reserved-cpus-across-numa   Split the Reserved CPUs across NUMA nodes
          --topology-manager-policy string    Kubelet Topology Manager Policy of the performance profile to be created. [Valid values: single-numa-node, best-effort, restricted] (default "restricted")
          --user-level-networking             Run with User level Networking(DPDK) enabled

  4. Exécutez l'outil Performance Profile Creator en mode découverte :

    Note

    Le mode découverte inspecte votre cluster à l'aide de la sortie de must-gather. La sortie produite comprend des informations sur :

    • Le partitionnement de la cellule NUMA avec les identifiants de l'unité centrale alloués
    • Si l'hyperthreading est activé

    En utilisant ces informations, vous pouvez définir des valeurs appropriées pour certains des arguments fournis à l'outil Performance Profile Creator.

    $ podman run --entrypoint performance-profile-creator -v <path_to_must-gather>/must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 --info log --must-gather-dir-path /must-gather
    Note

    Cette commande utilise le créateur de profil de performance comme nouveau point d'entrée vers podman. Elle mappe les données must-gather pour l'hôte dans l'image du conteneur et invoque les arguments de profil fournis par l'utilisateur pour produire le fichier my-performance-profile.yaml.

    L'option -v peut être le chemin d'accès à l'un ou l'autre :

    • Le répertoire de sortie de must-gather
    • Un répertoire existant contenant l'archive décompressée must-gather

    L'option info requiert une valeur qui spécifie le format de sortie. Les valeurs possibles sont log et JSON. Le format JSON est réservé au débogage.

  5. Exécuter podman:

    $ podman run --entrypoint performance-profile-creator -v /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 --mcp-name=worker-cnf --reserved-cpu-count=4 --rt-kernel=true --split-reserved-cpus-across-numa=false --must-gather-dir-path /must-gather --power-consumption-mode=ultra-low-latency --offlined-cpu-count=6 > my-performance-profile.yaml
    Note

    Les arguments du Créateur de profil de performance sont présentés dans le tableau des arguments du Créateur de profil de performance. Les arguments suivants sont nécessaires :

    • reserved-cpu-count
    • mcp-name
    • rt-kernel

    Dans cet exemple, l'argument mcp-name est défini sur worker-cnf en fonction de la sortie de la commande oc get mcp. Pour OpenShift à nœud unique, utilisez --mcp-name=master.

  6. Examinez le fichier YAML créé :

    $ cat my-performance-profile.yaml

    Exemple de sortie

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: performance
    spec:
      cpu:
        isolated: 2-39,48-79
        offlined: 42-47
        reserved: 0-1,40-41
      machineConfigPoolSelector:
        machineconfiguration.openshift.io/role: worker-cnf
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
      numa:
        topologyPolicy: restricted
      realTimeKernel:
        enabled: true
      workloadHints:
        highPowerConsumption: true
        realTime: true

  7. Appliquer le profil généré :

    $ oc apply -f my-performance-profile.yaml

18.1.2.1. Comment lancer le site podman pour créer un profil de performance ?

L'exemple suivant montre comment exécuter podman pour créer un profil de performance avec 20 CPU réservés qui doivent être répartis sur les nœuds NUMA.

Configuration du matériel du nœud :

  • 80 CPU
  • Hyperthreading activé
  • Deux nœuds NUMA
  • Les unités centrales paires sont exécutées sur le nœud NUMA 0 et les unités centrales impaires sur le nœud NUMA 1

Lancez podman pour créer le profil de performance :

$ podman run --entrypoint performance-profile-creator -v /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 --mcp-name=worker-cnf --reserved-cpu-count=20 --rt-kernel=true --split-reserved-cpus-across-numa=true --must-gather-dir-path /must-gather > my-performance-profile.yaml

Le profil créé est décrit dans le fichier YAML suivant :

  apiVersion: performance.openshift.io/v2
  kind: PerformanceProfile
  metadata:
    name: performance
  spec:
    cpu:
      isolated: 10-39,50-79
      reserved: 0-9,40-49
    nodeSelector:
      node-role.kubernetes.io/worker-cnf: ""
    numa:
      topologyPolicy: restricted
    realTimeKernel:
      enabled: true
Note

Dans ce cas, 10 CPU sont réservés sur le nœud NUMA 0 et 10 sur le nœud NUMA 1.

18.1.3. Exécution du script wrapper Performance Profile Creator

Le script d'habillage du profil de performance simplifie l'exécution de l'outil Performance Profile Creator (PPC). Il masque les complexités associées à l'exécution de podman et à la spécification des répertoires de mappage et permet la création du profil de performance.

Conditions préalables

  • Accès à l'image de l'opérateur de réglage des nœuds.
  • Accès à l'archive must-gather.

Procédure

  1. Créez un fichier sur votre machine locale nommé, par exemple, run-perf-profile-creator.sh:

    $ vi run-perf-profile-creator.sh
  2. Collez le code suivant dans le fichier :

    #!/bin/bash
    
    readonly CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-podman}
    readonly CURRENT_SCRIPT=$(basename "$0")
    readonly CMD="${CONTAINER_RUNTIME} run --entrypoint performance-profile-creator"
    readonly IMG_EXISTS_CMD="${CONTAINER_RUNTIME} image exists"
    readonly IMG_PULL_CMD="${CONTAINER_RUNTIME} image pull"
    readonly MUST_GATHER_VOL="/must-gather"
    
    NTO_IMG="registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12"
    MG_TARBALL=""
    DATA_DIR=""
    
    usage() {
      print "Wrapper usage:"
      print "  ${CURRENT_SCRIPT} [-h] [-p image][-t path] -- [performance-profile-creator flags]"
      print ""
      print "Options:"
      print "   -h                 help for ${CURRENT_SCRIPT}"
      print "   -p                 Node Tuning Operator image"
      print "   -t                 path to a must-gather tarball"
    
      ${IMG_EXISTS_CMD} "${NTO_IMG}" && ${CMD} "${NTO_IMG}" -h
    }
    
    function cleanup {
      [ -d "${DATA_DIR}" ] && rm -rf "${DATA_DIR}"
    }
    trap cleanup EXIT
    
    exit_error() {
      print "error: $*"
      usage
      exit 1
    }
    
    print() {
      echo  "$*" >&2
    }
    
    check_requirements() {
      ${IMG_EXISTS_CMD} "${NTO_IMG}" || ${IMG_PULL_CMD} "${NTO_IMG}" || \
          exit_error "Node Tuning Operator image not found"
    
      [ -n "${MG_TARBALL}" ] || exit_error "Must-gather tarball file path is mandatory"
      [ -f "${MG_TARBALL}" ] || exit_error "Must-gather tarball file not found"
    
      DATA_DIR=$(mktemp -d -t "${CURRENT_SCRIPT}XXXX") || exit_error "Cannot create the data directory"
      tar -zxf "${MG_TARBALL}" --directory "${DATA_DIR}" || exit_error "Cannot decompress the must-gather tarball"
      chmod a+rx "${DATA_DIR}"
    
      return 0
    }
    
    main() {
      while getopts ':hp:t:' OPT; do
        case "${OPT}" in
          h)
            usage
            exit 0
            ;;
          p)
            NTO_IMG="${OPTARG}"
            ;;
          t)
            MG_TARBALL="${OPTARG}"
            ;;
          ?)
            exit_error "invalid argument: ${OPTARG}"
            ;;
        esac
      done
      shift $((OPTIND - 1))
    
      check_requirements || exit 1
    
      ${CMD} -v "${DATA_DIR}:${MUST_GATHER_VOL}:z" "${NTO_IMG}" "$@" --must-gather-dir-path "${MUST_GATHER_VOL}"
      echo "" 1>&2
    }
    
    main "$@"
  3. Ajoutez des permissions d'exécution pour tout le monde sur ce script :

    $ chmod a+x run-perf-profile-creator.sh
  4. Facultatif : Affichez l'utilisation de la commande run-perf-profile-creator.sh:

    $ ./run-perf-profile-creator.sh -h

    Résultats attendus

    Wrapper usage:
      run-perf-profile-creator.sh [-h] [-p image][-t path] -- [performance-profile-creator flags]
    
    Options:
       -h                 help for run-perf-profile-creator.sh
       -p                 Node Tuning Operator image 1
       -t                 path to a must-gather tarball 2
    A tool that automates creation of Performance Profiles
    
    Usage:
      performance-profile-creator [flags]
    
    Flags:
          --disable-ht                        Disable Hyperthreading
      -h, --help                              help for performance-profile-creator
          --info string                       Show cluster information; requires --must-gather-dir-path, ignore the other arguments. [Valid values: log, json] (default "log")
          --mcp-name string                   MCP name corresponding to the target machines (required)
          --must-gather-dir-path string       Must gather directory path (default "must-gather")
          --offlined-cpu-count int            Number of offlined CPUs
          --power-consumption-mode string     The power consumption mode.  [Valid values: default, low-latency, ultra-low-latency] (default "default")
          --profile-name string               Name of the performance profile to be created (default "performance")
          --reserved-cpu-count int            Number of reserved CPUs (required)
          --rt-kernel                         Enable Real Time Kernel (required)
          --split-reserved-cpus-across-numa   Split the Reserved CPUs across NUMA nodes
          --topology-manager-policy string    Kubelet Topology Manager Policy of the performance profile to be created. [Valid values: single-numa-node, best-effort, restricted] (default "restricted")
          --user-level-networking             Run with User level Networking(DPDK) enabled

    Note

    Il existe deux types d'arguments :

    • Les arguments enveloppants, à savoir -h, -p et -t
    • Arguments du CPP
    1
    En option : Spécifiez l'image de l'opérateur Node Tuning. Si elle n'est pas définie, l'image en amont par défaut est utilisée : registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12.
    2
    -t est un argument obligatoire du script wrapper et spécifie le chemin d'accès à l'archive must-gather.
  5. Exécutez l'outil de création de profils de performance en mode découverte :

    Note

    Le mode découverte inspecte votre cluster à l'aide de la sortie de must-gather. La sortie produite comprend des informations sur :

    • Le partitionnement de la cellule NUMA avec les ID d'unité centrale attribués
    • Si l'hyperthreading est activé

    En utilisant ces informations, vous pouvez définir des valeurs appropriées pour certains des arguments fournis à l'outil Performance Profile Creator.

    $ ./run-perf-profile-creator.sh -t /must-gather/must-gather.tar.gz -- --info=log
    Note

    L'option info requiert une valeur qui spécifie le format de sortie. Les valeurs possibles sont log et JSON. Le format JSON est réservé au débogage.

  6. Vérifiez le pool de configuration de la machine :

    $ oc get mcp

    Exemple de sortie

    NAME         CONFIG                                                 UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
    master       rendered-master-acd1358917e9f98cbdb599aea622d78b       True      False      False      3              3                   3                     0                      22h
    worker-cnf   rendered-worker-cnf-1d871ac76e1951d32b2fe92369879826   False     True       False      2              1                   1                     0                      22h

  7. Créer un profil de performance :

    ./run-perf-profile-creator.sh -t /must-gather/must-gather.tar.gz -- --mcp-name=worker-cnf --reserved-cpu-count=2 --rt-kernel=true > my-performance-profile.yaml
    Note

    Les arguments du Créateur de profil de performance sont présentés dans le tableau des arguments du Créateur de profil de performance. Les arguments suivants sont nécessaires :

    • reserved-cpu-count
    • mcp-name
    • rt-kernel

    Dans cet exemple, l'argument mcp-name est défini sur worker-cnf en fonction de la sortie de la commande oc get mcp. Pour OpenShift à nœud unique, utilisez --mcp-name=master.

  8. Examinez le fichier YAML créé :

    $ cat my-performance-profile.yaml

    Exemple de sortie

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: performance
    spec:
      cpu:
        isolated: 1-39,41-79
        reserved: 0,40
      nodeSelector:
        node-role.kubernetes.io/worker-cnf: ""
      numa:
        topologyPolicy: restricted
      realTimeKernel:
        enabled: false

  9. Appliquer le profil généré :

    Note

    Installez l'opérateur de réglage des nœuds avant d'appliquer le profil.

    $ oc apply -f my-performance-profile.yaml

18.1.4. Arguments du créateur de profil de performance

Tableau 18.1. Arguments du créateur de profil de performance

ArgumentDescription

disable-ht

Désactiver l'hyperthreading.

Valeurs possibles : true ou false.

Valeur par défaut : false.

Avertissement

Si cet argument est défini à true, vous ne devez pas désactiver l'hyperthreading dans le BIOS. La désactivation de l'hyperthreading se fait à l'aide d'un argument de la ligne de commande du noyau.

info

Il capture des informations sur les clusters et n'est utilisé qu'en mode découverte. Le mode découverte nécessite également l'argument must-gather-dir-path. Si d'autres arguments sont définis, ils sont ignorés.

Valeurs possibles :

  • log
  • JSON

    Note

    Ces options définissent le format de sortie, le format JSON étant réservé au débogage.

Valeur par défaut : log.

mcp-name

Nom du MCP par exemple worker-cnf correspondant aux machines cibles. Ce paramètre est obligatoire.

must-gather-dir-path

Doit rassembler le chemin d'accès au répertoire. Ce paramètre est obligatoire.

Lorsque l'utilisateur exécute l'outil avec le script wrapper must-gather est fourni par le script lui-même et l'utilisateur ne doit pas le spécifier.

offlined-cpu-count

Nombre d'unités centrales hors ligne.

Note

Il doit s'agir d'un nombre naturel supérieur à 0. Si le nombre de processeurs logiques déconnectés est insuffisant, des messages d'erreur sont enregistrés. Ces messages sont les suivants :

Error: failed to compute the reserved and isolated CPUs: please ensure that reserved-cpu-count plus offlined-cpu-count should be in the range [0,1]
Error: failed to compute the reserved and isolated CPUs: please specify the offlined CPU count in the range [0,1]

power-consumption-mode

Le mode de consommation d'énergie.

Valeurs possibles :

  • default: Partitionnement de l'unité centrale avec gestion de l'énergie activée et faible latence de base.
  • low-latency: Mesures renforcées pour améliorer les chiffres de latence.
  • ultra-low-latency: Priorité donnée à une latence optimale, au détriment de la gestion de l'énergie.

Valeur par défaut : default.

profile-name

Nom du profil de performance à créer. Valeur par défaut : performance.

reserved-cpu-count

Nombre d'unités centrales réservées. Ce paramètre est obligatoire.

Note

Il doit s'agir d'un nombre naturel. La valeur 0 n'est pas autorisée.

rt-kernel

Activer le noyau en temps réel. Ce paramètre est obligatoire.

Valeurs possibles : true ou false.

split-reserved-cpus-across-numa

Répartir les unités centrales réservées sur les nœuds NUMA.

Valeurs possibles : true ou false.

Valeur par défaut : false.

topology-manager-policy

Politique du Kubelet Topology Manager du profil de performance à créer.

Valeurs possibles :

  • single-numa-node
  • best-effort
  • restricted

Valeur par défaut : restricted.

user-level-networking

Exécution avec la mise en réseau au niveau de l'utilisateur (DPDK) activée.

Valeurs possibles : true ou false.

Valeur par défaut : false.

18.2. Profils de performance de référence

18.2.1. Un modèle de profil de performance pour les clusters qui utilisent OVS-DPDK sur OpenStack

Pour maximiser les performances des machines dans un cluster qui utilise Open vSwitch avec le kit de développement du plan de données (OVS-DPDK) sur Red Hat OpenStack Platform (RHOSP), vous pouvez utiliser un profil de performance.

Vous pouvez utiliser le modèle de profil de performance suivant pour créer un profil pour votre déploiement.

Un modèle de profil de performance pour les clusters qui utilisent OVS-DPDK

apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
  name: cnf-performanceprofile
spec:
  additionalKernelArgs:
    - nmi_watchdog=0
    - audit=0
    - mce=off
    - processor.max_cstate=1
    - idle=poll
    - intel_idle.max_cstate=0
    - default_hugepagesz=1GB
    - hugepagesz=1G
    - intel_iommu=on
  cpu:
    isolated: <CPU_ISOLATED>
    reserved: <CPU_RESERVED>
  hugepages:
    defaultHugepagesSize: 1G
    pages:
      - count: <HUGEPAGES_COUNT>
        node: 0
        size: 1G
  nodeSelector:
    node-role.kubernetes.io/worker: ''
  realTimeKernel:
    enabled: false
    globallyDisableIrqLoadBalancing: true

Insérez les valeurs appropriées à votre configuration pour les clés CPU_ISOLATED, CPU_RESERVED, et HUGEPAGES_COUNT.

Pour savoir comment créer et utiliser les profils de performance, voir la page "Créer un profil de performance" dans la section "Scalabilité et performance" de la documentation OpenShift Container Platform.

18.3. Ressources supplémentaires

Chapitre 19. Partitionnement de la charge de travail dans OpenShift à nœud unique

Dans les environnements à ressources limitées, tels que les déploiements OpenShift à nœud unique, utilisez le partitionnement de la charge de travail pour isoler les services OpenShift Container Platform, les charges de travail de gestion de cluster et les pods d'infrastructure afin qu'ils s'exécutent sur un ensemble réservé d'unités centrales.

Le nombre minimum de CPU réservés requis pour la gestion de cluster dans OpenShift à nœud unique est de quatre Hyper-Threads (HT) de CPU. Avec le partitionnement de la charge de travail, vous annotez l'ensemble des pods de gestion de cluster et un ensemble d'opérateurs complémentaires typiques à inclure dans la partition de la charge de travail de gestion de cluster. Ces modules fonctionnent normalement dans le cadre de la configuration minimale de l'unité centrale. Les opérateurs supplémentaires ou les charges de travail en dehors de l'ensemble de pods de gestion de grappes minimales nécessitent l'ajout de CPU supplémentaires à la partition de la charge de travail.

Le partitionnement de la charge de travail isole les charges de travail des utilisateurs de celles de la plateforme à l'aide des capacités d'ordonnancement standard de Kubernetes.

Voici un aperçu des configurations requises pour le partitionnement de la charge de travail :

  • Le partitionnement de la charge de travail qui utilise /etc/crio/crio.conf.d/01-workload-partitioning relie les pods de l'infrastructure OpenShift Container Platform à une configuration cpuset définie.
  • Le profil de performance épingle les services de cluster tels que systemd et kubelet aux unités centrales définies dans le champ spec.cpu.reserved.

    Note

    À l'aide de l'opérateur de réglage du nœud, vous pouvez configurer le profil de performance pour épingler également les applications au niveau du système pour une configuration complète de partitionnement de la charge de travail sur le nœud.

  • Les CPU que vous spécifiez dans le champ du profil de performance spec.cpu.reserved et dans le champ du partitionnement de la charge de travail cpuset doivent correspondre.

Le partitionnement de la charge de travail introduit une ressource <workload-type>.workload.openshift.io/cores étendue pour chaque pool de CPU défini, ou workload type. Kubelet annonce les ressources et les demandes de CPU par les pods alloués au pool dans la ressource correspondante. Lorsque le partitionnement de la charge de travail est activé, la ressource <workload-type>.workload.openshift.io/cores permet d'accéder à la capacité de CPU de l'hôte, et pas seulement au pool de CPU par défaut.

Ressources supplémentaires

Chapitre 20. Demander des données de profilage CRI-O et Kubelet en utilisant l'opérateur d'observabilité du nœud

L'opérateur d'observabilité des nœuds collecte et stocke les données de profilage CRI-O et Kubelet des nœuds de travail. Vous pouvez interroger les données de profilage pour analyser les tendances des performances de CRI-O et de Kubelet et déboguer les problèmes liés aux performances.

Important

L'opérateur d'observabilité de nœud est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas leur utilisation en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information au cours du processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

20.1. Fonctionnement de l'opérateur d'observabilité des nœuds

Le flux de travail suivant explique comment interroger les données de profilage à l'aide de l'opérateur d'observabilité des nœuds :

  1. Installez l'opérateur d'observabilité Node dans le cluster OpenShift Container Platform.
  2. Créez une ressource personnalisée NodeObservability pour activer le profilage CRI-O sur les nœuds de travail de votre choix.
  3. Exécutez la requête de profilage pour générer les données de profilage.

20.2. Installation de l'opérateur d'observabilité du nœud

Le Node Observability Operator n'est pas installé par défaut dans OpenShift Container Platform. Vous pouvez installer le Node Observability Operator en utilisant le CLI d'OpenShift Container Platform ou la console web.

20.2.1. Installation de l'opérateur d'observabilité du nœud à l'aide du CLI

Vous pouvez installer l'opérateur d'observabilité Node en utilisant la CLI d'OpenShift (oc).

Conditions préalables

  • Vous avez installé le CLI OpenShift (oc).
  • Vous avez accès au cluster avec les privilèges cluster-admin.

Procédure

  1. Confirmez que l'opérateur d'observabilité du nœud est disponible en exécutant la commande suivante :

    $ oc get packagemanifests -n openshift-marketplace node-observability-operator

    Exemple de sortie

    NAME                            CATALOG                AGE
    node-observability-operator     Red Hat Operators      9h

  2. Créez l'espace de noms node-observability-operator en exécutant la commande suivante :

    $ oc new-project node-observability-operator
  3. Créer un fichier YAML de l'objet OperatorGroup:

    cat <<EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: node-observability-operator
      namespace: node-observability-operator
    spec:
      targetNamespaces: []
    EOF
  4. Créer un fichier YAML de l'objet Subscription pour abonner un espace de noms à un opérateur :

    cat <<EOF | oc apply -f -
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: node-observability-operator
      namespace: node-observability-operator
    spec:
      channel: alpha
      name: node-observability-operator
      source: redhat-operators
      sourceNamespace: openshift-marketplace
    EOF

Vérification

  1. Affichez le nom du plan d'installation en exécutant la commande suivante :

    $ oc -n node-observability-operator get sub node-observability-operator -o yaml | yq '.status.installplan.name'

    Exemple de sortie

    install-dt54w

  2. Vérifiez l'état du plan d'installation en exécutant la commande suivante :

    oc -n node-observability-operator get ip <install_plan_name> -o yaml | yq '.status.phase' $ oc -n node-observability-operator get ip <install_plan_name> -o yaml

    <install_plan_name> est le nom du plan d'installation que vous avez obtenu à partir de la sortie de la commande précédente.

    Exemple de sortie

    COMPLETE

  3. Vérifiez que l'opérateur d'observabilité du nœud est opérationnel :

    $ oc get deploy -n node-observability-operator

    Exemple de sortie

    NAME                                            READY   UP-TO-DATE  AVAILABLE   AGE
    node-observability-operator-controller-manager  1/1     1           1           40h

20.2.2. Installation du Node Observability Operator à l'aide de la console web

Vous pouvez installer l'opérateur d'observabilité Node à partir de la console web d'OpenShift Container Platform.

Conditions préalables

  • Vous avez accès au cluster avec les privilèges cluster-admin.
  • Vous avez accès à la console web de OpenShift Container Platform.

Procédure

  1. Connectez-vous à la console web de OpenShift Container Platform.
  2. Dans le panneau de navigation de l'administrateur, développez OperatorsOperatorHub.
  3. Dans le champ All items, entrez Node Observability Operator et sélectionnez la tuile Node Observability Operator.
  4. Cliquez sur Install.
  5. Sur la page Install Operator, configurez les paramètres suivants :

    1. Dans la zone Update channel, cliquez sur alpha.
    2. Dans la zone Installation mode, cliquez sur A specific namespace on the cluster.
    3. Dans la liste Installed Namespace, sélectionnez node-observability-operator.
    4. Dans la zone Update approval, sélectionnez Automatic.
    5. Cliquez sur Install.

Vérification

  1. Dans le panneau de navigation de l'administrateur, développez OperatorsInstalled Operators.
  2. Vérifiez que l'opérateur d'observabilité du nœud figure dans la liste des opérateurs.

20.3. Création de la ressource personnalisée Node Observability

Vous devez créer et exécuter la ressource personnalisée (CR) NodeObservability avant d'exécuter la requête de profilage. Lorsque vous exécutez la CR NodeObservability, elle crée les CR machine config et machine config pool nécessaires pour activer le profilage CRI-O sur les nœuds de travail correspondant à la ressource nodeSelector.

Important

Si le profilage CRI-O n'est pas activé sur les nœuds de travail, la ressource NodeObservabilityMachineConfig est créée. Les nœuds de travail correspondant à la ressource nodeSelector spécifiée dans NodeObservability CR redémarrent. Cette opération peut durer 10 minutes ou plus.

Note

Le profilage des Kubelets est activé par défaut.

Le socket unix CRI-O du nœud est monté sur le pod de l'agent, ce qui permet à l'agent de communiquer avec le CRI-O pour exécuter la requête pprof. De même, la chaîne de certificats kubelet-serving-ca est montée sur le pod de l'agent, ce qui permet une communication sécurisée entre l'agent et le point de terminaison kubelet du nœud.

Conditions préalables

  • Vous avez installé l'opérateur d'observabilité du nœud.
  • Vous avez installé le CLI OpenShift (oc).
  • Vous avez accès au cluster avec les privilèges cluster-admin.

Procédure

  1. Connectez-vous au CLI de OpenShift Container Platform en exécutant la commande suivante :

    $ oc login -u kubeadmin https://<HOSTNAME>:6443
  2. Revenez à l'espace de noms node-observability-operator en exécutant la commande suivante :

    $ oc project node-observability-operator
  3. Créez un fichier CR nommé nodeobservability.yaml qui contient le texte suivant :

        apiVersion: nodeobservability.olm.openshift.io/v1alpha2
        kind: NodeObservability
        metadata:
          name: cluster 1
        spec:
          nodeSelector:
            kubernetes.io/hostname: <node_hostname> 2
          type: crio-kubelet
    1
    Vous devez spécifier le nom cluster car il ne doit y avoir qu'un seul CR NodeObservability par cluster.
    2
    Spécifiez les nœuds sur lesquels l'agent Node Observability doit être déployé.
  4. Exécutez le CR NodeObservability:

    oc apply -f nodeobservability.yaml

    Exemple de sortie

    nodeobservability.olm.openshift.io/cluster created

  5. Vérifiez l'état de NodeObservability CR en exécutant la commande suivante :

    $ oc get nob/cluster -o yaml | yq '.status.conditions'

    Exemple de sortie

    conditions:
      conditions:
      - lastTransitionTime: "2022-07-05T07:33:54Z"
        message: 'DaemonSet node-observability-ds ready: true NodeObservabilityMachineConfig
          ready: true'
        reason: Ready
        status: "True"
        type: Ready

    NodeObservability L'exécution du CR est terminée lorsque le motif est Ready et le statut True.

20.4. Exécution de la requête de profilage

Pour exécuter la requête de profilage, vous devez créer une ressource NodeObservabilityRun. La requête de profilage est une opération bloquante qui récupère les données de profilage CRI-O et Kubelet pour une durée de 30 secondes. Une fois la requête de profilage terminée, vous devez récupérer les données de profilage dans le répertoire /run/node-observability du système de fichiers du conteneur. La durée de vie des données est liée au module d'agent par l'intermédiaire du volume emptyDir, de sorte que vous pouvez accéder aux données de profilage lorsque le module d'agent est dans l'état running.

Important

Vous ne pouvez demander qu'une seule requête de profilage à la fois.

Conditions préalables

  • Vous avez installé l'opérateur d'observabilité du nœud.
  • Vous avez créé la ressource personnalisée (CR) NodeObservability.
  • Vous avez accès au cluster avec les privilèges cluster-admin.

Procédure

  1. Créez un fichier de ressources NodeObservabilityRun nommé nodeobservabilityrun.yaml qui contient le texte suivant :

    apiVersion: nodeobservability.olm.openshift.io/v1alpha2
    kind: NodeObservabilityRun
    metadata:
      name: nodeobservabilityrun
    spec:
      nodeObservabilityRef:
        name: cluster
  2. Déclenchez la requête de profilage en exécutant la ressource NodeObservabilityRun:

    $ oc apply -f nodeobservabilityrun.yaml
  3. Vérifiez l'état du site NodeObservabilityRun en exécutant la commande suivante :

    $ oc get nodeobservabilityrun nodeobservabilityrun -o yaml  | yq '.status.conditions'

    Exemple de sortie

    conditions:
    - lastTransitionTime: "2022-07-07T14:57:34Z"
      message: Ready to start profiling
      reason: Ready
      status: "True"
      type: Ready
    - lastTransitionTime: "2022-07-07T14:58:10Z"
      message: Profiling query done
      reason: Finished
      status: "True"
      type: Finished

    La requête de profilage est terminée lorsque le statut est True et le type Finished.

  4. Récupérez les données de profilage à partir du chemin d'accès au conteneur /run/node-observability en exécutant le script bash suivant :

    for a in $(oc get nodeobservabilityrun nodeobservabilityrun -o yaml | yq .status.agents[].name); do
      echo "agent ${a}"
      mkdir -p "/tmp/${a}"
      for p in $(oc exec "${a}" -c node-observability-agent -- bash -c "ls /run/node-observability/*.pprof"); do
        f="$(basename ${p})"
        echo "copying ${f} to /tmp/${a}/${f}"
        oc exec "${a}" -c node-observability-agent -- cat "${p}" > "/tmp/${a}/${f}"
      done
    done

Chapitre 21. Clusters à la périphérie du réseau

21.1. Les défis de la périphérie du réseau

L'informatique en périphérie présente des défis complexes lorsqu'il s'agit de gérer de nombreux sites géographiquement éloignés. Utilisez le zero touch provisioning (ZTP) et GitOps pour approvisionner et gérer les sites à la périphérie du réseau.

21.1.1. Relever les défis de la périphérie du réseau

Aujourd'hui, les fournisseurs de services souhaitent déployer leur infrastructure à la périphérie du réseau. Cela pose des défis importants :

  • Comment gérer les déploiements de plusieurs sites périphériques en parallèle ?
  • Que se passe-t-il lorsque vous devez déployer des sites dans des environnements déconnectés ?
  • Comment gérer le cycle de vie de grandes flottes de clusters ?

Zero touch provisioning (ZTP) et GitOps relèvent ces défis en vous permettant de provisionner des sites périphériques distants à l'échelle avec des définitions de site déclaratives et des configurations pour l'équipement bare-metal. Les configurations de modèle ou de superposition installent les fonctionnalités d'OpenShift Container Platform qui sont requises pour les charges de travail CNF. Le cycle de vie complet de l'installation et des mises à jour est géré par le pipeline ZTP.

ZTP utilise GitOps pour les déploiements d'infrastructure. Avec GitOps, vous utilisez des fichiers YAML déclaratifs et d'autres modèles définis stockés dans des dépôts Git. Red Hat Advanced Cluster Management (RHACM) utilise vos référentiels Git pour piloter le déploiement de votre infrastructure.

GitOps assure la traçabilité, le contrôle d'accès basé sur les rôles (RBAC) et une source unique de vérité pour l'état souhaité de chaque site. Les problèmes d'évolutivité sont traités par les méthodologies Git et les opérations basées sur les événements par le biais de webhooks.

Vous démarrez le flux de travail ZTP en créant des ressources personnalisées (CR) déclaratives de définition et de configuration de site que le pipeline ZTP transmet aux nœuds périphériques.

Le diagramme suivant montre comment ZTP fonctionne dans le cadre de la périphérie éloignée.

ZTP at the network far edge

21.1.2. Utilisation de ZTP pour provisionner des clusters à la périphérie du réseau

Red Hat Advanced Cluster Management (RHACM) gère les clusters dans une architecture hub-and-spoke, où un seul cluster hub gère de nombreux clusters spoke. Les clusters concentrateurs exécutant RHACM provisionnent et déploient les clusters gérés en utilisant le zero touch provisioning (ZTP) et le service assisté qui est déployé lors de l'installation de RHACM.

Le service assisté gère le provisionnement d'OpenShift Container Platform sur des clusters à un seul nœud, des clusters à trois nœuds ou des clusters standard fonctionnant sur du bare metal.

Voici un aperçu de haut niveau de l'utilisation de ZTP pour provisionner et maintenir des hôtes bare-metal avec OpenShift Container Platform :

  • Un hub cluster exécutant RHACM gère un registre d'images OpenShift qui reflète les images des versions d'OpenShift Container Platform. RHACM utilise le registre d'images OpenShift pour provisionner les clusters gérés.
  • Vous gérez les hôtes nus dans un fichier d'inventaire au format YAML, versionné dans un dépôt Git.
  • Vous préparez les hôtes pour le provisionnement en tant que clusters gérés, et utilisez RHACM et le service assisté pour installer les hôtes bare-metal sur site.

L'installation et le déploiement des clusters est un processus en deux étapes, comprenant une phase d'installation initiale et une phase de configuration ultérieure. Le diagramme suivant illustre ce processus :

Using GitOps and ZTP to install and deploy managed clusters

21.1.3. Installation de clusters gérés avec des ressources SiteConfig et RHACM

GitOps ZTP utilise les ressources personnalisées (CR) SiteConfig dans un référentiel Git pour gérer les processus d'installation des clusters OpenShift Container Platform. La CR SiteConfig contient les paramètres spécifiques aux clusters requis pour l'installation. Elle comporte des options permettant d'appliquer certaines CR de configuration pendant l'installation, y compris des manifestes supplémentaires définis par l'utilisateur.

Le plugin ZTP GitOps traite les CR SiteConfig pour générer une collection de CR sur le cluster hub. Cela déclenche le service assisté dans Red Hat Advanced Cluster Management (RHACM) pour installer OpenShift Container Platform sur l'hôte bare-metal. Vous pouvez trouver l'état de l'installation et les messages d'erreur dans ces CR sur le cluster du concentrateur.

Vous pouvez approvisionner des grappes individuelles manuellement ou par lots à l'aide de ZTP :

Approvisionnement d'un seul cluster
Créez un CR SiteConfig unique et les CR d'installation et de configuration associés pour le cluster, et appliquez-les dans le cluster hub pour commencer le provisionnement du cluster. C'est un bon moyen de tester vos CR avant de les déployer à plus grande échelle.
Approvisionnement de nombreux clusters
Installez des clusters gérés par lots de 400 au maximum en définissant SiteConfig et les CR associés dans un référentiel Git. ArgoCD utilise les CR SiteConfig pour déployer les sites. Le générateur de politiques RHACM crée les manifestes et les applique au cluster hub. Ceci démarre le processus de provisionnement du cluster.

21.1.4. Configuration de clusters gérés avec des politiques et des ressources PolicyGenTemplate

Le Zero Touch Provisioning (ZTP) utilise Red Hat Advanced Cluster Management (RHACM) pour configurer les clusters en utilisant une approche de gouvernance basée sur des règles pour appliquer la configuration.

Le générateur de politiques ou PolicyGen est un plugin pour l'opérateur GitOps qui permet de créer des politiques RHACM à partir d'un modèle concis. L'outil peut combiner plusieurs CR en une seule politique, et vous pouvez générer plusieurs politiques qui s'appliquent à divers sous-ensembles de clusters dans votre flotte.

Note

Pour des raisons d'évolutivité et pour réduire la complexité de la gestion des configurations dans le parc de grappes, utilisez des CR de configuration présentant autant de points communs que possible.

  • Dans la mesure du possible, appliquer les RC de configuration à l'aide d'une politique commune à l'ensemble de la flotte.
  • La préférence suivante consiste à créer des groupements logiques de clusters pour gérer autant que possible les configurations restantes dans le cadre d'une politique de groupe.
  • Lorsqu'une configuration est propre à un site individuel, utilisez RHACM templating sur le cluster hub pour injecter les données spécifiques au site dans une stratégie commune ou de groupe. Il est également possible d'appliquer une politique de site individuelle pour le site.

Le diagramme suivant montre comment le générateur de politiques interagit avec GitOps et RHACM dans la phase de configuration du déploiement du cluster.

Policy generator

Pour les grandes flottes de clusters, il est courant que la configuration de ces clusters soit très cohérente.

La structure des politiques recommandée ci-après combine les CR de configuration pour atteindre plusieurs objectifs :

  • Décrire les configurations courantes et les appliquer à la flotte.
  • Réduire le nombre de politiques maintenues et gérées.
  • Favoriser la flexibilité dans les configurations communes pour les variantes de grappes.

Tableau 21.1. Catégories de politiques recommandées dans PolicyGenTemplate

Catégorie de politiqueDescription

Communs

Une politique qui existe dans la catégorie commune est appliquée à tous les clusters du parc. Utilisez les CR communs PolicyGenTemplate pour appliquer des paramètres d'installation communs à tous les types de clusters.

Groupes

Une stratégie qui existe dans la catégorie des groupes est appliquée à un groupe de clusters dans le parc. Utilisez les CR de groupe PolicyGenTemplate pour gérer des aspects spécifiques des installations de clusters à un nœud, à trois nœuds et standard. Les groupes de clusters peuvent également suivre une région géographique, une variante matérielle, etc.

Sites

Une politique qui existe dans la catégorie des sites est appliquée à un site spécifique de la grappe. Chaque cluster peut avoir ses propres politiques spécifiques gérées.

Ressources supplémentaires

  • Pour plus d'informations sur l'extraction des CR de référence SiteConfig et PolicyGenTemplate de l'image du conteneur ztp-site-generate, voir Préparation du dépôt ZTP Git.

21.2. Préparation de la grappe du concentrateur pour ZTP

Pour utiliser RHACM dans un environnement déconnecté, créez un registre miroir qui reflète les images de version d'OpenShift Container Platform et le catalogue Operator Lifecycle Manager (OLM) qui contient les images d'opérateurs requises. OLM gère, installe et met à niveau les opérateurs et leurs dépendances dans le cluster. Vous pouvez également utiliser un hôte miroir déconnecté pour servir les images de disque RHCOS ISO et RootFS qui sont utilisées pour provisionner les hôtes bare-metal.

21.2.1. Versions logicielles de la solution Telco RAN 4.12 validées

La solution Red Hat Telco Radio Access Network (RAN) version 4.12 a été validée à l'aide des produits logiciels Red Hat suivants.

Tableau 21.2. Logiciel de solution validé Telco RAN 4.12

ProduitVersion du logiciel

Cluster OpenShift Container Platform version

4.12

Plugin GitOps ZTP

4.10, 4.11 ou 4.12

Red Hat Advanced Cluster Management (RHACM)

2.6, 2.7

Red Hat OpenShift GitOps

1.6

Gestionnaire du cycle de vie tenant compte de la topologie (TALM)

4.10, 4.11 ou 4.12

21.2.2. Installation de GitOps ZTP dans un environnement déconnecté

Utilisez Red Hat Advanced Cluster Management (RHACM), Red Hat OpenShift GitOps et Topology Aware Lifecycle Manager (TALM) sur le cluster hub dans l'environnement déconnecté pour gérer le déploiement de plusieurs clusters gérés.

Conditions préalables

  • Vous avez installé le CLI OpenShift Container Platform (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez configuré un registre miroir déconnecté à utiliser dans le cluster.

    Note

    Le registre miroir déconnecté que vous créez doit contenir une version des images de sauvegarde et de pré-cache de TALM qui correspond à la version de TALM en cours d'exécution dans le cluster hub. Le cluster de rayons doit pouvoir résoudre ces images dans le registre miroir déconnecté.

Procédure

21.2.3. Ajout d'images RHCOS ISO et RootFS à l'hôte miroir déconnecté

Avant de commencer à installer des clusters dans l'environnement déconnecté avec Red Hat Advanced Cluster Management (RHACM), vous devez d'abord héberger les images Red Hat Enterprise Linux CoreOS (RHCOS) pour qu'elles soient utilisées. Utilisez un miroir déconnecté pour héberger les images RHCOS.

Conditions préalables

  • Déployer et configurer un serveur HTTP pour héberger les ressources de l'image RHCOS sur le réseau. Vous devez pouvoir accéder au serveur HTTP depuis votre ordinateur et depuis les machines que vous créez.
Important

Les images RHCOS peuvent ne pas changer avec chaque version d'OpenShift Container Platform. Vous devez télécharger les images avec la version la plus élevée qui est inférieure ou égale à la version que vous installez. Utilisez les versions d'image qui correspondent à votre version d'OpenShift Container Platform si elles sont disponibles. Vous avez besoin d'images ISO et RootFS pour installer RHCOS sur les hôtes. Les images RHCOS QCOW2 ne sont pas prises en charge pour ce type d'installation.

Procédure

  1. Connectez-vous à l'hôte miroir.
  2. Obtenez les images RHCOS ISO et RootFS à partir de mirror.openshift.com, par exemple :

    1. Exporter les noms des images requises et la version d'OpenShift Container Platform en tant que variables d'environnement :

      $ export ISO_IMAGE_NAME=<iso_image_name> 1
      $ export ROOTFS_IMAGE_NAME=<rootfs_image_name> 1
      $ export OCP_VERSION=<ocp_version> 1
      1
      Nom de l'image ISO, par exemple, rhcos-4.12.1-x86_64-live.x86_64.iso
      1
      Nom de l'image RootFS, par exemple, rhcos-4.12.1-x86_64-live-rootfs.x86_64.img
      1
      Version d'OpenShift Container Platform, par exemple, 4.12.1
    2. Téléchargez les images nécessaires :

      $ sudo wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.12/${OCP_VERSION}/${ISO_IMAGE_NAME} -O /var/www/html/${ISO_IMAGE_NAME}
      $ sudo wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.12/${OCP_VERSION}/${ROOTFS_IMAGE_NAME} -O /var/www/html/${ROOTFS_IMAGE_NAME}

Verification steps

  • Vérifiez que les images ont été téléchargées avec succès et qu'elles sont servies sur l'hôte miroir déconnecté, par exemple :

    $ wget http://$(hostname)/${ISO_IMAGE_NAME}

    Exemple de sortie

    Saving to: rhcos-4.12.1-x86_64-live.x86_64.iso
    rhcos-4.12.1-x86_64-live.x86_64.iso-  11%[====>    ]  10.01M  4.71MB/s

21.2.4. Activation du service assisté et mise à jour de AgentServiceConfig sur le cluster hub

Red Hat Advanced Cluster Management (RHACM) utilise le service assisté pour déployer les clusters OpenShift Container Platform. Le service assisté est déployé automatiquement lorsque vous activez l'opérateur MultiClusterHub avec Central Infrastructure Management (CIM). Lorsque vous avez activé CIM sur le cluster hub, vous devez alors mettre à jour la ressource personnalisée (CR) AgentServiceConfig avec des références aux images ISO et RootFS qui sont hébergées sur le serveur HTTP du registre miroir.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez activé le service assisté sur le cluster du concentrateur. Pour plus d'informations, voir Activation du service de gestion de l'infrastructure centrale.

Procédure

  1. Mettez à jour le CR AgentServiceConfig en exécutant la commande suivante :

    $ oc edit AgentServiceConfig
  2. Ajouter l'entrée suivante au champ items.spec.osImages du CR :

    - cpuArchitecture: x86_64
        openshiftVersion: "4.12"
        rootFSUrl: https://<host>/<path>/rhcos-live-rootfs.x86_64.img
        url: https://<mirror-registry>/<path>/rhcos-live.x86_64.iso

    où :

    <host>
    Nom de domaine complet (FQDN) du serveur HTTP du registre miroir cible.
    <sentier>
    Chemin d'accès à l'image sur le registre du miroir cible.

    Enregistrez et quittez l'éditeur pour appliquer les modifications.

21.2.5. Configuration du cluster hub pour utiliser un registre miroir déconnecté

Vous pouvez configurer le hub cluster pour utiliser un registre miroir déconnecté pour un environnement déconnecté.

Conditions préalables

  • Vous avez une installation de cluster hub déconnecté avec Red Hat Advanced Cluster Management (RHACM) 2.5 installé.
  • Vous avez hébergé les images rootfs et iso sur un serveur HTTP.
Avertissement

Si vous activez TLS pour le serveur HTTP, vous devez confirmer que le certificat racine est signé par une autorité approuvée par le client et vérifier la chaîne de certificats approuvés entre votre hub OpenShift Container Platform et les clusters gérés et le serveur HTTP. L'utilisation d'un serveur configuré avec un certificat non approuvé empêche le téléchargement des images vers le service de création d'images. L'utilisation de serveurs HTTPS non approuvés n'est pas prise en charge.

Procédure

  1. Créer un ConfigMap contenant la configuration du registre miroir :

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: assisted-installer-mirror-config
      namespace: assisted-installer
      labels:
        app: assisted-service
    data:
      ca-bundle.crt: <certificate> 1
      registries.conf: |  2
        unqualified-search-registries = ["registry.access.redhat.com", "docker.io"]
    
        [[registry]]
          location = <mirror_registry_url>  3
          insecure = false
          mirror-by-digest-only = true
    1
    Certificat du registre miroir utilisé lors de la création du registre miroir.
    2
    Le fichier de configuration du registre des miroirs. La configuration du registre miroir ajoute des informations de miroir à /etc/containers/registries.conf dans l'image de découverte. Ces informations sont stockées dans la section imageContentSources du fichier install-config.yaml lorsqu'elles sont transmises au programme d'installation. Le pod de service assisté fonctionnant sur le cluster HUB récupère les images des conteneurs à partir du registre miroir configuré.
    3
    L'URL du registre miroir.

    Cette opération met à jour mirrorRegistryRef dans la ressource personnalisée AgentServiceConfig, comme indiqué ci-dessous :

    Exemple de sortie

    apiVersion: agent-install.openshift.io/v1beta1
    kind: AgentServiceConfig
    metadata:
      name: agent
      namespace: assisted-installer
    spec:
      databaseStorage:
        volumeName: <db_pv_name>
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: <db_storage_size>
      filesystemStorage:
        volumeName: <fs_pv_name>
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: <fs_storage_size>
      mirrorRegistryRef:
        name: 'assisted-installer-mirror-config'
      osImages:
        - openshiftVersion: <ocp_version>
          rootfs: <rootfs_url> 1
          url: <iso_url> 2

    1 2
    Doit correspondre aux URL du serveur HTTPD.
Important

Un serveur NTP valide est requis lors de l'installation des clusters. Assurez-vous qu'un serveur NTP approprié est disponible et qu'il est accessible depuis les grappes installées via le réseau déconnecté.

21.2.6. Configurer le hub cluster pour utiliser des registres non authentifiés

Vous pouvez configurer le cluster hub pour utiliser des registres non authentifiés. Les registres non authentifiés ne nécessitent pas d'authentification pour accéder aux images et les télécharger.

Conditions préalables

  • Vous avez installé et configuré un cluster de type hub et installé Red Hat Advanced Cluster Management (RHACM) sur le cluster de type hub.
  • Vous avez installé le CLI (oc) de OpenShift Container Platform.
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez configuré un registre non authentifié à utiliser avec le cluster hub.

Procédure

  1. Mettez à jour la ressource personnalisée (CR) AgentServiceConfig en exécutant la commande suivante :

    $ oc edit AgentServiceConfig agent
  2. Ajouter le champ unauthenticatedRegistries dans le CR :

    apiVersion: agent-install.openshift.io/v1beta1
    kind: AgentServiceConfig
    metadata:
      name: agent
    spec:
      unauthenticatedRegistries:
      - example.registry.com
      - example.registry2.com
      ...

    Les registres non authentifiés sont répertoriés sous spec.unauthenticatedRegistries dans la ressource AgentServiceConfig. Tout registre figurant sur cette liste n'est pas tenu d'avoir une entrée dans le secret d'extraction utilisé pour l'installation du cluster de rayons. assisted-service valide le secret d'extraction en s'assurant qu'il contient les informations d'authentification pour chaque registre d'image utilisé pour l'installation.

Note

Les registres miroirs sont automatiquement ajoutés à la liste des ignorés et n'ont pas besoin d'être ajoutés sous spec.unauthenticatedRegistries. La spécification de la variable d'environnement PUBLIC_CONTAINER_REGISTRIES dans ConfigMap remplace les valeurs par défaut par la valeur spécifiée. Les valeurs par défaut de PUBLIC_CONTAINER_REGISTRIES sont quay.io et registry.svc.ci.openshift.org.

Vérification

Vérifiez que vous pouvez accéder au registre nouvellement ajouté à partir du cluster hub en exécutant les commandes suivantes :

  1. Ouvrez un shell de débogage vers le cluster du concentrateur :

    oc debug node/<node_name>
  2. Testez l'accès au registre non authentifié en exécutant la commande suivante :

    sh-4.4# podman login -u kubeadmin -p $(oc whoami -t) <unauthenticated_registry>

    où :

    <registre_non-authentifié>
    Le nouveau registre est-il, par exemple, unauthenticated-image-registry.openshift-image-registry.svc:5000.

    Exemple de sortie

    Login Succeeded!

21.2.7. Configuration du cluster hub avec ArgoCD

Vous pouvez configurer le cluster hub avec un ensemble d'applications ArgoCD qui génèrent les ressources personnalisées (CR) d'installation et de stratégie requises pour chaque site avec GitOps zero touch provisioning (ZTP).

Note

Red Hat Advanced Cluster Management (RHACM) utilise les CR SiteConfig pour générer les CR d'installation de cluster géré du jour 1 pour ArgoCD. Chaque application ArgoCD peut gérer un maximum de 300 CR SiteConfig.

Conditions préalables

  • Vous avez un hub cluster OpenShift Container Platform avec Red Hat Advanced Cluster Management (RHACM) et Red Hat OpenShift GitOps installés.
  • Vous avez extrait le déploiement de référence du conteneur du plugin ZTP GitOps comme décrit dans la section "Préparation du référentiel de configuration du site GitOps ZTP". L'extraction du déploiement de référence crée le répertoire out/argocd/deployment auquel il est fait référence dans la procédure suivante.

Procédure

  1. Préparer la configuration du pipeline ArgoCD :

    1. Créez un dépôt Git avec une structure de répertoire similaire au répertoire d'exemple. Pour plus d'informations, voir "Preparing the GitOps ZTP site configuration repository".
    2. Configurez l'accès au référentiel en utilisant l'interface utilisateur d'ArgoCD. Sous Settings, configurez les éléments suivants :

      • Repositories - Ajoutez les informations de connexion. L'URL doit se terminer par .git, par exemple, https://repo.example.com/repo.git et les informations d'identification.
      • Certificates - Ajoutez le certificat public pour le référentiel, si nécessaire.
    3. Modifiez les deux applications ArgoCD, out/argocd/deployment/clusters-app.yaml et out/argocd/deployment/policies-app.yaml, en fonction de votre dépôt Git :

      • Mettez à jour l'URL pour qu'elle pointe vers le dépôt Git. L'URL se termine par .git, par exemple, https://repo.example.com/repo.git.
      • Le site targetRevision indique la branche du dépôt Git à surveiller.
      • path spécifie le chemin vers les CR SiteConfig et PolicyGenTemplate, respectivement.
  2. Pour installer le plugin ZTP GitOps, vous devez patcher l'instance ArgoCD dans le cluster hub en utilisant le fichier patch précédemment extrait dans le répertoire out/argocd/deployment/. Exécutez la commande suivante :

    $ oc patch argocd openshift-gitops \
    -n openshift-gitops --type=merge \
    --patch-file out/argocd/deployment/argocd-openshift-gitops-patch.json
  3. Appliquez la configuration du pipeline à votre cluster hub en utilisant la commande suivante :

    $ oc apply -k out/argocd/deployment

21.2.8. Préparation du dépôt de configuration du site ZTP de GitOps

Avant d'utiliser le pipeline ZTP GitOps, vous devez préparer le dépôt Git qui hébergera les données de configuration du site.

Conditions préalables

  • Vous avez configuré les applications GitOps du hub cluster pour générer les ressources personnalisées (CR) d'installation et de stratégie requises.
  • Vous avez déployé les clusters gérés à l'aide du Zero Touch Provisioning (ZTP).

Procédure

  1. Créez une structure de répertoire avec des chemins distincts pour les CR SiteConfig et PolicyGenTemplate.
  2. Exportez le répertoire argocd à partir de l'image du conteneur ztp-site-generate à l'aide des commandes suivantes :

    $ podman pull registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12
    $ mkdir -p ./out
    $ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12 extract /home/ztp --tar | tar x -C ./out
  3. Vérifiez que le répertoire out contient les sous-répertoires suivants :

    • out/extra-manifest contient les fichiers CR source que SiteConfig utilise pour générer le manifeste supplémentaire configMap.
    • out/source-crs contient les fichiers CR source que PolicyGenTemplate utilise pour générer les stratégies de Red Hat Advanced Cluster Management (RHACM).
    • out/argocd/deployment contient des correctifs et des fichiers YAML à appliquer sur le cluster hub pour l'étape suivante de cette procédure.
    • out/argocd/example contient les exemples de fichiers SiteConfig et PolicyGenTemplate qui représentent la configuration recommandée.

La structure des répertoires sous out/argocd/example sert de référence pour la structure et le contenu de votre dépôt Git. L'exemple inclut SiteConfig et PolicyGenTemplate, des CR de référence pour les clusters à un nœud, à trois nœuds et standard. Supprimez les références aux types de clusters que vous n'utilisez pas. L'exemple suivant décrit un ensemble de CR pour un réseau de clusters à nœud unique :

example
├── policygentemplates
│   ├── common-ranGen.yaml
│   ├── example-sno-site.yaml
│   ├── group-du-sno-ranGen.yaml
│   ├── group-du-sno-validator-ranGen.yaml
│   ├── kustomization.yaml
│   └── ns.yaml
└── siteconfig
    ├── example-sno.yaml
    ├── KlusterletAddonConfigOverride.yaml
    └── kustomization.yaml

Conservez les CR SiteConfig et PolicyGenTemplate dans des répertoires distincts. Les répertoires SiteConfig et PolicyGenTemplate doivent contenir un fichier kustomization.yaml qui inclut explicitement les fichiers de ce répertoire.

Cette structure de répertoire et les fichiers kustomization.yaml doivent être validés et transférés dans votre dépôt Git. Le premier transfert vers Git doit inclure les fichiers kustomization.yaml. Les fichiers SiteConfig (example-sno.yaml) et PolicyGenTemplate (common-ranGen.yaml, group-du-sno*.yaml, et example-sno-site.yaml) peuvent être omis et transférés ultérieurement si nécessaire lors du déploiement d'un site.

Le fichier KlusterletAddonConfigOverride.yaml n'est requis que si un ou plusieurs CR SiteConfig qui y font référence sont validés et poussés sur Git. Voir example-sno.yaml pour un exemple d'utilisation.

21.3. Installation de clusters gérés avec RHACM et les ressources SiteConfig

Vous pouvez provisionner des clusters OpenShift Container Platform à l'échelle avec Red Hat Advanced Cluster Management (RHACM) en utilisant le service assisté et le générateur de politiques du plugin GitOps avec la technologie de réduction du noyau activée. Le pipeline ZTP (zero touch priovisioning) effectue les installations de clusters. ZTP peut être utilisé dans un environnement déconnecté.

21.3.1. GitOps ZTP et Topology Aware Lifecycle Manager (Gestionnaire de cycle de vie avec prise en compte de la topologie)

GitOps zero touch provisioning (ZTP) génère des CR d'installation et de configuration à partir de manifestes stockés dans Git. Ces artefacts sont appliqués à un cluster hub centralisé où Red Hat Advanced Cluster Management (RHACM), le service assisté et le Topology Aware Lifecycle Manager (TALM) utilisent les CR pour installer et configurer le cluster géré. La phase de configuration du pipeline ZTP utilise le TALM pour orchestrer l'application des CR de configuration au cluster. Il existe plusieurs points d'intégration clés entre GitOps ZTP et le TALM.

Informer les politiques
Par défaut, le ZTP GitOps crée toutes les politiques avec une action de remédiation de inform. Ces politiques provoquent un rapport du RHACM sur l'état de conformité des clusters concernés par les politiques, mais n'appliquent pas la configuration souhaitée. Au cours du processus ZTP, après l'installation d'OpenShift, le TALM passe en revue les politiques inform créées et les applique au(x) cluster(s) géré(s) cible(s). Cela permet d'appliquer la configuration au cluster géré. En dehors de la phase ZTP du cycle de vie du cluster, cela vous permet de modifier les politiques sans risquer de déployer immédiatement ces changements sur les clusters gérés affectés. Vous pouvez contrôler le calendrier et l'ensemble des clusters remédiés en utilisant TALM.
Création automatique des CR de ClusterGroupUpgrade

Pour automatiser la configuration initiale des clusters nouvellement déployés, le TALM surveille l'état de tous les CR ManagedCluster sur le cluster hub. Tout CR ManagedCluster qui n'a pas d'étiquette ztp-done appliquée, y compris les CR ManagedCluster nouvellement créés, entraîne la création automatique par le TALM d'un CR ClusterGroupUpgrade avec les caractéristiques suivantes :

  • Le CR ClusterGroupUpgrade est créé et activé dans l'espace de noms ztp-install.
  • ClusterGroupUpgrade CR porte le même nom que le ManagedCluster CR.
  • Le sélecteur de grappes n'inclut que la grappe associée à la CR ManagedCluster.
  • L'ensemble des politiques gérées comprend toutes les politiques que RHACM a liées au cluster au moment de la création de ClusterGroupUpgrade.
  • La mise en cache préalable est désactivée.
  • Le délai d'attente est fixé à 4 heures (240 minutes).

La création automatique d'une adresse ClusterGroupUpgrade activée garantit que le déploiement initial des grappes se fait sans intervention de l'utilisateur. En outre, la création automatique d'un CR ClusterGroupUpgrade pour tout ManagedCluster sans le label ztp-done permet de redémarrer une installation ZTP défaillante en supprimant simplement le CR ClusterGroupUpgrade pour le cluster.

Vagues

Chaque politique générée à partir d'une CR PolicyGenTemplate comprend une annotation ztp-deploy-wave. Cette annotation est basée sur la même annotation de chaque RC qui est incluse dans cette politique. L'annotation "vague" est utilisée pour ordonner les politiques dans la CR ClusterGroupUpgrade générée automatiquement. L'annotation de la vague n'est pas utilisée ailleurs que dans le CR auto-généré ClusterGroupUpgrade.

Note

Tous les CR d'une même politique doivent avoir le même paramètre pour l'annotation ztp-deploy-wave. La valeur par défaut de cette annotation pour chaque CR peut être remplacée dans . La valeur par défaut de cette annotation pour chaque RC peut être remplacée par l'annotation PolicyGenTemplate. L'annotation wave dans le RC source est utilisée pour déterminer et fixer l'annotation wave de la politique. Cette annotation est supprimée de chaque RC construit qui est inclus dans la politique générée au moment de l'exécution.

Le TALM applique les politiques de configuration dans l'ordre spécifié par les annotations de vagues. Le TALM attend que chaque politique soit conforme avant de passer à la politique suivante. Il est important de s'assurer que l'annotation d'onde pour chaque RC prend en compte les conditions préalables à l'application de ces RC au cluster. Par exemple, un opérateur doit être installé avant ou en même temps que la configuration de l'opérateur. De même, le site CatalogSource pour un opérateur doit être installé dans une vague avant ou en même temps que l'abonnement de l'opérateur. La valeur par défaut de la vague pour chaque CR tient compte de ces conditions préalables.

Plusieurs CR et politiques peuvent partager le même numéro d'onde. Le fait d'avoir moins de politiques peut accélérer les déploiements et réduire l'utilisation de l'unité centrale. La meilleure pratique consiste à regrouper de nombreux CR en un nombre relativement restreint de vagues.

Pour vérifier la valeur par défaut de la vague dans chaque CR source, exécutez la commande suivante dans le répertoire out/source-crs extrait de l'image du conteneur ztp-site-generate:

$ grep -r "ztp-deploy-wave" out/source-crs
Étiquettes de phase

Le CR ClusterGroupUpgrade est automatiquement créé et comprend des directives pour annoter le CR ManagedCluster avec des étiquettes au début et à la fin du processus ZTP.

Lorsque la configuration ZTP post-installation commence, l'étiquette ztp-running est appliquée à l'adresse ManagedCluster. Lorsque toutes les politiques sont remédiées dans le cluster et sont entièrement conformes, ces directives amènent le TALM à supprimer le label ztp-running et à appliquer le label ztp-done.

Pour les déploiements qui utilisent la politique informDuValidator, le label ztp-done est appliqué lorsque le cluster est entièrement prêt pour le déploiement des applications. Cela inclut tous les rapprochements et les effets résultants des CR de configuration appliqués par ZTP. Le label ztp-done affecte la création automatique de CR ClusterGroupUpgrade par TALM. Ne manipulez pas ce label après l'installation initiale de la grappe par ZTP.

CR liés
La CR ClusterGroupUpgrade créée automatiquement a la même référence propriétaire que la CR ManagedCluster dont elle est dérivée. Cette référence garantit que la suppression de la CR ManagedCluster entraîne la suppression de l'instance de la CR ClusterGroupUpgrade et de toutes les ressources qui la soutiennent.

21.3.2. Vue d'ensemble du déploiement de grappes gérées avec ZTP

Red Hat Advanced Cluster Management (RHACM) utilise le zero touch provisioning (ZTP) pour déployer des clusters OpenShift Container Platform à un nœud, des clusters à trois nœuds et des clusters standard. Vous gérez les données de configuration du site en tant que ressources personnalisées (CR) OpenShift Container Platform dans un référentiel Git. ZTP utilise une approche GitOps déclarative pour un modèle de développement unique et de déploiement en tout lieu afin de déployer les clusters gérés.

Le déploiement des grappes comprend

  • Installation du système d'exploitation hôte (RHCOS) sur un serveur vierge
  • Déployer OpenShift Container Platform
  • Création de politiques de cluster et d'abonnements à des sites
  • Effectuer les configurations réseau nécessaires au système d'exploitation du serveur
  • Déployer les opérateurs de profil et effectuer toute configuration logicielle nécessaire, telle que le profil de performance, le PTP et le SR-IOV
Vue d'ensemble du processus d'installation d'un site géré

Une fois que vous avez appliqué les ressources personnalisées (CR) du site géré sur le cluster du concentrateur, les actions suivantes se produisent automatiquement :

  1. Un fichier ISO d'image de découverte est généré et démarré sur l'hôte cible.
  2. Lorsque le fichier ISO démarre avec succès sur l'hôte cible, il communique au RHACM les informations relatives au matériel de l'hôte.
  3. Une fois tous les hôtes découverts, OpenShift Container Platform est installé.
  4. Lorsque l'installation d'OpenShift Container Platform est terminée, le hub installe le service klusterlet sur le cluster cible.
  5. Les services complémentaires demandés sont installés sur le cluster cible.

Le processus ISO de l'image de découverte est terminé lorsque le CR Agent pour le cluster géré est créé sur le cluster concentrateur.

Important

L'hôte bare-metal cible doit répondre aux exigences en matière de réseau, de firmware et de matériel énumérées dans Configuration recommandée d'un cluster OpenShift à nœud unique pour les charges de travail des applications vDU.

21.3.3. Création des secrets de l'hôte bare-metal géré

Ajoutez les ressources personnalisées (CR) Secret requises pour l'hôte bare-metal géré au cluster du concentrateur. Vous avez besoin d'un secret pour le pipeline ZTP afin d'accéder au Baseboard Management Controller (BMC) et d'un secret pour le service d'installation assistée afin d'extraire les images d'installation de cluster du registre.

Note

Les secrets sont référencés à partir du CR SiteConfig par leur nom. L'espace de noms doit correspondre à l'espace de noms de SiteConfig.

Procédure

  1. Créer un fichier secret YAML contenant les informations d'identification pour le contrôleur de gestion de carte de base (BMC) de l'hôte et un secret d'extraction requis pour l'installation d'OpenShift et de tous les opérateurs de cluster supplémentaires :

    1. Enregistrer le YAML suivant dans le fichier example-sno-secret.yaml:

      apiVersion: v1
      kind: Secret
      metadata:
        name: example-sno-bmc-secret
        namespace: example-sno 1
      data: 2
        password: <base64_password>
        username: <base64_username>
      type: Opaque
      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: pull-secret
        namespace: example-sno  3
      data:
        .dockerconfigjson: <pull_secret> 4
      type: kubernetes.io/dockerconfigjson
      1
      Doit correspondre à l'espace de noms configuré dans la CR SiteConfig correspondante
      2
      Valeurs encodées en base64 pour password et username
      3
      Doit correspondre à l'espace de noms configuré dans la CR SiteConfig correspondante
      4
      Secret d'extraction codé en base64
  2. Ajoutez le chemin relatif vers example-sno-secret.yaml au fichier kustomization.yaml que vous utilisez pour installer le cluster.

21.3.4. Configuration des arguments du noyau Discovery ISO pour les installations utilisant GitOps ZTP

Le flux de travail GitOps ZTP utilise l'ISO Discovery dans le cadre du processus d'installation d'OpenShift Container Platform sur les hôtes bare-metal gérés. Vous pouvez éditer la ressource InfraEnv pour spécifier les arguments du noyau pour l'ISO de découverte. Ceci est utile pour les installations de clusters avec des exigences environnementales spécifiques. Par exemple, configurez l'argument de noyau rd.net.timeout.carrier pour l'ISO de découverte afin de faciliter la mise en réseau statique du cluster ou de recevoir une adresse DHCP avant de télécharger le système de fichiers racine pendant l'installation.

Note

Dans OpenShift Container Platform 4.12, vous ne pouvez qu'ajouter des arguments de noyau. Vous ne pouvez pas remplacer ou supprimer des arguments du noyau.

Conditions préalables

  • Vous avez installé le CLI OpenShift (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Créez le CR InfraEnv et modifiez la spécification spec.kernelArguments pour configurer les arguments du noyau.

    1. Enregistrez le YAML suivant dans un fichier InfraEnv-example.yaml:

      Note

      Dans cet exemple, la CR InfraEnv utilise une syntaxe de modèle telle que {{ .Cluster.ClusterName }} qui est remplie en fonction des valeurs de la CR SiteConfig. La CR SiteConfig remplit automatiquement les valeurs de ces modèles pendant le déploiement. Ne modifiez pas les modèles manuellement.

      apiVersion: agent-install.openshift.io/v1beta1
      kind: InfraEnv
      metadata:
        annotations:
          argocd.argoproj.io/sync-wave: "1"
        name: "{{ .Cluster.ClusterName }}"
        namespace: "{{ .Cluster.ClusterName }}"
      spec:
        clusterRef:
          name: "{{ .Cluster.ClusterName }}"
          namespace: "{{ .Cluster.ClusterName }}"
        kernelArguments:
          - operation: append 1
            value: audit=0 2
          - operation: append
            value: trace=1
        sshAuthorizedKey: "{{ .Site.SshPublicKey }}"
        proxy: "{{ .Cluster.ProxySettings }}"
        pullSecretRef:
          name: "{{ .Site.PullSecretRef.Name }}"
        ignitionConfigOverride: "{{ .Cluster.IgnitionConfigOverride }}"
        nmStateConfigLabelSelector:
          matchLabels:
            nmstate-label: "{{ .Cluster.ClusterName }}"
        additionalNTPSources: "{{ .Cluster.AdditionalNTPSources }}"
      1
      Spécifier l'opération d'ajout d'un argument du noyau.
      2
      Spécifiez l'argument du noyau que vous souhaitez configurer. Cet exemple configure l'argument de noyau audit et l'argument de noyau trace.
  2. Livrez le CR InfraEnv-example.yaml au même endroit dans votre dépôt Git que le CR SiteConfig et repoussez vos modifications. L'exemple suivant montre un exemple de structure de dépôt Git :

    ~/example-ztp/install
              └── site-install
                   ├── siteconfig-example.yaml
                   ├── InfraEnv-example.yaml
                   ...
  3. Modifiez la spécification spec.clusters.crTemplates dans le CR SiteConfig pour faire référence au CR InfraEnv-example.yaml dans votre référentiel Git :

    clusters:
      crTemplates:
        InfraEnv: "InfraEnv-example.yaml"

    Lorsque vous êtes prêt à déployer votre cluster en validant et en poussant le CR SiteConfig, le pipeline de construction utilise le CR personnalisé InfraEnv-example dans votre dépôt Git pour configurer l'environnement d'infrastructure, y compris les arguments personnalisés du noyau.

Vérification

Pour vérifier que les arguments du noyau sont appliqués, après que l'image Discovery a vérifié qu'OpenShift Container Platform est prêt pour l'installation, vous pouvez vous connecter en SSH à l'hôte cible avant que le processus d'installation ne commence. À ce moment-là, vous pouvez voir les arguments du noyau pour l'ISO Discovery dans le fichier /proc/cmdline.

  1. Ouvrez une session SSH avec l'hôte cible :

    $ ssh -i /path/to/privatekey core@<nom_de_l'hôte>
  2. Affichez les arguments du noyau du système à l'aide de la commande suivante :

    $ cat /proc/cmdline

21.3.5. Déploiement d'un cluster géré avec SiteConfig et ZTP

Suivez la procédure suivante pour créer une ressource personnalisée (CR) SiteConfig et les fichiers associés, et pour lancer le déploiement du cluster ZTP (Zero Touch Provisioning).

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez configuré le cluster du concentrateur pour générer les CR d'installation et de stratégie nécessaires.
  • Vous avez créé un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé. Le référentiel doit être accessible depuis le cluster du concentrateur et vous devez le configurer comme référentiel source pour l'application ArgoCD. Voir "Préparation du dépôt de configuration de site GitOps ZTP" pour plus d'informations.

    Note

    Lorsque vous créez le référentiel source, assurez-vous de patcher l'application ArgoCD avec le fichier de patches argocd/deployment/argocd-openshift-gitops-patch.json que vous extrayez du conteneur ztp-site-generate. Voir "Configuration du cluster hub avec ArgoCD".

  • Pour être prêt à provisionner des clusters gérés, vous devez disposer des éléments suivants pour chaque hôte bare-metal :

    Connectivité du réseau
    Votre réseau a besoin de DNS. Les hôtes des clusters gérés doivent être joignables depuis le hub cluster. Assurez-vous que la connectivité de couche 3 existe entre le cluster hub et l'hôte du cluster géré.
    Détails du contrôleur de gestion de la carte de base (BMC)
    ZTP utilise le nom d'utilisateur et le mot de passe de la BMC pour se connecter à la BMC lors de l'installation du cluster. Le plugin ZTP de GitOps gère les CR ManagedCluster sur le cluster hub en se basant sur le CR SiteConfig dans le repo Git de votre site. Vous devez créer manuellement les CR BMCSecret pour chaque hôte.

    Procédure

    1. Créez les secrets de cluster gérés requis sur le cluster concentrateur. Ces ressources doivent se trouver dans un espace de noms dont le nom correspond à celui du cluster. Par exemple, dans out/argocd/example/siteconfig/example-sno.yaml, le nom du cluster et l'espace de noms sont example-sno.

      1. Exportez l'espace de noms du cluster en exécutant la commande suivante :

        $ export CLUSTERNS=example-sno
      2. Créer l'espace de noms :

        $ oc create namespace $CLUSTERNS
    2. Créez un secret d'extraction et des CR BMC Secret pour le cluster géré. Le secret d'extraction doit contenir toutes les informations d'identification nécessaires à l'installation d'OpenShift Container Platform et de tous les opérateurs requis. Voir "Creating the managed bare-metal host secrets" pour plus d'informations.

      Note

      Les secrets sont référencés à partir de la ressource personnalisée (CR) SiteConfig par leur nom. L'espace de noms doit correspondre à l'espace de noms SiteConfig.

    3. Créez un SiteConfig CR pour votre cluster dans votre clone local du dépôt Git :

      1. Choisissez l'exemple approprié pour votre CR dans le dossier out/argocd/example/siteconfig/. Ce dossier contient des fichiers d'exemple pour les grappes à un nœud, à trois nœuds et standard :

        • example-sno.yaml
        • example-3node.yaml
        • example-standard.yaml
      2. Modifiez les détails de la grappe et de l'hôte dans le fichier d'exemple pour qu'ils correspondent au type de grappe que vous souhaitez. Par exemple :

        Exemple de cluster OpenShift à nœud unique SiteConfig CR

        apiVersion: ran.openshift.io/v1
        kind: SiteConfig
        metadata:
          name: "<site_name>"
          namespace: "<site_name>"
        spec:
          baseDomain: "example.com"
          pullSecretRef:
            name: "assisted-deployment-pull-secret" 1
          clusterImageSetNameRef: "openshift-4.12" 2
          sshPublicKey: "ssh-rsa AAAA..." 3
          clusters:
          - clusterName: "<site_name>"
            networkType: "OVNKubernetes"
            clusterLabels: 4
              common: true
              group-du-sno: ""
              sites : "<site_name>"
            clusterNetwork:
              - cidr: 1001:1::/48
                hostPrefix: 64
            machineNetwork:
              - cidr: 1111:2222:3333:4444::/64
            serviceNetwork:
              - 1001:2::/112
            additionalNTPSources:
              - 1111:2222:3333:4444::2
            #crTemplates:
            #  KlusterletAddonConfig: "KlusterletAddonConfigOverride.yaml" 5
            nodes:
              - hostName: "example-node.example.com" 6
                role: "master"
                bmcAddress: idrac-virtualmedia://<out_of_band_ip>/<system_id>/ 7
                bmcCredentialsName:
                  name: "bmh-secret" 8
                bootMACAddress: "AA:BB:CC:DD:EE:11"
                bootMode: "UEFI" 9
                rootDeviceHints:
                  wwn: "0x11111000000asd123"
                cpuset: "0-1,52-53"  10
                nodeNetwork: 11
                  interfaces:
                    - name: eno1
                      macAddress: "AA:BB:CC:DD:EE:11"
                  config:
                    interfaces:
                      - name: eno1
                        type: ethernet
                        state: up
                        ipv4:
                          enabled: false
                        ipv6: 12
                          enabled: true
                          address:
                          - ip: 1111:2222:3333:4444::aaaa:1
                            prefix-length: 64
                    dns-resolver:
                      config:
                        search:
                        - example.com
                        server:
                        - 1111:2222:3333:4444::2
                    routes:
                      config:
                      - destination: ::/0
                        next-hop-interface: eno1
                        next-hop-address: 1111:2222:3333:4444::1
                        table-id: 254

        1
        Créez le CR assisted-deployment-pull-secret avec le même espace de noms que le CR SiteConfig.
        2
        clusterImageSetNameRef définit un jeu d'images disponible sur le hub cluster. Pour voir la liste des versions supportées sur votre hub cluster, exécutez oc get clusterimagesets.
        3
        Configurer la clé publique SSH utilisée pour accéder au cluster.
        4
        Les libellés des grappes doivent correspondre au champ bindingRules dans les CR PolicyGenTemplate que vous définissez. Par exemple, policygentemplates/common-ranGen.yaml s'applique à tous les clusters dont le champ common: true est défini, policygentemplates/group-du-sno-ranGen.yaml s'applique à tous les clusters dont le champ group-du-sno: "" est défini.
        5
        Facultatif. Le CR spécifié sous KlusterletAddonConfig est utilisé pour remplacer le CR par défaut KlusterletAddonConfig qui est créé pour le cluster.
        6
        Pour les déploiements à un seul nœud, définissez un seul hôte. Pour les déploiements à trois nœuds, définissez trois hôtes. Pour les déploiements standard, définissez trois hôtes avec role: master et deux hôtes ou plus avec role: worker.
        7
        Adresse BMC que vous utilisez pour accéder à l'hôte. S'applique à tous les types de clusters.
        8
        Nom du CR bmh-secret que vous créez séparément avec les informations d'identification BMC de l'hôte. Lorsque vous créez le CR bmh-secret, utilisez le même espace de noms que le CR SiteConfig qui approvisionne l'hôte.
        9
        Configure le mode de démarrage de l'hôte. La valeur par défaut est UEFI. Utilisez UEFISecureBoot pour activer le démarrage sécurisé sur l'hôte.
        10
        cpuset doit correspondre à la valeur définie dans le champ cluster PerformanceProfile CR spec.cpu.reserved pour le partitionnement de la charge de travail.
        11
        Spécifie les paramètres du réseau pour le nœud.
        12
        Configure l'adresse IPv6 pour l'hôte. Pour les clusters OpenShift à un seul nœud avec des adresses IP statiques, l'API spécifique au nœud et les IP d'entrée doivent être les mêmes.
        Note

        Pour plus d'informations sur l'adressage BMC, voir la section "Ressources supplémentaires".

      3. Vous pouvez consulter l'ensemble par défaut des CR extra-manifest MachineConfig à l'adresse out/argocd/extra-manifest. Il est automatiquement appliqué au cluster lors de son installation.
      4. Facultatif : Pour provisionner des manifestes d'installation supplémentaires sur le cluster provisionné, créez un répertoire dans votre référentiel Git, par exemple, sno-extra-manifest/, et ajoutez vos CRs de manifestes personnalisés à ce répertoire. Si votre SiteConfig.yaml fait référence à ce répertoire dans le champ extraManifestPath, tous les CRs de ce répertoire référencé sont ajoutés à l'ensemble par défaut des manifestes supplémentaires.
    4. Ajoutez le CR SiteConfig au fichier kustomization.yaml dans la section generators, comme dans l'exemple présenté dans out/argocd/example/siteconfig/kustomization.yaml.
    5. Commencez le CR SiteConfig et les changements kustomization.yaml associés dans votre dépôt Git et repoussez les changements.

      Le pipeline ArgoCD détecte les changements et commence le déploiement du cluster géré.

21.3.6. Suivi de la progression de l'installation des clusters gérés

Le pipeline ArgoCD utilise le CR SiteConfig pour générer les CR de configuration du cluster et le synchronise avec le cluster hub. Vous pouvez suivre la progression de la synchronisation dans le tableau de bord ArgoCD.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

Lorsque la synchronisation est terminée, l'installation se déroule généralement comme suit :

  1. L'opérateur de service assisté installe OpenShift Container Platform sur le cluster. Vous pouvez surveiller la progression de l'installation du cluster à partir du tableau de bord RHACM ou de la ligne de commande en exécutant les commandes suivantes :

    1. Exporter le nom du cluster :

      $ export CLUSTER=<clusterName>
    2. Interrogez le CR AgentClusterInstall pour le cluster géré :

      $ oc get agentclusterinstall -n $CLUSTER $CLUSTER -o jsonpath='{.status.conditions[?(@.type=="Completed")]}' | jq
    3. Obtenir les événements d'installation pour le cluster :

      $ curl -sk $(oc get agentclusterinstall -n $CLUSTER $CLUSTER -o jsonpath='{.status.debugInfo.eventsURL}')  | jq '.[-2,-1]'

21.3.7. Dépannage de GitOps ZTP en validant les CR d'installation

Le pipeline ArgoCD utilise les ressources personnalisées (CR) SiteConfig et PolicyGenTemplate pour générer les CR de configuration du cluster et les stratégies de Red Hat Advanced Cluster Management (RHACM). Utilisez les étapes suivantes pour résoudre les problèmes qui peuvent survenir au cours de ce processus.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  1. Vérifiez que les CR d'installation ont été créés en utilisant la commande suivante :

    oc get AgentClusterInstall -n <cluster_name>

    Si aucun objet n'est renvoyé, utilisez les étapes suivantes pour résoudre le problème du flux du pipeline ArgoCD depuis les fichiers SiteConfig jusqu'aux CR d'installation.

  2. Vérifiez que la CR ManagedCluster a été générée à l'aide de la CR SiteConfig sur le cluster hub :

    $ oc get managedcluster
  3. Si le site ManagedCluster est manquant, vérifiez si l'application clusters n'a pas échoué à synchroniser les fichiers du référentiel Git vers le hub cluster :

    $ oc describe -n openshift-gitops application clusters
    1. Vérifiez le champ Status.Conditions pour afficher les journaux d'erreurs du cluster géré. Par exemple, la définition d'une valeur non valide pour extraManifestPath: dans le CR SiteConfig entraîne l'erreur suivante :

      Status:
        Conditions:
          Last Transition Time:  2021-11-26T17:21:39Z
          Message:               rpc error: code = Unknown desc = `kustomize build /tmp/https___git.com/ran-sites/siteconfigs/ --enable-alpha-plugins` failed exit status 1: 2021/11/26 17:21:40 Error could not create extra-manifest ranSite1.extra-manifest3 stat extra-manifest3: no such file or directory 2021/11/26 17:21:40 Error: could not build the entire SiteConfig defined by /tmp/kust-plugin-config-913473579: stat extra-manifest3: no such file or directory Error: failure in plugin configured via /tmp/kust-plugin-config-913473579; exit status 1: exit status 1
          Type:  ComparisonError
    2. Vérifiez le champ Status.Sync. S'il y a des erreurs dans le journal, le champ Status.Sync pourrait indiquer une erreur Unknown:

      Status:
        Sync:
          Compared To:
            Destination:
              Namespace:  clusters-sub
              Server:     https://kubernetes.default.svc
            Source:
              Path:             sites-config
              Repo URL:         https://git.com/ran-sites/siteconfigs/.git
              Target Revision:  master
          Status:               Unknown

21.3.8. Suppression d'un site de cluster géré du pipeline ZTP

Vous pouvez supprimer un site géré et les CR de politique d'installation et de configuration associés du pipeline ZTP.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.

Précédent

  1. Supprimez un site et les CR associés en supprimant les fichiers SiteConfig et PolicyGenTemplate du fichier kustomization.yaml.

    Lorsque vous exécutez à nouveau le pipeline ZTP, les CR générés sont supprimés.

  2. Facultatif : Si vous souhaitez supprimer définitivement un site, vous devez également supprimer du dépôt Git les fichiers SiteConfig et PolicyGenTemplate spécifiques au site.
  3. Facultatif : Si vous souhaitez supprimer temporairement un site, par exemple lors du redéploiement d'un site, vous pouvez laisser les CR SiteConfig et PolicyGenTemplate spécifiques au site dans le référentiel Git.
Note

Après avoir supprimé le fichier SiteConfig du référentiel Git, si les clusters correspondants sont bloqués dans le processus de détachement, vérifiez Red Hat Advanced Cluster Management (RHACM) sur le cluster hub pour obtenir des informations sur le nettoyage du cluster détaché.

Ressources supplémentaires

21.3.9. Suppression du contenu obsolète du pipeline ZTP

Si une modification de la configuration de PolicyGenTemplate entraîne des politiques obsolètes, par exemple si vous renommez des politiques, utilisez la procédure suivante pour supprimer les politiques obsolètes.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  1. Supprimer les fichiers PolicyGenTemplate concernés du dépôt Git, valider et pousser vers le dépôt distant.
  2. Attendez que les modifications soient synchronisées par l'application et que les stratégies concernées soient supprimées du cluster du concentrateur.
  3. Ajouter les fichiers PolicyGenTemplate mis à jour au dépôt Git, puis valider et pousser vers le dépôt distant.

    Note

    La suppression des politiques de zero touch provisioning (ZTP) du référentiel Git, et par conséquent leur suppression du hub cluster, n'affecte pas la configuration du cluster géré. La politique et les CR gérés par cette politique restent en place sur le cluster géré.

  4. Facultatif : Après avoir apporté des modifications aux CR PolicyGenTemplate qui entraînent des stratégies obsolètes, vous pouvez supprimer manuellement ces stratégies du cluster du concentrateur. Vous pouvez supprimer les politiques à partir de la console RHACM en utilisant l'onglet Governance ou en exécutant la commande suivante :

    oc delete policy -n <namespace> <policy_name>

21.3.10. Démantèlement du pipeline ZTP

Vous pouvez supprimer le pipeline ArgoCD et tous les artefacts ZTP générés.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  1. Détachez tous les clusters de Red Hat Advanced Cluster Management (RHACM) sur le cluster concentrateur.
  2. Supprimez le fichier kustomization.yaml dans le répertoire deployment à l'aide de la commande suivante :

    $ oc delete -k out/argocd/deployment
  3. Validez et transférez vos modifications dans le référentiel du site.

21.4. Configuration de clusters gérés avec des politiques et des ressources PolicyGenTemplate

Les ressources personnalisées (CR) de stratégie appliquée configurent les clusters gérés que vous provisionnez. Vous pouvez personnaliser la façon dont Red Hat Advanced Cluster Management (RHACM) utilise les CR PolicyGenTemplate pour générer les CR de stratégie appliquée.

21.4.1. À propos du CRD PolicyGenTemplate

La définition des ressources personnalisées (CRD) de PolicyGenTemplate indique au générateur de politiques PolicyGen les ressources personnalisées (CR) à inclure dans la configuration du cluster, la manière de combiner les CR dans les politiques générées et les éléments de ces CR qui doivent être mis à jour avec le contenu superposé.

L'exemple suivant montre un CR PolicyGenTemplate (common-du-ranGen.yaml) extrait du conteneur de référence ztp-site-generate. Le fichier common-du-ranGen.yaml définit deux politiques de Red Hat Advanced Cluster Management (RHACM). Les politiques gèrent une collection de CR de configuration, une pour chaque valeur unique de policyName dans le CR. common-du-ranGen.yaml crée une liaison de placement unique et une règle de placement pour lier les politiques aux clusters en fonction des étiquettes répertoriées dans la section bindingRules.

Exemple de PolicyGenTemplate CR - common-du-ranGen.yaml

---
apiVersion: ran.openshift.io/v1
kind: PolicyGenTemplate
metadata:
  name: "common"
  namespace: "ztp-common"
spec:
  bindingRules:
    common: "true" 1
  sourceFiles: 2
    - fileName: SriovSubscription.yaml
      policyName: "subscriptions-policy"
    - fileName: SriovSubscriptionNS.yaml
      policyName: "subscriptions-policy"
    - fileName: SriovSubscriptionOperGroup.yaml
      policyName: "subscriptions-policy"
    - fileName: SriovOperatorStatus.yaml
      policyName: "subscriptions-policy"
    - fileName: PtpSubscription.yaml
      policyName: "subscriptions-policy"
    - fileName: PtpSubscriptionNS.yaml
      policyName: "subscriptions-policy"
    - fileName: PtpSubscriptionOperGroup.yaml
      policyName: "subscriptions-policy"
    - fileName: PtpOperatorStatus.yaml
      policyName: "subscriptions-policy"
    - fileName: ClusterLogNS.yaml
      policyName: "subscriptions-policy"
    - fileName: ClusterLogOperGroup.yaml
      policyName: "subscriptions-policy"
    - fileName: ClusterLogSubscription.yaml
      policyName: "subscriptions-policy"
    - fileName: ClusterLogOperatorStatus.yaml
      policyName: "subscriptions-policy"
    - fileName: StorageNS.yaml
      policyName: "subscriptions-policy"
    - fileName: StorageOperGroup.yaml
      policyName: "subscriptions-policy"
    - fileName: StorageSubscription.yaml
      policyName: "subscriptions-policy"
    - fileName: StorageOperatorStatus.yaml
      policyName: "subscriptions-policy"
    - fileName: ReduceMonitoringFootprint.yaml
      policyName: "config-policy"
    - fileName: OperatorHub.yaml 3
      policyName: "config-policy"
    - fileName: DefaultCatsrc.yaml 4
      policyName: "config-policy" 5
      metadata:
        name: redhat-operators
      spec:
        displayName: disconnected-redhat-operators
        image: registry.example.com:5000/disconnected-redhat-operators/disconnected-redhat-operator-index:v4.9
    - fileName: DisconnectedICSP.yaml
      policyName: "config-policy"
      spec:
        repositoryDigestMirrors:
        - mirrors:
          - registry.example.com:5000
          source: registry.redhat.io

1
common: "true" applique les politiques à tous les clusters portant cette étiquette.
2
Les fichiers répertoriés sous sourceFiles créent les stratégies d'opérateur pour les clusters installés.
3
OperatorHub.yaml configure l'OperatorHub pour le registre déconnecté.
4
DefaultCatsrc.yaml configure la source du catalogue pour le registre déconnecté.
5
policyName: "config-policy" configure les abonnements des opérateurs. La CR OperatorHub désactive la valeur par défaut et cette CR remplace redhat-operators par une CR CatalogSource qui pointe vers le registre déconnecté.

Une CR PolicyGenTemplate peut être construite avec n'importe quel nombre de CR incluses. Appliquez l'exemple de CR suivant dans le cluster du hub pour générer une politique contenant un seul CR :

apiVersion: ran.openshift.io/v1
kind: PolicyGenTemplate
metadata:
  name: "group-du-sno"
  namespace: "ztp-group"
spec:
  bindingRules:
    group-du-sno: ""
  mcp: "master"
  sourceFiles:
    - fileName: PtpConfigSlave.yaml
      policyName: "config-policy"
      metadata:
        name: "du-ptp-slave"
      spec:
        profile:
        - name: "slave"
          interface: "ens5f0"
          ptp4lOpts: "-2 -s --summary_interval -4"
          phc2sysOpts: "-a -r -n 24"

En utilisant le fichier source PtpConfigSlave.yaml comme exemple, le fichier définit un CR PtpConfig. La politique générée pour l'exemple PtpConfigSlave est nommée group-du-sno-config-policy. La RC PtpConfig définie dans la politique générée group-du-sno-config-policy est nommée du-ptp-slave. Le spec défini dans PtpConfigSlave.yaml est placé sous du-ptp-slave avec les autres éléments spec définis dans le fichier source.

L'exemple suivant montre le CR group-du-sno-config-policy:

apiVersion: policy.open-cluster-management.io/v1
kind: Policy
metadata:
  name: group-du-ptp-config-policy
  namespace: groups-sub
  annotations:
    policy.open-cluster-management.io/categories: CM Configuration Management
    policy.open-cluster-management.io/controls: CM-2 Baseline Configuration
    policy.open-cluster-management.io/standards: NIST SP 800-53
spec:
    remediationAction: inform
    disabled: false
    policy-templates:
        - objectDefinition:
            apiVersion: policy.open-cluster-management.io/v1
            kind: ConfigurationPolicy
            metadata:
                name: group-du-ptp-config-policy-config
            spec:
                remediationAction: inform
                severity: low
                namespaceselector:
                    exclude:
                        - kube-*
                    include:
                        - '*'
                object-templates:
                    - complianceType: musthave
                      objectDefinition:
                        apiVersion: ptp.openshift.io/v1
                        kind: PtpConfig
                        metadata:
                            name: du-ptp-slave
                            namespace: openshift-ptp
                        spec:
                            recommend:
                                - match:
                                - nodeLabel: node-role.kubernetes.io/worker-du
                                  priority: 4
                                  profile: slave
                            profile:
                                - interface: ens5f0
                                  name: slave
                                  phc2sysOpts: -a -r -n 24
                                  ptp4lConf: |
                                    [global]
                                    #
                                    # Default Data Set
                                    #
                                    twoStepFlag 1
                                    slaveOnly 0
                                    priority1 128
                                    priority2 128
                                    domainNumber 24
                                    .....

21.4.2. Recommandations pour la personnalisation des CR PolicyGenTemplate

Tenez compte des meilleures pratiques suivantes lorsque vous personnalisez la configuration du site PolicyGenTemplate ressources personnalisées (CR) :

  • Utiliser aussi peu de politiques que nécessaire. L'utilisation de moins de politiques nécessite moins de ressources. Chaque politique supplémentaire crée des frais généraux pour le cluster hub et le cluster géré déployé. Les CR sont combinés en politiques sur la base du champ policyName dans le CR PolicyGenTemplate. Les CR du même PolicyGenTemplate qui ont la même valeur pour policyName sont gérés dans le cadre d'une seule politique.
  • Dans les environnements déconnectés, utilisez une source de catalogue unique pour tous les opérateurs en configurant le registre comme un index unique contenant tous les opérateurs. Chaque CatalogSource CR supplémentaire sur les clusters gérés augmente l'utilisation du CPU.
  • MachineConfig Les CR doivent être incluses en tant que extraManifests dans la CR SiteConfig afin qu'elles soient appliquées lors de l'installation. Cela peut réduire le temps global nécessaire pour que le cluster soit prêt à déployer des applications.
  • PolicyGenTemplates doit remplacer le champ "channel" pour identifier explicitement la version souhaitée. Cela permet de s'assurer que les modifications apportées au CR source lors des mises à niveau ne mettent pas à jour l'abonnement généré.

Ressources supplémentaires

Note

Lorsque vous gérez un grand nombre de grappes de rayons sur la grappe pivot, minimisez le nombre de stratégies afin de réduire la consommation de ressources.

Le regroupement de plusieurs CR de configuration en une seule politique ou en un nombre limité de politiques est un moyen de réduire le nombre total de politiques sur le cluster du concentrateur. Lorsque l'on utilise la hiérarchie des politiques communes, de groupe et de site pour gérer la configuration du site, il est particulièrement important de combiner la configuration spécifique au site dans une seule politique.

21.4.3. PolicyGenTemplate CRs pour les déploiements RAN

Utilisez les ressources personnalisées (CR) PolicyGenTemplate (PGT) pour personnaliser la configuration appliquée au cluster en utilisant le pipeline GitOps zero touch provisioning (ZTP). La PGT CR vous permet de générer une ou plusieurs politiques pour gérer l'ensemble des CR de configuration sur votre flotte de clusters. Le PGT identifie l'ensemble des CR gérés, les regroupe dans des politiques, construit l'enveloppe de la politique autour de ces CR et associe les politiques aux clusters en utilisant des règles de liaison d'étiquettes.

La configuration de référence, obtenue à partir du conteneur ZTP GitOps, est conçue pour fournir un ensemble de fonctionnalités critiques et de paramètres de réglage des nœuds qui garantissent que le cluster peut prendre en charge les contraintes strictes de performance et d'utilisation des ressources typiques des applications RAN (Radio Access Network) Distributed Unit (DU). Les modifications ou omissions de la configuration de base peuvent affecter la disponibilité des fonctionnalités, les performances et l'utilisation des ressources. Utilisez les CR de référence PolicyGenTemplate comme base pour créer une hiérarchie de fichiers de configuration adaptés aux exigences spécifiques de votre site.

Les CR de référence PolicyGenTemplate définies pour la configuration du cluster DU RAN peuvent être extraites du conteneur GitOps ZTP ztp-site-generate. Voir "Preparing the GitOps ZTP site configuration repository" pour plus de détails.

Les CR de PolicyGenTemplate se trouvent dans le dossier ./out/argocd/example/policygentemplates. L'architecture de référence comporte des CR de configuration communs, de groupe et spécifiques au site. Chaque CR PolicyGenTemplate fait référence à d'autres CR qui se trouvent dans le dossier ./out/source-crs.

Les CR PolicyGenTemplate relatifs à la configuration des grappes RAN sont décrits ci-dessous. Des variantes sont fournies pour le groupe PolicyGenTemplate CR afin de tenir compte des différences entre les configurations de grappes à un nœud, à trois nœuds compactes et standard. De même, des variantes de configuration spécifiques au site sont fournies pour les grappes à un nœud et les grappes à plusieurs nœuds (compactes ou standard). Utilisez les variantes de configuration spécifiques au groupe et au site qui sont pertinentes pour votre déploiement.

Tableau 21.3. PolicyGenTemplate CRs pour les déploiements RAN

PolicyGenTemplate CRDescription

example-multinode-site.yaml

Contient un ensemble de CR qui s'appliquent aux clusters multi-nœuds. Ces CR configurent les caractéristiques SR-IOV typiques des installations RAN.

example-sno-site.yaml

Contient un ensemble de CRs qui s'appliquent aux clusters OpenShift à nœud unique. Ces CRs configurent les fonctionnalités SR-IOV typiques des installations RAN.

common-ranGen.yaml

Contient un ensemble de CR RAN communs qui sont appliqués à tous les clusters. Ces CR souscrivent à un ensemble d'opérateurs fournissant des fonctionnalités de cluster typiques pour la RAN ainsi que des réglages de cluster de base.

group-du-3node-ranGen.yaml

Contient les politiques RAN pour les clusters à trois nœuds uniquement.

group-du-sno-ranGen.yaml

Contient les politiques RAN pour les clusters à nœud unique uniquement.

group-du-standard-ranGen.yaml

Contient les politiques RAN pour les trois clusters de plan de contrôle standard.

group-du-3node-validator-ranGen.yaml

PolicyGenTemplate CR utilisé pour générer les différentes politiques requises pour les grappes à trois nœuds.

group-du-standard-validator-ranGen.yaml

PolicyGenTemplate CR utilisé pour générer les différentes politiques requises pour les clusters standard.

group-du-sno-validator-ranGen.yaml

PolicyGenTemplate CR utilisé pour générer les différentes politiques requises pour les clusters OpenShift à nœud unique.

21.4.4. Personnalisation d'un cluster géré avec des CR PolicyGenTemplate

Utilisez la procédure suivante pour personnaliser les stratégies appliquées au cluster géré que vous provisionnez à l'aide du pipeline ZTP (Zero Touch Provisioning).

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez configuré le cluster du concentrateur pour générer les CR d'installation et de stratégie nécessaires.
  • Vous avez créé un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé. Le référentiel doit être accessible depuis le cluster hub et être défini comme référentiel source pour l'application Argo CD.

Procédure

  1. Créer un CR PolicyGenTemplate pour les CR de configuration spécifiques au site.

    1. Choisissez l'exemple approprié pour votre CR dans le dossier out/argocd/example/policygentemplates, par exemple, example-sno-site.yaml ou example-multinode-site.yaml.
    2. Modifiez le champ bindingRules dans le fichier d'exemple pour qu'il corresponde à l'étiquette spécifique au site incluse dans le CR SiteConfig. Dans l'exemple de fichier SiteConfig, l'étiquette spécifique au site est sites: example-sno.

      Note

      Veillez à ce que les étiquettes définies dans votre champ PolicyGenTemplate bindingRules correspondent aux étiquettes définies dans les clusters gérés connexes SiteConfig CR.

    3. Modifiez le contenu du fichier d'exemple pour qu'il corresponde à la configuration souhaitée.
  2. Facultatif : Créez une CR PolicyGenTemplate pour toutes les CR de configuration commune qui s'appliquent à l'ensemble de la flotte de clusters.

    1. Sélectionnez l'exemple approprié pour votre CR dans le dossier out/argocd/example/policygentemplates, par exemple common-ranGen.yaml.
    2. Modifiez le contenu du fichier d'exemple pour qu'il corresponde à la configuration souhaitée.
  3. Facultatif : Créez un CR PolicyGenTemplate pour tous les CR de configuration de groupe qui s'appliquent à certains groupes de clusters dans la flotte.

    Assurez-vous que le contenu des fichiers spec superposés correspond à l'état final souhaité. À titre de référence, le répertoire out/source-crs contient la liste complète des sources-crs disponibles pour être incluses et superposées par vos modèles PolicyGenTemplate.

    Note

    En fonction des exigences spécifiques de vos clusters, il se peut que vous ayez besoin de plus d'une stratégie de groupe par type de cluster, surtout si l'on considère que les stratégies de groupe de l'exemple ont chacune un seul fichier PerformancePolicy.yaml qui ne peut être partagé sur un ensemble de clusters que si ces clusters sont constitués de configurations matérielles identiques.

    1. Sélectionnez l'exemple approprié pour votre CR dans le dossier out/argocd/example/policygentemplates, par exemple group-du-sno-ranGen.yaml.
    2. Modifiez le contenu du fichier d'exemple pour qu'il corresponde à la configuration souhaitée.
  4. Facultatif. Créez un validator inform policy PolicyGenTemplate CR pour signaler que l'installation et la configuration ZTP de la grappe déployée sont terminées. Pour plus d'informations, voir "Creating a validator inform policy".
  5. Définir tous les espaces de noms de la politique dans un fichier YAML similaire à l'exemple de fichier out/argocd/example/policygentemplates/ns.yaml.

    Important

    Ne pas inclure le CR Namespace dans le même fichier que le CR PolicyGenTemplate.

  6. Ajoutez les CR PolicyGenTemplate et Namespace au fichier kustomization.yaml dans la section des générateurs, comme dans l'exemple présenté dans out/argocd/example/policygentemplates/kustomization.yaml.
  7. Commencez les CR PolicyGenTemplate, CR Namespace et le fichier kustomization.yaml associé dans votre dépôt Git et repoussez les changements.

    Le pipeline ArgoCD détecte les modifications et commence le déploiement du cluster géré. Vous pouvez pousser les modifications vers le CR SiteConfig et le CR PolicyGenTemplate simultanément.

21.4.5. Suivi de l'avancement du déploiement de la politique de cluster géré

Le pipeline ArgoCD utilise les CR PolicyGenTemplate dans Git pour générer les politiques RHACM et les synchroniser avec le cluster central. Vous pouvez surveiller la progression de la synchronisation des politiques du cluster géré après que le service d'assistance a installé OpenShift Container Platform sur le cluster géré.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  1. Le Topology Aware Lifecycle Manager (TALM) applique les politiques de configuration liées à la grappe.

    Une fois l'installation du cluster terminée et le cluster devenu Ready, un CR ClusterGroupUpgrade correspondant à ce cluster, avec une liste de politiques ordonnées définies par ran.openshift.io/ztp-deploy-wave annotations, est automatiquement créé par le TALM. Les politiques de la grappe sont appliquées dans l'ordre indiqué dans ClusterGroupUpgrade CR.

    Vous pouvez contrôler l'avancement de la réconciliation des politiques de configuration à l'aide des commandes suivantes :

    $ export CLUSTER=<clusterName>
    $ oc get clustergroupupgrades -n ztp-install $CLUSTER -o jsonpath='{.status.conditions[-1:]}' | jq

    Exemple de sortie

    {
      "lastTransitionTime": "2022-11-09T07:28:09Z",
      "message": "Remediating non-compliant policies",
      "reason": "InProgress",
      "status": "True",
      "type": "Progressing"
    }

  2. Vous pouvez contrôler l'état détaillé de la conformité de la politique de cluster en utilisant le tableau de bord RHACM ou la ligne de commande.

    1. Pour vérifier la conformité de la politique à l'aide de oc, exécutez la commande suivante :

      $ oc get policies -n $CLUSTER

      Exemple de sortie

      NAME                                                     REMEDIATION ACTION   COMPLIANCE STATE   AGE
      ztp-common.common-config-policy                          inform               Compliant          3h42m
      ztp-common.common-subscriptions-policy                   inform               NonCompliant       3h42m
      ztp-group.group-du-sno-config-policy                     inform               NonCompliant       3h42m
      ztp-group.group-du-sno-validator-du-policy               inform               NonCompliant       3h42m
      ztp-install.example1-common-config-policy-pjz9s          enforce              Compliant          167m
      ztp-install.example1-common-subscriptions-policy-zzd9k   enforce              NonCompliant       164m
      ztp-site.example1-config-policy                          inform               NonCompliant       3h42m
      ztp-site.example1-perf-policy                            inform               NonCompliant       3h42m

    2. Pour vérifier l'état des politiques à partir de la console Web RHACM, effectuez les actions suivantes :

      1. Cliquez sur GovernanceFind policies.
      2. Cliquez sur une politique de cluster pour vérifier son statut.

Lorsque toutes les politiques de la grappe sont conformes, l'installation et la configuration de ZTP pour la grappe sont terminées. Le label ztp-done est ajouté à la grappe.

Dans la configuration de référence, la politique finale qui devient conforme est celle définie dans la politique *-du-validator-policy. Cette politique, lorsqu'elle est conforme sur un cluster, garantit que toute la configuration du cluster, l'installation de l'Opérateur et la configuration de l'Opérateur sont terminées.

21.4.6. Validation de la génération des CR de la politique de configuration

Les ressources personnalisées (CR) de stratégie sont générées dans le même espace de noms que le site PolicyGenTemplate à partir duquel elles sont créées. Le même flux de dépannage s'applique à toutes les CR de stratégie générées à partir de PolicyGenTemplate, qu'elles soient basées sur ztp-common, ztp-group ou ztp-site, comme le montrent les commandes suivantes :

$ export NS=<espace de noms>
$ oc get policy -n $NS

L'ensemble attendu de CR enveloppés dans une politique doit être affiché.

Si la synchronisation des politiques a échoué, suivez les étapes de dépannage suivantes.

Procédure

  1. Pour afficher des informations détaillées sur les politiques, exécutez la commande suivante :

    $ oc describe -n openshift-gitops application policies
  2. Vérifiez que Status: Conditions: est affiché dans les journaux d'erreurs. Par exemple, la définition d'une adresse sourceFile→fileName: invalide génère l'erreur suivante :

    Status:
      Conditions:
        Last Transition Time:  2021-11-26T17:21:39Z
        Message:               rpc error: code = Unknown desc = `kustomize build /tmp/https___git.com/ran-sites/policies/ --enable-alpha-plugins` failed exit status 1: 2021/11/26 17:21:40 Error could not find test.yaml under source-crs/: no such file or directory Error: failure in plugin configured via /tmp/kust-plugin-config-52463179; exit status 1: exit status 1
        Type:  ComparisonError
  3. Vérifiez Status: Sync:. S'il y a des erreurs d'enregistrement à Status: Conditions:, le site Status: Sync: affiche Unknown ou Error:

    Status:
      Sync:
        Compared To:
          Destination:
            Namespace:  policies-sub
            Server:     https://kubernetes.default.svc
          Source:
            Path:             policies
            Repo URL:         https://git.com/ran-sites/policies/.git
            Target Revision:  master
        Status:               Error
  4. Lorsque Red Hat Advanced Cluster Management (RHACM) reconnaît que des stratégies s'appliquent à un objet ManagedCluster, les objets CR de stratégie sont appliqués à l'espace de noms du cluster. Vérifiez si les stratégies ont été copiées dans l'espace de noms du cluster :

    $ oc get policy -n $CLUSTER

    Exemple de sortie :

    NAME                                         REMEDIATION ACTION   COMPLIANCE STATE   AGE
    ztp-common.common-config-policy              inform               Compliant          13d
    ztp-common.common-subscriptions-policy       inform               Compliant          13d
    ztp-group.group-du-sno-config-policy         inform               Compliant          13d
    Ztp-group.group-du-sno-validator-du-policy   inform               Compliant          13d
    ztp-site.example-sno-config-policy           inform               Compliant          13d

    RHACM copie toutes les politiques applicables dans l'espace de noms du cluster. Les noms des stratégies copiées ont le format suivant : <policyGenTemplate.Namespace>.<policyGenTemplate.Name>-<policyName>.

  5. Vérifiez la règle de placement pour toutes les politiques qui n'ont pas été copiées dans l'espace de noms du cluster. Les matchSelector dans le PlacementRule pour ces politiques doivent correspondre aux étiquettes de l'objet ManagedCluster:

    $ oc get placementrule -n $NS
  6. Notez le nom PlacementRule approprié pour la politique, le commun, le groupe ou le site manquant, à l'aide de la commande suivante :

    oc get placementrule -n $NS <placementRuleName> -o yaml
    • Les décisions d'état doivent inclure le nom de votre cluster.
    • La paire clé-valeur de matchSelector dans la spécification doit correspondre aux étiquettes de votre cluster géré.
  7. Vérifiez les étiquettes de l'objet ManagedCluster à l'aide de la commande suivante :

    $ oc get ManagedCluster $CLUSTER -o jsonpath='{.metadata.labels}' | jq
  8. Vérifiez quelles politiques sont conformes à l'aide de la commande suivante :

    $ oc get policy -n $CLUSTER

    Si les stratégies Namespace, OperatorGroup et Subscription sont conformes mais que les stratégies de configuration de l'opérateur ne le sont pas, il est probable que les opérateurs ne se sont pas installés sur le cluster géré. Dans ce cas, les politiques de configuration de l'opérateur ne s'appliquent pas car le CRD n'est pas encore appliqué au rayon.

21.4.7. Redémarrage du rapprochement des politiques

Vous pouvez relancer le rapprochement des politiques en cas de problèmes de conformité inattendus, par exemple lorsque la ressource personnalisée (CR) ClusterGroupUpgrade a expiré.

Procédure

  1. Un CR ClusterGroupUpgrade est généré dans l'espace de noms ztp-install par le Topology Aware Lifecycle Manager une fois que le cluster géré devient Ready:

    $ export CLUSTER=<clusterName>
    $ oc get clustergroupupgrades -n ztp-install $CLUSTER
  2. Si des problèmes inattendus surviennent et que les politiques ne sont pas réclamées dans le délai configuré (4 heures par défaut), l'état de la CR ClusterGroupUpgrade est indiqué par UpgradeTimedOut:

    $ oc get clustergroupupgrades -n ztp-install $CLUSTER -o jsonpath='{.status.conditions[?(@.type=="Ready")]}'
  3. Un CR ClusterGroupUpgrade dans l'état UpgradeTimedOut redémarre automatiquement son rapprochement des politiques toutes les heures. Si vous avez modifié vos politiques, vous pouvez lancer une nouvelle tentative immédiatement en supprimant le CR ClusterGroupUpgrade existant. Cela déclenche la création automatique d'un nouveau CR ClusterGroupUpgrade qui commence immédiatement à réconcilier les politiques :

    $ oc delete clustergroupupgrades -n ztp-install $CLUSTER

Notez que lorsque le CR ClusterGroupUpgrade se termine avec le statut UpgradeCompleted et que le cluster géré a l'étiquette ztp-done appliquée, vous pouvez effectuer des changements de configuration supplémentaires en utilisant PolicyGenTemplate. La suppression du CR ClusterGroupUpgrade existant ne permet pas au TALM de générer un nouveau CR.

À ce stade, ZTP a terminé son interaction avec le cluster et toute interaction ultérieure doit être traitée comme une mise à jour et un nouveau CR ClusterGroupUpgrade créé pour la remédiation des politiques.

Ressources supplémentaires

  • Pour plus d'informations sur l'utilisation de Topology Aware Lifecycle Manager (TALM) pour construire votre propre CR ClusterGroupUpgrade, voir À propos du CR ClusterGroupUpgrade.

21.4.8. Indication de la réalisation pour les installations ZTP

Le Zero Touch Provisioning (ZTP) simplifie le processus de vérification de l'état de l'installation ZTP d'une grappe. L'état ZTP passe par trois phases : installation du cluster, configuration du cluster et ZTP terminé.

Phase d'installation du cluster
La phase d'installation du cluster est indiquée par les conditions ManagedClusterJoined et ManagedClusterAvailable dans le CR ManagedCluster. Si le CR ManagedCluster ne contient pas ces conditions, ou si la condition est fixée à False, la grappe est toujours en phase d'installation. Des détails supplémentaires sur l'installation sont disponibles dans les CR AgentClusterInstall et ClusterDeployment. Pour plus d'informations, voir "Troubleshooting GitOps ZTP".
Phase de configuration du cluster
La phase de configuration de la grappe est indiquée par une étiquette ztp-running appliquée à la CR ManagedCluster de la grappe.
ZTP fait

L'installation et la configuration du cluster sont terminées dans la phase ZTP done. Cela se traduit par la suppression de l'étiquette ztp-running et l'ajout de l'étiquette ztp-done à la CR ManagedCluster. L'étiquette ztp-done indique que la configuration a été appliquée et que la configuration de base de l'UA a terminé la mise au point du cluster.

La transition vers l'état ZTP done est conditionnée par l'état de conformité d'une politique d'information du validateur de Red Hat Advanced Cluster Management (RHACM). Cette politique capture les critères existants pour une installation terminée et valide qu'elle passe à un état conforme uniquement lorsque le provisionnement ZTP du cluster géré est terminé.

La politique d'information des validateurs permet de s'assurer que la configuration du cluster est entièrement appliquée et que les opérateurs ont terminé leur initialisation. La politique valide les éléments suivants :

  • Le site cible MachineConfigPool contient les entrées attendues et a fini d'être mis à jour. Tous les nœuds sont disponibles et ne sont pas dégradés.
  • L'opérateur SR-IOV a terminé l'initialisation, comme l'indique au moins un site SriovNetworkNodeState avec syncStatus: Succeeded.
  • Le jeu de démons PTP Operator existe.

21.5. Installation manuelle d'un cluster OpenShift à un nœud avec ZTP

Vous pouvez déployer un cluster OpenShift géré à nœud unique en utilisant Red Hat Advanced Cluster Management (RHACM) et le service assisté.

Note

Si vous créez plusieurs clusters gérés, utilisez la méthode SiteConfig décrite dans Déploiement de sites distants avec ZTP.

Important

L'hôte bare-metal cible doit répondre aux exigences en matière de réseau, de firmware et de matériel énumérées dans Configuration de cluster recommandée pour les charges de travail de l'application vDU.

21.5.1. Générer manuellement les CR d'installation et de configuration de ZTP

Utilisez le point d'entrée generator pour le conteneur ztp-site-generate afin de générer les ressources personnalisées (CR) d'installation et de configuration du site pour un cluster basé sur les CR SiteConfig et PolicyGenTemplate.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  1. Créez un dossier de sortie en exécutant la commande suivante :

    $ mkdir -p ./out
  2. Exporter le répertoire argocd à partir de l'image du conteneur ztp-site-generate:

    $ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12 extract /home/ztp --tar | tar x -C ./out

    Le répertoire ./out contient les CR de référence PolicyGenTemplate et SiteConfig dans le dossier out/argocd/example/.

    Exemple de sortie

    out
     └── argocd
          └── example
               ├── policygentemplates
               │     ├── common-ranGen.yaml
               │     ├── example-sno-site.yaml
               │     ├── group-du-sno-ranGen.yaml
               │     ├── group-du-sno-validator-ranGen.yaml
               │     ├── kustomization.yaml
               │     └── ns.yaml
               └── siteconfig
                      ├── example-sno.yaml
                      ├── KlusterletAddonConfigOverride.yaml
                      └── kustomization.yaml

  3. Créez un dossier de sortie pour les CR d'installation du site :

    $ mkdir -p ./site-install
  4. Modifiez l'exemple de CR SiteConfig pour le type de cluster que vous voulez installer. Copiez example-sno.yaml vers site-1-sno.yaml et modifiez le CR pour qu'il corresponde aux détails du site et de l'hôte bare-metal que vous souhaitez installer, par exemple :

    Exemple de cluster OpenShift à nœud unique SiteConfig CR

    apiVersion: ran.openshift.io/v1
    kind: SiteConfig
    metadata:
      name: "<site_name>"
      namespace: "<site_name>"
    spec:
      baseDomain: "example.com"
      pullSecretRef:
        name: "assisted-deployment-pull-secret" 1
      clusterImageSetNameRef: "openshift-4.12" 2
      sshPublicKey: "ssh-rsa AAAA..." 3
      clusters:
      - clusterName: "<site_name>"
        networkType: "OVNKubernetes"
        clusterLabels: 4
          common: true
          group-du-sno: ""
          sites : "<site_name>"
        clusterNetwork:
          - cidr: 1001:1::/48
            hostPrefix: 64
        machineNetwork:
          - cidr: 1111:2222:3333:4444::/64
        serviceNetwork:
          - 1001:2::/112
        additionalNTPSources:
          - 1111:2222:3333:4444::2
        #crTemplates:
        #  KlusterletAddonConfig: "KlusterletAddonConfigOverride.yaml" 5
        nodes:
          - hostName: "example-node.example.com" 6
            role: "master"
            bmcAddress: idrac-virtualmedia://<out_of_band_ip>/<system_id>/ 7
            bmcCredentialsName:
              name: "bmh-secret" 8
            bootMACAddress: "AA:BB:CC:DD:EE:11"
            bootMode: "UEFI" 9
            rootDeviceHints:
              wwn: "0x11111000000asd123"
            cpuset: "0-1,52-53"  10
            nodeNetwork: 11
              interfaces:
                - name: eno1
                  macAddress: "AA:BB:CC:DD:EE:11"
              config:
                interfaces:
                  - name: eno1
                    type: ethernet
                    state: up
                    ipv4:
                      enabled: false
                    ipv6: 12
                      enabled: true
                      address:
                      - ip: 1111:2222:3333:4444::aaaa:1
                        prefix-length: 64
                dns-resolver:
                  config:
                    search:
                    - example.com
                    server:
                    - 1111:2222:3333:4444::2
                routes:
                  config:
                  - destination: ::/0
                    next-hop-interface: eno1
                    next-hop-address: 1111:2222:3333:4444::1
                    table-id: 254

    1
    Créez le CR assisted-deployment-pull-secret avec le même espace de noms que le CR SiteConfig.
    2
    clusterImageSetNameRef définit un jeu d'images disponible sur le hub cluster. Pour voir la liste des versions supportées sur votre hub cluster, exécutez oc get clusterimagesets.
    3
    Configurer la clé publique SSH utilisée pour accéder au cluster.
    4
    Les libellés des grappes doivent correspondre au champ bindingRules dans les CR PolicyGenTemplate que vous définissez. Par exemple, policygentemplates/common-ranGen.yaml s'applique à tous les clusters dont le champ common: true est défini, policygentemplates/group-du-sno-ranGen.yaml s'applique à tous les clusters dont le champ group-du-sno: "" est défini.
    5
    Facultatif. Le CR spécifié sous KlusterletAddonConfig est utilisé pour remplacer le CR par défaut KlusterletAddonConfig qui est créé pour le cluster.
    6
    Pour les déploiements à un seul nœud, définissez un seul hôte. Pour les déploiements à trois nœuds, définissez trois hôtes. Pour les déploiements standard, définissez trois hôtes avec role: master et deux hôtes ou plus avec role: worker.
    7
    Adresse BMC que vous utilisez pour accéder à l'hôte. S'applique à tous les types de clusters.
    8
    Nom du CR bmh-secret que vous créez séparément avec les informations d'identification BMC de l'hôte. Lorsque vous créez le CR bmh-secret, utilisez le même espace de noms que le CR SiteConfig qui approvisionne l'hôte.
    9
    Configure le mode de démarrage de l'hôte. La valeur par défaut est UEFI. Utilisez UEFISecureBoot pour activer le démarrage sécurisé sur l'hôte.
    10
    cpuset doit correspondre à la valeur définie dans le champ cluster PerformanceProfile CR spec.cpu.reserved pour le partitionnement de la charge de travail.
    11
    Spécifie les paramètres du réseau pour le nœud.
    12
    Configure l'adresse IPv6 pour l'hôte. Pour les clusters OpenShift à un seul nœud avec des adresses IP statiques, l'API spécifique au nœud et les IP d'entrée doivent être les mêmes.
  5. Générer les CR d'installation du jour 0 en traitant le CR SiteConfig modifié site-1-sno.yaml en exécutant la commande suivante :

    $ podman run -it --rm -v `pwd`/out/argocd/example/siteconfig:/resources:Z -v `pwd`/site-install:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 generator install site-1-sno.yaml /output

    Exemple de sortie

    site-install
    └── site-1-sno
        ├── site-1_agentclusterinstall_example-sno.yaml
        ├── site-1-sno_baremetalhost_example-node1.example.com.yaml
        ├── site-1-sno_clusterdeployment_example-sno.yaml
        ├── site-1-sno_configmap_example-sno.yaml
        ├── site-1-sno_infraenv_example-sno.yaml
        ├── site-1-sno_klusterletaddonconfig_example-sno.yaml
        ├── site-1-sno_machineconfig_02-master-workload-partitioning.yaml
        ├── site-1-sno_machineconfig_predefined-extra-manifests-master.yaml
        ├── site-1-sno_machineconfig_predefined-extra-manifests-worker.yaml
        ├── site-1-sno_managedcluster_example-sno.yaml
        ├── site-1-sno_namespace_example-sno.yaml
        └── site-1-sno_nmstateconfig_example-node1.example.com.yaml

  6. Facultatif : Générer uniquement les CR d'installation du jour 0 MachineConfig pour un type de cluster particulier en traitant le CR de référence SiteConfig avec l'option -E. Par exemple, exécutez les commandes suivantes :

    1. Créer un dossier de sortie pour les CR MachineConfig:

      $ mkdir -p ./site-machineconfig
    2. Générer les CR d'installation de MachineConfig:

      $ podman run -it --rm -v `pwd`/out/argocd/example/siteconfig:/resources:Z -v `pwd`/site-machineconfig:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 generator install -E site-1-sno.yaml /output

      Exemple de sortie

      site-machineconfig
      └── site-1-sno
          ├── site-1-sno_machineconfig_02-master-workload-partitioning.yaml
          ├── site-1-sno_machineconfig_predefined-extra-manifests-master.yaml
          └── site-1-sno_machineconfig_predefined-extra-manifests-worker.yaml

  7. Générez et exportez les CR de configuration du jour 2 en utilisant les CR de référence PolicyGenTemplate de l'étape précédente. Exécutez les commandes suivantes :

    1. Créer un dossier de sortie pour les CR du jour 2 :

      $ mkdir -p ./ref
    2. Générer et exporter les CR de configuration du jour 2 :

      $ podman run -it --rm -v `pwd`/out/argocd/example/policygentemplates:/resources:Z -v `pwd`/ref:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 generator config -N . /output

      La commande génère des exemples de CR de groupe et de site PolicyGenTemplate pour OpenShift à un nœud, des clusters à trois nœuds et des clusters standard dans le dossier ./ref.

      Exemple de sortie

      ref
       └── customResource
            ├── common
            ├── example-multinode-site
            ├── example-sno
            ├── group-du-3node
            ├── group-du-3node-validator
            │    └── Multiple-validatorCRs
            ├── group-du-sno
            ├── group-du-sno-validator
            ├── group-du-standard
            └── group-du-standard-validator
                 └── Multiple-validatorCRs

  8. Utilisez les CR générés comme base pour les CR que vous utilisez pour installer le cluster. Vous appliquez les CR d'installation au cluster concentrateur comme décrit dans la section "Installation d'un cluster géré unique". Les CR de configuration peuvent être appliqués à la grappe une fois l'installation de la grappe terminée.

21.5.2. Création des secrets de l'hôte bare-metal géré

Ajoutez les ressources personnalisées (CR) Secret requises pour l'hôte bare-metal géré au cluster du concentrateur. Vous avez besoin d'un secret pour le pipeline ZTP afin d'accéder au Baseboard Management Controller (BMC) et d'un secret pour le service d'installation assistée afin d'extraire les images d'installation de cluster du registre.

Note

Les secrets sont référencés à partir du CR SiteConfig par leur nom. L'espace de noms doit correspondre à l'espace de noms de SiteConfig.

Procédure

  1. Créer un fichier secret YAML contenant les informations d'identification pour le contrôleur de gestion de carte de base (BMC) de l'hôte et un secret d'extraction requis pour l'installation d'OpenShift et de tous les opérateurs de cluster supplémentaires :

    1. Enregistrer le YAML suivant dans le fichier example-sno-secret.yaml:

      apiVersion: v1
      kind: Secret
      metadata:
        name: example-sno-bmc-secret
        namespace: example-sno 1
      data: 2
        password: <base64_password>
        username: <base64_username>
      type: Opaque
      ---
      apiVersion: v1
      kind: Secret
      metadata:
        name: pull-secret
        namespace: example-sno  3
      data:
        .dockerconfigjson: <pull_secret> 4
      type: kubernetes.io/dockerconfigjson
      1
      Doit correspondre à l'espace de noms configuré dans la CR SiteConfig correspondante
      2
      Valeurs encodées en base64 pour password et username
      3
      Doit correspondre à l'espace de noms configuré dans la CR SiteConfig correspondante
      4
      Secret d'extraction codé en base64
  2. Ajoutez le chemin relatif vers example-sno-secret.yaml au fichier kustomization.yaml que vous utilisez pour installer le cluster.

21.5.3. Configuration des arguments du noyau Discovery ISO pour les installations manuelles à l'aide de GitOps ZTP

Le flux de travail GitOps ZTP utilise l'ISO Discovery dans le cadre du processus d'installation d'OpenShift Container Platform sur les hôtes bare-metal gérés. Vous pouvez éditer la ressource InfraEnv pour spécifier les arguments du noyau pour l'ISO de découverte. Ceci est utile pour les installations de clusters avec des exigences environnementales spécifiques. Par exemple, configurez l'argument de noyau rd.net.timeout.carrier pour l'ISO de découverte afin de faciliter la mise en réseau statique du cluster ou de recevoir une adresse DHCP avant de télécharger le système de fichiers racine pendant l'installation.

Note

Dans OpenShift Container Platform 4.12, vous ne pouvez qu'ajouter des arguments de noyau. Vous ne pouvez pas remplacer ou supprimer des arguments du noyau.

Conditions préalables

  • Vous avez installé le CLI OpenShift (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Vous avez généré manuellement les ressources personnalisées (RC) d'installation et de configuration.

Procédure

  1. Modifiez la spécification spec.kernelArguments dans le CR InfraEnv pour configurer les arguments du noyau :
apiVersion: agent-install.openshift.io/v1beta1
kind: InfraEnv
metadata:
  name: <cluster_name>
  namespace: <cluster_name>
spec:
  kernelArguments:
    - operation: append 1
      value: audit=0 2
    - operation: append
      value: trace=1
  clusterRef:
    name: <cluster_name>
    namespace: <cluster_name>
  pullSecretRef:
    name: pull-secret
1
Spécifier l'opération d'ajout d'un argument du noyau.
2
Spécifiez l'argument du noyau que vous souhaitez configurer. Cet exemple configure l'argument de noyau audit et l'argument de noyau trace.
Note

La CR SiteConfig génère la ressource InfraEnv dans le cadre des CR d'installation du jour 0.

Vérification

Pour vérifier que les arguments du noyau sont appliqués, après que l'image Discovery a vérifié qu'OpenShift Container Platform est prêt pour l'installation, vous pouvez vous connecter en SSH à l'hôte cible avant que le processus d'installation ne commence. À ce moment-là, vous pouvez voir les arguments du noyau pour l'ISO Discovery dans le fichier /proc/cmdline.

  1. Ouvrez une session SSH avec l'hôte cible :

    $ ssh -i /path/to/privatekey core@<nom_de_l'hôte>
  2. Affichez les arguments du noyau du système à l'aide de la commande suivante :

    $ cat /proc/cmdline

21.5.4. Installation d'un seul cluster géré

Vous pouvez déployer manuellement un seul cluster géré à l'aide du service assisté et de Red Hat Advanced Cluster Management (RHACM).

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez créé le contrôleur de gestion de carte de base (BMC) Secret et le secret d'extraction d'image Secret ressources personnalisées (CR). Voir "Création des secrets de l'hôte bare-metal géré" pour plus de détails.
  • L'hôte bare-metal cible répond aux exigences matérielles et de mise en réseau pour les clusters gérés.

Procédure

  1. Créez un ClusterImageSet pour chaque version spécifique du cluster à déployer, par exemple clusterImageSet-4.12.yaml. Un ClusterImageSet a le format suivant :

    apiVersion: hive.openshift.io/v1
    kind: ClusterImageSet
    metadata:
      name: openshift-4.12.0 1
    spec:
       releaseImage: quay.io/openshift-release-dev/ocp-release:4.12.0-x86_64 2
    1
    La version descriptive que vous souhaitez déployer.
    2
    Spécifie le site releaseImage à déployer et détermine la version de l'image du système d'exploitation. L'ISO de découverte est basée sur la version de l'image définie par releaseImage, ou sur la dernière version si la version exacte n'est pas disponible.
  2. Appliquer la CR clusterImageSet:

    $ oc apply -f clusterImageSet-4.12.yaml
  3. Créer le CR Namespace dans le fichier cluster-namespace.yaml:

    apiVersion: v1
    kind: Namespace
    metadata:
         name: <cluster_name> 1
         labels:
            name: <cluster_name> 2
    1 2
    Le nom du cluster géré à provisionner.
  4. Appliquez la CR Namespace en exécutant la commande suivante :

    $ oc apply -f cluster-namespace.yaml
  5. Appliquez les CR du jour 0 que vous avez extraites du conteneur ztp-site-generate et que vous avez personnalisées pour répondre à vos besoins :

    $ oc apply -R ./site-install/site-sno-1

21.5.5. Surveillance de l'état de l'installation du cluster géré

Assurez-vous que le provisionnement de la grappe a réussi en vérifiant l'état de la grappe.

Conditions préalables

  • Toutes les ressources personnalisées ont été configurées et provisionnées, et la ressource personnalisée Agent est créée sur le hub pour le cluster géré.

Procédure

  1. Vérifiez l'état du cluster géré :

    $ oc get managedcluster

    True indique que le cluster géré est prêt.

  2. Vérifier le statut de l'agent :

    oc get agent -n <cluster_name>
  3. Utilisez la commande describe pour obtenir une description détaillée de l'état de l'agent. Les statuts à connaître sont BackendError, InputError, ValidationsFailing, InstallationFailed et AgentIsConnected. Ces statuts concernent les ressources personnalisées Agent et AgentClusterInstall.

    oc describe agent -n <cluster_name>
  4. Vérifier l'état de l'approvisionnement du cluster :

    oc get agentclusterinstall -n <cluster_name>
  5. Utilisez la commande describe pour obtenir une description détaillée de l'état de l'approvisionnement de la grappe :

    oc describe agentclusterinstall -n <cluster_name>
  6. Vérifiez l'état des services complémentaires du cluster géré :

    oc get managedclusteraddon -n <cluster_name>
  7. Récupérer les informations d'authentification du fichier kubeconfig pour le cluster géré :

    $ oc get secret -n <cluster_name> <cluster_name>-admin-kubeconfig -o jsonpath={.data.kubeconfig} | base64 -d > <directory>/<cluster_name>-kubeconfig

21.5.6. Dépannage du cluster géré

Cette procédure permet de diagnostiquer les problèmes d'installation qui pourraient survenir avec le cluster géré.

Procédure

  1. Vérifiez l'état du cluster géré :

    $ oc get managedcluster

    Exemple de sortie

    NAME            HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED   AVAILABLE   AGE
    SNO-cluster     true                                   True     True      2d19h

    Si le statut dans la colonne AVAILABLE est True, le cluster géré est géré par le hub.

    Si le statut dans la colonne AVAILABLE est Unknown, le cluster géré n'est pas géré par le concentrateur. Suivez les étapes suivantes pour continuer la vérification et obtenir plus d'informations.

  2. Vérifiez l'état de l'installation de AgentClusterInstall:

    oc get clusterdeployment -n <cluster_name>

    Exemple de sortie

    NAME        PLATFORM            REGION   CLUSTERTYPE   INSTALLED    INFRAID    VERSION  POWERSTATE AGE
    Sno0026    agent-baremetal                               false                          Initialized
    2d14h

    Si l'état de la colonne INSTALLED est false, l'installation a échoué.

  3. Si l'installation a échoué, entrez la commande suivante pour vérifier l'état de la ressource AgentClusterInstall:

    oc describe agentclusterinstall -n <cluster_name> <cluster_name> $ oc describe agentclusterinstall -n <cluster_name>
  4. Résolvez les erreurs et réinitialisez le cluster :

    1. Supprimer la ressource cluster gérée du cluster :

      oc delete managedcluster <cluster_name> $ oc delete managedcluster <cluster_name>
    2. Supprimer l'espace de noms du cluster :

      oc delete namespace <cluster_name> $ oc delete namespace <cluster_name>

      Cette opération supprime toutes les ressources personnalisées de l'espace de nommage créées pour ce cluster. Vous devez attendre que la suppression de ManagedCluster CR soit terminée avant de poursuivre.

    3. Recréer les ressources personnalisées pour le cluster géré.

21.5.7. Référence des CR d'installation de clusters générés par RHACM

Red Hat Advanced Cluster Management (RHACM) prend en charge le déploiement d'OpenShift Container Platform sur des clusters à un nœud, des clusters à trois nœuds et des clusters standard avec un ensemble spécifique de ressources personnalisées (CR) d'installation que vous générez à l'aide de SiteConfig CR pour chaque site.

Note

Chaque cluster géré possède son propre espace de noms, et tous les CR d'installation, à l'exception de ManagedCluster et ClusterImageSet, se trouvent dans cet espace de noms. ManagedCluster et ClusterImageSet sont à l'échelle du cluster, et non à l'échelle de l'espace de noms. L'espace de noms et les noms des CR correspondent au nom du cluster.

Le tableau suivant répertorie les CR d'installation qui sont automatiquement appliqués par le service RHACM assisté lorsqu'il installe des clusters à l'aide des CR SiteConfig que vous configurez.

Tableau 21.4. CR d'installation de clusters générés par le RHACM

CRDescriptionUtilisation

BareMetalHost

Contient les informations de connexion pour le contrôleur de gestion de la carte de base (BMC) de l'hôte nu-métal cible.

Permet d'accéder à la BMC pour charger et démarrer l'image de découverte sur le serveur cible à l'aide du protocole Redfish.

InfraEnv

Contient des informations pour l'installation d'OpenShift Container Platform sur l'hôte bare-metal cible.

Utilisé avec ClusterDeployment pour générer l'ISO de découverte pour le cluster géré.

AgentClusterInstall

Spécifie les détails de la configuration du cluster géré, tels que la mise en réseau et le nombre de nœuds du plan de contrôle. Affiche le cluster kubeconfig et les informations d'identification une fois l'installation terminée.

Spécifie les informations de configuration du cluster géré et fournit un statut pendant l'installation du cluster.

ClusterDeployment

Fait référence au CR AgentClusterInstall à utiliser.

Utilisé avec InfraEnv pour générer l'ISO de découverte pour le cluster géré.

NMStateConfig

Fournit des informations sur la configuration du réseau, telles que l'adresse MAC et le mappage IP, le serveur DNS, la route par défaut et d'autres paramètres du réseau.

Définit une adresse IP statique pour le serveur API Kube du cluster géré.

Agent

Contient des informations matérielles sur l'hôte bare-metal cible.

Créé automatiquement sur le concentrateur lorsque l'image de découverte de la machine cible démarre.

ManagedCluster

Lorsqu'un cluster est géré par le hub, il doit être importé et connu. Cet objet Kubernetes fournit cette interface.

Le hub utilise cette ressource pour gérer et afficher l'état des clusters gérés.

KlusterletAddonConfig

Contient la liste des services fournis par le hub à déployer sur la ressource ManagedCluster.

Indique au concentrateur les services complémentaires à déployer sur la ressource ManagedCluster.

Namespace

Espace logique pour les ressources ManagedCluster existant sur le hub. Unique par site.

Propage les ressources sur le site ManagedCluster.

Secret

Deux CR sont créés : BMC Secret et Image Pull Secret.

  • BMC Secret s'authentifie sur l'hôte nu cible à l'aide de son nom d'utilisateur et de son mot de passe.
  • Image Pull Secret contient des informations d'authentification pour l'image OpenShift Container Platform installée sur l'hôte bare-metal cible.

ClusterImageSet

Contient des informations sur l'image OpenShift Container Platform, telles que le dépôt et le nom de l'image.

Passé dans les ressources pour fournir des images OpenShift Container Platform.

21.6. Configuration recommandée d'un cluster OpenShift à nœud unique pour les charges de travail des applications vDU

Utilisez les informations de référence suivantes pour comprendre les configurations OpenShift à nœud unique requises pour déployer des applications d'unités distribuées virtuelles (vDU) dans le cluster. Les configurations comprennent les optimisations de cluster pour les charges de travail à haute performance, l'activation du partitionnement de la charge de travail et la minimisation du nombre de redémarrages requis après l'installation.

Ressources supplémentaires

21.6.1. Exécuter des applications à faible latence sur OpenShift Container Platform

OpenShift Container Platform permet un traitement à faible latence pour les applications exécutées sur du matériel commercial (COTS) en utilisant plusieurs technologies et dispositifs matériels spécialisés :

Noyau temps réel pour RHCOS
Veille à ce que les charges de travail soient traitées avec un degré élevé de déterminisme des processus.
Isolation de l'unité centrale
Évite les retards dans la programmation de l'unité centrale et garantit la disponibilité constante de la capacité de l'unité centrale.
Gestion de la topologie en fonction des NUMA
Alignement de la mémoire et des pages volumineuses sur les périphériques CPU et PCI afin d'épingler la mémoire garantie du conteneur et les pages volumineuses sur le nœud d'accès non uniforme à la mémoire (NUMA). Les ressources pod pour toutes les classes de qualité de service (QoS) restent sur le même nœud NUMA. Cela permet de réduire la latence et d'améliorer les performances du nœud.
Gestion de la mémoire des pages volumineuses
L'utilisation de pages de grande taille améliore les performances du système en réduisant la quantité de ressources système nécessaires pour accéder aux tables de pages.
Synchronisation de précision à l'aide du protocole PTP
Permet la synchronisation entre les nœuds du réseau avec une précision inférieure à la microseconde.

21.6.2. Configuration recommandée pour les charges de travail des applications vDU

L'exécution des charges de travail des applications vDU nécessite un hôte bare-metal disposant de ressources suffisantes pour exécuter les services OpenShift Container Platform et les charges de travail de production.

Tableau 21.5. Minimum resource requirements

ProfilevCPUMémoireStockage

Minimum

4 à 8 cœurs vCPU

32 Go de RAM

120GB

Note

Une vCPU équivaut à un cœur physique lorsque le multithreading simultané (SMT), ou Hyper-Threading, n'est pas activé. Lorsqu'il est activé, utilisez la formule suivante pour calculer le ratio correspondant :

  • (threads per core × cores) × sockets = vCPUs
Important

The server must have a Baseboard Management Controller (BMC) when booting with virtual media.

21.6.3. Configuration du micrologiciel hôte pour une faible latence et des performances élevées

Les hôtes bare-metal nécessitent la configuration du firmware avant que l'hôte puisse être provisionné. La configuration du micrologiciel dépend du matériel spécifique et des exigences particulières de votre installation.

Procédure

  1. Réglez le site UEFI/BIOS Boot Mode sur UEFI.
  2. Dans l'ordre de démarrage de l'hôte, définir Hard drive first.
  3. Appliquez la configuration de micrologiciel spécifique à votre matériel. Le tableau suivant décrit une configuration représentative du micrologiciel pour un serveur Intel Xeon Skylake ou Intel Cascade Lake, basée sur la conception de référence Intel FlexRAN 4G et 5G baseband PHY.

    Important

    La configuration exacte du micrologiciel dépend de vos exigences spécifiques en matière de matériel et de réseau. L'exemple de configuration suivant n'est donné qu'à titre d'illustration.

    Tableau 21.6. Exemple de configuration du micrologiciel pour un serveur Intel Xeon Skylake ou Cascade Lake

    Réglage du micrologicielConfiguration

    Politique de puissance et de performance de l'unité centrale

    Performances

    Mise à l'échelle de la fréquence Uncore

    Handicapés

    Performance Limite P

    Handicapés

    Technologie Intel SpeedStep ® améliorée

    Activé

    TDP configurable par Intel

    Activé

    Niveau TDP configurable

    Niveau 2

    Technologie Intel® Turbo Boost

    Activé

    Turbo à haut rendement énergétique

    Handicapés

    Matériel P-States

    Handicapés

    Paquet C-State

    État C0/C1

    C1E

    Handicapés

    Processeur C6

    Handicapés

Note

Activer les paramètres SR-IOV et VT-d globaux dans le micrologiciel de l'hôte. Ces paramètres sont pertinents pour les environnements bare-metal.

21.6.4. Conditions préalables de connectivité pour les réseaux de clusters gérés

Avant d'installer et de provisionner un cluster géré avec le pipeline GitOps Zero Touch Provisioning (ZTP), l'hôte du cluster géré doit remplir les conditions préalables suivantes en matière de réseau :

  • Il doit y avoir une connectivité bidirectionnelle entre le conteneur ZTP GitOps dans le cluster hub et le contrôleur de gestion de carte de base (BMC) de l'hôte bare-metal cible.
  • Le cluster géré doit pouvoir résoudre et atteindre le nom d'hôte API du hub et le nom d'hôte *.apps. Voici un exemple du nom d'hôte API du concentrateur et du nom d'hôte *.apps:

    • api.hub-cluster.internal.domain.com
    • console-openshift-console.apps.hub-cluster.internal.domain.com
  • Le cluster hub doit pouvoir résoudre et atteindre l'API et le nom d'hôte *.apps du cluster géré. Voici un exemple du nom d'hôte API du cluster géré et du nom d'hôte *.apps:

    • api.sno-managed-cluster-1.internal.domain.com
    • console-openshift-console.apps.sno-managed-cluster-1.internal.domain.com

21.6.5. Partitionnement de la charge de travail dans OpenShift à nœud unique avec GitOps ZTP

Le partitionnement des charges de travail configure les services OpenShift Container Platform, les charges de travail de gestion de cluster et les pods d'infrastructure pour qu'ils s'exécutent sur un nombre réservé de CPU hôtes.

Pour configurer le partitionnement de la charge de travail avec GitOps ZTP, vous spécifiez les ressources CPU de gestion de cluster avec le champ cpuset de la ressource personnalisée (CR) SiteConfig et le champ reserved de la CR de groupe PolicyGenTemplate. Le pipeline GitOps ZTP utilise ces valeurs pour remplir les champs requis dans le partitionnement de la charge de travail MachineConfig CR (cpuset) et PerformanceProfile CR (reserved) qui configurent le cluster OpenShift à nœud unique.

Note

Pour des performances optimales, assurez-vous que les ensembles de CPU reserved et isolated ne partagent pas les cœurs de CPU dans les zones NUMA.

  • Le partitionnement de la charge de travail MachineConfig CR relie les pods de l'infrastructure OpenShift Container Platform à une configuration cpuset définie.
  • L'adresse PerformanceProfile CR relie les services systemd aux unités centrales réservées.
Important

La valeur du champ reserved spécifiée dans le CR PerformanceProfile doit correspondre au champ cpuset dans le CR MachineConfig de partitionnement de la charge de travail.

Ressources supplémentaires

21.6.6. Configurations de clusters recommandées lors de l'installation

Le pipeline ZTP applique les ressources personnalisées (CR) suivantes lors de l'installation du cluster. Ces CR de configuration garantissent que le cluster répond aux exigences de fonctionnalité et de performance nécessaires à l'exécution d'une application vDU.

Note

Lors de l'utilisation du plugin ZTP GitOps et des CRs SiteConfig pour le déploiement en cluster, les CRs MachineConfig suivants sont inclus par défaut.

Utilisez le filtre SiteConfig extraManifests pour modifier les CR inclus par défaut. Pour plus d'informations, voir Configuration avancée des clusters gérés avec les CR SiteConfig.

21.6.6.1. Répartition de la charge de travail

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent un partitionnement de la charge de travail. Cela limite les cœurs autorisés à exécuter les services de la plateforme, maximisant ainsi le cœur du CPU pour les charges utiles de l'application.

Note

Le partitionnement de la charge de travail ne peut être activé que lors de l'installation du cluster. Vous ne pouvez pas désactiver le partitionnement de la charge de travail après l'installation. Cependant, vous pouvez reconfigurer le partitionnement de la charge de travail en mettant à jour la valeur cpu que vous définissez dans le profil de performance et dans la ressource personnalisée (CR) MachineConfig correspondante.

  • Le CR codé en base64 qui permet le partitionnement de la charge de travail contient l'ensemble de CPU auquel les charges de travail de gestion sont limitées. Encodez les valeurs spécifiques à l'hôte pour crio.conf et kubelet.conf en base64. Ajustez le contenu pour qu'il corresponde à l'ensemble de CPU spécifié dans le profil de performance de la grappe. Il doit correspondre au nombre de cœurs de l'hôte de la grappe.

    Configuration recommandée pour le partitionnement de la charge de travail

    apiVersion: machineconfiguration.openshift.io/v1
    kind: MachineConfig
    metadata:
      labels:
        machineconfiguration.openshift.io/role: master
      name: 02-master-workload-partitioning
    spec:
      config:
        ignition:
          version: 3.2.0
        storage:
          files:
          - contents:
              source: data:text/plain;charset=utf-8;base64,W2NyaW8ucnVudGltZS53b3JrbG9hZHMubWFuYWdlbWVudF0KYWN0aXZhdGlvbl9hbm5vdGF0aW9uID0gInRhcmdldC53b3JrbG9hZC5vcGVuc2hpZnQuaW8vbWFuYWdlbWVudCIKYW5ub3RhdGlvbl9wcmVmaXggPSAicmVzb3VyY2VzLndvcmtsb2FkLm9wZW5zaGlmdC5pbyIKcmVzb3VyY2VzID0geyAiY3B1c2hhcmVzIiA9IDAsICJjcHVzZXQiID0gIjAtMSw1Mi01MyIgfQo=
            mode: 420
            overwrite: true
            path: /etc/crio/crio.conf.d/01-workload-partitioning
            user:
              name: root
          - contents:
              source: data:text/plain;charset=utf-8;base64,ewogICJtYW5hZ2VtZW50IjogewogICAgImNwdXNldCI6ICIwLTEsNTItNTMiCiAgfQp9Cg==
            mode: 420
            overwrite: true
            path: /etc/kubernetes/openshift-workload-pinning
            user:
              name: root

  • Une fois configuré dans l'hôte du cluster, le contenu de /etc/crio/crio.conf.d/01-workload-partitioning doit ressembler à ceci :

    [crio.runtime.workloads.management]
    activation_annotation = "target.workload.openshift.io/management"
    annotation_prefix = "resources.workload.openshift.io"
    resources = { "cpushares" = 0, "cpuset" = "0-1,52-53" } 1
    1
    La valeur de cpuset varie en fonction de l'installation. Si l'Hyper-Threading est activé, indiquez les deux threads pour chaque cœur. La valeur cpuset doit correspondre aux CPU réservés que vous avez définis dans le champ spec.cpu.reserved du profil de performance.
  • Une fois configuré dans le cluster, le contenu de /etc/kubernetes/openshift-workload-pinning devrait ressembler à ceci :

    {
      "management": {
        "cpuset": "0-1,52-53" 1
      }
    }
    1
    La valeur de cpuset doit correspondre à celle de cpuset dans /etc/crio/crio.conf.d/01-workload-partitioning.

Vérification

Vérifiez que l'affectation des CPU des applications et du système de cluster est correcte. Exécutez les commandes suivantes :

  1. Ouvrez une connexion shell à distance au cluster géré :

    $ oc debug node/example-sno-1
  2. Vérifiez que l'épinglage du processeur des applications utilisateur est correct :

    sh-4.4# pgrep ovn | while read i; do taskset -cp $i; done

    Exemple de sortie

    pid 8481's current affinity list: 0-3
    pid 8726's current affinity list: 0-3
    pid 9088's current affinity list: 0-3
    pid 9945's current affinity list: 0-3
    pid 10387's current affinity list: 0-3
    pid 12123's current affinity list: 0-3
    pid 13313's current affinity list: 0-3

  3. Vérifier que l'affectation du CPU aux applications du système est correcte :

    sh-4.4# pgrep systemd | while read i; do taskset -cp $i; done

    Exemple de sortie

    pid 1's current affinity list: 0-3
    pid 938's current affinity list: 0-3
    pid 962's current affinity list: 0-3
    pid 1197's current affinity list: 0-3

21.6.6.2. Réduction de l'empreinte de la gestion de la plate-forme

Pour réduire l'empreinte de gestion globale de la plateforme, une ressource personnalisée (CR) MachineConfig est nécessaire pour placer tous les points de montage spécifiques à Kubernetes dans un nouvel espace de noms distinct du système d'exploitation hôte. L'exemple suivant de CR codée en base64 MachineConfig illustre cette configuration.

Configuration recommandée de l'espace de noms pour le montage du conteneur

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: master
  name: container-mount-namespace-and-kubelet-conf-master
spec:
  config:
    ignition:
      version: 3.2.0
    storage:
      files:
      - contents:
          source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKCmRlYnVnKCkgewogIGVjaG8gJEAgPiYyCn0KCnVzYWdlKCkgewogIGVjaG8gVXNhZ2U6ICQoYmFzZW5hbWUgJDApIFVOSVQgW2VudmZpbGUgW3Zhcm5hbWVdXQogIGVjaG8KICBlY2hvIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBFeGVjU3RhcnQgc3RhbnphIGZyb20gdGhlIGdpdmVuIHN5c3RlbWQgdW5pdCBhbmQgcmV0dXJuIGl0IHRvIHN0ZG91dAogIGVjaG8KICBlY2hvICJJZiAnZW52ZmlsZScgaXMgcHJvdmlkZWQsIHB1dCBpdCBpbiB0aGVyZSBpbnN0ZWFkLCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCAndmFybmFtZSciCiAgZWNobyAiRGVmYXVsdCAndmFybmFtZScgaXMgRVhFQ1NUQVJUIGlmIG5vdCBzcGVjaWZpZWQiCiAgZXhpdCAxCn0KClVOSVQ9JDEKRU5WRklMRT0kMgpWQVJOQU1FPSQzCmlmIFtbIC16ICRVTklUIHx8ICRVTklUID09ICItLWhlbHAiIHx8ICRVTklUID09ICItaCIgXV07IHRoZW4KICB1c2FnZQpmaQpkZWJ1ZyAiRXh0cmFjdGluZyBFeGVjU3RhcnQgZnJvbSAkVU5JVCIKRklMRT0kKHN5c3RlbWN0bCBjYXQgJFVOSVQgfCBoZWFkIC1uIDEpCkZJTEU9JHtGSUxFI1wjIH0KaWYgW1sgISAtZiAkRklMRSBdXTsgdGhlbgogIGRlYnVnICJGYWlsZWQgdG8gZmluZCByb290IGZpbGUgZm9yIHVuaXQgJFVOSVQgKCRGSUxFKSIKICBleGl0CmZpCmRlYnVnICJTZXJ2aWNlIGRlZmluaXRpb24gaXMgaW4gJEZJTEUiCkVYRUNTVEFSVD0kKHNlZCAtbiAtZSAnL15FeGVjU3RhcnQ9LipcXCQvLC9bXlxcXSQvIHsgcy9eRXhlY1N0YXJ0PS8vOyBwIH0nIC1lICcvXkV4ZWNTdGFydD0uKlteXFxdJC8geyBzL15FeGVjU3RhcnQ9Ly87IHAgfScgJEZJTEUpCgppZiBbWyAkRU5WRklMRSBdXTsgdGhlbgogIFZBUk5BTUU9JHtWQVJOQU1FOi1FWEVDU1RBUlR9CiAgZWNobyAiJHtWQVJOQU1FfT0ke0VYRUNTVEFSVH0iID4gJEVOVkZJTEUKZWxzZQogIGVjaG8gJEVYRUNTVEFSVApmaQo=
        mode: 493
        path: /usr/local/bin/extractExecStart
      - contents:
          source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKbnNlbnRlciAtLW1vdW50PS9ydW4vY29udGFpbmVyLW1vdW50LW5hbWVzcGFjZS9tbnQgIiRAIgo=
        mode: 493
        path: /usr/local/bin/nsenterCmns
    systemd:
      units:
      - contents: |
          [Unit]
          Description=Manages a mount namespace that both kubelet and crio can use to share their container-specific mounts

          [Service]
          Type=oneshot
          RemainAfterExit=yes
          RuntimeDirectory=container-mount-namespace
          Environment=RUNTIME_DIRECTORY=%t/container-mount-namespace
          Environment=BIND_POINT=%t/container-mount-namespace/mnt
          ExecStartPre=bash -c "findmnt ${RUNTIME_DIRECTORY} || mount --make-unbindable --bind ${RUNTIME_DIRECTORY} ${RUNTIME_DIRECTORY}"
          ExecStartPre=touch ${BIND_POINT}
          ExecStart=unshare --mount=${BIND_POINT} --propagation slave mount --make-rshared /
          ExecStop=umount -R ${RUNTIME_DIRECTORY}
        enabled: true
        name: container-mount-namespace.service
      - dropins:
        - contents: |
            [Unit]
            Wants=container-mount-namespace.service
            After=container-mount-namespace.service

            [Service]
            ExecStartPre=/usr/local/bin/extractExecStart %n /%t/%N-execstart.env ORIG_EXECSTART
            EnvironmentFile=-/%t/%N-execstart.env
            ExecStart=
            ExecStart=bash -c "nsenter --mount=%t/container-mount-namespace/mnt \
                ${ORIG_EXECSTART}"
          name: 90-container-mount-namespace.conf
        name: crio.service
      - dropins:
        - contents: |
            [Unit]
            Wants=container-mount-namespace.service
            After=container-mount-namespace.service

            [Service]
            ExecStartPre=/usr/local/bin/extractExecStart %n /%t/%N-execstart.env ORIG_EXECSTART
            EnvironmentFile=-/%t/%N-execstart.env
            ExecStart=
            ExecStart=bash -c "nsenter --mount=%t/container-mount-namespace/mnt \
                ${ORIG_EXECSTART} --housekeeping-interval=30s"
          name: 90-container-mount-namespace.conf
        - contents: |
            [Service]
            Environment="OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION=60s"
            Environment="OPENSHIFT_EVICTION_MONITORING_PERIOD_DURATION=30s"
          name: 30-kubelet-interval-tuning.conf
        name: kubelet.service

21.6.6.3. SCTP

Le protocole SCTP (Stream Control Transmission Protocol) est un protocole clé utilisé dans les applications RAN. Cet objet MachineConfig ajoute le module de noyau SCTP au nœud pour activer ce protocole.

Configuration SCTP recommandée

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: master
  name: load-sctp-module
spec:
  config:
    ignition:
      version: 2.2.0
    storage:
      files:
        - contents:
            source: data:,
            verification: {}
          filesystem: root
            mode: 420
            path: /etc/modprobe.d/sctp-blacklist.conf
        - contents:
            source: data:text/plain;charset=utf-8,sctp
          filesystem: root
            mode: 420
            path: /etc/modules-load.d/sctp-load.conf

21.6.6.4. Démarrage accéléré des conteneurs

Le MachineConfig CR suivant configure les processus et les conteneurs OpenShift de base pour utiliser tous les cœurs de CPU disponibles lors du démarrage et de l'arrêt du système. Cela accélère la récupération du système lors du démarrage initial et des redémarrages.

Configuration de démarrage recommandée pour les conteneurs accélérés

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: master
  name: 04-accelerated-container-startup-master
spec:
  config:
    ignition:
      version: 3.2.0
    storage:
      files:
      - contents:
          source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKIwojIFRlbXBvcmFyaWx5IHJlc2V0IHRoZSBjb3JlIHN5c3RlbSBwcm9jZXNzZXMncyBDUFUgYWZmaW5pdHkgdG8gYmUgdW5yZXN0cmljdGVkIHRvIGFjY2VsZXJhdGUgc3RhcnR1cCBhbmQgc2h1dGRvd24KIwojIFRoZSBkZWZhdWx0cyBiZWxvdyBjYW4gYmUgb3ZlcnJpZGRlbiB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCiMKCiMgVGhlIGRlZmF1bHQgc2V0IG9mIGNyaXRpY2FsIHByb2Nlc3NlcyB3aG9zZSBhZmZpbml0eSBzaG91bGQgYmUgdGVtcG9yYXJpbHkgdW5ib3VuZDoKQ1JJVElDQUxfUFJPQ0VTU0VTPSR7Q1JJVElDQUxfUFJPQ0VTU0VTOi0ic3lzdGVtZCBvdnMgY3JpbyBrdWJlbGV0IE5ldHdvcmtNYW5hZ2VyIGNvbm1vbiBkYnVzIn0KCiMgRGVmYXVsdCB3YWl0IHRpbWUgaXMgNjAwcyA9IDEwbToKTUFYSU1VTV9XQUlUX1RJTUU9JHtNQVhJTVVNX1dBSVRfVElNRTotNjAwfQoKIyBEZWZhdWx0IHN0ZWFkeS1zdGF0ZSB0aHJlc2hvbGQgPSAyJQojIEFsbG93ZWQgdmFsdWVzOgojICA0ICAtIGFic29sdXRlIHBvZCBjb3VudCAoKy8tKQojICA0JSAtIHBlcmNlbnQgY2hhbmdlICgrLy0pCiMgIC0xIC0gZGlzYWJsZSB0aGUgc3RlYWR5LXN0YXRlIGNoZWNrClNURUFEWV9TVEFURV9USFJFU0hPTEQ9JHtTVEVBRFlfU1RBVEVfVEhSRVNIT0xEOi0yJX0KCiMgRGVmYXVsdCBzdGVhZHktc3RhdGUgd2luZG93ID0gNjBzCiMgSWYgdGhlIHJ1bm5pbmcgcG9kIGNvdW50IHN0YXlzIHdpdGhpbiB0aGUgZ2l2ZW4gdGhyZXNob2xkIGZvciB0aGlzIHRpbWUKIyBwZXJpb2QsIHJldHVybiBDUFUgdXRpbGl6YXRpb24gdG8gbm9ybWFsIGJlZm9yZSB0aGUgbWF4aW11bSB3YWl0IHRpbWUgaGFzCiMgZXhwaXJlcwpTVEVBRFlfU1RBVEVfV0lORE9XPSR7U1RFQURZX1NUQVRFX1dJTkRPVzotNjB9CgojIERlZmF1bHQgc3RlYWR5LXN0YXRlIGFsbG93cyBhbnkgcG9kIGNvdW50IHRvIGJlICJzdGVhZHkgc3RhdGUiCiMgSW5jcmVhc2luZyB0aGlzIHdpbGwgc2tpcCBhbnkgc3RlYWR5LXN0YXRlIGNoZWNrcyB1bnRpbCB0aGUgY291bnQgcmlzZXMgYWJvdmUKIyB0aGlzIG51bWJlciB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgaWYgdGhlcmUgYXJlIHNvbWUgcGVyaW9kcyB3aGVyZSB0aGUKIyBjb3VudCBkb2Vzbid0IGluY3JlYXNlIGJ1dCB3ZSBrbm93IHdlIGNhbid0IGJlIGF0IHN0ZWFkeS1zdGF0ZSB5ZXQuClNURUFEWV9TVEFURV9NSU5JTVVNPSR7U1RFQURZX1NUQVRFX01JTklNVU06LTB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpLVUJFTEVUX0NQVV9TVEFURT0vdmFyL2xpYi9rdWJlbGV0L2NwdV9tYW5hZ2VyX3N0YXRlCkZVTExfQ1BVX1NUQVRFPS9zeXMvZnMvY2dyb3VwL2NwdXNldC9jcHVzZXQuY3B1cwp1bnJlc3RyaWN0ZWRDcHVzZXQoKSB7CiAgbG9jYWwgY3B1cwogIGlmIFtbIC1lICRLVUJFTEVUX0NQVV9TVEFURSBdXTsgdGhlbgogICAgICBjcHVzPSQoanEgLXIgJy5kZWZhdWx0Q3B1U2V0JyA8JEtVQkVMRVRfQ1BVX1NUQVRFKQogIGZpCiAgaWYgW1sgLXogJGNwdXMgXV07IHRoZW4KICAgICMgZmFsbCBiYWNrIHRvIHVzaW5nIGFsbCBjcHVzIGlmIHRoZSBrdWJlbGV0IHN0YXRlIGlzIG5vdCBjb25maWd1cmVkIHlldAogICAgW1sgLWUgJEZVTExfQ1BVX1NUQVRFIF1dIHx8IHJldHVybiAxCiAgICBjcHVzPSQoPCRGVUxMX0NQVV9TVEFURSkKICBmaQogIGVjaG8gJGNwdXMKfQoKcmVzdHJpY3RlZENwdXNldCgpIHsKICBmb3IgYXJnIGluICQoPC9wcm9jL2NtZGxpbmUpOyBkbwogICAgaWYgW1sgJGFyZyA9fiBec3lzdGVtZC5jcHVfYWZmaW5pdHk9IF1dOyB0aGVuCiAgICAgIGVjaG8gJHthcmcjKj19CiAgICAgIHJldHVybiAwCiAgICBmaQogIGRvbmUKICByZXR1cm4gMQp9CgpnZXRDUFVDb3VudCAoKSB7CiAgbG9jYWwgY3B1c2V0PSIkMSIKICBsb2NhbCBjcHVsaXN0PSgpCiAgbG9jYWwgY3B1cz0wCiAgbG9jYWwgbWluY3B1cz0yCgogIGlmIFtbIC16ICRjcHVzZXQgfHwgJGNwdXNldCA9fiBbXjAtOSwtXSBdXTsgdGhlbgogICAgZWNobyAkbWluY3B1cwogICAgcmV0dXJuIDEKICBmaQoKICBJRlM9JywnIHJlYWQgLXJhIGNwdWxpc3QgPDw8ICRjcHVzZXQKCiAgZm9yIGVsbSBpbiAiJHtjcHVsaXN0W0BdfSI7IGRvCiAgICBpZiBbWyAkZWxtID1+IF5bMC05XSskIF1dOyB0aGVuCiAgICAgICgoIGNwdXMrKyApKQogICAgZWxpZiBbWyAkZWxtID1+IF5bMC05XSstWzAtOV0rJCBdXTsgdGhlbgogICAgICBsb2NhbCBsb3c9MCBoaWdoPTAKICAgICAgSUZTPSctJyByZWFkIGxvdyBoaWdoIDw8PCAkZWxtCiAgICAgICgoIGNwdXMgKz0gaGlnaCAtIGxvdyArIDEgKSkKICAgIGVsc2UKICAgICAgZWNobyAkbWluY3B1cwogICAgICByZXR1cm4gMQogICAgZmkKICBkb25lCgogICMgUmV0dXJuIGEgbWluaW11bSBvZiAyIGNwdXMKICBlY2hvICQoKCBjcHVzID4gJG1pbmNwdXMgPyBjcHVzIDogJG1pbmNwdXMgKSkKICByZXR1cm4gMAp9CgpyZXNldE9WU3RocmVhZHMgKCkgewogIGxvY2FsIGNwdWNvdW50PSIkMSIKICBsb2NhbCBjdXJSZXZhbGlkYXRvcnM9MAogIGxvY2FsIGN1ckhhbmRsZXJzPTAKICBsb2NhbCBkZXNpcmVkUmV2YWxpZGF0b3JzPTAKICBsb2NhbCBkZXNpcmVkSGFuZGxlcnM9MAogIGxvY2FsIHJjPTAKCiAgY3VyUmV2YWxpZGF0b3JzPSQocHMgLVRlbyBwaWQsdGlkLGNvbW0sY21kIHwgZ3JlcCAtZSByZXZhbGlkYXRvciB8IGdyZXAgLWMgb3ZzLXZzd2l0Y2hkKQogIGN1ckhhbmRsZXJzPSQocHMgLVRlbyBwaWQsdGlkLGNvbW0sY21kIHwgZ3JlcCAtZSBoYW5kbGVyIHwgZ3JlcCAtYyBvdnMtdnN3aXRjaGQpCgogICMgQ2FsY3VsYXRlIHRoZSBkZXNpcmVkIG51bWJlciBvZiB0aHJlYWRzIHRoZSBzYW1lIHdheSBPVlMgZG9lcy4KICAjIE9WUyB3aWxsIHNldCB0aGVzZSB0aHJlYWQgY291bnQgYXMgYSBvbmUgc2hvdCBwcm9jZXNzIG9uIHN0YXJ0dXAsIHNvIHdlCiAgIyBoYXZlIHRvIGFkanVzdCB1cCBvciBkb3duIGR1cmluZyB0aGUgYm9vdCB1cCBwcm9jZXNzLiBUaGUgZGVzaXJlZCBvdXRjb21lIGlzCiAgIyB0byBub3QgcmVzdHJpY3QgdGhlIG51bWJlciBvZiB0aHJlYWQgYXQgc3RhcnR1cCB1bnRpbCB3ZSByZWFjaCBhIHN0ZWFkeQogICMgc3RhdGUuICBBdCB3aGljaCBwb2ludCB3ZSBuZWVkIHRvIHJlc2V0IHRoZXNlIGJhc2VkIG9uIG91ciByZXN0cmljdGVkICBzZXQKICAjIG9mIGNvcmVzLgogICMgU2VlIE9WUyBmdW5jdGlvbiB0aGF0IGNhbGN1bGF0ZXMgdGhlc2UgdGhyZWFkIGNvdW50czoKICAjIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVudnN3aXRjaC9vdnMvYmxvYi9tYXN0ZXIvb2Zwcm90by9vZnByb3RvLWRwaWYtdXBjYWxsLmMjTDYzNQogICgoIGRlc2lyZWRSZXZhbGlkYXRvcnM9JGNwdWNvdW50IC8gNCArIDEgKSkKICAoKCBkZXNpcmVkSGFuZGxlcnM9JGNwdWNvdW50IC0gJGRlc2lyZWRSZXZhbGlkYXRvcnMgKSkKCgogIGlmIFtbICRjdXJSZXZhbGlkYXRvcnMgLW5lICRkZXNpcmVkUmV2YWxpZGF0b3JzIHx8ICRjdXJIYW5kbGVycyAtbmUgJGRlc2lyZWRIYW5kbGVycyBdXTsgdGhlbgoKICAgIGxvZ2dlciAiUmVjb3Zlcnk6IFJlLXNldHRpbmcgT1ZTIHJldmFsaWRhdG9yIHRocmVhZHM6ICR7Y3VyUmV2YWxpZGF0b3JzfSAtPiAke2Rlc2lyZWRSZXZhbGlkYXRvcnN9IgogICAgbG9nZ2VyICJSZWNvdmVyeTogUmUtc2V0dGluZyBPVlMgaGFuZGxlciB0aHJlYWRzOiAke2N1ckhhbmRsZXJzfSAtPiAke2Rlc2lyZWRIYW5kbGVyc30iCgogICAgb3ZzLXZzY3RsIHNldCBcCiAgICAgIE9wZW5fdlN3aXRjaCAuIFwKICAgICAgb3RoZXItY29uZmlnOm4taGFuZGxlci10aHJlYWRzPSR7ZGVzaXJlZEhhbmRsZXJzfSBcCiAgICAgIG90aGVyLWNvbmZpZzpuLXJldmFsaWRhdG9yLXRocmVhZHM9JHtkZXNpcmVkUmV2YWxpZGF0b3JzfQogICAgcmM9JD8KICBmaQoKICByZXR1cm4gJHJjCn0KCnJlc2V0QWZmaW5pdHkoKSB7CiAgbG9jYWwgY3B1c2V0PSIkMSIKICBsb2NhbCBmYWlsY291bnQ9MAogIGxvY2FsIHN1Y2Nlc3Njb3VudD0wCiAgbG9nZ2VyICJSZWNvdmVyeTogU2V0dGluZyBDUFUgYWZmaW5pdHkgZm9yIGNyaXRpY2FsIHByb2Nlc3NlcyBcIiRDUklUSUNBTF9QUk9DRVNTRVNcIiB0byAkY3B1c2V0IgogIGZvciBwcm9jIGluICRDUklUSUNBTF9QUk9DRVNTRVM7IGRvCiAgICBsb2NhbCBwaWRzPSIkKHBncmVwICRwcm9jKSIKICAgIGZvciBwaWQgaW4gJHBpZHM7IGRvCiAgICAgIGxvY2FsIHRhc2tzZXRPdXRwdXQKICAgICAgdGFza3NldE91dHB1dD0iJCh0YXNrc2V0IC1hcGMgIiRjcHVzZXQiICRwaWQgMj4mMSkiCiAgICAgIGlmIFtbICQ/IC1uZSAwIF1dOyB0aGVuCiAgICAgICAgZWNobyAiRVJST1I6ICR0YXNrc2V0T3V0cHV0IgogICAgICAgICgoZmFpbGNvdW50KyspKQogICAgICBlbHNlCiAgICAgICAgKChzdWNjZXNzY291bnQrKykpCiAgICAgIGZpCiAgICBkb25lCiAgZG9uZQoKICByZXNldE9WU3RocmVhZHMgIiQoZ2V0Q1BVQ291bnQgJHtjcHVzZXR9KSIKICBpZiBbWyAkPyAtbmUgMCBdXTsgdGhlbgogICAgKChmYWlsY291bnQrKykpCiAgZWxzZQogICAgKChzdWNjZXNzY291bnQrKykpCiAgZmkKCiAgbG9nZ2VyICJSZWNvdmVyeTogUmUtYWZmaW5lZCAkc3VjY2Vzc2NvdW50IHBpZHMgc3VjY2Vzc2Z1bGx5IgogIGlmIFtbICRmYWlsY291bnQgLWd0IDAgXV07IHRoZW4KICAgIGxvZ2dlciAiUmVjb3Zlcnk6IEZhaWxlZCB0byByZS1hZmZpbmUgJGZhaWxjb3VudCBwcm9jZXNzZXMiCiAgICByZXR1cm4gMQogIGZpCn0KCnNldFVucmVzdHJpY3RlZCgpIHsKICBsb2dnZXIgIlJlY292ZXJ5OiBTZXR0aW5nIGNyaXRpY2FsIHN5c3RlbSBwcm9jZXNzZXMgdG8gaGF2ZSB1bnJlc3RyaWN0ZWQgQ1BVIGFjY2VzcyIKICByZXNldEFmZmluaXR5ICIkKHVucmVzdHJpY3RlZENwdXNldCkiCn0KCnNldFJlc3RyaWN0ZWQoKSB7CiAgbG9nZ2VyICJSZWNvdmVyeTogUmVzZXR0aW5nIGNyaXRpY2FsIHN5c3RlbSBwcm9jZXNzZXMgYmFjayB0byBub3JtYWxseSByZXN0cmljdGVkIGFjY2VzcyIKICByZXNldEFmZmluaXR5ICIkKHJlc3RyaWN0ZWRDcHVzZXQpIgp9CgpjdXJyZW50QWZmaW5pdHkoKSB7CiAgbG9jYWwgcGlkPSIkMSIKICB0YXNrc2V0IC1wYyAkcGlkIHwgYXdrIC1GJzogJyAne3ByaW50ICQyfScKfQoKd2l0aGluKCkgewogIGxvY2FsIGxhc3Q9JDEgY3VycmVudD0kMiB0aHJlc2hvbGQ9JDMKICBsb2NhbCBkZWx0YT0wIHBjaGFuZ2UKICBkZWx0YT0kKCggY3VycmVudCAtIGxhc3QgKSkKICBpZiBbWyAkY3VycmVudCAtZXEgJGxhc3QgXV07IHRoZW4KICAgIHBjaGFuZ2U9MAogIGVsaWYgW1sgJGxhc3QgLWVxIDAgXV07IHRoZW4KICAgIHBjaGFuZ2U9MTAwMDAwMAogIGVsc2UKICAgIHBjaGFuZ2U9JCgoICggJGRlbHRhICogMTAwKSAvIGxhc3QgKSkKICBmaQogIGVjaG8gLW4gImxhc3Q6JGxhc3QgY3VycmVudDokY3VycmVudCBkZWx0YTokZGVsdGEgcGNoYW5nZToke3BjaGFuZ2V9JTogIgogIGxvY2FsIGFic29sdXRlIGxpbWl0CiAgY2FzZSAkdGhyZXNob2xkIGluCiAgICAqJSkKICAgICAgYWJzb2x1dGU9JHtwY2hhbmdlIyMtfSAjIGFic29sdXRlIHZhbHVlCiAgICAgIGxpbWl0PSR7dGhyZXNob2xkJSUlfQogICAgICA7OwogICAgKikKICAgICAgYWJzb2x1dGU9JHtkZWx0YSMjLX0gIyBhYnNvbHV0ZSB2YWx1ZQogICAgICBsaW1pdD0kdGhyZXNob2xkCiAgICAgIDs7CiAgZXNhYwogIGlmIFtbICRhYnNvbHV0ZSAtbGUgJGxpbWl0IF1dOyB0aGVuCiAgICBlY2hvICJ3aXRoaW4gKCsvLSkkdGhyZXNob2xkIgogICAgcmV0dXJuIDAKICBlbHNlCiAgICBlY2hvICJvdXRzaWRlICgrLy0pJHRocmVzaG9sZCIKICAgIHJldHVybiAxCiAgZmkKfQoKc3RlYWR5c3RhdGUoKSB7CiAgbG9jYWwgbGFzdD0kMSBjdXJyZW50PSQyCiAgaWYgW1sgJGxhc3QgLWx0ICRTVEVBRFlfU1RBVEVfTUlOSU1VTSBdXTsgdGhlbgogICAgZWNobyAibGFzdDokbGFzdCBjdXJyZW50OiRjdXJyZW50IFdhaXRpbmcgdG8gcmVhY2ggJFNURUFEWV9TVEFURV9NSU5JTVVNIGJlZm9yZSBjaGVja2luZyBmb3Igc3RlYWR5LXN0YXRlIgogICAgcmV0dXJuIDEKICBmaQogIHdpdGhpbiAkbGFzdCAkY3VycmVudCAkU1RFQURZX1NUQVRFX1RIUkVTSE9MRAp9Cgp3YWl0Rm9yUmVhZHkoKSB7CiAgbG9nZ2VyICJSZWNvdmVyeTogV2FpdGluZyAke01BWElNVU1fV0FJVF9USU1FfXMgZm9yIHRoZSBpbml0aWFsaXphdGlvbiB0byBjb21wbGV0ZSIKICBsb2NhbCBsYXN0U3lzdGVtZENwdXNldD0iJChjdXJyZW50QWZmaW5pdHkgMSkiCiAgbG9jYWwgbGFzdERlc2lyZWRDcHVzZXQ9IiQodW5yZXN0cmljdGVkQ3B1c2V0KSIKICBsb2NhbCB0PTAgcz0xMAogIGxvY2FsIGxhc3RDY291bnQ9MCBjY291bnQ9MCBzdGVhZHlTdGF0ZVRpbWU9MAogIHdoaWxlIFtbICR0IC1sdCAkTUFYSU1VTV9XQUlUX1RJTUUgXV07IGRvCiAgICBzbGVlcCAkcwogICAgKCh0ICs9IHMpKQogICAgIyBSZS1jaGVjayB0aGUgY3VycmVudCBhZmZpbml0eSBvZiBzeXN0ZW1kLCBpbiBjYXNlIHNvbWUgb3RoZXIgcHJvY2VzcyBoYXMgY2hhbmdlZCBpdAogICAgbG9jYWwgc3lzdGVtZENwdXNldD0iJChjdXJyZW50QWZmaW5pdHkgMSkiCiAgICAjIFJlLWNoZWNrIHRoZSB1bnJlc3RyaWN0ZWQgQ3B1c2V0LCBhcyB0aGUgYWxsb3dlZCBzZXQgb2YgdW5yZXNlcnZlZCBjb3JlcyBtYXkgY2hhbmdlIGFzIHBvZHMgYXJlIGFzc2lnbmVkIHRvIGNvcmVzCiAgICBsb2NhbCBkZXNpcmVkQ3B1c2V0PSIkKHVucmVzdHJpY3RlZENwdXNldCkiCiAgICBpZiBbWyAkc3lzdGVtZENwdXNldCAhPSAkbGFzdFN5c3RlbWRDcHVzZXQgfHwgJGxhc3REZXNpcmVkQ3B1c2V0ICE9ICRkZXNpcmVkQ3B1c2V0IF1dOyB0aGVuCiAgICAgIHJlc2V0QWZmaW5pdHkgIiRkZXNpcmVkQ3B1c2V0IgogICAgICBsYXN0U3lzdGVtZENwdXNldD0iJChjdXJyZW50QWZmaW5pdHkgMSkiCiAgICAgIGxhc3REZXNpcmVkQ3B1c2V0PSIkZGVzaXJlZENwdXNldCIKICAgIGZpCgogICAgIyBEZXRlY3Qgc3RlYWR5LXN0YXRlIHBvZCBjb3VudAogICAgY2NvdW50PSQoY3JpY3RsIHBzIHwgd2MgLWwpCiAgICBpZiBzdGVhZHlzdGF0ZSAkbGFzdENjb3VudCAkY2NvdW50OyB0aGVuCiAgICAgICgoc3RlYWR5U3RhdGVUaW1lICs9IHMpKQogICAgICBlY2hvICJTdGVhZHktc3RhdGUgZm9yICR7c3RlYWR5U3RhdGVUaW1lfXMvJHtTVEVBRFlfU1RBVEVfV0lORE9XfXMiCiAgICAgIGlmIFtbICRzdGVhZHlTdGF0ZVRpbWUgLWdlICRTVEVBRFlfU1RBVEVfV0lORE9XIF1dOyB0aGVuCiAgICAgICAgbG9nZ2VyICJSZWNvdmVyeTogU3RlYWR5LXN0YXRlICgrLy0gJFNURUFEWV9TVEFURV9USFJFU0hPTEQpIGZvciAke1NURUFEWV9TVEFURV9XSU5ET1d9czogRG9uZSIKICAgICAgICByZXR1cm4gMAogICAgICBmaQogICAgZWxzZQogICAgICBpZiBbWyAkc3RlYWR5U3RhdGVUaW1lIC1ndCAwIF1dOyB0aGVuCiAgICAgICAgZWNobyAiUmVzZXR0aW5nIHN0ZWFkeS1zdGF0ZSB0aW1lciIKICAgICAgICBzdGVhZHlTdGF0ZVRpbWU9MAogICAgICBmaQogICAgZmkKICAgIGxhc3RDY291bnQ9JGNjb3VudAogIGRvbmUKICBsb2dnZXIgIlJlY292ZXJ5OiBSZWNvdmVyeSBDb21wbGV0ZSBUaW1lb3V0Igp9CgptYWluKCkgewogIGlmICEgdW5yZXN0cmljdGVkQ3B1c2V0ID4mL2Rldi9udWxsOyB0aGVuCiAgICBsb2dnZXIgIlJlY292ZXJ5OiBObyB1bnJlc3RyaWN0ZWQgQ3B1c2V0IGNvdWxkIGJlIGRldGVjdGVkIgogICAgcmV0dXJuIDEKICBmaQoKICBpZiAhIHJlc3RyaWN0ZWRDcHVzZXQgPiYvZGV2L251bGw7IHRoZW4KICAgIGxvZ2dlciAiUmVjb3Zlcnk6IE5vIHJlc3RyaWN0ZWQgQ3B1c2V0IGhhcyBiZWVuIGNvbmZpZ3VyZWQuICBXZSBhcmUgYWxyZWFkeSBydW5uaW5nIHVucmVzdHJpY3RlZC4iCiAgICByZXR1cm4gMAogIGZpCgogICMgRW5zdXJlIHdlIHJlc2V0IHRoZSBDUFUgYWZmaW5pdHkgd2hlbiB3ZSBleGl0IHRoaXMgc2NyaXB0IGZvciBhbnkgcmVhc29uCiAgIyBUaGlzIHdheSBlaXRoZXIgYWZ0ZXIgdGhlIHRpbWVyIGV4cGlyZXMgb3IgYWZ0ZXIgdGhlIHByb2Nlc3MgaXMgaW50ZXJydXB0ZWQKICAjIHZpYSBeQyBvciBTSUdURVJNLCB3ZSByZXR1cm4gdGhpbmdzIGJhY2sgdG8gdGhlIHdheSB0aGV5IHNob3VsZCBiZS4KICB0cmFwIHNldFJlc3RyaWN0ZWQgRVhJVAoKICBsb2dnZXIgIlJlY292ZXJ5OiBSZWNvdmVyeSBNb2RlIFN0YXJ0aW5nIgogIHNldFVucmVzdHJpY3RlZAogIHdhaXRGb3JSZWFkeQp9CgppZiBbWyAiJHtCQVNIX1NPVVJDRVswXX0iID0gIiR7MH0iIF1dOyB0aGVuCiAgbWFpbiAiJHtAfSIKICBleGl0ICQ/CmZpCg==
        mode: 493
        path: /usr/local/bin/accelerated-container-startup.sh
    systemd:
      units:
      - contents: |
          [Unit]
          Description=Unlocks more CPUs for critical system processes during container startup

          [Service]
          Type=simple
          ExecStart=/usr/local/bin/accelerated-container-startup.sh

          # Maximum wait time is 600s = 10m:
          Environment=MAXIMUM_WAIT_TIME=600

          # Steady-state threshold = 2%
          # Allowed values:
          #  4  - absolute pod count (+/-)
          #  4% - percent change (+/-)
          #  -1 - disable the steady-state check
          # Note: '%' must be escaped as '%%' in systemd unit files
          Environment=STEADY_STATE_THRESHOLD=2%%

          # Steady-state window = 120s
          # If the running pod count stays within the given threshold for this time
          # period, return CPU utilization to normal before the maximum wait time has
          # expires
          Environment=STEADY_STATE_WINDOW=120

          # Steady-state minimum = 40
          # Increasing this will skip any steady-state checks until the count rises above
          # this number to avoid false positives if there are some periods where the
          # count doesn't increase but we know we can't be at steady-state yet.
          Environment=STEADY_STATE_MINIMUM=40

          [Install]
          WantedBy=multi-user.target
        enabled: true
        name: accelerated-container-startup.service
      - contents: |
          [Unit]
          Description=Unlocks more CPUs for critical system processes during container shutdown
          DefaultDependencies=no

          [Service]
          Type=simple
          ExecStart=/usr/local/bin/accelerated-container-startup.sh

          # Maximum wait time is 600s = 10m:
          Environment=MAXIMUM_WAIT_TIME=600

          # Steady-state threshold
          # Allowed values:
          #  4  - absolute pod count (+/-)
          #  4% - percent change (+/-)
          #  -1 - disable the steady-state check
          # Note: '%' must be escaped as '%%' in systemd unit files
          Environment=STEADY_STATE_THRESHOLD=-1

          # Steady-state window = 60s
          # If the running pod count stays within the given threshold for this time
          # period, return CPU utilization to normal before the maximum wait time has
          # expires
          Environment=STEADY_STATE_WINDOW=60

          [Install]
          WantedBy=shutdown.target reboot.target halt.target
        enabled: true
        name: accelerated-container-shutdown.service

21.6.6.5. Vidage automatique des crashs du noyau avec kdump

kdump est une fonctionnalité du noyau Linux qui crée un crash dump du noyau lorsque celui-ci se bloque. kdump est activé avec les CR MachineConfig suivants :

Configuration recommandée pour kdump

apiVersion: machineconfiguration.openshift.io/v1
kind: MachineConfig
metadata:
  labels:
    machineconfiguration.openshift.io/role: master
  name: 06-kdump-enable-master
spec:
  config:
    ignition:
      version: 3.2.0
    systemd:
      units:
      - enabled: true
        name: kdump.service
  kernelArguments:
    - crashkernel=512M

21.6.7. Configurations recommandées pour les clusters après l'installation

Une fois l'installation du cluster terminée, le pipeline ZTP applique les ressources personnalisées (CR) suivantes, nécessaires à l'exécution des charges de travail de l'UD.

Note

Dans GitOps ZTP v4.10 et les versions antérieures, vous devez configurer le démarrage sécurisé de l'UEFI à l'aide d'un CR MachineConfig. Cela n'est plus nécessaire dans GitOps ZTP v4.11 et les versions ultérieures. Dans la version 4.11, vous configurez le démarrage sécurisé UEFI pour les clusters OpenShift à nœud unique à l'aide des CR du profil de performance. Pour plus d'informations, voir Profil de performance.

21.6.7.1. Espaces de noms des opérateurs et groupes d'opérateurs

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent les ressources personnalisées (CR) suivantes : OperatorGroup et Namespace:

  • Opérateur de stockage local
  • Opérateur forestier
  • Opérateur PTP
  • Opérateur de réseau SR-IOV

Le YAML suivant résume ces CR :

Configuration recommandée de l'espace de noms de l'opérateur et du groupe d'opérateurs

apiVersion: v1
kind: Namespace
metadata:
  annotations:
    workload.openshift.io/allowed: management
  name: openshift-local-storage
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: openshift-local-storage
  namespace: openshift-local-storage
spec:
  targetNamespaces:
    - openshift-local-storage
---
apiVersion: v1
kind: Namespace
metadata:
  annotations:
    workload.openshift.io/allowed: management
  name: openshift-logging
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: cluster-logging
  namespace: openshift-logging
spec:
  targetNamespaces:
    - openshift-logging
---
apiVersion: v1
kind: Namespace
metadata:
  annotations:
    workload.openshift.io/allowed: management
  labels:
    openshift.io/cluster-monitoring: "true"
  name: openshift-ptp
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: ptp-operators
  namespace: openshift-ptp
spec:
  targetNamespaces:
    - openshift-ptp
---
apiVersion: v1
kind: Namespace
metadata:
  annotations:
    workload.openshift.io/allowed: management
    name: openshift-sriov-network-operator
---
apiVersion: operators.coreos.com/v1
kind: OperatorGroup
metadata:
  name: sriov-network-operators
  namespace: openshift-sriov-network-operator
spec:
  targetNamespaces:
    - openshift-sriov-network-operator

21.6.7.2. Abonnements des opérateurs

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent les CR Subscription suivants. L'abonnement fournit l'emplacement pour télécharger les opérateurs suivants :

  • Opérateur de stockage local
  • Opérateur forestier
  • Opérateur PTP
  • Opérateur de réseau SR-IOV

Abonnements recommandés pour les opérateurs

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: cluster-logging
  namespace: openshift-logging
spec:
  channel: "stable" 1
  name: cluster-logging
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  installPlanApproval: Manual 2
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: local-storage-operator
  namespace: openshift-local-storage
spec:
  channel: "stable"
  installPlanApproval: Automatic
  name: local-storage-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  installPlanApproval: Manual
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
    name: ptp-operator-subscription
    namespace: openshift-ptp
spec:
  channel: "stable"
  name: ptp-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  installPlanApproval: Manual
---
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: sriov-network-operator-subscription
  namespace: openshift-sriov-network-operator
spec:
  channel: "stable"
  name: sriov-network-operator
  source: redhat-operators
  sourceNamespace: openshift-marketplace
  installPlanApproval: Manual

1
Indiquez le canal à partir duquel l'opérateur doit être reçu. stable est le canal recommandé.
2
Spécifiez Manual ou Automatic. En mode Automatic, l'opérateur se met automatiquement à jour avec les dernières versions du canal au fur et à mesure qu'elles sont disponibles dans le registre. En mode Manual, les nouvelles versions de l'opérateur ne sont installées qu'après avoir été explicitement approuvées.

21.6.7.3. Journalisation des clusters et transmission des journaux

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent la journalisation et le transfert de journaux pour le débogage. L'exemple YAML suivant illustre les CR ClusterLogging et ClusterLogForwarder nécessaires.

Configuration recommandée de la journalisation et de la transmission des journaux pour les clusters

apiVersion: logging.openshift.io/v1
kind: ClusterLogging 1
metadata:
  name: instance
  namespace: openshift-logging
spec:
  collection:
    logs:
      fluentd: {}
      type: fluentd
  curation:
    type: "curator"
    curator:
      schedule: "30 3 * * *"
  managementState: Managed
---
apiVersion: logging.openshift.io/v1
kind: ClusterLogForwarder 2
metadata:
  name: instance
  namespace: openshift-logging
spec:
  inputs:
    - infrastructure: {}
      name: infra-logs
  outputs:
    - name: kafka-open
      type: kafka
      url: tcp://10.46.55.190:9092/test    3
  pipelines:
    - inputRefs:
      - audit
      name: audit-logs
      outputRefs:
      - kafka-open
    - inputRefs:
      - infrastructure
      name: infrastructure-logs
      outputRefs:
      - kafka-open

1
Met à jour l'instance ClusterLogging existante ou crée l'instance si elle n'existe pas.
2
Met à jour l'instance ClusterLogForwarder existante ou crée l'instance si elle n'existe pas.
3
Spécifie l'URL du serveur Kafka vers lequel les journaux sont transférés.

21.6.7.4. Profil de performance

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent un profil de performance Node Tuning Operator pour utiliser les capacités et les services de l'hôte en temps réel.

Note

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon était utilisé pour mettre en œuvre un réglage automatique afin d'obtenir des performances de faible latence pour les applications OpenShift. Dans OpenShift Container Platform 4.11 et les versions ultérieures, cette fonctionnalité fait partie de l'opérateur Node Tuning.

L'exemple suivant PerformanceProfile CR illustre la configuration requise du cluster.

Configuration recommandée du profil de performance

apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
  name: openshift-node-performance-profile 1
spec:
  additionalKernelArgs:
  - "rcupdate.rcu_normal_after_boot=0"
  - "efi=runtime" 2
  cpu:
    isolated: 2-51,54-103 3
    reserved: 0-1,52-53   4
  hugepages:
    defaultHugepagesSize: 1G
    pages:
      - count: 32 5
        size: 1G  6
        node: 0 7
  machineConfigPoolSelector:
    pools.operator.machineconfiguration.openshift.io/master: ""
  nodeSelector:
    node-role.kubernetes.io/master: ""
  numa:
    topologyPolicy: "restricted"
  realTimeKernel:
    enabled: true    8

1
Assurez-vous que la valeur de name correspond à celle spécifiée dans le champ spec.profile.data de TunedPerformancePatch.yaml et dans le champ status.configuration.source.name de validatorCRs/informDuValidator.yaml.
2
Configure le démarrage sécurisé UEFI pour l'hôte du cluster.
3
Définissez les CPU isolés. Assurez-vous que toutes les paires Hyper-Threading correspondent.
Important

Les pools de CPU réservés et isolés ne doivent pas se chevaucher et doivent couvrir tous les cœurs disponibles. Les cœurs de CPU qui ne sont pas pris en compte entraînent un comportement indéfini dans le système.

4
Définissez les unités centrales réservées. Lorsque le partitionnement de la charge de travail est activé, les processus système, les threads du noyau et les threads du conteneur système sont limités à ces unités centrales. Toutes les unités centrales qui ne sont pas isolées doivent être réservées.
5
Définir le nombre de pages énormes.
6
Définir la taille de la grande page.
7
Définissez node comme étant le nœud NUMA où les hugepages sont alloués.
8
Définissez enabled à true pour installer le noyau Linux en temps réel.

21.6.7.5. PTP

Les clusters OpenShift à nœud unique utilisent le Precision Time Protocol (PTP) pour la synchronisation de l'heure du réseau. L'exemple suivant PtpConfig CR illustre la configuration esclave PTP requise.

Configuration PTP recommandée

apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
  name: du-ptp-slave
  namespace: openshift-ptp
spec:
  profile:
    - interface: ens5f0     1
      name: slave
      phc2sysOpts: -a -r -n 24
      ptp4lConf: |
        [global]
        #
        # Default Data Set
        #
        twoStepFlag 1
        slaveOnly 0
        priority1 128
        priority2 128
        domainNumber 24
        #utc_offset 37
        clockClass 248
        clockAccuracy 0xFE
        offsetScaledLogVariance 0xFFFF
        free_running 0
        freq_est_interval 1
        dscp_event 0
        dscp_general 0
        dataset_comparison ieee1588
        G.8275.defaultDS.localPriority 128
        #
        # Port Data Set
        #
        logAnnounceInterval -3
        logSyncInterval -4
        logMinDelayReqInterval -4
        logMinPdelayReqInterval -4
        announceReceiptTimeout 3
        syncReceiptTimeout 0
        delayAsymmetry 0
        fault_reset_interval 4
        neighborPropDelayThresh 20000000
        masterOnly 0
        G.8275.portDS.localPriority 128
        #
        # Run time options
        #
        assume_two_step 0
        logging_level 6
        path_trace_enabled 0
        follow_up_info 0
        hybrid_e2e 0
        inhibit_multicast_service 0
        net_sync_monitor 0
        tc_spanning_tree 0
        tx_timestamp_timeout 1
        unicast_listen 0
        unicast_master_table 0
        unicast_req_duration 3600
        use_syslog 1
        verbose 0
        summary_interval 0
        kernel_leap 1
        check_fup_sync 0
        #
        # Servo Options
        #
        pi_proportional_const 0.0
        pi_integral_const 0.0
        pi_proportional_scale 0.0
        pi_proportional_exponent -0.3
        pi_proportional_norm_max 0.7
        pi_integral_scale 0.0
        pi_integral_exponent 0.4
        pi_integral_norm_max 0.3
        step_threshold 2.0
        first_step_threshold 0.00002
        max_frequency 900000000
        clock_servo pi
        sanity_freq_limit 200000000
        ntpshm_segment 0
        #
        # Transport options
        #
        transportSpecific 0x0
        ptp_dst_mac 01:1B:19:00:00:00
        p2p_dst_mac 01:80:C2:00:00:0E
        udp_ttl 1
        udp6_scope 0x0E
        uds_address /var/run/ptp4l
        #
        # Default interface options
        #
        clock_type OC
        network_transport L2
        delay_mechanism E2E
        time_stamping hardware
        tsproc_mode filter
        delay_filter moving_median
        delay_filter_length 10
        egressLatency 0
        ingressLatency 0
        boundary_clock_jbod 0
        #
        # Clock description
        #
        productDescription ;;
        revisionData ;;
        manufacturerIdentity 00:00:00
        userDescription ;
        timeSource 0xA0
      ptp4lOpts: -2 -s --summary_interval -4
recommend:
  - match:
      - nodeLabel: node-role.kubernetes.io/master
    priority: 4
    profile: slave

1
Définit l'interface utilisée pour recevoir le signal d'horloge PTP.

21.6.7.6. Profil accordé étendu

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent des configurations de réglage des performances supplémentaires nécessaires pour les charges de travail hautes performances. L'exemple suivant Tuned CR étend le profil Tuned:

Configuration recommandée du profil Tuned étendu

apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
  name: performance-patch
  namespace: openshift-cluster-node-tuning-operator
spec:
  profile:
    - data: |
        [main]
        summary=Configuration changes profile inherited from performance created tuned
        include=openshift-node-performance-openshift-node-performance-profile
        [bootloader]
        cmdline_crash=nohz_full=2-51,54-103
        [sysctl]
        kernel.timer_migration=1
        [scheduler]
        group.ice-ptp=0:f:10:*:ice-ptp.*
        [service]
        service.stalld=start,enable
        service.chronyd=stop,disable
      name: performance-patch
  recommend:
    - machineConfigLabels:
        machineconfiguration.openshift.io/role: master
      priority: 19
      profile: performance-patch

21.6.7.7. SR-IOV

La virtualisation des E/S à racine unique (SR-IOV) est couramment utilisée pour activer les réseaux fronthaul et midhaul. L'exemple YAML suivant configure la SR-IOV pour un cluster OpenShift à nœud unique.

Configuration SR-IOV recommandée

apiVersion: sriovnetwork.openshift.io/v1
kind: SriovOperatorConfig
metadata:
  name: default
  namespace: openshift-sriov-network-operator
spec:
  configDaemonNodeSelector:
    node-role.kubernetes.io/master: ""
  disableDrain: true
  enableInjector: true
  enableOperatorWebhook: true
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
  name: sriov-nw-du-mh
  namespace: openshift-sriov-network-operator
spec:
  networkNamespace: openshift-sriov-network-operator
  resourceName: du_mh
  vlan: 150 1
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: sriov-nnp-du-mh
  namespace: openshift-sriov-network-operator
spec:
  deviceType: vfio-pci 2
  isRdma: false
  nicSelector:
    pfNames:
      - ens7f0 3
  nodeSelector:
    node-role.kubernetes.io/master: ""
  numVfs: 8 4
  priority: 10
  resourceName: du_mh
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetwork
metadata:
  name: sriov-nw-du-fh
  namespace: openshift-sriov-network-operator
spec:
  networkNamespace: openshift-sriov-network-operator
  resourceName: du_fh
  vlan: 140 5
---
apiVersion: sriovnetwork.openshift.io/v1
kind: SriovNetworkNodePolicy
metadata:
  name: sriov-nnp-du-fh
  namespace: openshift-sriov-network-operator
spec:
  deviceType: netdevice 6
  isRdma: true
  nicSelector:
    pfNames:
      - ens5f0 7
  nodeSelector:
    node-role.kubernetes.io/master: ""
  numVfs: 8 8
  priority: 10
  resourceName: du_fh

1
Spécifie le VLAN pour le réseau intermédiaire.
2
Sélectionnez vfio-pci ou netdevice, selon le cas.
3
Spécifie l'interface connectée au réseau intermédiaire.
4
Spécifie le nombre de VFs pour le réseau midhaul.
5
Le VLAN pour le réseau frontal.
6
Sélectionnez vfio-pci ou netdevice, selon le cas.
7
Spécifie l'interface connectée au réseau fronthaul.
8
Spécifie le nombre de VFs pour le réseau fronthaul.

21.6.7.8. Opérateur de console

L'opérateur de console installe et maintient la console web sur un cluster. Lorsque le nœud est géré de manière centralisée, l'opérateur n'est pas nécessaire et libère de l'espace pour les charges de travail des applications. L'exemple de ressource personnalisée (CR) suivant ( Console ) désactive la console.

Configuration recommandée de la console

apiVersion: operator.openshift.io/v1
kind: Console
metadata:
  annotations:
    include.release.openshift.io/ibm-cloud-managed: "false"
    include.release.openshift.io/self-managed-high-availability: "false"
    include.release.openshift.io/single-node-developer: "false"
    release.openshift.io/create-only: "true"
  name: cluster
spec:
  logLevel: Normal
  managementState: Removed
  operatorLogLevel: Normal

21.6.7.9. Grafana et Alertmanager

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent des ressources CPU réduites consommées par les composants de surveillance d'OpenShift Container Platform. La ressource personnalisée (CR) suivante ConfigMap désactive Grafana et Alertmanager.

Configuration recommandée pour la surveillance des clusters

apiVersion: v1
kind: ConfigMap
metadata:
  name: cluster-monitoring-config
  namespace: openshift-monitoring
data:
  config.yaml: |
    grafana:
      enabled: false
    alertmanagerMain:
      enabled: false
    prometheusK8s:
       retention: 24h

21.6.7.10. Diagnostic du réseau

Les clusters OpenShift à nœud unique qui exécutent des charges de travail DU nécessitent moins de contrôles de connectivité réseau inter-pods pour réduire la charge supplémentaire créée par ces pods. La ressource personnalisée (CR) suivante désactive ces contrôles.

Configuration recommandée pour le diagnostic du réseau

apiVersion: operator.openshift.io/v1
kind: Network
metadata:
  name: cluster
spec:
  disableNetworkDiagnostics: true

21.7. Valider le réglage d'un cluster OpenShift à nœud unique pour les charges de travail des applications vDU

Avant de pouvoir déployer des applications d'unités virtuelles distribuées (vDU), vous devez régler et configurer le microprogramme de l'hôte du cluster et divers autres paramètres de configuration du cluster. Utilisez les informations suivantes pour valider la configuration de la grappe afin de prendre en charge les charges de travail vDU.

Ressources supplémentaires

21.7.1. Configuration recommandée du micrologiciel pour les hôtes de la grappe vDU

Utilisez le tableau suivant comme base pour configurer le firmware de l'hôte du cluster pour les applications vDU fonctionnant sur OpenShift Container Platform 4.12.

Note

Le tableau suivant est une recommandation générale pour la configuration du micrologiciel de l'hôte du cluster vDU. Les paramètres exacts du micrologiciel dépendront de vos besoins et de votre plate-forme matérielle spécifique. La configuration automatique du firmware n'est pas gérée par le pipeline de provisionnement zero touch.

Tableau 21.7. Paramètres recommandés pour le micrologiciel de l'hôte de la grappe

Réglage du micrologicielConfigurationDescription

HyperTransport (HT)

Activé

Le bus HyperTransport (HT) est une technologie de bus développée par AMD. HT fournit un lien à grande vitesse entre les composants de la mémoire hôte et les autres périphériques du système.

UEFI

Activé

Activer le démarrage à partir de l'UEFI pour l'hôte vDU.

Politique de puissance et de performance de l'unité centrale

Performances

Définissez la politique de puissance et de performance de l'unité centrale pour optimiser le système en termes de performance plutôt que d'efficacité énergétique.

Mise à l'échelle de la fréquence Uncore

Handicapés

Désactivez l'option Uncore Frequency Scaling pour éviter que la tension et la fréquence des parties non centrales de l'unité centrale ne soient réglées indépendamment.

Fréquence Uncore

Maximum

Règle les parties non essentielles de l'unité centrale, telles que le cache et le contrôleur de mémoire, à leur fréquence de fonctionnement maximale possible.

Performance Limite P

Handicapés

Désactiver la limite de performance P pour empêcher la coordination de la fréquence Uncore des processeurs.

Technologie Intel® SpeedStep améliorée

Activé

Activez Enhanced Intel SpeedStep pour permettre au système d'ajuster dynamiquement la tension du processeur et la fréquence du cœur, ce qui réduit la consommation d'énergie et la production de chaleur dans l'hôte.

Technologie Intel® Turbo Boost

Activé

Activez la technologie Turbo Boost pour les processeurs basés sur Intel afin d'autoriser automatiquement les cœurs du processeur à fonctionner plus rapidement que la fréquence de fonctionnement nominale s'ils fonctionnent en dessous des limites de puissance, de courant et de température spécifiées.

TDP configurable par Intel

Activé

Active la puissance de conception thermique (TDP) pour le CPU.

Niveau TDP configurable

Niveau 2

Le niveau TDP définit la consommation d'énergie de l'unité centrale requise pour une performance donnée. Le niveau TDP 2 permet au CPU d'atteindre le niveau de performance le plus stable au prix de la consommation d'énergie.

Turbo à haut rendement énergétique

Handicapés

Désactiver le Turbo écoénergétique pour empêcher le processeur d'utiliser une stratégie basée sur l'efficacité énergétique.

Matériel P-States

Activé ou désactivé

Activer les états P contrôlés par le système d'exploitation pour permettre des configurations d'économie d'énergie. Désactiver P-states (états de performance) pour optimiser le système d'exploitation et le processeur en termes de performance plutôt que de consommation d'énergie.

Paquet C-State

État C0/C1

Utilisez les états C0 ou C1 pour mettre le processeur dans un état totalement actif (C0) ou pour arrêter les horloges internes du processeur fonctionnant dans le logiciel (C1).

C1E

Handicapés

CPU Enhanced Halt (C1E) est une fonction d'économie d'énergie des puces Intel. La désactivation de C1E empêche le système d'exploitation d'envoyer une commande d'arrêt au processeur lorsqu'il est inactif.

Processeur C6

Handicapés

L'économie d'énergie C6 est une fonction du processeur qui désactive automatiquement les cœurs et la mémoire cache inactifs du processeur. La désactivation de C6 améliore les performances du système.

Regroupement sous-NUMA

Handicapés

Le clustering Sub-NUMA divise les cœurs de processeur, le cache et la mémoire en plusieurs domaines NUMA. La désactivation de cette option peut améliorer les performances des charges de travail sensibles à la latence.

Note

Activer les paramètres SR-IOV et VT-d globaux dans le micrologiciel de l'hôte. Ces paramètres sont pertinents pour les environnements bare-metal.

Note

Activez à la fois C-states et P-States contrôlé par le système d'exploitation pour permettre une gestion de l'alimentation par pod.

21.7.2. Configurations de cluster recommandées pour l'exécution des applications vDU

Les clusters qui exécutent des applications d'unités distribuées virtualisées (vDU) nécessitent une configuration hautement réglée et optimisée. Les informations suivantes décrivent les différents éléments nécessaires à la prise en charge des charges de travail vDU dans les clusters OpenShift Container Platform 4.12.

21.7.2.4. Vérification de la version du noyau temps réel

Utilisez toujours la dernière version du noyau temps réel dans vos clusters OpenShift Container Platform. Si vous n'êtes pas sûr de la version du noyau utilisée dans le cluster, vous pouvez comparer la version actuelle du noyau en temps réel à la version release à l'aide de la procédure suivante.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous êtes connecté en tant qu'utilisateur avec des privilèges cluster-admin.
  • Vous avez installé podman.

Procédure

  1. Exécutez la commande suivante pour obtenir la version du cluster :

    $ OCP_VERSION=$(oc get clusterversion version -o jsonpath='{.status.desired.version}{"\n"}')
  2. Obtenir le numéro SHA de l'image de la version :

    $ DTK_IMAGE=$(oc adm release info --image-for=driver-toolkit quay.io/openshift-release-dev/ocp-release:$OCP_VERSION-x86_64)
  3. Exécutez le conteneur d'image de version et extrayez la version du noyau qui est fournie avec la version actuelle du cluster :

    $ podman run --rm $DTK_IMAGE rpm -qa | grep 'kernel-rt-core-' | sed 's#kernel-rt-core-##'

    Exemple de sortie

    4.18.0-305.49.1.rt7.121.el8_4.x86_64

    Il s'agit de la version par défaut du noyau en temps réel qui est livrée avec la version.

    Note

    Le noyau temps réel est désigné par la chaîne .rt dans la version du noyau.

Vérification

Vérifiez que la version du noyau indiquée pour la version actuelle de la grappe correspond au noyau en temps réel qui s'exécute dans la grappe. Exécutez les commandes suivantes pour vérifier la version du noyau en temps réel en cours d'exécution :

  1. Ouvrez une connexion shell à distance au nœud de cluster :

    oc debug node/<node_name>
  2. Vérifier la version du noyau temps réel :

    sh-4.4# uname -r

    Exemple de sortie

    4.18.0-305.49.1.rt7.121.el8_4.x86_64

21.7.3. Vérification de l'application des configurations recommandées pour les clusters

Vous pouvez vérifier que les clusters exécutent la bonne configuration. La procédure suivante décrit comment vérifier les différentes configurations requises pour déployer une application DU dans les clusters OpenShift Container Platform 4.12.

Conditions préalables

  • Vous avez déployé un cluster et l'avez optimisé pour les charges de travail vDU.
  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté en tant qu'utilisateur avec les privilèges cluster-admin.

Procédure

  1. Vérifiez que les sources OperatorHub par défaut sont désactivées. Exécutez la commande suivante :

    $ oc get operatorhub cluster -o yaml

    Exemple de sortie

    spec:
        disableAllDefaultSources: true

  2. Vérifiez que toutes les ressources CatalogSource requises sont annotées pour le partitionnement de la charge de travail (PreferredDuringScheduling) en exécutant la commande suivante :

    $ oc get catalogsource -A -o jsonpath='{range .items[*]}{.metadata.name}{" -- "}{.metadata.annotations.target\.workload\.openshift\.io/management}{"\n"}{end}'

    Exemple de sortie

    certified-operators -- {"effect": "PreferredDuringScheduling"}
    community-operators -- {"effect": "PreferredDuringScheduling"}
    ran-operators 1
    redhat-marketplace -- {"effect": "PreferredDuringScheduling"}
    redhat-operators -- {"effect": "PreferredDuringScheduling"}

    1
    CatalogSource les ressources qui ne sont pas annotées sont également renvoyées. Dans cet exemple, la ressource ran-operators CatalogSource n'est pas annotée et n'a pas l'annotation PreferredDuringScheduling.
    Note

    Dans un cluster vDU correctement configuré, une seule source de catalogue annotée est répertoriée.

  3. Vérifiez que tous les espaces de noms d'opérateurs OpenShift Container Platform applicables sont annotés pour le partitionnement de la charge de travail. Cela inclut tous les opérateurs installés avec le noyau d'OpenShift Container Platform et l'ensemble des opérateurs supplémentaires inclus dans la configuration de réglage DU de référence. Exécutez la commande suivante :

    $ oc get namespaces -A -o jsonpath='{range .items[*]}{.metadata.name}{" -- "}{.metadata.annotations.workload\.openshift\.io/allowed}{"\n"}{end}'

    Exemple de sortie

    default --
    openshift-apiserver -- management
    openshift-apiserver-operator -- management
    openshift-authentication -- management
    openshift-authentication-operator -- management

    Important

    Les opérateurs supplémentaires ne doivent pas être annotés pour le partitionnement de la charge de travail. Dans la sortie de la commande précédente, les opérateurs supplémentaires doivent être listés sans aucune valeur à droite du séparateur --.

  4. Vérifiez que la configuration de ClusterLogging est correcte. Exécutez les commandes suivantes :

    1. Validez que les journaux d'entrée et de sortie appropriés sont configurés :

      $ oc get -n openshift-logging ClusterLogForwarder instance -o yaml

      Exemple de sortie

      apiVersion: logging.openshift.io/v1
      kind: ClusterLogForwarder
      metadata:
        creationTimestamp: "2022-07-19T21:51:41Z"
        generation: 1
        name: instance
        namespace: openshift-logging
        resourceVersion: "1030342"
        uid: 8c1a842d-80c5-447a-9150-40350bdf40f0
      spec:
        inputs:
        - infrastructure: {}
          name: infra-logs
        outputs:
        - name: kafka-open
          type: kafka
          url: tcp://10.46.55.190:9092/test
        pipelines:
        - inputRefs:
          - audit
          name: audit-logs
          outputRefs:
          - kafka-open
        - inputRefs:
          - infrastructure
          name: infrastructure-logs
          outputRefs:
          - kafka-open
      ...

    2. Vérifiez que le calendrier de curation est adapté à votre application :

      $ oc get -n openshift-logging clusterloggings.logging.openshift.io instance -o yaml

      Exemple de sortie

      apiVersion: logging.openshift.io/v1
      kind: ClusterLogging
      metadata:
        creationTimestamp: "2022-07-07T18:22:56Z"
        generation: 1
        name: instance
        namespace: openshift-logging
        resourceVersion: "235796"
        uid: ef67b9b8-0e65-4a10-88ff-ec06922ea796
      spec:
        collection:
          logs:
            fluentd: {}
            type: fluentd
        curation:
          curator:
            schedule: 30 3 * * *
          type: curator
        managementState: Managed
      ...

  5. Vérifiez que la console web est désactivée (managementState: Removed) en exécutant la commande suivante :

    $ oc get consoles.operator.openshift.io cluster -o jsonpath="{ .spec.managementState }"

    Exemple de sortie

    Supprimé

  6. Vérifiez que chronyd est désactivé sur le nœud de cluster en exécutant les commandes suivantes :

    oc debug node/<node_name>

    Vérifiez l'état de chronyd sur le nœud :

    sh-4.4# chroot /host
    sh-4.4# systemctl status chronyd

    Exemple de sortie

    ● chronyd.service - NTP client/server
        Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
        Active: inactive (dead)
          Docs: man:chronyd(8)
                man:chrony.conf(5)

  7. Vérifiez que l'interface PTP est bien synchronisée avec l'horloge primaire en utilisant une connexion shell à distance au conteneur linuxptp-daemon et à l'outil PTP Management Client (pmc) :

    1. Définissez la variable $PTP_POD_NAME avec le nom du module linuxptp-daemon en exécutant la commande suivante :

      $ PTP_POD_NAME=$(oc get pods -n openshift-ptp -l app=linuxptp-daemon -o name)
    2. Exécutez la commande suivante pour vérifier l'état de synchronisation du dispositif PTP :

      $ oc -n openshift-ptp rsh -c linuxptp-daemon-container ${PTP_POD_NAME} pmc -u -f /var/run/ptp4l.0.config -b 0 'GET PORT_DATA_SET'

      Exemple de sortie

      sending: GET PORT_DATA_SET
        3cecef.fffe.7a7020-1 seq 0 RESPONSE MANAGEMENT PORT_DATA_SET
          portIdentity            3cecef.fffe.7a7020-1
          portState               SLAVE
          logMinDelayReqInterval  -4
          peerMeanPathDelay       0
          logAnnounceInterval     1
          announceReceiptTimeout  3
          logSyncInterval         0
          delayMechanism          1
          logMinPdelayReqInterval 0
          versionNumber           2
        3cecef.fffe.7a7020-2 seq 0 RESPONSE MANAGEMENT PORT_DATA_SET
          portIdentity            3cecef.fffe.7a7020-2
          portState               LISTENING
          logMinDelayReqInterval  0
          peerMeanPathDelay       0
          logAnnounceInterval     1
          announceReceiptTimeout  3
          logSyncInterval         0
          delayMechanism          1
          logMinPdelayReqInterval 0
          versionNumber           2

    3. Exécutez la commande suivante pmc pour vérifier l'état de l'horloge PTP :

      $ oc -n openshift-ptp rsh -c linuxptp-daemon-container ${PTP_POD_NAME} pmc -u -f /var/run/ptp4l.0.config -b 0 'GET TIME_STATUS_NP'

      Exemple de sortie

      sending: GET TIME_STATUS_NP
        3cecef.fffe.7a7020-0 seq 0 RESPONSE MANAGEMENT TIME_STATUS_NP
          master_offset              10 1
          ingress_time               1657275432697400530
          cumulativeScaledRateOffset +0.000000000
          scaledLastGmPhaseChange    0
          gmTimeBaseIndicator        0
          lastGmPhaseChange          0x0000'0000000000000000.0000
          gmPresent                  true 2
          gmIdentity                 3c2c30.ffff.670e00

      1
      master_offset doit se situer entre -100 et 100 ns.
      2
      Indique que l'horloge PTP est synchronisée avec un maître et que l'horloge locale n'est pas l'horloge du grand maître.
    4. Vérifiez que la valeur attendue de master offset correspondant à la valeur de /var/run/ptp4l.0.config se trouve dans le journal de linuxptp-daemon-container:

      $ oc logs $PTP_POD_NAME -n openshift-ptp -c linuxptp-daemon-container

      Exemple de sortie

      phc2sys[56020.341]: [ptp4l.1.config] CLOCK_REALTIME phc offset  -1731092 s2 freq -1546242 delay    497
      ptp4l[56020.390]: [ptp4l.1.config] master offset         -2 s2 freq   -5863 path delay       541
      ptp4l[56020.390]: [ptp4l.0.config] master offset         -8 s2 freq  -10699 path delay       533

  8. Vérifiez que la configuration du SR-IOV est correcte en exécutant les commandes suivantes :

    1. Vérifiez que la valeur disableDrain de la ressource SriovOperatorConfig est définie sur true:

      $ oc get sriovoperatorconfig -n openshift-sriov-network-operator default -o jsonpath="{.spec.disableDrain}{'\n'}"

      Exemple de sortie

      true

    2. Vérifiez que l'état de synchronisation de SriovNetworkNodeState est Succeeded en exécutant la commande suivante :

      $ oc get SriovNetworkNodeStates -n openshift-sriov-network-operator -o jsonpath="{.items[*].status.syncStatus}{'\n'}"

      Exemple de sortie

      Succeeded

    3. Vérifier que le nombre et la configuration attendus des fonctions virtuelles (Vfs) sous chaque interface configurée pour SR-IOV sont présents et corrects dans le champ .status.interfaces. Par exemple :

      $ oc get SriovNetworkNodeStates -n openshift-sriov-network-operator -o yaml

      Exemple de sortie

      apiVersion: v1
      items:
      - apiVersion: sriovnetwork.openshift.io/v1
        kind: SriovNetworkNodeState
      ...
        status:
          interfaces:
          ...
          - Vfs:
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.0
              vendor: "8086"
              vfID: 0
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.1
              vendor: "8086"
              vfID: 1
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.2
              vendor: "8086"
              vfID: 2
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.3
              vendor: "8086"
              vfID: 3
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.4
              vendor: "8086"
              vfID: 4
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.5
              vendor: "8086"
              vfID: 5
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.6
              vendor: "8086"
              vfID: 6
            - deviceID: 154c
              driver: vfio-pci
              pciAddress: 0000:3b:0a.7
              vendor: "8086"
              vfID: 7

  9. Vérifiez que le profil de performance du cluster est correct. Les sections cpu et hugepages varient en fonction de votre configuration matérielle. Exécutez la commande suivante :

    $ oc get PerformanceProfile openshift-node-performance-profile -o yaml

    Exemple de sortie

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      creationTimestamp: "2022-07-19T21:51:31Z"
      finalizers:
      - foreground-deletion
      generation: 1
      name: openshift-node-performance-profile
      resourceVersion: "33558"
      uid: 217958c0-9122-4c62-9d4d-fdc27c31118c
    spec:
      additionalKernelArgs:
      - idle=poll
      - rcupdate.rcu_normal_after_boot=0
      - efi=runtime
      cpu:
        isolated: 2-51,54-103
        reserved: 0-1,52-53
      hugepages:
        defaultHugepagesSize: 1G
        pages:
        - count: 32
          size: 1G
      machineConfigPoolSelector:
        pools.operator.machineconfiguration.openshift.io/master: ""
      net:
        userLevelNetworking: true
      nodeSelector:
        node-role.kubernetes.io/master: ""
      numa:
        topologyPolicy: restricted
      realTimeKernel:
        enabled: true
    status:
      conditions:
      - lastHeartbeatTime: "2022-07-19T21:51:31Z"
        lastTransitionTime: "2022-07-19T21:51:31Z"
        status: "True"
        type: Available
      - lastHeartbeatTime: "2022-07-19T21:51:31Z"
        lastTransitionTime: "2022-07-19T21:51:31Z"
        status: "True"
        type: Upgradeable
      - lastHeartbeatTime: "2022-07-19T21:51:31Z"
        lastTransitionTime: "2022-07-19T21:51:31Z"
        status: "False"
        type: Progressing
      - lastHeartbeatTime: "2022-07-19T21:51:31Z"
        lastTransitionTime: "2022-07-19T21:51:31Z"
        status: "False"
        type: Degraded
      runtimeClass: performance-openshift-node-performance-profile
      tuned: openshift-cluster-node-tuning-operator/openshift-node-performance-openshift-node-performance-profile

    Note

    Les paramètres du processeur dépendent du nombre de cœurs disponibles sur le serveur et doivent être alignés sur les paramètres de partitionnement de la charge de travail. La configuration de hugepages dépend du serveur et de l'application.

  10. Vérifiez que le site PerformanceProfile a été appliqué avec succès au cluster en exécutant la commande suivante :

    $ oc get performanceprofile openshift-node-performance-profile -o jsonpath="{range .status.conditions[*]}{ @.type }{' -- '}{@.status}{'\n'}{end}"

    Exemple de sortie

    Available -- True
    Upgradeable -- True
    Progressing -- False
    Degraded -- False

  11. Vérifiez les paramètres du correctif de performance Tuned en exécutant la commande suivante :

    $ oc get tuneds.tuned.openshift.io -n openshift-cluster-node-tuning-operator performance-patch -o yaml

    Exemple de sortie

    apiVersion: tuned.openshift.io/v1
    kind: Tuned
    metadata:
      creationTimestamp: "2022-07-18T10:33:52Z"
      generation: 1
      name: performance-patch
      namespace: openshift-cluster-node-tuning-operator
      resourceVersion: "34024"
      uid: f9799811-f744-4179-bf00-32d4436c08fd
    spec:
      profile:
      - data: |
          [main]
          summary=Configuration changes profile inherited from performance created tuned
          include=openshift-node-performance-openshift-node-performance-profile
          [bootloader]
          cmdline_crash=nohz_full=2-23,26-47 1
          [sysctl]
          kernel.timer_migration=1
          [scheduler]
          group.ice-ptp=0:f:10:*:ice-ptp.*
          [service]
          service.stalld=start,enable
          service.chronyd=stop,disable
        name: performance-patch
      recommend:
      - machineConfigLabels:
          machineconfiguration.openshift.io/role: master
        priority: 19
        profile: performance-patch

    1
    La liste des processeurs dans cmdline=nohz_full= variera en fonction de votre configuration matérielle.
  12. Vérifiez que les diagnostics de mise en réseau du cluster sont désactivés en exécutant la commande suivante :

    $ oc get networks.operator.openshift.io cluster -o jsonpath='{.spec.disableNetworkDiagnostics}'

    Exemple de sortie

    true

  13. Vérifiez que l'intervalle de maintenance de Kubelet est réglé sur un taux plus lent. Ce paramètre est défini dans la configuration de la machine containerMountNS. Exécutez la commande suivante :

    $ oc describe machineconfig container-mount-namespace-and-kubelet-conf-master | grep OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION

    Exemple de sortie

    Environment="OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION=60s"

  14. Vérifiez que Grafana et alertManagerMain sont désactivés et que la période de rétention de Prometheus est fixée à 24 heures en exécutant la commande suivante :

    $ oc get configmap cluster-monitoring-config -n openshift-monitoring -o jsonpath="{ .data.config\.yaml }"

    Exemple de sortie

    grafana:
      enabled: false
    alertmanagerMain:
      enabled: false
    prometheusK8s:
       retention: 24h

    1. Utilisez les commandes suivantes pour vérifier que les routes Grafana et alertManagerMain ne sont pas trouvées dans le cluster :

      $ oc get route -n openshift-monitoring alertmanager-main
      $ oc get route -n openshift-monitoring grafana

      Les deux requêtes devraient renvoyer des messages à l'adresse Error from server (NotFound).

  15. Vérifiez qu'il y a un minimum de 4 CPUs alloués comme reserved pour chacun des arguments de ligne de commande PerformanceProfile, Tuned performance-patch, workload partitioning, et kernel en exécutant la commande suivante :

    $ oc get performanceprofile -o jsonpath="{ .items[0].spec.cpu.reserved }"

    Exemple de sortie

    0-3

    Note

    En fonction de votre charge de travail, vous pouvez avoir besoin d'allouer des unités centrales réservées supplémentaires.

21.8. Configuration avancée des clusters gérés avec les ressources SiteConfig

Vous pouvez utiliser les ressources personnalisées (CR) de SiteConfig pour déployer des fonctionnalités et des configurations personnalisées dans vos clusters gérés au moment de l'installation.

21.8.1. Personnaliser les manifestes d'installation supplémentaires dans le pipeline ZTP GitOps

Vous pouvez définir un ensemble de manifestes supplémentaires à inclure dans la phase d'installation du pipeline GitOps ZTP (Zero Touch Provisioning). Ces manifestes sont liés aux ressources personnalisées (CR) de SiteConfig et sont appliqués au cluster lors de l'installation. L'inclusion de MachineConfig CRs au moment de l'installation rend le processus d'installation plus efficace.

Conditions préalables

  • Créez un dépôt Git où vous gérez les données de configuration de votre site personnalisé. Le dépôt doit être accessible depuis le cluster hub et être défini comme dépôt source pour l'application Argo CD.

Procédure

  1. Créer un ensemble de manifestes CR supplémentaires que le pipeline ZTP utilise pour personnaliser l'installation des clusters.
  2. Dans votre répertoire personnalisé /siteconfig, créez un dossier /extra-manifest pour vos manifestes supplémentaires. L'exemple suivant illustre un exemple de /siteconfig avec un dossier /extra-manifest:

    siteconfig
    ├── site1-sno-du.yaml
    ├── site2-standard-du.yaml
    └── extra-manifest
        └── 01-example-machine-config.yaml
  3. Ajoutez vos CR de manifestes supplémentaires personnalisés au répertoire siteconfig/extra-manifest.
  4. Dans votre CR SiteConfig, saisissez le nom du répertoire dans le champ extraManifestPath, par exemple :

    clusters:
    - clusterName: "example-sno"
      networkType: "OVNKubernetes"
      extraManifestPath: extra-manifest
  5. Sauvegardez les CRs SiteConfig et /extra-manifest et mettez-les dans le repo de configuration du site.

Le pipeline ZTP ajoute les CR du répertoire /extra-manifest à l'ensemble par défaut des manifestes supplémentaires lors du provisionnement de la grappe.

21.8.2. Filtrer les ressources personnalisées à l'aide des filtres SiteConfig

En utilisant des filtres, vous pouvez facilement personnaliser les ressources personnalisées (CR) de SiteConfig pour inclure ou exclure d'autres CR à utiliser dans la phase d'installation du pipeline GitOps de zero touch provisioning (ZTP).

Vous pouvez spécifier une valeur inclusionDefault de include ou exclude pour le CR SiteConfig, ainsi qu'une liste des CR RAN extraManifest spécifiques que vous souhaitez inclure ou exclure. En définissant inclusionDefault comme include, le pipeline ZTP applique tous les fichiers contenus dans /source-crs/extra-manifest pendant l'installation. Le réglage de inclusionDefault à exclude fait l'inverse.

Vous pouvez exclure des CR individuels du dossier /source-crs/extra-manifest qui sont autrement inclus par défaut. L'exemple suivant configure un CR personnalisé à nœud unique OpenShift SiteConfig pour exclure le CR /source-crs/extra-manifest/03-sctp-machine-config-worker.yaml au moment de l'installation.

D'autres scénarios de filtrage facultatifs sont également décrits.

Conditions préalables

  • Vous avez configuré le cluster du concentrateur pour générer les CR d'installation et de stratégie nécessaires.
  • Vous avez créé un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé. Le référentiel doit être accessible depuis le cluster hub et être défini comme référentiel source pour l'application Argo CD.

Procédure

  1. Pour empêcher le pipeline ZTP d'appliquer le fichier 03-sctp-machine-config-worker.yaml CR, appliquez le YAML suivant dans le SiteConfig CR :

    apiVersion: ran.openshift.io/v1
    kind: SiteConfig
    metadata:
      name: "site1-sno-du"
      namespace: "site1-sno-du"
    spec:
      baseDomain: "example.com"
      pullSecretRef:
        name: "assisted-deployment-pull-secret"
      clusterImageSetNameRef: "openshift-4.12"
      sshPublicKey: "<ssh_public_key>"
      clusters:
    - clusterName: "site1-sno-du"
      extraManifests:
        filter:
          exclude:
            - 03-sctp-machine-config-worker.yaml

    Le pipeline ZTP ne tient pas compte de la CR 03-sctp-machine-config-worker.yaml lors de l'installation. Tous les autres CR de /source-crs/extra-manifest sont appliqués.

  2. Enregistrez le CR SiteConfig et transférez les modifications dans le référentiel de configuration du site.

    Le pipeline ZTP surveille et ajuste les CR qu'il applique en fonction des instructions du filtre SiteConfig.

  3. Facultatif : Pour éviter que le pipeline ZTP n'applique toutes les CR /source-crs/extra-manifest pendant l'installation du cluster, appliquez le YAML suivant dans la CR SiteConfig:

    - clusterName: "site1-sno-du"
      extraManifests:
        filter:
          inclusionDefault: exclude
  4. Facultatif : Pour exclure tous les CR de /source-crs/extra-manifest RAN et inclure à la place un fichier CR personnalisé pendant l'installation, modifiez le CR personnalisé de SiteConfig pour définir le dossier des manifestes personnalisés et le fichier include, par exemple :

    clusters:
    - clusterName: "site1-sno-du"
      extraManifestPath: "<custom_manifest_folder>" 1
      extraManifests:
        filter:
          inclusionDefault: exclude  2
          include:
            - custom-sctp-machine-config-worker.yaml
    1
    Remplacez <custom_manifest_folder> par le nom du dossier qui contient les CR de l'installation personnalisée, par exemple, user-custom-manifest/.
    2
    Définissez inclusionDefault sur exclude pour éviter que le pipeline ZTP n'applique les fichiers contenus dans /source-crs/extra-manifest lors de l'installation.

    L'exemple suivant illustre la structure du dossier personnalisé :

    siteconfig
      ├── site1-sno-du.yaml
      └── user-custom-manifest
            └── custom-sctp-machine-config-worker.yaml

21.9. Configuration avancée des clusters gérés avec les ressources PolicyGenTemplate

Vous pouvez utiliser les CR PolicyGenTemplate pour déployer des fonctionnalités personnalisées dans vos clusters gérés.

21.9.1. Déploiement de modifications supplémentaires dans les clusters

Si vous souhaitez modifier la configuration du cluster en dehors de la configuration de base du pipeline ZTP de GitOps, trois options s'offrent à vous :

Appliquer la configuration supplémentaire une fois que le pipeline ZTP est terminé
Lorsque le déploiement du pipeline ZTP de GitOps est terminé, le cluster déployé est prêt pour les charges de travail des applications. À ce stade, vous pouvez installer des opérateurs supplémentaires et appliquer des configurations spécifiques à vos besoins. Assurez-vous que les configurations supplémentaires n'affectent pas négativement les performances de la plateforme ou le budget CPU alloué.
Ajouter du contenu à la bibliothèque ZTP
Les ressources personnalisées (CR) de base que vous déployez avec le pipeline ZTP de GitOps peuvent être complétées par du contenu personnalisé selon les besoins.
Créer des manifestes supplémentaires pour l'installation du cluster
Les manifestes supplémentaires sont appliqués pendant l'installation et rendent le processus d'installation plus efficace.
Important

Fournir des CR source supplémentaires ou modifier des CR source existants peut avoir un impact significatif sur la performance ou le profil CPU d'OpenShift Container Platform.

Ressources supplémentaires

21.9.2. Utilisation des CR PolicyGenTemplate pour remplacer le contenu des CR sources

PolicyGenTemplate les ressources personnalisées (CR) vous permettent de superposer des détails de configuration supplémentaires aux CR de base fournis avec le plugin GitOps dans le conteneur ztp-site-generate. Vous pouvez considérer les CR PolicyGenTemplate comme une fusion logique ou un correctif de la CR de base. Utilisez les CR PolicyGenTemplate pour mettre à jour un seul champ du CR de base, ou pour superposer l'ensemble du contenu du CR de base. Vous pouvez mettre à jour des valeurs et insérer des champs qui ne figurent pas dans le CR de base.

L'exemple de procédure suivant décrit comment mettre à jour les champs du CR PerformanceProfile généré pour la configuration de référence sur la base du CR PolicyGenTemplate dans le fichier group-du-sno-ranGen.yaml. Utilisez cette procédure comme base pour modifier d'autres parties de PolicyGenTemplate en fonction de vos besoins.

Conditions préalables

  • Créez un dépôt Git où vous gérez les données de configuration de votre site personnalisé. Le dépôt doit être accessible depuis le cluster hub et être défini comme dépôt source pour Argo CD.

Procédure

  1. Examinez le CR source de référence à la recherche de contenu existant. Vous pouvez examiner les CR source répertoriés dans la référence PolicyGenTemplate CR en les extrayant du conteneur ZTP (Zero Touch Provisioning).

    1. Créez un dossier /out:

      $ mkdir -p ./out
    2. Extraire les CR source :

      $ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 extract /home/ztp --tar | tar x -C ./out
  2. Examinez le document de référence PerformanceProfile CR à l'adresse ./out/source-crs/PerformanceProfile.yaml:

    apiVersion: performance.openshift.io/v2
    kind: PerformanceProfile
    metadata:
      name: $name
      annotations:
        ran.openshift.io/ztp-deploy-wave: "10"
    spec:
      additionalKernelArgs:
      - "idle=poll"
      - "rcupdate.rcu_normal_after_boot=0"
      cpu:
        isolated: $isolated
        reserved: $reserved
      hugepages:
        defaultHugepagesSize: $defaultHugepagesSize
        pages:
          - size: $size
            count: $count
            node: $node
      machineConfigPoolSelector:
        pools.operator.machineconfiguration.openshift.io/$mcp: ""
      net:
        userLevelNetworking: true
      nodeSelector:
        node-role.kubernetes.io/$mcp: ''
      numa:
        topologyPolicy: "restricted"
      realTimeKernel:
        enabled: true
    Note

    Tous les champs du CR source qui contiennent $…​ sont supprimés du CR généré s'ils ne sont pas fournis dans le CR PolicyGenTemplate.

  3. Mettez à jour l'entrée PolicyGenTemplate pour PerformanceProfile dans le fichier de référence group-du-sno-ranGen.yaml. L'exemple suivant de strophe PolicyGenTemplate CR fournit les spécifications appropriées de l'unité centrale, définit la configuration de hugepages et ajoute un nouveau champ qui définit globallyDisableIrqLoadBalancing comme faux.

    - fileName: PerformanceProfile.yaml
      policyName: "config-policy"
      metadata:
        name: openshift-node-performance-profile
      spec:
        cpu:
          # These must be tailored for the specific hardware platform
          isolated: "2-19,22-39"
          reserved: "0-1,20-21"
        hugepages:
          defaultHugepagesSize: 1G
          pages:
            - size: 1G
              count: 10
        globallyDisableIrqLoadBalancing: false
  4. Commencer le changement PolicyGenTemplate dans Git, puis pousser vers le dépôt Git surveillé par l'application GitOps ZTP argo CD.

Exemple de sortie

L'application ZTP génère une politique RHACM qui contient la CR PerformanceProfile générée. Le contenu de ce CR est obtenu en fusionnant les contenus metadata et spec de l'entrée PerformanceProfile dans le PolicyGenTemplate sur le CR source. Le CR résultant a le contenu suivant :

---
apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
    name: openshift-node-performance-profile
spec:
    additionalKernelArgs:
        - idle=poll
        - rcupdate.rcu_normal_after_boot=0
    cpu:
        isolated: 2-19,22-39
        reserved: 0-1,20-21
    globallyDisableIrqLoadBalancing: false
    hugepages:
        defaultHugepagesSize: 1G
        pages:
            - count: 10
              size: 1G
    machineConfigPoolSelector:
        pools.operator.machineconfiguration.openshift.io/master: ""
    net:
        userLevelNetworking: true
    nodeSelector:
        node-role.kubernetes.io/master: ""
    numa:
        topologyPolicy: restricted
    realTimeKernel:
        enabled: true
Note

Dans le dossier /source-crs que vous extrayez du conteneur ztp-site-generate, la syntaxe $ n'est pas utilisée pour la substitution de modèle comme le suggère la syntaxe. Au contraire, si l'outil policyGen voit le préfixe $ pour une chaîne et que vous ne spécifiez pas de valeur pour ce champ dans le CR PolicyGenTemplate correspondant, le champ est entièrement omis du CR de sortie.

Une exception à cette règle est la variable $mcp dans les fichiers YAML /source-crs, qui est remplacée par la valeur spécifiée pour mcp dans le CR PolicyGenTemplate. Par exemple, dans example/policygentemplates/group-du-standard-ranGen.yaml, la valeur de mcp est worker:

spec:
  bindingRules:
    group-du-standard: ""
  mcp: "worker"

L'outil policyGen remplace les instances de $mcp par worker dans les CR de sortie.

21.9.3. Ajouter un nouveau contenu au pipeline ZTP de GitOps

Les CR source du conteneur de générateur de site ZTP de GitOps fournissent un ensemble de fonctionnalités critiques et de paramètres de réglage des nœuds pour les applications d'unités distribuées (UD) du RAN. Ils sont appliqués aux clusters que vous déployez avec ZTP. Pour ajouter ou modifier des CR source existants dans le conteneur ztp-site-generate, reconstruisez le conteneur ztp-site-generate et mettez-le à la disposition du cluster concentrateur, généralement à partir du registre déconnecté associé au cluster concentrateur. Tout CR valide de OpenShift Container Platform peut être ajouté.

Suivez la procédure suivante pour ajouter un nouveau contenu au pipeline ZTP.

Procédure

  1. Créez un répertoire contenant un fichier Containerfile et les fichiers YAML du CR source que vous souhaitez inclure dans le conteneur ztp-site-generate mis à jour, par exemple :

    ztp-update/
    ├── example-cr1.yaml
    ├── example-cr2.yaml
    └── ztp-update.in
  2. Ajoutez le contenu suivant au fichier de conteneurs ztp-update.in:

    FROM registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12
    
    ADD example-cr2.yaml /kustomize/plugin/ran.openshift.io/v1/policygentemplate/source-crs/
    ADD example-cr1.yaml /kustomize/plugin/ran.openshift.io/v1/policygentemplate/source-crs/
  3. Ouvrez un terminal dans le dossier ztp-update/ et reconstruisez le conteneur :

    $ podman build -t ztp-site-generate-rhel8-custom:v4.12-custom-1
  4. Pousser l'image du conteneur construit vers votre registre déconnecté, par exemple :

    $ podman push localhost/ztp-site-generate-rhel8-custom:v4.12-custom-1 registry.example.com:5000/ztp-site-generate-rhel8-custom:v4.12-custom-1
  5. Patch de l'instance Argo CD sur le cluster hub pour pointer vers l'image de conteneur nouvellement construite :

    $ oc patch -n openshift-gitops argocd openshift-gitops --type=json -p '[{"op": "replace", "path":"/spec/repo/initContainers/0/image", "value": "registry.example.com:5000/ztp-site-generate-rhel8-custom:v4.12-custom-1"} ]'

    Lorsque l'instance Argo CD est corrigée, le pod openshift-gitops-repo-server redémarre automatiquement.

Vérification

  1. Vérifiez que le nouveau pod openshift-gitops-repo-server a terminé son initialisation et que le pod repo précédent est terminé :

    $ oc get pods -n openshift-gitops | grep openshift-gitops-repo-server

    Exemple de sortie

    openshift-gitops-server-7df86f9774-db682          1/1     Running   	     1          28s

    Vous devez attendre que le nouveau pod openshift-gitops-repo-server ait terminé son initialisation et que le pod précédent soit terminé pour que le contenu de l'image de conteneur nouvellement ajoutée soit disponible.

Ressources supplémentaires

  • Alternativement, vous pouvez patcher l'instance ArgoCD comme décrit dans Configuration du cluster hub avec ArgoCD en modifiant argocd-openshift-gitops-patch.json avec une image initContainer mise à jour avant d'appliquer le fichier patch.

21.9.4. Configuration des délais d'évaluation de la conformité des politiques pour les CR PolicyGenTemplate

Utilisez Red Hat Advanced Cluster Management (RHACM) installé sur un cluster hub pour surveiller et signaler si vos clusters gérés sont conformes aux stratégies appliquées. RHACM utilise des modèles de politiques pour appliquer des contrôleurs de politiques et des politiques prédéfinis. Les contrôleurs de politiques sont des instances de définition de ressources personnalisées (CRD) Kubernetes.

Vous pouvez remplacer les intervalles d'évaluation des politiques par défaut par des ressources personnalisées (CR) sur le site PolicyGenTemplate. Vous configurez les paramètres de durée qui définissent combien de temps une CR ConfigurationPolicy peut rester dans un état de conformité ou de non-conformité à la politique avant que RHACM ne réévalue les politiques de cluster appliquées.

Le générateur de politiques ZTP (zero touch provisioning) génère des politiques CR ConfigurationPolicy avec des intervalles d'évaluation prédéfinis. La valeur par défaut de l'état noncompliant est de 10 secondes. La valeur par défaut de l'état compliant est de 10 minutes. Pour désactiver l'intervalle d'évaluation, définissez la valeur sur never.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez créé un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé.

Procédure

  1. Pour configurer l'intervalle d'évaluation de toutes les politiques dans une CR PolicyGenTemplate, ajoutez evaluationInterval au champ spec, puis définissez les valeurs compliant et noncompliant appropriées. Par exemple :

    spec:
      evaluationInterval:
        compliant: 30m
        noncompliant: 20s
  2. Pour configurer l'intervalle d'évaluation de l'objet spec.sourceFiles dans un CR PolicyGenTemplate, ajoutez evaluationInterval au champ sourceFiles, par exemple :

    spec:
      sourceFiles:
       - fileName: SriovSubscription.yaml
         policyName: "sriov-sub-policy"
         evaluationInterval:
           compliant: never
           noncompliant: 10s
  3. Commencez les fichiers PolicyGenTemplate CRs dans le dépôt Git et apportez vos modifications.

Vérification

Vérifiez que les stratégies des clusters de rayons gérés sont contrôlées aux intervalles prévus.

  1. Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin sur le cluster géré.
  2. Obtenez les pods qui sont en cours d'exécution dans l'espace de noms open-cluster-management-agent-addon. Exécutez la commande suivante :

    $ oc get pods -n open-cluster-management-agent-addon

    Exemple de sortie

    NAME                                         READY   STATUS    RESTARTS        AGE
    config-policy-controller-858b894c68-v4xdb    1/1     Running   22 (5d8h ago)   10d

  3. Vérifiez que les politiques appliquées sont évaluées à l'intervalle prévu dans les journaux du pod config-policy-controller:

    $ oc logs -n open-cluster-management-agent-addon config-policy-controller-858b894c68-v4xdb

    Exemple de sortie

    2022-05-10T15:10:25.280Z       info   configuration-policy-controller controllers/configurationpolicy_controller.go:166      Skipping the policy evaluation due to the policy not reaching the evaluation interval  {"policy": "compute-1-config-policy-config"}
    2022-05-10T15:10:25.280Z       info   configuration-policy-controller controllers/configurationpolicy_controller.go:166      Skipping the policy evaluation due to the policy not reaching the evaluation interval  {"policy": "compute-1-common-compute-1-catalog-policy-config"}

21.9.5. Signalisation de l'achèvement du déploiement d'un cluster ZTP avec des politiques d'information du validateur

Créez une politique d'information du validateur qui signale la fin de l'installation et de la configuration du cluster déployé dans le cadre du Zero Touch Provisioning (ZTP). Cette politique peut être utilisée pour les déploiements de clusters OpenShift à un nœud, de clusters à trois nœuds et de clusters standard.

Procédure

  1. Créez une ressource personnalisée (CR) autonome PolicyGenTemplate qui contient le fichier source validatorCRs/informDuValidator.yaml. Vous n'avez besoin que d'une CR PolicyGenTemplate autonome pour chaque type de cluster. Par exemple, cette CR applique une politique d'information du validateur pour les clusters OpenShift à nœud unique :

    Exemple de politique d'information de validateur de cluster à nœud unique CR (group-du-sno-validator-ranGen.yaml)

    apiVersion: ran.openshift.io/v1
    kind: PolicyGenTemplate
    metadata:
      name: "group-du-sno-validator" 1
      namespace: "ztp-group" 2
    spec:
      bindingRules:
        group-du-sno: "" 3
      bindingExcludedRules:
        ztp-done: "" 4
      mcp: "master" 5
      sourceFiles:
        - fileName: validatorCRs/informDuValidator.yaml
          remediationAction: inform 6
          policyName: "du-policy" 7

    1
    Le nom de l'objet PolicyGenTemplates. Ce nom est également utilisé dans les noms des objets placementBinding, placementRule, et policy qui sont créés dans l'objet namespace.
    2
    Cette valeur doit correspondre à celle de namespace utilisée dans le groupe PolicyGenTemplates.
    3
    L'étiquette group-du-* définie dans bindingRules doit exister dans les fichiers SiteConfig.
    4
    Le label défini dans bindingExcludedRules doit être "ztp-done:`". Le label ztp-done est utilisé en coordination avec le Topology Aware Lifecycle Manager.
    5
    mcp définit l'objet MachineConfigPool utilisé dans le fichier source validatorCRs/informDuValidator.yaml. Il doit s'agir de master pour les déploiements de clusters à un ou trois nœuds et de worker pour les déploiements de clusters standard.
    6
    Facultatif. La valeur par défaut est inform.
    7
    Cette valeur fait partie du nom de la stratégie RHACM générée. La stratégie de validation générée pour l'exemple d'un seul nœud est group-du-sno-validator-du-policy.
  2. Commencez le fichier PolicyGenTemplate CR dans votre dépôt Git et transférez les modifications.

Ressources supplémentaires

21.9.6. Configuration des événements rapides PTP à l'aide des CR PolicyGenTemplate

Vous pouvez configurer les événements rapides PTP pour les clusters vRAN qui sont déployés à l'aide du pipeline GitOps Zero Touch Provisioning (ZTP). Utilisez les ressources personnalisées (CR) de PolicyGenTemplate comme base pour créer une hiérarchie de fichiers de configuration adaptés aux exigences spécifiques de votre site.

Conditions préalables

  • Créez un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé.

Procédure

  1. Ajoutez le YAML suivant à .spec.sourceFiles dans le fichier common-ranGen.yaml pour configurer l'opérateur AMQP :

    #AMQ interconnect operator for fast events
    - fileName: AmqSubscriptionNS.yaml
      policyName: "subscriptions-policy"
    - fileName: AmqSubscriptionOperGroup.yaml
      policyName: "subscriptions-policy"
    - fileName: AmqSubscription.yaml
      policyName: "subscriptions-policy"
  2. Appliquez les modifications suivantes à PolicyGenTemplate aux fichiers group-du-3node-ranGen.yaml, group-du-sno-ranGen.yaml ou group-du-standard-ranGen.yaml en fonction de vos besoins :

    1. Dans .sourceFiles, ajoutez le fichier PtpOperatorConfig CR qui configure l'hôte de transport AMQ à config-policy:

      - fileName: PtpOperatorConfigForEvent.yaml
        policyName: "config-policy"
    2. Configurez les pages linuxptp et phc2sys pour le type d'horloge PTP et l'interface. Par exemple, ajoutez la strophe suivante à .sourceFiles:

      - fileName: PtpConfigSlave.yaml 1
        policyName: "config-policy"
        metadata:
          name: "du-ptp-slave"
        spec:
          profile:
          - name: "slave"
            interface: "ens5f1" 2
            ptp4lOpts: "-2 -s --summary_interval -4" 3
            phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 4
          ptpClockThreshold: 5
            holdOverTimeout: 30 #secs
            maxOffsetThreshold: 100  #nano secs
            minOffsetThreshold: -100 #nano secs
      1
      Il peut s'agir de PtpConfigMaster.yaml, PtpConfigSlave.yaml, ou PtpConfigSlaveCvl.yaml en fonction de vos besoins. PtpConfigSlaveCvl.yaml configure les services linuxptp pour un NIC Intel E810 Columbiaville. Pour les configurations basées sur group-du-sno-ranGen.yaml ou group-du-3node-ranGen.yaml, utilisez PtpConfigSlave.yaml.
      2
      Nom de l'interface spécifique au dispositif.
      3
      Vous devez ajouter la valeur --summary_interval -4 à ptp4lOpts dans .spec.sourceFiles.spec.profile pour activer les événements rapides PTP.
      4
      Valeurs requises phc2sysOpts. -m imprime des messages à stdout. linuxptp-daemon DaemonSet analyse les journaux et génère des métriques Prometheus.
      5
      Facultatif. Si la strophe ptpClockThreshold n'est pas présente, des valeurs par défaut sont utilisées pour les champs ptpClockThreshold. La strophe indique les valeurs par défaut de ptpClockThreshold. Les valeurs de ptpClockThreshold configurent le délai de déclenchement des événements PTP après la déconnexion de l'horloge maître PTP. holdOverTimeout est la valeur de temps en secondes avant que l'état de l'événement de l'horloge PTP ne passe à FREERUN lorsque l'horloge maître PTP est déconnectée. Les paramètres maxOffsetThreshold et minOffsetThreshold configurent des valeurs de décalage en nanosecondes qui se comparent aux valeurs de CLOCK_REALTIME (phc2sys) ou au décalage du maître (ptp4l). Lorsque la valeur de décalage ptp4l ou phc2sys est en dehors de cette plage, l'état de l'horloge PTP est réglé sur FREERUN. Lorsque la valeur de décalage est comprise dans cette plage, l'état de l'horloge PTP est réglé sur LOCKED.
  3. Appliquez les modifications suivantes PolicyGenTemplate aux fichiers YAML de votre site, par exemple example-sno-site.yaml:

    1. Dans .sourceFiles, ajoutez le fichier Interconnect CR qui configure le routeur AMQ à config-policy:

      - fileName: AmqInstance.yaml
        policyName: "config-policy"
  4. Fusionnez tous les autres changements et fichiers nécessaires avec votre référentiel de site personnalisé.
  5. Transférez les modifications dans le référentiel de configuration de votre site pour déployer les événements rapides PTP sur de nouveaux sites à l'aide de GitOps ZTP.

Ressources supplémentaires

21.9.7. Configuration de l'opérateur de registre d'images pour la mise en cache locale des images

OpenShift Container Platform gère la mise en cache des images à l'aide d'un registre local. Dans les cas d'utilisation de l'edge computing, les clusters sont souvent soumis à des restrictions de bande passante lorsqu'ils communiquent avec des registres d'images centralisés, ce qui peut entraîner de longs temps de téléchargement des images.

De longs temps de téléchargement sont inévitables lors du déploiement initial. Avec le temps, CRI-O risque d'effacer le répertoire /var/lib/containers/storage en cas d'arrêt inattendu. Pour remédier aux longs temps de téléchargement des images, vous pouvez créer un registre d'images local sur les clusters gérés à distance à l'aide de GitOps ZTP. Cette solution est utile dans les scénarios d'Edge computing où les clusters sont déployés à la périphérie du réseau.

Avant de pouvoir configurer le registre d'images local avec GitOps ZTP, vous devez configurer le partitionnement des disques dans le CR SiteConfig que vous utilisez pour installer le cluster géré à distance. Après l'installation, vous configurez le registre d'images local à l'aide d'un CR PolicyGenTemplate. Ensuite, le pipeline ZTP crée des CR de volume persistant (PV) et de revendication de volume persistant (PVC) et corrige la configuration imageregistry.

Note

Le registre d'images local ne peut être utilisé que pour les images d'applications utilisateur et ne peut pas être utilisé pour les images d'opérateurs OpenShift Container Platform ou Operator Lifecycle Manager.

Ressources supplémentaires

21.9.8. Configuration des événements bare-metal avec les CR PolicyGenTemplate

21.9.8.1. Configurer le partitionnement des disques avec SiteConfig

Configurer le partitionnement du disque pour un cluster géré à l'aide d'un CR SiteConfig et du ZTP GitOps. Les détails de la partition du disque dans le CR SiteConfig doivent correspondre au disque sous-jacent.

Note

Utilisez des noms persistants pour les périphériques afin d'éviter que les noms de périphériques tels que /dev/sda et /dev/sdb ne soient échangés à chaque redémarrage. Vous pouvez utiliser rootDeviceHints pour choisir le périphérique de démarrage et utiliser ensuite le même périphérique pour d'autres partitionnements.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez créé un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé pour l'utiliser avec GitOps Zero Touch Provisioning (ZTP).

Procédure

  1. Ajoutez le fichier YAML suivant, qui décrit le partitionnement du disque hôte, au fichier SiteConfig CR que vous utilisez pour installer le cluster géré :

    nodes:
        rootDeviceHints:
          wwn: "0x62cea7f05c98c2002708a0a22ff480ea"
        diskPartition:
          - device: /dev/disk/by-id/wwn-0x62cea7f05c98c2002708a0a22ff480ea 1
            partitions:
              - mount_point: /var/imageregistry
                size: 102500 2
                start: 344844 3
    1
    Ce paramètre dépend du matériel. Il peut s'agir d'un numéro de série ou d'un nom d'appareil. La valeur doit correspondre à la valeur définie pour rootDeviceHints.
    2
    La valeur minimale pour size est de 102500 MiB.
    3
    La valeur minimale pour start est de 25000 MiB. La valeur totale de size et start ne doit pas dépasser la taille du disque, sinon l'installation échouera.
  2. Sauvegardez le CR SiteConfig et mettez-le dans le répertoire de configuration du site.

Le pipeline ZTP approvisionne le cluster à l'aide de SiteConfig CR et configure la partition du disque.

21.9.8.2. Configuration du registre d'images à l'aide des CR PolicyGenTemplate

Utilisez les CR PolicyGenTemplate (PGT) pour appliquer les CR nécessaires à la configuration du registre d'images et à la correction de la configuration imageregistry.

Conditions préalables

  • Vous avez configuré une partition de disque dans le cluster géré.
  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez créé un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé pour l'utiliser avec GitOps Zero Touch Provisioning (ZTP).

Procédure

  1. Configurez la classe de stockage, la revendication de volume persistant, le volume persistant et la configuration du registre d'images dans le CR PolicyGenTemplate approprié. Par exemple, pour configurer un site individuel, ajoutez le fichier YAML suivant au fichier example-sno-site.yaml:

    sourceFiles:
      # storage class
      - fileName: StorageClass.yaml
        policyName: "sc-for-image-registry"
        metadata:
          name: image-registry-sc
          annotations:
            ran.openshift.io/ztp-deploy-wave: "100" 1
      # persistent volume claim
      - fileName: StoragePVC.yaml
        policyName: "pvc-for-image-registry"
        metadata:
          name: image-registry-pvc
          namespace: openshift-image-registry
          annotations:
            ran.openshift.io/ztp-deploy-wave: "100"
        spec:
          accessModes:
            - ReadWriteMany
          resources:
            requests:
              storage: 100Gi
          storageClassName: image-registry-sc
          volumeMode: Filesystem
      # persistent volume
      - fileName: ImageRegistryPV.yaml 2
        policyName: "pv-for-image-registry"
        metadata:
          annotations:
            ran.openshift.io/ztp-deploy-wave: "100"
      - fileName: ImageRegistryConfig.yaml
        policyName: "config-for-image-registry"
        complianceType: musthave
        metadata:
          annotations:
            ran.openshift.io/ztp-deploy-wave: "100"
        spec:
          storage:
            pvc:
              claim: "image-registry-pvc"
    1
    Définissez la valeur appropriée pour ztp-deploy-wave selon que vous configurez les registres d'images au niveau du site, du commun ou du groupe. ztp-deploy-wave: "100" convient au développement ou aux tests car il vous permet de regrouper les fichiers source référencés.
    2
    Dans ImageRegistryPV.yaml, assurez-vous que le champ spec.local.path est défini à /var/imageregistry pour correspondre à la valeur définie pour le champ mount_point dans le CR SiteConfig.
    Important

    Ne définissez pas complianceType: mustonlyhave pour la configuration - fileName: ImageRegistryConfig.yaml. Cela peut faire échouer le déploiement du pod de registre.

  2. Commencer le changement PolicyGenTemplate dans Git, puis pousser vers le dépôt Git surveillé par l'application GitOps ZTP ArgoCD.

Vérification

Suivez les étapes suivantes pour résoudre les erreurs du registre d'images local sur les clusters gérés :

  • Vérifiez que la connexion au registre est réussie lorsque vous êtes connecté au cluster géré. Exécutez les commandes suivantes :

    1. Exporter le nom du cluster géré :

      $ cluster=<nom_du_cluster_géré>
    2. Obtenir les détails du cluster géré kubeconfig:

      $ oc get secret -n $cluster $cluster-admin-password -o jsonpath='{.data.password}' | base64 -d > kubeadmin-password-$cluster
    3. Télécharger et exporter le cluster kubeconfig:

      $ oc get secret -n $cluster $cluster-admin-kubeconfig -o jsonpath='{.data.kubeconfig}' | base64 -d > kubeconfig-$cluster && export KUBECONFIG=./kubeconfig-$cluster
    4. Vérifiez l'accès au registre d'images à partir du cluster géré. Voir "Accès au registre".
  • Vérifiez que le CRD Config de l'instance du groupe imageregistry.operator.openshift.io ne signale pas d'erreurs. Exécutez la commande suivante en vous connectant au cluster géré :

    $ oc get image.config.openshift.io cluster -o yaml

    Exemple de sortie

    apiVersion: config.openshift.io/v1
    kind: Image
    metadata:
      annotations:
        include.release.openshift.io/ibm-cloud-managed: "true"
        include.release.openshift.io/self-managed-high-availability: "true"
        include.release.openshift.io/single-node-developer: "true"
        release.openshift.io/create-only: "true"
      creationTimestamp: "2021-10-08T19:02:39Z"
      generation: 5
      name: cluster
      resourceVersion: "688678648"
      uid: 0406521b-39c0-4cda-ba75-873697da75a4
    spec:
      additionalTrustedCA:
        name: acm-ice

  • Vérifiez que le site PersistentVolumeClaim du cluster géré contient des données. Exécutez la commande suivante en vous connectant au cluster géré :

    $ oc get pv image-registry-sc
  • Vérifiez que le pod registry* est en cours d'exécution et qu'il se trouve dans l'espace de noms openshift-image-registry.

    $ oc get pods -n openshift-image-registry | grep registry*

    Exemple de sortie

    cluster-image-registry-operator-68f5c9c589-42cfg   1/1     Running     0          8d
    image-registry-5f8987879-6nx6h                     1/1     Running     0          8d

  • Vérifiez que la partition du disque sur le cluster géré est correcte :

    1. Ouvrez un shell de débogage sur le cluster géré :

      $ oc debug node/sno-1.example.com
    2. Exécutez lsblk pour vérifier les partitions du disque hôte :

      sh-4.4# lsblk
      NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
      sda      8:0    0 446.6G  0 disk
        |-sda1   8:1    0     1M  0 part
        |-sda2   8:2    0   127M  0 part
        |-sda3   8:3    0   384M  0 part /boot
        |-sda4   8:4    0 336.3G  0 part /sysroot
        `-sda5   8:5    0 100.1G  0 part /var/imageregistry 1
      sdb      8:16   0 446.6G  0 disk
      sr0     11:0    1   104M  0 rom
      1
      /var/imageregistry indique que le disque est correctement partitionné.

Ressources supplémentaires

21.9.9. Configuration de la surveillance des événements sur le système nu à l'aide des CR PolicyGenTemplate

Vous pouvez configurer des événements matériels bare-metal pour les clusters vRAN qui sont déployés à l'aide du pipeline Zero Touch Provisioning (ZTP) de GitOps.

Conditions préalables

  • Installez le CLI OpenShift (oc).
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Créez un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé.

Procédure

  1. Pour configurer l'opérateur d'interconnexion AMQ et l'opérateur de relais d'événements Bare Metal, ajoutez le fichier YAML suivant à spec.sourceFiles dans le fichier common-ranGen.yaml:

    # AMQ interconnect operator for fast events
    - fileName: AmqSubscriptionNS.yaml
      policyName: "subscriptions-policy"
    - fileName: AmqSubscriptionOperGroup.yaml
      policyName: "subscriptions-policy"
    - fileName: AmqSubscription.yaml
      policyName: "subscriptions-policy"
    # Bare Metal Event Rely operator
    - fileName: BareMetalEventRelaySubscriptionNS.yaml
      policyName: "subscriptions-policy"
    - fileName: BareMetalEventRelaySubscriptionOperGroup.yaml
      policyName: "subscriptions-policy"
    - fileName: BareMetalEventRelaySubscription.yaml
      policyName: "subscriptions-policy"
  2. Ajoutez le CR Interconnect à .spec.sourceFiles dans le fichier de configuration du site, par exemple le fichier example-sno-site.yaml:

    - fileName: AmqInstance.yaml
      policyName: "config-policy"
  3. Ajoutez le CR HardwareEvent à spec.sourceFiles dans votre fichier de configuration de groupe spécifique, par exemple dans le fichier group-du-sno-ranGen.yaml:

    - fileName: HardwareEvent.yaml
      policyName: "config-policy"
      spec:
        nodeSelector: {}
        transportHost: "amqp://<amq_interconnect_name>.<amq_interconnect_namespace>.svc.cluster.local" 1
        logLevel: "info"
    1
    L'URL transportHost est composée des CR AMQ Interconnect existants name et namespace. Par exemple, dans transportHost: "amqp://amq-router.amq-router.svc.cluster.local", les AMQ Interconnect name et namespace sont tous deux définis sur amq-router.
    Note

    Chaque contrôleur de gestion de carte de base (BMC) ne nécessite qu'une seule ressource HardwareEvent.

  4. Validez le changement PolicyGenTemplate dans Git, puis transférez les changements dans le référentiel de configuration de votre site pour déployer la surveillance des événements sur de nouveaux sites à l'aide du protocole ZTP de GitOps.
  5. Créez le Secret Redfish en exécutant la commande suivante :

    $ oc -n openshift-bare-metal-events create secret generic redfish-basic-auth \
    --from-literal=username=<bmc_username> --from-literal=password=<bmc_password> \
    --from-literal=hostaddr="<bmc_host_ip_addr>"

Ressources supplémentaires

Ressources supplémentaires

21.9.10. Utilisation de modèles de concentrateurs dans les CR PolicyGenTemplate

Topology Aware Lifecycle Manager prend en charge les fonctions partielles du modèle de cluster de hub de Red Hat Advanced Cluster Management (RHACM) dans les politiques de configuration utilisées avec GitOps ZTP.

Les modèles de grappes côté hub vous permettent de définir des politiques de configuration qui peuvent être dynamiquement adaptées aux grappes cibles. Il n'est donc pas nécessaire de créer des politiques distinctes pour de nombreux clusters ayant des configurations similaires mais des valeurs différentes.

Important

Les modèles de politique sont limités au même espace de noms que celui dans lequel la politique est définie. Cela signifie que vous devez créer les objets référencés dans le modèle de hub dans le même espace de noms que celui où la politique est créée.

Les fonctions de modèle de concentrateur suivantes sont disponibles pour une utilisation dans GitOps ZTP avec TALM :

  • fromConfigmap renvoie la valeur de la clé de données fournie dans la ressource nommée ConfigMap.

    Note

    La taille des CR ConfigMap est limitée à 1 MiB. La taille effective des CR ConfigMap est encore limitée par l'annotation last-applied-configuration. Pour éviter la limite de last-applied-configuration, ajoutez l'annotation suivante au modèle ConfigMap:

    argocd.argoproj.io/sync-options: Replace=true
  • base64enc renvoie la valeur encodée en base64 de la chaîne d'entrée
  • base64dec renvoie la valeur décodée de la chaîne d'entrée encodée en base64
  • indent renvoie la chaîne d'entrée avec les espaces d'indentation ajoutés
  • autoindent renvoie la chaîne d'entrée avec des espaces d'indentation ajoutés en fonction de l'espacement utilisé dans le modèle parent
  • toInt convertit et renvoie la valeur entière de la valeur d'entrée
  • toBool convertit la chaîne d'entrée en une valeur booléenne et renvoie la valeur booléenne

Diverses fonctions de la communauté Open source sont également disponibles pour une utilisation avec GitOps ZTP.

21.9.10.1. Exemples de modèles de concentrateurs

Les exemples de code suivants sont des modèles de concentrateur valides. Chacun de ces modèles renvoie des valeurs provenant du CR ConfigMap portant le nom test-config dans l'espace de noms default.

  • Renvoie la valeur avec la clé common-key:

    {{hub fromConfigMap "default" "test-config" "common-key" hub}}
  • Renvoie une chaîne en utilisant la valeur concaténée du champ .ManagedClusterName et la chaîne -name:

    {{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) hub}}
  • Crée et renvoie une valeur booléenne à partir de la valeur concaténée du champ .ManagedClusterName et de la chaîne de caractères -name:

    {{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) | toBool hub}}
  • Crée et renvoie une valeur entière à partir de la valeur concaténée du champ .ManagedClusterName et de la chaîne de caractères -name:

    {{hub (printf "%s-name" .ManagedClusterName) | fromConfigMap "default" "test-config" | toInt hub}}

21.9.10.2. Spécification des cartes réseau de l'hôte dans les CR de PolicyGenTemplate de site avec des modèles de cluster de concentrateurs

Vous pouvez gérer les NIC des hôtes dans un seul CR ConfigMap et utiliser les modèles de cluster de hub pour remplir les valeurs NIC personnalisées dans les polices générées qui sont appliquées aux hôtes du cluster. L'utilisation de modèles de cluster de concentrateurs dans les CR PolicyGenTemplate (PGT) signifie qu'il n'est pas nécessaire de créer plusieurs CR PGT pour chaque site.

L'exemple suivant vous montre comment utiliser un seul CR ConfigMap pour gérer les NIC des hôtes du cluster et les appliquer au cluster en tant que polices en utilisant un seul CR de site PolicyGenTemplate.

Note

Lorsque vous utilisez la fonction fromConfigmap, la variable printf n'est disponible que pour les champs clés de la ressource modèle data. Vous ne pouvez pas l'utiliser pour les champs name et namespace.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez créé un dépôt Git dans lequel vous gérez les données de configuration de votre site personnalisé. Le dépôt doit être accessible depuis le cluster hub et être défini comme dépôt source pour l'application GitOps ZTP ArgoCD.

Procédure

  1. Créez une ressource ConfigMap qui décrit les cartes réseau d'un groupe d'hôtes. Par exemple :

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: sriovdata
      namespace: ztp-site
      annotations:
        argocd.argoproj.io/sync-options: Replace=true 1
    data:
      example-sno-du_fh-numVfs: "8"
      example-sno-du_fh-pf: ens1f0
      example-sno-du_fh-priority: "10"
      example-sno-du_fh-vlan: "140"
      example-sno-du_mh-numVfs: "8"
      example-sno-du_mh-pf: ens3f0
      example-sno-du_mh-priority: "10"
      example-sno-du_mh-vlan: "150"
    1
    L'annotation argocd.argoproj.io/sync-options n'est requise que si le site ConfigMap a une taille supérieure à 1 Mio.
    Note

    Le site ConfigMap doit se trouver dans le même espace de noms que la politique pour laquelle la substitution du modèle de concentrateur a été effectuée.

  2. Commencer le CR ConfigMap dans Git, puis le pousser vers le dépôt Git contrôlé par l'application Argo CD.
  3. Créez une PGT CR de site qui utilise des modèles pour extraire les données requises de l'objet ConfigMap. En voici un exemple :

    apiVersion: ran.openshift.io/v1
    kind: PolicyGenTemplate
    metadata:
      name: "site"
      namespace: "ztp-site"
    spec:
      remediationAction: inform
      bindingRules:
        group-du-sno: ""
      mcp: "master"
      sourceFiles:
        - fileName: SriovNetwork.yaml
          policyName: "config-policy"
          metadata:
            name: "sriov-nw-du-fh"
          spec:
            resourceName: du_fh
            vlan: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-vlan" .ManagedClusterName) | toInt hub}}'
        - fileName: SriovNetworkNodePolicy.yaml
          policyName: "config-policy"
          metadata:
            name: "sriov-nnp-du-fh"
          spec:
            deviceType: netdevice
            isRdma: true
            nicSelector:
              pfNames:
              - '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-pf" .ManagedClusterName) | autoindent hub}}'
            numVfs: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-numVfs" .ManagedClusterName) | toInt hub}}'
            priority: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-priority" .ManagedClusterName) | toInt hub}}'
            resourceName: du_fh
        - fileName: SriovNetwork.yaml
          policyName: "config-policy"
          metadata:
            name: "sriov-nw-du-mh"
          spec:
            resourceName: du_mh
            vlan: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-vlan" .ManagedClusterName) | toInt hub}}'
        - fileName: SriovNetworkNodePolicy.yaml
          policyName: "config-policy"
          metadata:
            name: "sriov-nnp-du-mh"
          spec:
            deviceType: vfio-pci
            isRdma: false
            nicSelector:
              pfNames:
              - '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-pf" .ManagedClusterName)  hub}}'
            numVfs: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-numVfs" .ManagedClusterName) | toInt hub}}'
            priority: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-priority" .ManagedClusterName) | toInt hub}}'
            resourceName: du_mh
  4. Commencer le site PolicyGenTemplate CR dans Git et le pousser vers le dépôt Git qui est surveillé par l'application ArgoCD.

    Note

    Les modifications ultérieures apportées à la CR ConfigMap référencée ne sont pas automatiquement synchronisées avec les politiques appliquées. Vous devez synchroniser manuellement les nouvelles modifications de ConfigMap pour mettre à jour les PolicyGenTemplate CR existants. Voir "Synchronisation des nouvelles modifications du ConfigMap avec les CR PolicyGenTemplate existantes".

21.9.10.3. Spécification des ID de VLAN dans les CR de groupe PolicyGenTemplate avec les modèles de cluster de hub

Vous pouvez gérer les ID de VLAN pour les clusters gérés dans un seul ConfigMap CR et utiliser les modèles de cluster de hub pour remplir les ID de VLAN dans les polices générées qui sont appliquées aux clusters.

L'exemple suivant montre comment gérer les ID VLAN dans un seul ConfigMap CR et les appliquer dans des polices de cluster individuelles en utilisant un seul PolicyGenTemplate group CR.

Note

Lorsque vous utilisez la fonction fromConfigmap, la variable printf n'est disponible que pour les champs clés de la ressource modèle data. Vous ne pouvez pas l'utiliser pour les champs name et namespace.

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez créé un dépôt Git où vous gérez les données de configuration de votre site personnalisé. Le dépôt doit être accessible depuis le cluster hub et être défini comme dépôt source pour l'application Argo CD.

Procédure

  1. Créez un CR ConfigMap qui décrit les ID VLAN pour un groupe d'hôtes du cluster. Par exemple :

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: site-data
      namespace: ztp-group
      annotations:
        argocd.argoproj.io/sync-options: Replace=true 1
    data:
      site-1-vlan: "101"
      site-2-vlan: "234"
    1
    L'annotation argocd.argoproj.io/sync-options n'est requise que si le site ConfigMap a une taille supérieure à 1 Mio.
    Note

    Le site ConfigMap doit se trouver dans le même espace de noms que la politique pour laquelle la substitution du modèle de concentrateur a été effectuée.

  2. Commencer le CR ConfigMap dans Git, puis le pousser vers le dépôt Git contrôlé par l'application Argo CD.
  3. Créez un groupe PGT CR qui utilise un modèle de concentrateur pour extraire les ID VLAN requis de l'objet ConfigMap. Par exemple, ajoutez l'extrait YAML suivant au groupe PGT CR :

    - fileName: SriovNetwork.yaml
        policyName: "config-policy"
        metadata:
          name: "sriov-nw-du-mh"
          annotations:
            ran.openshift.io/ztp-deploy-wave: "10"
        spec:
          resourceName: du_mh
          vlan: '{{hub fromConfigMap "" "site-data" (printf "%s-vlan" .ManagedClusterName) | toInt hub}}'
  4. Commencer le groupe PolicyGenTemplate CR dans Git, puis pousser vers le dépôt Git surveillé par l'application Argo CD.

    Note

    Les modifications ultérieures apportées à la CR ConfigMap référencée ne sont pas automatiquement synchronisées avec les politiques appliquées. Vous devez synchroniser manuellement les nouvelles modifications de ConfigMap pour mettre à jour les PolicyGenTemplate CR existants. Voir "Synchronisation des nouvelles modifications du ConfigMap avec les CR PolicyGenTemplate existantes".

21.9.10.4. Synchronisation des nouveaux changements de ConfigMap avec les CR de PolicyGenTemplate existants

Conditions préalables

  • Vous avez installé l'OpenShift CLI (oc).
  • Vous vous êtes connecté au cluster hub en tant qu'utilisateur avec les privilèges cluster-admin.
  • Vous avez créé un CR PolicyGenTemplate qui tire des informations d'un CR ConfigMap à l'aide de modèles de grappes de nœuds.

Procédure

  1. Mettez à jour le contenu de votre ConfigMap CR, et appliquez les changements dans le cluster hub.
  2. Pour synchroniser le contenu de la CR ConfigMap mise à jour avec la politique déployée, effectuez l'une des opérations suivantes :

    1. Option 1 : Supprimer la politique existante. ArgoCD utilise la commande PolicyGenTemplate CR pour recréer immédiatement la politique supprimée. Par exemple, exécutez la commande suivante :

      oc delete policy <policy_name> -n <policy_namespace> $ oc delete policy <policy_name>
    2. Option 2 : Appliquer une annotation spéciale policy.open-cluster-management.io/trigger-update à la police avec une valeur différente à chaque fois que vous mettez à jour le site ConfigMap. Par exemple :

      $ oc annotate policy <policy_name> -n <policy_namespace> policy.open-cluster-management.io/trigger-update="1"
      Note

      Vous devez appliquer la politique mise à jour pour que les modifications soient prises en compte. Pour plus d'informations, voir Annotation spéciale pour le retraitement.

  3. Facultatif : si elle existe, supprimez la CR ClusterGroupUpdate qui contient la politique. Par exemple :

    oc delete clustergroupupgrade <cgu_name> -n <cgu_namespace>
    1. Créez un nouveau CR ClusterGroupUpdate qui inclut la politique à appliquer avec les changements mis à jour de ConfigMap. Par exemple, ajoutez le fichier YAML suivant au fichier cgr-example.yaml:

      apiVersion: ran.openshift.io/v1alpha1
      kind: ClusterGroupUpgrade
      metadata:
        name: <cgr_name>
        namespace: <policy_namespace>
      spec:
        managedPolicies:
          - <managed_policy>
        enable: true
        clusters:
        - <managed_cluster_1>
        - <managed_cluster_2>
        remediationStrategy:
          maxConcurrency: 2
          timeout: 240
    2. Appliquer la politique mise à jour :

      $ oc apply -f cgr-example.yaml

21.10. Mise à jour des clusters gérés avec le Topology Aware Lifecycle Manager

Vous pouvez utiliser le Topology Aware Lifecycle Manager (TALM) pour gérer le cycle de vie du logiciel des clusters gérés par OpenShift Container Platform. TALM utilise les stratégies de Red Hat Advanced Cluster Management (RHACM) pour effectuer des modifications sur les clusters cibles.

Ressources supplémentaires

21.10.1. Mise à jour des clusters dans un environnement déconnecté

Vous pouvez mettre à niveau les clusters gérés et les opérateurs des clusters gérés que vous avez déployés à l'aide de GitOps ZTP et de Topology Aware Lifecycle Manager (TALM).

21.10.1.1. Mise en place de l'environnement

TALM peut effectuer des mises à jour de la plateforme et de l'opérateur.

Vous devez mettre en miroir l'image de la plate-forme et les images de l'opérateur que vous souhaitez mettre à jour dans votre registre miroir avant de pouvoir utiliser TALM pour mettre à jour vos clusters déconnectés. Effectuez les étapes suivantes pour créer un miroir des images :

  • Pour les mises à jour de la plate-forme, vous devez effectuer les étapes suivantes :

    1. Mettre en miroir le référentiel d'images OpenShift Container Platform souhaité. Assurez-vous que l'image de la plateforme souhaitée est mise en miroir en suivant la procédure " Mirroring the OpenShift Container Platform image repository " (Mise en miroir du référentiel d'images OpenShift Container Platform) dont le lien se trouve dans les Ressources supplémentaires. Enregistrez le contenu de la section imageContentSources dans le fichier imageContentSources.yaml:

      Exemple de sortie

      imageContentSources:
       - mirrors:
         - mirror-ocp-registry.ibmcloud.io.cpak:5000/openshift-release-dev/openshift4
         source: quay.io/openshift-release-dev/ocp-release
       - mirrors:
         - mirror-ocp-registry.ibmcloud.io.cpak:5000/openshift-release-dev/openshift4
         source: quay.io/openshift-release-dev/ocp-v4.0-art-dev

    2. Enregistrez la signature de l'image de la plate-forme souhaitée qui a été mise en miroir. Vous devez ajouter la signature de l'image à la CR PolicyGenTemplate pour les mises à jour de la plate-forme. Pour obtenir la signature de l'image, procédez comme suit :

      1. Spécifiez le tag OpenShift Container Platform souhaité en exécutant la commande suivante :

        oCP_RELEASE_NUMBER=<release_version>
      2. Spécifiez l'architecture du serveur en exécutant la commande suivante :

        aRCHITECTURE=<server_architecture>
      3. Obtenez le résumé de l'image de la version de Quay en exécutant la commande suivante

        $ DIGEST="$(oc adm release info quay.io/openshift-release-dev/ocp-release:${OCP_RELEASE_NUMBER}-${ARCHITECTURE} | sed -n 's/Pull From: .*@//p')"
      4. Définissez l'algorithme de résumé en exécutant la commande suivante :

        $ DIGEST_ALGO="${DIGEST%%:*}"
      5. Définissez la signature numérique en exécutant la commande suivante :

        $ DIGEST_ENCODED="${DIGEST#*:}"
      6. Obtenez la signature de l'image à partir du site web mirror.openshift.com en exécutant la commande suivante :

        $ SIGNATURE_BASE64=$(curl -s "https://mirror.openshift.com/pub/openshift-v4/signatures/openshift/release/${DIGEST_ALGO}=${DIGEST_ENCODED}/signature-1" | base64 -w0 && echo)
      7. Enregistrez la signature de l'image dans le fichier checksum-<OCP_RELEASE_NUMBER>.yaml en exécutant les commandes suivantes :

        $ cat >checksum-${OCP_RELEASE_NUMBER}.yaml <<EOF
        ${DIGEST_ALGO}-${DIGEST_ENCODED}: ${SIGNATURE_BASE64}
        EOF
    3. Préparer le graphique de mise à jour. Vous avez deux options pour préparer le graphique de mise à jour :

      1. Utiliser le service de mise à jour OpenShift.

        Pour plus d'informations sur la mise en place du graphe sur le hub cluster, voir Déployer l'opérateur pour OpenShift Update Service et Construire le conteneur init de données du graphe.

      2. Faites une copie locale du graphe en amont. Hébergez le graphique de mise à jour sur un serveur http ou https dans l'environnement déconnecté qui a accès au cluster géré. Pour télécharger le graphe de mise à jour, utilisez la commande suivante :

        $ curl -s https://api.openshift.com/api/upgrades_info/v1/graph?channel=stable-4.12 -o ~/upgrade-graph_stable-4.12
  • Pour les mises à jour de l'opérateur, vous devez effectuer la tâche suivante :

    • Mettre en miroir les catalogues de l'opérateur. Assurez-vous que les images d'opérateur souhaitées sont mises en miroir en suivant la procédure décrite dans la section "Mise en miroir des catalogues d'opérateur pour utilisation avec des clusters déconnectés".

Ressources supplémentaires

21.10.1.2. Mise à jour de la plate-forme

Vous pouvez effectuer une mise à jour de la plate-forme avec le TALM.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Mettre à jour ZTP avec la dernière version.
  • Approvisionnez un ou plusieurs clusters gérés avec ZTP.
  • Mettez en miroir le référentiel d'images souhaité.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Créer des stratégies RHACM dans le cluster hub.

Procédure

  1. Créer un CR PolicyGenTemplate pour la mise à jour de la plateforme :

    1. Enregistrez le contenu suivant du CR PolicyGenTemplate dans le fichier du-upgrade.yaml.

      Exemple de PolicyGenTemplate pour la mise à jour de la plate-forme

      apiVersion: ran.openshift.io/v1
      kind: PolicyGenTemplate
      metadata:
        name: "du-upgrade"
        namespace: "ztp-group-du-sno"
      spec:
        bindingRules:
          group-du-sno: ""
        mcp: "master"
        remediationAction: inform
        sourceFiles:
          - fileName: ImageSignature.yaml 1
            policyName: "platform-upgrade-prep"
            binaryData:
              ${DIGEST_ALGO}-${DIGEST_ENCODED}: ${SIGNATURE_BASE64} 2
          - fileName: DisconnectedICSP.yaml
            policyName: "platform-upgrade-prep"
            metadata:
              name: disconnected-internal-icsp-for-ocp
            spec:
              repositoryDigestMirrors: 3
                - mirrors:
                  - quay-intern.example.com/ocp4/openshift-release-dev
                  source: quay.io/openshift-release-dev/ocp-release
                - mirrors:
                  - quay-intern.example.com/ocp4/openshift-release-dev
                  source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
          - fileName: ClusterVersion.yaml 4
            policyName: "platform-upgrade-prep"
            metadata:
              name: version
              annotations:
                ran.openshift.io/ztp-deploy-wave: "1"
            spec:
              channel: "stable-4.12"
              upstream: http://upgrade.example.com/images/upgrade-graph_stable-4.12
          - fileName: ClusterVersion.yaml 5
            policyName: "platform-upgrade"
            metadata:
              name: version
            spec:
              channel: "stable-4.12"
              upstream: http://upgrade.example.com/images/upgrade-graph_stable-4.12
              desiredUpdate:
                version: 4.12.4
            status:
              history:
                - version: 4.12.4
                  state: "Completed"

      1
      Le CR ConfigMap contient la signature de l'image de la version souhaitée à mettre à jour.
      2
      Affiche la signature de l'image de la version d'OpenShift Container Platform souhaitée. Obtenez la signature à partir du fichier checksum-${OCP_RELASE_NUMBER}.yaml que vous avez enregistré en suivant les procédures de la section " Configuration de l'environnement ".
      3
      Affiche le dépôt miroir qui contient l'image OpenShift Container Platform souhaitée. Obtenez les miroirs à partir du fichier imageContentSources.yaml que vous avez enregistré en suivant les procédures de la section " Configuration de l'environnement ".
      4
      Indique le CR ClusterVersion à mettre à jour en amont.
      5
      Indique le CR ClusterVersion pour déclencher la mise à jour. Les champs channel, upstream, et desiredVersion sont tous nécessaires pour la mise en cache des images.

      La CR PolicyGenTemplate génère deux politiques :

      • La politique du-upgrade-platform-upgrade-prep prépare la mise à jour de la plate-forme. Elle crée le CR ConfigMap pour la signature d'image de version souhaitée, crée la source de contenu d'image du référentiel d'images de version en miroir et met à jour la version du cluster avec le canal de mise à jour souhaité et le graphique de mise à jour accessible par le cluster géré dans l'environnement déconnecté.
      • La politique du-upgrade-platform-upgrade est utilisée pour effectuer la mise à niveau de la plate-forme.
    2. Ajoutez le contenu du fichier du-upgrade.yaml au fichier kustomization.yaml situé dans le dépôt ZTP Git pour les CR PolicyGenTemplate et transférez les modifications dans le dépôt Git.

      ArgoCD extrait les modifications du référentiel Git et génère les politiques sur le cluster hub.

    3. Vérifiez les politiques créées en exécutant la commande suivante :

      $ oc get policies -A | grep platform-upgrade
  2. Appliquer les ressources de mise à jour requises avant de lancer la mise à jour de la plateforme avec le TALM.

    1. Enregistrez le contenu du fichier platform-upgrade-prep ClusterUpgradeGroup CR avec la stratégie du-upgrade-platform-upgrade-prep et les clusters gérés cibles dans le fichier cgu-platform-upgrade-prep.yml, comme indiqué dans l'exemple suivant :

      apiVersion: ran.openshift.io/v1alpha1
      kind: ClusterGroupUpgrade
      metadata:
        name: cgu-platform-upgrade-prep
        namespace: default
      spec:
        managedPolicies:
        - du-upgrade-platform-upgrade-prep
        clusters:
        - spoke1
        remediationStrategy:
          maxConcurrency: 1
        enable: true
    2. Appliquez la politique au cluster hub en exécutant la commande suivante :

      $ oc apply -f cgu-platform-upgrade-prep.yml
    3. Surveillez le processus de mise à jour. Une fois la mise à jour terminée, assurez-vous que la politique est conforme en exécutant la commande suivante :

      $ oc get policies --all-namespaces
  3. Créez le CR ClusterGroupUpdate pour la mise à jour de la plate-forme avec le champ spec.enable défini sur false.

    1. Enregistrez le contenu de la mise à jour de la plate-forme ClusterGroupUpdate CR avec la stratégie du-upgrade-platform-upgrade et les clusters cibles dans le fichier cgu-platform-upgrade.yml, comme indiqué dans l'exemple suivant :

      apiVersion: ran.openshift.io/v1alpha1
      kind: ClusterGroupUpgrade
      metadata:
        name: cgu-platform-upgrade
        namespace: default
      spec:
        managedPolicies:
        - du-upgrade-platform-upgrade
        preCaching: false
        clusters:
        - spoke1
        remediationStrategy:
          maxConcurrency: 1
        enable: false
    2. Appliquez le CR ClusterGroupUpdate au cluster du concentrateur en exécutant la commande suivante :

      $ oc apply -f cgu-platform-upgrade.yml
  4. Facultatif : Prémettre en cache les images pour la mise à jour de la plateforme.

    1. Activez la mise en cache préalable dans le CR ClusterGroupUpdate en exécutant la commande suivante :

      $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-platform-upgrade \
      --patch '{"spec":{"preCaching": true}}' --type=merge
    2. Surveillez le processus de mise à jour et attendez la fin de la mise en cache. Vérifiez l'état de la mise en cache préalable en exécutant la commande suivante sur le cluster du concentrateur :

      $ oc get cgu cgu-platform-upgrade -o jsonpath='{.status.precaching.status}'
  5. Lancer la mise à jour de la plate-forme :

    1. Activez la stratégie cgu-platform-upgrade et désactivez la mise en cache préalable en exécutant la commande suivante :

      $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-platform-upgrade \
      --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge
    2. Surveillez le processus. Une fois le processus terminé, assurez-vous que la politique est conforme en exécutant la commande suivante :

      $ oc get policies --all-namespaces

Ressources supplémentaires

21.10.1.3. Mise à jour de l'opérateur

Vous pouvez effectuer une mise à jour de l'opérateur avec le TALM.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Mettre à jour ZTP avec la dernière version.
  • Approvisionnez un ou plusieurs clusters gérés avec ZTP.
  • Miroir de l'image d'index souhaitée, des images de la liasse et de toutes les images de l'opérateur référencées dans les images de la liasse.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Créer des stratégies RHACM dans le cluster hub.

Procédure

  1. Mettre à jour le CR PolicyGenTemplate pour la mise à jour de l'opérateur.

    1. Mettez à jour le CR du-upgrade PolicyGenTemplate avec le contenu supplémentaire suivant dans le fichier du-upgrade.yaml:

      apiVersion: ran.openshift.io/v1
      kind: PolicyGenTemplate
      metadata:
        name: "du-upgrade"
        namespace: "ztp-group-du-sno"
      spec:
        bindingRules:
          group-du-sno: ""
        mcp: "master"
        remediationAction: inform
        sourceFiles:
          - fileName: DefaultCatsrc.yaml
            remediationAction: inform
            policyName: "operator-catsrc-policy"
            metadata:
              name: redhat-operators
            spec:
              displayName: Red Hat Operators Catalog
              image: registry.example.com:5000/olm/redhat-operators:v4.12 1
              updateStrategy: 2
                registryPoll:
                  interval: 1h
      1
      L'URL de l'image d'index contient les images de l'opérateur souhaitées. Si les images d'index sont toujours poussées vers le même nom d'image et la même balise, cette modification n'est pas nécessaire.
      2
      Le champ registryPoll.interval permet de définir la fréquence à laquelle le gestionnaire du cycle de vie de l'opérateur (OLM) interroge l'image d'index pour les nouvelles versions de l'opérateur. Cette modification n'est pas nécessaire si une nouvelle balise d'image d'index est toujours insérée pour les mises à jour des opérateurs des flux y et z. Le champ registryPoll.interval peut être défini sur un intervalle plus court pour accélérer la mise à jour, mais les intervalles plus courts augmentent la charge de calcul. Pour y remédier, vous pouvez rétablir la valeur par défaut du champ registryPoll.interval une fois la mise à jour terminée.
    2. Cette mise à jour génère une politique, du-upgrade-operator-catsrc-policy, pour mettre à jour la source du catalogue redhat-operators avec les nouvelles images d'index qui contiennent les images d'opérateurs souhaitées.

      Note

      Si vous souhaitez utiliser la mise en cache préalable des images pour les opérateurs et qu'il existe des opérateurs provenant d'une source de catalogue autre que redhat-operators, vous devez effectuer les tâches suivantes :

      • Préparez une stratégie de source de catalogue distincte avec la nouvelle image d'index ou la mise à jour de l'intervalle d'interrogation du registre pour la source de catalogue différente.
      • Préparer une politique d'abonnement distincte pour les opérateurs souhaités qui proviennent d'une source de catalogue différente.

      Par exemple, l'opérateur SRIOV-FEC souhaité est disponible dans la source de catalogue certified-operators. Pour mettre à jour la source du catalogue et l'abonnement à l'opérateur, ajoutez le contenu suivant pour générer deux politiques, du-upgrade-fec-catsrc-policy et du-upgrade-subscriptions-fec-policy:

      apiVersion: ran.openshift.io/v1
      kind: PolicyGenTemplate
      metadata:
        name: "du-upgrade"
        namespace: "ztp-group-du-sno"
      spec:
        bindingRules:
          group-du-sno: ""
        mcp: "master"
        remediationAction: inform
        sourceFiles:
             …
          - fileName: DefaultCatsrc.yaml
            remediationAction: inform
            policyName: "fec-catsrc-policy"
            metadata:
              name: certified-operators
            spec:
              displayName: Intel SRIOV-FEC Operator
              image: registry.example.com:5000/olm/far-edge-sriov-fec:v4.10
              updateStrategy:
                registryPoll:
                  interval: 10m
          - fileName: AcceleratorsSubscription.yaml
            policyName: "subscriptions-fec-policy"
            spec:
              channel: "stable"
              source: certified-operators
    3. Supprime les canaux d'abonnement spécifiés dans le CR commun PolicyGenTemplate, s'ils existent. Les canaux d'abonnement par défaut de l'image ZTP sont utilisés pour la mise à jour.

      Note

      Le canal par défaut pour les opérateurs appliqués par l'intermédiaire de ZTP 4.12 est stable, à l'exception de performance-addon-operator. À partir de OpenShift Container Platform 4.11, la fonctionnalité performance-addon-operator a été déplacée vers node-tuning-operator. Pour la version 4.10, le canal par défaut pour PAO est v4.10. Vous pouvez également spécifier les canaux par défaut dans le CR commun PolicyGenTemplate.

    4. Pousser les mises à jour de PolicyGenTemplate CRs vers le dépôt ZTP Git.

      ArgoCD extrait les modifications du référentiel Git et génère les politiques sur le cluster hub.

    5. Vérifiez les politiques créées en exécutant la commande suivante :

      $ oc get policies -A | grep -E "catsrc-policy|subscription"
  2. Appliquez les mises à jour nécessaires du catalogue avant de lancer la mise à jour de l'opérateur.

    1. Enregistrez le contenu du CR ClusterGroupUpgrade nommé operator-upgrade-prep avec les stratégies source du catalogue et les clusters gérés cibles dans le fichier cgu-operator-upgrade-prep.yml:

      apiVersion: ran.openshift.io/v1alpha1
      kind: ClusterGroupUpgrade
      metadata:
        name: cgu-operator-upgrade-prep
        namespace: default
      spec:
        clusters:
        - spoke1
        enable: true
        managedPolicies:
        - du-upgrade-operator-catsrc-policy
        remediationStrategy:
          maxConcurrency: 1
    2. Appliquez la politique au cluster hub en exécutant la commande suivante :

      $ oc apply -f cgu-operator-upgrade-prep.yml
    3. Surveillez le processus de mise à jour. Une fois la mise à jour terminée, assurez-vous que la politique est conforme en exécutant la commande suivante :

      $ oc get policies -A | grep -E "catsrc-policy"
  3. Créez le CR ClusterGroupUpgrade pour la mise à jour de l'opérateur avec le champ spec.enable défini sur false.

    1. Enregistrez le contenu de la mise à jour de l'opérateur ClusterGroupUpgrade CR avec la stratégie du-upgrade-operator-catsrc-policy et les stratégies d'abonnement créées à partir des clusters communs PolicyGenTemplate et cibles dans le fichier cgu-operator-upgrade.yml, comme indiqué dans l'exemple suivant :

      apiVersion: ran.openshift.io/v1alpha1
      kind: ClusterGroupUpgrade
      metadata:
        name: cgu-operator-upgrade
        namespace: default
      spec:
        managedPolicies:
        - du-upgrade-operator-catsrc-policy 1
        - common-subscriptions-policy 2
        preCaching: false
        clusters:
        - spoke1
        remediationStrategy:
          maxConcurrency: 1
        enable: false
      1
      La politique est nécessaire à la fonction de mise en cache préalable des images pour récupérer les images de l'opérateur à partir de la source du catalogue.
      2
      La politique contient des abonnements d'opérateurs. Si vous avez suivi la structure et le contenu de la référence PolicyGenTemplates, tous les abonnements des opérateurs sont regroupés dans la politique common-subscriptions-policy.
      Note

      Un CR ClusterGroupUpgrade ne peut pré-cacher que les images des opérateurs souhaités définis dans la politique d'abonnement à partir d'une source de catalogue incluse dans le CR ClusterGroupUpgrade. Si les opérateurs souhaités proviennent de différentes sources de catalogue, comme dans l'exemple de l'opérateur SRIOV-FEC, un autre CR ClusterGroupUpgrade doit être créé avec les politiques du-upgrade-fec-catsrc-policy et du-upgrade-subscriptions-fec-policy pour la mise en cache et la mise à jour des images de l'opérateur SRIOV-FEC.

    2. Appliquez le CR ClusterGroupUpgrade au cluster du concentrateur en exécutant la commande suivante :

      $ oc apply -f cgu-operator-upgrade.yml
  4. Facultatif : Prémettre en cache les images pour la mise à jour de l'opérateur.

    1. Avant de commencer la mise en cache des images, vérifiez que la politique d'abonnement est bien NonCompliant à ce stade en exécutant la commande suivante :

      $ oc get policy common-subscriptions-policy -n <policy_namespace>

      Exemple de sortie

      NAME                          REMEDIATION ACTION   COMPLIANCE STATE     AGE
      common-subscriptions-policy   inform               NonCompliant         27d

    2. Activez la mise en cache préalable dans le CR ClusterGroupUpgrade en exécutant la commande suivante :

      $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-operator-upgrade \
      --patch '{"spec":{"preCaching": true}}' --type=merge
    3. Surveillez le processus et attendez la fin de la mise en cache. Vérifiez l'état de la mise en cache préalable en exécutant la commande suivante sur le cluster géré :

      $ oc get cgu cgu-operator-upgrade -o jsonpath='{.status.precaching.status}'
    4. Vérifiez que la mise en cache est terminée avant de lancer la mise à jour en exécutant la commande suivante :

      $ oc get cgu -n default cgu-operator-upgrade -ojsonpath='{.status.conditions}' | jq

      Exemple de sortie

      [
          {
            "lastTransitionTime": "2022-03-08T20:49:08.000Z",
            "message": "The ClusterGroupUpgrade CR is not enabled",
            "reason": "UpgradeNotStarted",
            "status": "False",
            "type": "Ready"
          },
          {
            "lastTransitionTime": "2022-03-08T20:55:30.000Z",
            "message": "Precaching is completed",
            "reason": "PrecachingCompleted",
            "status": "True",
            "type": "PrecachingDone"
          }
      ]

  5. Lancer la mise à jour de l'opérateur.

    1. Activez le cgu-operator-upgrade ClusterGroupUpgrade CR et désactivez la mise en cache préalable pour lancer la mise à jour de l'opérateur en exécutant la commande suivante :

      $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-operator-upgrade \
      --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge
    2. Surveillez le processus. Une fois le processus terminé, assurez-vous que la politique est conforme en exécutant la commande suivante :

      $ oc get policies --all-namespaces

Ressources supplémentaires

21.10.1.4. Réalisation conjointe d'une mise à jour de la plate-forme et d'une mise à jour de l'opérateur

Vous pouvez effectuer une mise à jour de la plate-forme et de l'opérateur en même temps.

Conditions préalables

  • Installez le gestionnaire de cycle de vie Topology Aware (TALM).
  • Mettre à jour ZTP avec la dernière version.
  • Approvisionnez un ou plusieurs clusters gérés avec ZTP.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.
  • Créer des stratégies RHACM dans le cluster hub.

Procédure

  1. Créez le CR PolicyGenTemplate pour les mises à jour en suivant les étapes décrites dans les sections "Effectuer une mise à jour de la plate-forme" et "Effectuer une mise à jour de l'opérateur".
  2. Appliquer les travaux préparatoires pour la plateforme et la mise à jour de l'opérateur.

    1. Enregistrez le contenu du fichier ClusterGroupUpgrade CR avec les politiques de préparation des mises à jour de la plate-forme, les mises à jour de la source du catalogue et les clusters cibles dans le fichier cgu-platform-operator-upgrade-prep.yml, par exemple :

      apiVersion: ran.openshift.io/v1alpha1
      kind: ClusterGroupUpgrade
      metadata:
        name: cgu-platform-operator-upgrade-prep
        namespace: default
      spec:
        managedPolicies:
        - du-upgrade-platform-upgrade-prep
        - du-upgrade-operator-catsrc-policy
        clusterSelector:
        - group-du-sno
        remediationStrategy:
          maxConcurrency: 10
        enable: true
    2. Appliquez le fichier cgu-platform-operator-upgrade-prep.yml au cluster hub en exécutant la commande suivante :

      $ oc apply -f cgu-platform-operator-upgrade-prep.yml
    3. Surveillez le processus. Une fois le processus terminé, assurez-vous que la politique est conforme en exécutant la commande suivante :

      $ oc get policies --all-namespaces
  3. Créez le CR ClusterGroupUpdate pour la plate-forme et la mise à jour de l'opérateur avec le champ spec.enable réglé sur false.

    1. Enregistrez le contenu de la plateforme et de la mise à jour de l'opérateur ClusterGroupUpdate CR avec les politiques et les clusters cibles dans le fichier cgu-platform-operator-upgrade.yml, comme indiqué dans l'exemple suivant :

      apiVersion: ran.openshift.io/v1alpha1
      kind: ClusterGroupUpgrade
      metadata:
        name: cgu-du-upgrade
        namespace: default
      spec:
        managedPolicies:
        - du-upgrade-platform-upgrade 1
        - du-upgrade-operator-catsrc-policy 2
        - common-subscriptions-policy 3
        preCaching: true
        clusterSelector:
        - group-du-sno
        remediationStrategy:
          maxConcurrency: 1
        enable: false
      1
      Il s'agit de la politique de mise à jour de la plateforme.
      2
      Il s'agit de la stratégie contenant les informations de source du catalogue pour les opérateurs à mettre à jour. Elle est nécessaire pour que la fonction de mise en cache préalable détermine les images d'opérateurs à télécharger sur le cluster géré.
      3
      Il s'agit de la politique de mise à jour des opérateurs.
    2. Appliquez le fichier cgu-platform-operator-upgrade.yml au cluster hub en exécutant la commande suivante :

      $ oc apply -f cgu-platform-operator-upgrade.yml
  4. Facultatif : Pré-cachez les images pour la plateforme et la mise à jour de l'opérateur.

    1. Activez la mise en cache préalable dans le CR ClusterGroupUpgrade en exécutant la commande suivante :

      $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-du-upgrade \
      --patch '{"spec":{"preCaching": true}}' --type=merge
    2. Surveillez le processus de mise à jour et attendez la fin de la mise en cache. Vérifiez l'état de la mise en cache préalable en exécutant la commande suivante sur le cluster géré :

      $ oc get jobs,pods -n openshift-talm-pre-cache
    3. Vérifiez que la mise en cache est terminée avant de lancer la mise à jour en exécutant la commande suivante :

      $ oc get cgu cgu-du-upgrade -ojsonpath='{.status.conditions}'
  5. Démarrer la plateforme et la mise à jour de l'opérateur.

    1. Activez le cgu-du-upgrade ClusterGroupUpgrade CR pour démarrer la plateforme et la mise à jour de l'opérateur en exécutant la commande suivante :

      $ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-du-upgrade \
      --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge
    2. Surveillez le processus. Une fois le processus terminé, assurez-vous que la politique est conforme en exécutant la commande suivante :

      $ oc get policies --all-namespaces
      Note

      Les CR pour les mises à jour de la plate-forme et de l'opérateur peuvent être créés dès le début en configurant le paramètre spec.enable: true. Dans ce cas, la mise à jour démarre immédiatement après la fin de la mise en cache préalable et il n'est pas nécessaire d'activer manuellement le CR.

      La mise en cache préalable et la mise à jour créent des ressources supplémentaires, telles que des stratégies, des liaisons de placement, des règles de placement, des actions de cluster géré et des vues de cluster géré, afin de faciliter l'exécution des procédures. La définition du champ afterCompletion.deleteObjects sur true supprime toutes ces ressources une fois les mises à jour terminées.

21.10.1.5. Suppression des abonnements Performance Addon Operator des clusters déployés

Dans les versions antérieures d'OpenShift Container Platform, l'opérateur Performance Addon fournissait un réglage automatique des performances à faible latence pour les applications. Dans OpenShift Container Platform 4.11 ou ultérieure, ces fonctions font partie de l'opérateur Node Tuning.

N'installez pas l'opérateur Performance Addon sur des clusters exécutant OpenShift Container Platform 4.11 ou une version ultérieure. Si vous mettez à niveau vers OpenShift Container Platform 4.11 ou une version ultérieure, l'opérateur Node Tuning supprime automatiquement l'opérateur Performance Addon.

Note

Vous devez supprimer toutes les stratégies qui créent des abonnements à Performance Addon Operator afin d'empêcher la réinstallation de l'opérateur.

Le profil DU de référence inclut l'opérateur Performance Addon dans le CR PolicyGenTemplate common-ranGen.yaml . Pour supprimer l'abonnement des clusters gérés déployés, vous devez mettre à jour common-ranGen.yaml.

Note

Si vous installez Performance Addon Operator 4.10.3-5 ou une version ultérieure sur OpenShift Container Platform 4.11 ou une version ultérieure, Performance Addon Operator détecte la version du cluster et se met automatiquement en hibernation pour éviter d'interférer avec les fonctions de Node Tuning Operator. Cependant, pour garantir des performances optimales, supprimez le Performance Addon Operator de vos clusters OpenShift Container Platform 4.11.

Conditions préalables

  • Créez un dépôt Git où vous gérez les données de configuration de votre site personnalisé. Le dépôt doit être accessible depuis le cluster hub et être défini comme dépôt source pour ArgoCD.
  • Mise à jour vers OpenShift Container Platform 4.11 ou une version ultérieure.
  • Connectez-vous en tant qu'utilisateur disposant des privilèges cluster-admin.

Procédure

  1. Remplacez complianceType par mustnothave pour l'espace de noms Performance Addon Operator, le groupe Operator et l'abonnement dans le fichier common-ranGen.yaml.

     -  fileName: PaoSubscriptionNS.yaml
        policyName: "subscriptions-policy"
        complianceType: mustnothave
     -  fileName: PaoSubscriptionOperGroup.yaml
        policyName: "subscriptions-policy"
        complianceType: mustnothave
     -  fileName: PaoSubscription.yaml
        policyName: "subscriptions-policy"
        complianceType: mustnothave
  2. Fusionnez les modifications avec votre référentiel de site personnalisé et attendez que l'application ArgoCD synchronise les modifications avec le cluster du concentrateur. Le statut de la politique common-subscriptions-policy devient Non-Compliant.
  3. Appliquez la modification à vos clusters cibles à l'aide du gestionnaire de cycle de vie Topology Aware. Pour plus d'informations sur le déploiement des modifications de configuration, voir la section "Ressources supplémentaires".
  4. Surveillez le processus. Lorsque le statut de la politique common-subscriptions-policy pour un cluster cible est Compliant, l'opérateur Performance Addon a été supprimé du cluster. Obtenez le statut de common-subscriptions-policy en exécutant la commande suivante :

    $ oc get policy -n ztp-common common-subscriptions-policy
  5. Supprimer l'espace de noms de l'opérateur Performance Addon, le groupe d'opérateurs et les CR d'abonnement de .spec.sourceFiles dans le fichier common-ranGen.yaml.
  6. Fusionnez les modifications avec votre référentiel de site personnalisé et attendez que l'application ArgoCD synchronise les modifications avec le cluster du concentrateur. La politique reste conforme.

21.10.2. À propos de la création automatique de ClusterGroupUpgrade CR pour ZTP

TALM dispose d'un contrôleur appelé ManagedClusterForCGU qui surveille l'état Ready des CR ManagedCluster sur le cluster hub et crée les CR ClusterGroupUpgrade pour le ZTP (zero touch provisioning).

Pour tout cluster géré dans l'état Ready sans étiquette "ztp-done" appliquée, le contrôleur ManagedClusterForCGU crée automatiquement un CR ClusterGroupUpgrade dans l'espace de noms ztp-install avec ses politiques RHACM associées qui sont créées pendant le processus ZTP. Le TALM remédie ensuite à l'ensemble des politiques de configuration répertoriées dans le CR ClusterGroupUpgrade auto-créé pour pousser les CR de configuration vers le cluster géré.

Note

Si le cluster géré n'a pas de politiques liées lorsque le cluster devient Ready, aucun CR ClusterGroupUpgrade n'est créé.

Exemple d'un CR ClusterGroupUpgrade auto-créé pour ZTP

apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
  generation: 1
  name: spoke1
  namespace: ztp-install
  ownerReferences:
  - apiVersion: cluster.open-cluster-management.io/v1
    blockOwnerDeletion: true
    controller: true
    kind: ManagedCluster
    name: spoke1
    uid: 98fdb9b2-51ee-4ee7-8f57-a84f7f35b9d5
  resourceVersion: "46666836"
  uid: b8be9cd2-764f-4a62-87d6-6b767852c7da
spec:
  actions:
    afterCompletion:
      addClusterLabels:
        ztp-done: "" 1
      deleteClusterLabels:
        ztp-running: ""
      deleteObjects: true
    beforeEnable:
      addClusterLabels:
        ztp-running: "" 2
  clusters:
  - spoke1
  enable: true
  managedPolicies:
  - common-spoke1-config-policy
  - common-spoke1-subscriptions-policy
  - group-spoke1-config-policy
  - spoke1-config-policy
  - group-spoke1-validator-du-policy
  preCaching: false
  remediationStrategy:
    maxConcurrency: 1
    timeout: 240

1
Appliqué au cluster géré lorsque TALM termine la configuration du cluster.
2
Appliqué au cluster géré lorsque TALM commence à déployer les politiques de configuration.

21.11. Mise à jour de GitOps ZTP

Vous pouvez mettre à jour l'infrastructure Gitops zero touch provisioning (ZTP) indépendamment du cluster hub, de Red Hat Advanced Cluster Management (RHACM) et des clusters OpenShift Container Platform gérés.

Note

Vous pouvez mettre à jour l'opérateur Red Hat OpenShift GitOps lorsque de nouvelles versions sont disponibles. Lorsque vous mettez à jour le plugin GitOps ZTP, examinez les fichiers mis à jour dans la configuration de référence et assurez-vous que les changements répondent à vos besoins.

21.11.1. Vue d'ensemble du processus de mise à jour ZTP de GitOps

Vous pouvez mettre à jour GitOps zero touch provisioning (ZTP) pour un hub cluster pleinement opérationnel utilisant une version antérieure de l'infrastructure GitOps ZTP. Le processus de mise à jour évite l'impact sur les clusters gérés.

Note

Toute modification des paramètres de politique, y compris l'ajout de contenu recommandé, entraîne une mise à jour des politiques qui doit être déployée sur les clusters gérés et réconciliée.

À un niveau élevé, la stratégie de mise à jour de l'infrastructure ZTP de GitOps est la suivante :

  1. Étiqueter tous les groupes existants avec l'étiquette ztp-done.
  2. Arrêter les applications ArgoCD.
  3. Installer les nouveaux outils ZTP de GitOps.
  4. Mettre à jour le contenu requis et les changements optionnels dans le dépôt Git.
  5. Mettre à jour et redémarrer la configuration de l'application.

21.11.2. Préparation de la mise à niveau

Utilisez la procédure suivante pour préparer votre site à la mise à niveau GitOps zero touch provisioning (ZTP).

Procédure

  1. Obtenir la dernière version du conteneur GitOps ZTP qui contient les ressources personnalisées (CR) utilisées pour configurer Red Hat OpenShift GitOps pour une utilisation avec GitOps ZTP.
  2. Extrayez le répertoire argocd/deployment à l'aide des commandes suivantes :

    $ mkdir -p ./update
    $ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12 extract /home/ztp --tar | tar x -C ./update

    Le répertoire /update contient les sous-répertoires suivants :

    • update/extra-manifestcontient les fichiers CR source que le CR SiteConfig utilise pour générer le manifeste supplémentaire configMap.
    • update/source-crscontient les fichiers CR source que le CR PolicyGenTemplate utilise pour générer les stratégies de Red Hat Advanced Cluster Management (RHACM).
    • update/argocd/deploymentcontient des correctifs et des fichiers YAML à appliquer sur le cluster hub pour l'étape suivante de cette procédure.
    • update/argocd/example: contient des exemples de fichiers SiteConfig et PolicyGenTemplate qui représentent la configuration recommandée.
  3. Mettez à jour les fichiers clusters-app.yaml et policies-app.yaml pour refléter le nom de vos applications et l'URL, la branche et le chemin de votre dépôt Git.

    Si la mise à niveau inclut des changements qui entraînent des politiques obsolètes, ces dernières doivent être supprimées avant d'effectuer la mise à niveau.

  4. Diffuser les changements entre les CR de configuration et de déploiement dans le dossier /update et le repo Git où vous gérez les CR de votre flotte de sites. Appliquez et poussez les changements requis dans le référentiel de votre site.

    Important

    Lorsque vous mettez à jour GitOps ZTP vers la dernière version, vous devez appliquer les changements du répertoire update/argocd/deployment au dépôt de votre site. N'utilisez pas d'anciennes versions des fichiers argocd/deployment/.

21.11.3. Labellisation des clusters existants

Pour s'assurer que les clusters existants ne sont pas touchés par les mises à jour de l'outil, apposez l'étiquette ztp-done sur tous les clusters gérés existants.

Note

Cette procédure s'applique uniquement à la mise à jour des clusters qui n'ont pas été provisionnés avec Topology Aware Lifecycle Manager (TALM). Les clusters provisionnés avec TALM sont automatiquement étiquetés avec ztp-done.

Procédure

  1. Trouvez un sélecteur d'étiquettes qui répertorie les clusters gérés qui ont été déployés avec le zero touch provisioning (ZTP), comme local-cluster!=true:

    $ oc get managedcluster -l 'local-cluster!=true'
  2. Assurez-vous que la liste obtenue contient tous les clusters gérés qui ont été déployés avec ZTP, puis utilisez ce sélecteur pour ajouter l'étiquette ztp-done:

    $ oc label managedcluster -l 'local-cluster!=true' ztp-done=

21.11.4. Arrêt des applications ZTP existantes de GitOps

La suppression des applications existantes permet de s'assurer que les modifications apportées au contenu existant dans le dépôt Git ne sont pas déployées tant que la nouvelle version des outils n'est pas disponible.

Utilisez les fichiers d'application du répertoire deployment. Si vous avez utilisé des noms personnalisés pour les applications, mettez d'abord à jour les noms dans ces fichiers.

Procédure

  1. Effectuer une suppression non cascadée sur l'application clusters pour laisser toutes les ressources générées en place :

    $ oc delete -f update/argocd/deployment/clusters-app.yaml
  2. Effectuez une suppression en cascade sur l'application policies pour supprimer toutes les politiques précédentes :

    $ oc patch -f policies-app.yaml -p '{"metadata": {"finalizers": ["resources-finalizer.argocd.argoproj.io"]}}' --type merge
    $ oc delete -f update/argocd/deployment/policies-app.yaml

21.11.5. Changements requis dans le dépôt Git

Lors de la mise à niveau du conteneur ztp-site-generate d'une version antérieure de GitOps ZTP vers la version 4.10 ou une version ultérieure, le contenu du référentiel Git doit répondre à des exigences supplémentaires. Le contenu existant du référentiel doit être mis à jour pour refléter ces changements.

  • Apportez les modifications nécessaires aux fichiers PolicyGenTemplate:

    Tous les fichiers PolicyGenTemplate doivent être créés dans un Namespace préfixé par ztp. Cela garantit que l'application GitOps zero touch provisioning (ZTP) est en mesure de gérer les CR de politique générés par GitOps ZTP sans entrer en conflit avec la façon dont Red Hat Advanced Cluster Management (RHACM) gère les politiques en interne.

  • Ajouter le fichier kustomization.yaml au référentiel :

    Tous les CR SiteConfig et PolicyGenTemplate doivent être inclus dans un fichier kustomization.yaml sous leurs arborescences respectives. Par exemple :

    ├── policygentemplates
    │   ├── site1-ns.yaml
    │   ├── site1.yaml
    │   ├── site2-ns.yaml
    │   ├── site2.yaml
    │   ├── common-ns.yaml
    │   ├── common-ranGen.yaml
    │   ├── group-du-sno-ranGen-ns.yaml
    │   ├── group-du-sno-ranGen.yaml
    │   └── kustomization.yaml
    └── siteconfig
        ├── site1.yaml
        ├── site2.yaml
        └── kustomization.yaml
    Note

    Les fichiers énumérés dans les sections generator doivent contenir uniquement les CR SiteConfig ou PolicyGenTemplate. Si vos fichiers YAML existants contiennent d'autres CR, par exemple Namespace, ces autres CR doivent être extraits dans des fichiers séparés et répertoriés dans la section resources.

    Le fichier de personnalisation PolicyGenTemplate doit contenir tous les fichiers YAML PolicyGenTemplate dans la section generator et les CR Namespace dans la section resources. Par exemple :

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    
    generators:
    - common-ranGen.yaml
    - group-du-sno-ranGen.yaml
    - site1.yaml
    - site2.yaml
    
    resources:
    - common-ns.yaml
    - group-du-sno-ranGen-ns.yaml
    - site1-ns.yaml
    - site2-ns.yaml

    Le fichier de personnalisation SiteConfig doit contenir tous les fichiers YAML SiteConfig dans la section generator et tout autre CR dans les ressources :

    apiVersion: kustomize.config.k8s.io/v1beta1
    kind: Kustomization
    
    generators:
    - site1.yaml
    - site2.yaml
  • Supprimer les fichiers pre-sync.yaml et post-sync.yaml.

    Dans OpenShift Container Platform 4.10 et plus, les fichiers pre-sync.yaml et post-sync.yaml ne sont plus nécessaires. Le CR update/deployment/kustomization.yaml gère le déploiement des politiques sur le cluster hub.

    Note

    Il existe un ensemble de fichiers pre-sync.yaml et post-sync.yaml sous les arbres SiteConfig et PolicyGenTemplate.

  • Examiner et intégrer les modifications recommandées

    Chaque version peut inclure des changements supplémentaires recommandés pour la configuration appliquée aux clusters déployés. Généralement, ces changements permettent de réduire l'utilisation du processeur par la plateforme OpenShift, d'ajouter des fonctionnalités ou d'améliorer le réglage de la plateforme.

    Examinez les CR de référence SiteConfig et PolicyGenTemplate applicables aux types de clusters de votre réseau. Ces exemples se trouvent dans le répertoire argocd/example extrait du conteneur ZTP GitOps.

21.11.6. Installation des nouvelles applications ZTP de GitOps

En utilisant le répertoire argocd/deployment extrait, et après avoir vérifié que les applications pointent vers le dépôt Git de votre site, appliquez le contenu complet du répertoire de déploiement. L'application du contenu complet du répertoire garantit que toutes les ressources nécessaires aux applications sont correctement configurées.

Procédure

  1. Pour patcher l'instance ArgoCD dans le cluster hub en utilisant le fichier patch que vous avez précédemment extrait dans le répertoire update/argocd/deployment/, entrez la commande suivante :

    $ oc patch argocd openshift-gitops \
    -n openshift-gitops --type=merge \
    --patch-file update/argocd/deployment/argocd-openshift-gitops-patch.json
  2. Pour appliquer le contenu du répertoire argocd/deployment, entrez la commande suivante :

    $ oc apply -k update/argocd/deployment

21.11.7. Déploiement des changements de configuration de GitOps ZTP

Si des changements de configuration ont été inclus dans la mise à niveau en raison de la mise en œuvre des changements recommandés, le processus de mise à niveau entraîne un ensemble de CR de politiques sur le cluster concentrateur dans l'état Non-Compliant. Avec le conteneur ZTP GitOps v4.10 et les versions ultérieures ztp-site-generate, ces politiques sont définies en mode inform et ne sont pas poussées vers les clusters gérés sans une étape supplémentaire de la part de l'utilisateur. Cela permet de gérer les changements potentiellement perturbateurs apportés aux clusters en termes de moment où les changements sont effectués, par exemple, au cours d'une fenêtre de maintenance, et de nombre de clusters mis à jour simultanément.

Pour déployer les changements, créez un ou plusieurs CR ClusterGroupUpgrade comme indiqué dans la documentation TALM. Le CR doit contenir la liste des politiques Non-Compliant que vous souhaitez appliquer aux clusters gérés, ainsi qu'une liste ou un sélecteur des clusters à inclure dans la mise à jour.

Ressources supplémentaires

21.12. Extension des clusters OpenShift à nœud unique avec GitOps ZTP

Vous pouvez étendre les clusters OpenShift à nœud unique avec GitOps ZTP. Lorsque vous ajoutez des nœuds de travail aux clusters OpenShift à nœud unique, le cluster OpenShift à nœud unique d'origine conserve le rôle de nœud du plan de contrôle. L'ajout de nœuds de travail ne nécessite aucun temps d'arrêt pour le cluster OpenShift à nœud unique existant.

Note

Bien qu'il n'y ait pas de limite spécifiée sur le nombre de nœuds de travail que vous pouvez ajouter à un cluster OpenShift à nœud unique, vous devez réévaluer l'allocation de CPU réservée sur le nœud de plan de contrôle pour les nœuds de travail supplémentaires.

Si vous avez besoin d'un partitionnement de la charge de travail sur le nœud de travail, vous devez déployer et remédier aux stratégies de cluster gérées sur le cluster du concentrateur avant d'installer le nœud. De cette façon, les objets MachineConfig de partitionnement de la charge de travail sont rendus et associés au pool de configuration de la machine worker avant que le flux de travail ZTP de GitOps n'applique le fichier d'allumage MachineConfig au nœud de travailleur.

Il est recommandé de remédier d'abord aux stratégies, puis d'installer le nœud de travail. Si vous créez les manifestes de partitionnement de la charge de travail après avoir installé le nœud de travail, vous devez drainer le nœud manuellement et supprimer tous les modules gérés par les ensembles de démons. Lorsque les ensembles de démons de gestion créent les nouveaux modules, ceux-ci sont soumis au processus de partitionnement de la charge de travail.

Important

L'ajout de nœuds de travail à des clusters OpenShift à nœud unique avec GitOps ZTP est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas de les utiliser en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

Ressources supplémentaires

21.12.1. Application de profils au nœud de travail

Vous pouvez configurer le nœud de travail supplémentaire avec un profil DU.

Vous pouvez appliquer un profil d'unité distribuée (DU) RAN à la grappe de nœuds de travailleur à l'aide des ressources ZTP GitOps communes, de groupe et spécifiques au site PolicyGenTemplate. Le pipeline ZTP GitOps lié à l'application ArgoCD policies comprend les CR suivants que vous trouverez dans le dossier out/argocd/example/policygentemplates lorsque vous extrayez le conteneur ztp-site-generate:

  • common-ranGen.yaml
  • group-du-sno-ranGen.yaml
  • example-sno-site.yaml
  • ns.yaml
  • kustomization.yaml

La configuration du profil d'UD sur le nœud de travail est considérée comme une mise à niveau. Pour lancer le flux de mise à niveau, vous devez mettre à jour les stratégies existantes ou en créer de nouvelles. Ensuite, vous devez créer un CR ClusterGroupUpgrade pour réconcilier les stratégies dans le groupe de clusters.

21.12.2. (Facultatif) Assurer la compatibilité des sélecteurs des démons PTP et SR-IOV

Si le profil DU a été déployé à l'aide du plugin GitOps ZTP version 4.11 ou antérieure, les opérateurs PTP et SR-IOV peuvent être configurés pour placer les démons uniquement sur les nœuds étiquetés comme master. Cette configuration empêche les démons PTP et SR-IOV de fonctionner sur le nœud de travail. Si les sélecteurs de nœuds des démons PTP et SR-IOV sont mal configurés sur votre système, vous devez modifier les démons avant de procéder à la configuration du profil de l'UD travailleur.

Procédure

  1. Vérifiez les paramètres du sélecteur de nœud du démon de l'opérateur PTP sur l'un des clusters de rayons :

    $ oc get ptpoperatorconfig/default -n openshift-ptp -ojsonpath='{.spec}' | jq

    Exemple de sortie pour l'opérateur PTP

    {\i1}"daemonNodeSelector":{\i1}"node-role.kubernetes.io/master":{\i1}"\N- \N"\N"\N"}} 1

    1
    Si le sélecteur de nœud est défini sur master, le rayon a été déployé avec la version du plugin ZTP qui nécessite des modifications.
  2. Vérifiez les paramètres du sélecteur de nœud démon de l'opérateur SR-IOV sur l'un des clusters de rayons :

    $  oc get sriovoperatorconfig/default -n \
    openshift-sriov-network-operator -ojsonpath='{.spec}' | jq

    Exemple de sortie pour l'opérateur SR-IOV

    {\aemonNodeSelector":{"node-role.kubernetes.io/worker":\N"\N"},\N "disableDrain":false,\N "enableInjector":true,\N "enableOperatorWebhook":true} 1

    1
    Si le sélecteur de nœud est défini sur master, le rayon a été déployé avec la version du plugin ZTP qui nécessite des modifications.
  3. Dans la stratégie de groupe, ajoutez les entrées complianceType et spec suivantes :

    spec:
        - fileName: PtpOperatorConfig.yaml
          policyName: "config-policy"
          complianceType: mustonlyhave
          spec:
            daemonNodeSelector:
              node-role.kubernetes.io/worker: ""
        - fileName: SriovOperatorConfig.yaml
          policyName: "config-policy"
          complianceType: mustonlyhave
          spec:
            configDaemonNodeSelector:
              node-role.kubernetes.io/worker: ""
    Important

    La modification du champ daemonNodeSelector entraîne une perte temporaire de synchronisation PTP et une perte de connectivité SR-IOV.

  4. Commencer les changements dans Git, puis pousser vers le dépôt Git surveillé par l'application GitOps ZTP ArgoCD.

21.12.3. Compatibilité des sélecteurs de nœuds PTP et SR-IOV

Les ressources de configuration PTP et les stratégies de nœuds de réseau SR-IOV utilisent node-role.kubernetes.io/master: "" comme sélecteur de nœuds. Si les nœuds de travail supplémentaires ont la même configuration de carte réseau que le nœud du plan de contrôle, les stratégies utilisées pour configurer le nœud du plan de contrôle peuvent être réutilisées pour les nœuds de travail. Toutefois, le sélecteur de nœud doit être modifié pour sélectionner les deux types de nœuds, par exemple avec l'étiquette "node-role.kubernetes.io/worker".

21.12.4. Utilisation des CR PolicyGenTemplate pour appliquer des politiques aux nœuds de travailleur

Vous pouvez créer des règles pour les nœuds de travail.

Procédure

  1. Créez le modèle de politique suivant :

    apiVersion: ran.openshift.io/v1
    kind: PolicyGenTemplate
    metadata:
      name: "example-sno-workers"
      namespace: "example-sno"
    spec:
      bindingRules:
        sites: "example-sno" 1
      mcp: "worker" 2
      sourceFiles:
        - fileName: MachineConfigGeneric.yaml 3
          policyName: "config-policy"
          metadata:
            labels:
              machineconfiguration.openshift.io/role: worker
            name: enable-workload-partitioning
          spec:
            config:
              storage:
                files:
                - contents:
                    source: data:text/plain;charset=utf-8;base64,W2NyaW8ucnVudGltZS53b3JrbG9hZHMubWFuYWdlbWVudF0KYWN0aXZhdGlvbl9hbm5vdGF0aW9uID0gInRhcmdldC53b3JrbG9hZC5vcGVuc2hpZnQuaW8vbWFuYWdlbWVudCIKYW5ub3RhdGlvbl9wcmVmaXggPSAicmVzb3VyY2VzLndvcmtsb2FkLm9wZW5zaGlmdC5pbyIKcmVzb3VyY2VzID0geyAiY3B1c2hhcmVzIiA9IDAsICJjcHVzZXQiID0gIjAtMyIgfQo=
                  mode: 420
                  overwrite: true
                  path: /etc/crio/crio.conf.d/01-workload-partitioning
                  user:
                    name: root
                - contents:
                    source: data:text/plain;charset=utf-8;base64,ewogICJtYW5hZ2VtZW50IjogewogICAgImNwdXNldCI6ICIwLTMiCiAgfQp9Cg==
                  mode: 420
                  overwrite: true
                  path: /etc/kubernetes/openshift-workload-pinning
                  user:
                    name: root
        - fileName: PerformanceProfile.yaml
          policyName: "config-policy"
          metadata:
            name: openshift-worker-node-performance-profile
          spec:
            cpu: 4
              isolated: "4-47"
              reserved: "0-3"
            hugepages:
              defaultHugepagesSize: 1G
              pages:
                - size: 1G
                  count: 32
            realTimeKernel:
              enabled: true
        - fileName: TunedPerformancePatch.yaml
          policyName: "config-policy"
          metadata:
            name: performance-patch-worker
          spec:
            profile:
              - name: performance-patch-worker
                data: |
                  [main]
                  summary=Configuration changes profile inherited from performance created tuned
                  include=openshift-node-performance-openshift-worker-node-performance-profile
                  [bootloader]
                  cmdline_crash=nohz_full=4-47 5
                  [sysctl]
                  kernel.timer_migration=1
                  [scheduler]
                  group.ice-ptp=0:f:10:*:ice-ptp.*
                  [service]
                  service.stalld=start,enable
                  service.chronyd=stop,disable
            recommend:
            - profile: performance-patch-worker
    1
    Les politiques sont appliquées à tous les clusters portant cette étiquette.
    2
    Le champ MCP doit être défini comme worker.
    3
    Ce CR générique MachineConfig est utilisé pour configurer le partitionnement de la charge de travail sur le nœud de travail.
    4
    Les champs cpu.isolated et cpu.reserved doivent être configurés pour chaque plate-forme matérielle.
    5
    L'ensemble d'unités centrales cmdline_crash doit correspondre à l'ensemble d'unités centrales cpu.isolated dans la section PerformanceProfile.

    Un CR générique MachineConfig est utilisé pour configurer le partitionnement de la charge de travail sur le nœud de travail. Vous pouvez générer le contenu des fichiers de configuration crio et kubelet.

  2. Ajoutez le modèle de politique créé au dépôt Git surveillé par l'application ArgoCD policies.
  3. Ajouter la politique dans le fichier kustomization.yaml.
  4. Commencer les changements dans Git, puis pousser vers le dépôt Git surveillé par l'application GitOps ZTP ArgoCD.
  5. Pour remédier aux nouvelles politiques dans votre cluster de rayons, créez une ressource personnalisée TALM :

    $ cat <<EOF | oc apply -f -
    apiVersion: ran.openshift.io/v1alpha1
    kind: ClusterGroupUpgrade
    metadata:
      name: example-sno-worker-policies
      namespace: default
    spec:
      backup: false
      clusters:
      - example-sno
      enable: true
      managedPolicies:
      - group-du-sno-config-policy
      - example-sno-workers-config-policy
      - example-sno-config-policy
      preCaching: false
      remediationStrategy:
        maxConcurrency: 1
    EOF

21.12.5. Ajouter des nœuds de travail à des clusters OpenShift à nœud unique avec GitOps ZTP

Vous pouvez ajouter un ou plusieurs nœuds de travail à des clusters OpenShift à nœud unique existants afin d'augmenter les ressources CPU disponibles dans le cluster.

Conditions préalables

  • Installer et configurer RHACM 2.6 ou version ultérieure dans un cluster de hub bare-metal OpenShift Container Platform 4.11 ou version ultérieure
  • Installer Topology Aware Lifecycle Manager dans le cluster hub
  • Installer Red Hat OpenShift GitOps dans le cluster hub
  • Utilisez l'image du conteneur GitOps ZTP ztp-site-generate version 4.12 ou ultérieure
  • Déployer un cluster OpenShift géré à un seul nœud avec GitOps ZTP
  • Configurer la gestion centrale de l'infrastructure comme décrit dans la documentation RHACM
  • Configurer le DNS desservant le cluster pour résoudre le point de terminaison de l'API interne api-int.<cluster_name>.<base_domain>

Procédure

  1. Si vous avez déployé votre cluster en utilisant le manifeste example-sno.yaml SiteConfig , ajoutez votre nouveau nœud de travail à la liste spec.clusters['example-sno'].nodes:

    nodes:
    - hostName: "example-node2.example.com"
      role: "worker"
      bmcAddress: "idrac-virtualmedia+https://[1111:2222:3333:4444::bbbb:1]/redfish/v1/Systems/System.Embedded.1"
      bmcCredentialsName:
        name: "example-node2-bmh-secret"
      bootMACAddress: "AA:BB:CC:DD:EE:11"
      bootMode: "UEFI"
      nodeNetwork:
        interfaces:
          - name: eno1
            macAddress: "AA:BB:CC:DD:EE:11"
        config:
          interfaces:
            - name: eno1
              type: ethernet
              state: up
              macAddress: "AA:BB:CC:DD:EE:11"
              ipv4:
                enabled: false
              ipv6:
                enabled: true
                address:
                - ip: 1111:2222:3333:4444::1
                  prefix-length: 64
          dns-resolver:
            config:
              search:
              - example.com
              server:
              - 1111:2222:3333:4444::2
          routes:
            config:
            - destination: ::/0
              next-hop-interface: eno1
              next-hop-address: 1111:2222:3333:4444::1
              table-id: 254
  2. Créez un secret d'authentification BMC pour le nouvel hôte, référencé par le champ bmcCredentialsName dans la section spec.nodes de votre fichier SiteConfig:

    apiVersion: v1
    data:
      password: "password"
      username: "username"
    kind: Secret
    metadata:
      name: "example-node2-bmh-secret"
      namespace: example-sno
    type: Opaque
  3. Commencer les changements dans Git, puis pousser vers le dépôt Git qui est surveillé par l'application GitOps ZTP ArgoCD.

    Lorsque l'application ArgoCD cluster se synchronise, deux nouveaux manifestes apparaissent sur le hub cluster généré par le plugin ZTP :

    • BareMetalHost
    • NMStateConfig

      Important

      Le champ cpuset ne doit pas être configuré pour le nœud de travail. Le partitionnement de la charge de travail pour les nœuds de travail est ajouté par le biais de stratégies de gestion une fois l'installation du nœud terminée.

Vérification

Vous pouvez contrôler le processus d'installation de plusieurs manières.

  • Vérifiez que les images de préprovisionnement sont créées en exécutant la commande suivante :

    $ oc get ppimg -n example-sno

    Exemple de sortie

    NAMESPACE       NAME            READY   REASON
    example-sno     example-sno     True    ImageCreated
    example-sno     example-node2   True    ImageCreated

  • Vérifier l'état des hôtes nus :

    $ oc get bmh -n example-sno

    Exemple de sortie

    NAME            STATE          CONSUMER   ONLINE   ERROR   AGE
    example-sno     provisioned               true             69m
    example-node2   provisioning              true             4m50s 1

    1
    L'état provisioning indique que l'amorçage du nœud à partir du support d'installation est en cours.
  • Contrôler en permanence le processus d'installation :

    1. Observez le processus d'installation de l'agent en exécutant la commande suivante :

      $ oc get agent -n example-sno --watch

      Exemple de sortie

      NAME                                   CLUSTER   APPROVED   ROLE     STAGE
      671bc05d-5358-8940-ec12-d9ad22804faa   example-sno   true       master   Done
      [...]
      14fd821b-a35d-9cba-7978-00ddf535ff37   example-sno   true       worker   Starting installation
      14fd821b-a35d-9cba-7978-00ddf535ff37   example-sno   true       worker   Installing
      14fd821b-a35d-9cba-7978-00ddf535ff37   example-sno   true       worker   Writing image to disk
      [...]
      14fd821b-a35d-9cba-7978-00ddf535ff37   example-sno   true       worker   Waiting for control plane
      [...]
      14fd821b-a35d-9cba-7978-00ddf535ff37   example-sno   true       worker   Rebooting
      14fd821b-a35d-9cba-7978-00ddf535ff37   example-sno   true       worker   Done

    2. Lorsque l'installation du nœud de travailleur est terminée, les certificats du nœud de travailleur sont approuvés automatiquement. À ce stade, le nœud de travailleur apparaît dans l'état ManagedClusterInfo. Exécutez la commande suivante pour voir l'état :

      $ oc get managedclusterinfo/example-sno -n example-sno -o \
      jsonpath='{range .status.nodeList[*]}{.name}{"\t"}{.conditions}{"\t"}{.labels}{"\n"}{end}'

      Exemple de sortie

      example-sno	[{"status":"True","type":"Ready"}]	{"node-role.kubernetes.io/master":"","node-role.kubernetes.io/worker":""}
      example-node2	[{"status":"True","type":"Ready"}]	{"node-role.kubernetes.io/worker":""}

21.13. Mise en cache préalable des images pour les déploiements OpenShift à nœud unique

Dans les environnements où la bande passante est limitée et où vous utilisez la solution GitOps zero touch provisioning (ZTP) pour déployer un grand nombre de clusters, vous souhaitez éviter de télécharger toutes les images nécessaires au démarrage et à l'installation d'OpenShift Container Platform. La bande passante limitée sur les sites OpenShift distants à un seul nœud peut entraîner des délais de déploiement trop longs. L'outil factory-precaching-cli vous permet de pré-stager les serveurs avant de les envoyer au site distant pour le provisionnement ZTP.

L'outil factory-precaching-cli effectue les opérations suivantes :

  • Télécharge l'image RHCOS rootfs nécessaire au démarrage de l'ISO minimale.
  • Crée une partition à partir du disque d'installation sous le nom de data.
  • Formate le disque en xfs.
  • Crée une partition de données GUID Partition Table (GPT) à la fin du disque, la taille de la partition étant configurable par l'outil.
  • Copie les images de conteneurs nécessaires à l'installation d'OpenShift Container Platform.
  • Copie les images de conteneurs requises par ZTP pour installer OpenShift Container Platform.
  • Facultatif : Copie les opérateurs du jour 2 dans la partition.
Important

L'outil factory-precaching-cli est une fonctionnalité d'aperçu technologique uniquement. Les fonctionnalités de l'aperçu technologique ne sont pas prises en charge par les accords de niveau de service (SLA) de production de Red Hat et peuvent ne pas être complètes sur le plan fonctionnel. Red Hat ne recommande pas leur utilisation en production. Ces fonctionnalités offrent un accès anticipé aux fonctionnalités des produits à venir, ce qui permet aux clients de tester les fonctionnalités et de fournir un retour d'information pendant le processus de développement.

Pour plus d'informations sur la portée de l'assistance des fonctionnalités de l'aperçu technologique de Red Hat, voir Portée de l'assistance des fonctionnalités de l'aperçu technologique.

21.13.1. Obtenir l'outil factory-precaching-cli

Le binaire Go de l'outil factory-precaching-cli est disponible publiquement dans l'image conteneur des outils Telco RAN. Le binaire Go de l'outil factory-precaching-cli dans l'image du conteneur est exécuté sur le serveur exécutant une image RHCOS live à l'aide de podman. Si vous travaillez dans un environnement déconnecté ou si vous disposez d'un registre privé, vous devez y copier l'image afin de pouvoir la télécharger sur le serveur.

Procédure

  • Tirez l'image de l'outil factory-precaching-cli en exécutant la commande suivante :

    # podman pull quay.io/openshift-kni/telco-ran-tools:latest

Vérification

  • Pour vérifier que l'outil est disponible, interrogez la version actuelle du binaire Go de l'outil factory-precaching-cli :

    # podman run quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli -v

    Exemple de sortie

    factory-precaching-cli version 20221018.120852+main.feecf17

21.13.2. Démarrage à partir d'une image live du système d'exploitation

Vous pouvez utiliser l'outil factory-precaching-cli pour démarrer les serveurs lorsqu'un seul disque est disponible et qu'un lecteur de disque externe ne peut pas être connecté au serveur.

Avertissement

RHCOS exige que le disque ne soit pas utilisé lorsqu'il est sur le point d'être écrit avec une image RHCOS.

En fonction du matériel du serveur, vous pouvez monter l'ISO live RHCOS sur le serveur vierge en utilisant l'une des méthodes suivantes :

  • Utilisation de l'outil Dell RACADM sur un serveur Dell.
  • Utilisation de l'outil HPONCFG sur un serveur HP.
  • Utilisation de l'API Redfish BMC.
Note

Il est recommandé d'automatiser la procédure de montage. Pour automatiser la procédure, vous devez extraire les images requises et les héberger sur un serveur HTTP local.

Conditions préalables

  • Vous avez mis l'hôte sous tension.
  • Vous disposez d'une connectivité réseau avec l'hôte.
Procédure

Cet exemple de procédure utilise l'API Redfish BMC pour monter l'ISO live RHCOS.

  1. Monter l'ISO live RHCOS :

    1. Vérifier l'état des supports virtuels :

      $ curl --globoff -H "Content-Type: application/json" -H \
      "Accept: application/json" -k -X GET --user ${username_password} \
      https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1 | python -m json.tool
    2. Monter le fichier ISO en tant que support virtuel :

      $ curl --globoff -L -w "%{http_code} %{url_effective}\\n" -ku ${username_password} -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Image": "http://[$HTTPd_IP]/RHCOS-live.iso"}' -X POST https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1/Actions/VirtualMedia.InsertMedia
    3. Définir l'ordre de démarrage pour démarrer une seule fois à partir du support virtuel :

      $ curl --globoff  -L -w "%{http_code} %{url_effective}\\n"  -ku ${username_password}  -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Boot":{ "BootSourceOverrideEnabled": "Once", "BootSourceOverrideTarget": "Cd", "BootSourceOverrideMode": "UEFI"}}' -X PATCH https://$BMC_ADDRESS/redfish/v1/Systems/Self
  2. Redémarrez et assurez-vous que le serveur démarre à partir d'un support virtuel.

Ressources supplémentaires

21.13.3. Partitionnement du disque

Pour exécuter le processus complet de pré-cache, vous devez démarrer à partir d'une ISO vivante et utiliser l'outil factory-precaching-cli à partir d'une image de conteneur pour partitionner et pré-cacher tous les artefacts nécessaires.

Un live ISO ou RHCOS live ISO est nécessaire car le disque ne doit pas être utilisé lorsque le système d'exploitation (RHCOS) est écrit sur le périphérique pendant le provisionnement. Cette procédure permet également d'activer des serveurs à disque unique.

Conditions préalables

  • Vous avez un disque qui n'est pas partitionné.
  • Vous avez accès à l'image quay.io/openshift-kni/telco-ran-tools:latest.
  • Vous disposez de suffisamment d'espace de stockage pour installer OpenShift Container Platform et mettre en pré-cache les images requises.

Procédure

  1. Vérifier que le disque est dégagé :

    # lsblk

    Exemple de sortie

    NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0     7:0    0  93.8G  0 loop /run/ephemeral
    loop1     7:1    0 897.3M  1 loop /sysroot
    sr0      11:0    1   999M  0 rom  /run/media/iso
    nvme0n1 259:1    0   1.5T  0 disk

  2. Effacer toutes les signatures de système de fichiers, de RAID ou de table de partition de l'appareil :

    # wipefs -a /dev/nvme0n1

    Exemple de sortie

    /dev/nvme0n1: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
    /dev/nvme0n1: 8 bytes were erased at offset 0x1749a955e00 (gpt): 45 46 49 20 50 41 52 54
    /dev/nvme0n1: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa

Important

L'outil échoue si le disque n'est pas vide car il utilise la partition numéro 1 du périphérique pour la mise en cache des artefacts.

21.13.3.1. Création de la partition

Une fois que le périphérique est prêt, vous créez une partition unique et une table de partition GPT. La partition est automatiquement étiquetée comme data et créée à la fin du périphérique. Dans le cas contraire, la partition sera remplacée par la partition coreos-installer.

Important

L'adresse coreos-installer exige que la partition soit créée à la fin du périphérique et qu'elle soit étiquetée comme data. Ces deux conditions sont nécessaires pour sauvegarder la partition lors de l'écriture de l'image RHCOS sur le disque.

Conditions préalables

  • Le conteneur doit fonctionner en tant que privileged en raison du formatage des périphériques hôtes.
  • Vous devez monter le dossier /dev pour que le processus puisse être exécuté à l'intérieur du conteneur.

Procédure

Dans l'exemple suivant, la taille de la partition est de 250 GiB afin de permettre la mise en cache préalable du profil de l'UD pour les opérateurs du jour 2.

  1. Exécutez le conteneur en tant que privileged et partitionnez le disque :

    # podman run -v /dev:/dev --privileged \
    --rm quay.io/openshift-kni/telco-ran-tools:latest -- \
    factory-precaching-cli partition \ 1
    -d /dev/nvme0n1 \ 2
    -s 250 3
    1
    Spécifie la fonction de partitionnement de l'outil factory-precaching-cli.
    2
    Définit le répertoire racine sur le disque.
    3
    Définit la taille du disque en Go.
  2. Vérifier les informations de stockage :

    # lsblk

    Exemple de sortie

    NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0         7:0    0  93.8G  0 loop /run/ephemeral
    loop1         7:1    0 897.3M  1 loop /sysroot
    sr0          11:0    1   999M  0 rom  /run/media/iso
    nvme0n1     259:1    0   1.5T  0 disk
    └─nvme0n1p1 259:3    0   250G  0 part

Vérification

Vous devez vérifier que les conditions suivantes sont remplies :

  • Le périphérique possède une table de partition GPT
  • La partition utilise les secteurs les plus récents de l'appareil.
  • La partition est correctement étiquetée comme data.

Interroger l'état du disque pour vérifier que le disque est partitionné comme prévu :

# gdisk -l /dev/nvme0n1

Exemple de sortie

GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/nvme0n1: 3125627568 sectors, 1.5 TiB
Model: Dell Express Flash PM1725b 1.6TB SFF
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): CB5A9D44-9B3C-4174-A5C1-C64957910B61
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 3125627534
Partitions will be aligned on 2048-sector boundaries
Total free space is 2601338846 sectors (1.2 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1      2601338880      3125627534   250.0 GiB   8300  data

21.13.3.2. Montage de la cloison

Après avoir vérifié que le disque est correctement partitionné, vous pouvez monter le périphérique sur /mnt.

Important

Il est recommandé de monter l'appareil sur /mnt car ce point de montage est utilisé lors de la préparation du ZTP.

  1. Vérifiez que la partition est formatée comme xfs:

    # lsblk -f /dev/nvme0n1

    Exemple de sortie

    NAME        FSTYPE LABEL UUID                                 MOUNTPOINT
    nvme0n1
    └─nvme0n1p1 xfs          1bee8ea4-d6cf-4339-b690-a76594794071

  2. Monter la partition :

    # mount /dev/nvme0n1p1 /mnt/

Vérification

  • Vérifiez que la partition est montée :

    # lsblk

    Exemple de sortie

    NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0         7:0    0  93.8G  0 loop /run/ephemeral
    loop1         7:1    0 897.3M  1 loop /sysroot
    sr0          11:0    1   999M  0 rom  /run/media/iso
    nvme0n1     259:1    0   1.5T  0 disk
    └─nvme0n1p1 259:2    0   250G  0 part /var/mnt 1

    1
    Le point de montage est /var/mnt car le dossier /mnt dans le RHCOS est un lien vers /var/mnt.

21.13.4. Téléchargement des images

L'outil factory-precaching-cli vous permet de télécharger les images suivantes sur votre serveur partitionné :

  • Images de la plate-forme OpenShift Container
  • Images de l'opérateur incluses dans le profil de l'unité distribuée (DU) pour les sites RAN 5G
  • Images d'opérateurs provenant de registres déconnectés
Note

La liste des images d'opérateurs disponibles peut varier selon les versions d'OpenShift Container Platform.

21.13.4.1. Téléchargement avec des travailleurs parallèles

L'outil factory-precaching-cli utilise des travailleurs parallèles pour télécharger plusieurs images simultanément. Vous pouvez configurer le nombre de travailleurs avec l'option --parallel ou -p. Le nombre par défaut est fixé à 80 % des processeurs disponibles sur le serveur.

Note

Votre shell de connexion peut être limité à un sous-ensemble de CPU, ce qui réduit les CPU disponibles pour le conteneur. Pour lever cette restriction, vous pouvez faire précéder vos commandes de taskset 0xffffffff, par exemple :

# taskset 0xffffffff podman run --rm quay.io/openshift-kni/telco-ran-tools:latest factory-precaching-cli download --help

21.13.4.2. Préparation du téléchargement des images OpenShift Container Platform

Pour télécharger des images de conteneurs OpenShift Container Platform, vous devez connaître la version du moteur multicluster (MCE). Lorsque vous utilisez le drapeau --du-profile, vous devez également spécifier la version de Red Hat Advanced Cluster Management (RHACM) fonctionnant dans le hub cluster qui va provisionner l'OpenShift à nœud unique.

Conditions préalables

  • Vous avez installé RHACM et MCE.
  • Vous avez partitionné le périphérique de stockage.
  • Vous disposez de suffisamment d'espace pour les images sur le périphérique partitionné.
  • Vous avez connecté le serveur bare-metal à l'Internet.
  • Vous avez un secret de tirage valide.

Procédure

  1. Vérifiez la version de RHACM et de MCE en exécutant les commandes suivantes dans le cluster hub :

    $ oc get csv -A | grep -i advanced-cluster-management

    Exemple de sortie

    open-cluster-management                            advanced-cluster-management.v2.6.3           Advanced Cluster Management for Kubernetes   2.6.3                 advanced-cluster-management.v2.6.3                Succeeded

    $ oc get csv -A | grep -i multicluster-engine

    Exemple de sortie

    multicluster-engine                                cluster-group-upgrades-operator.v0.0.3       cluster-group-upgrades-operator              0.0.3                                                                   Pending
    multicluster-engine                                multicluster-engine.v2.1.4                   multicluster engine for Kubernetes           2.1.4                 multicluster-engine.v2.0.3                        Succeeded
    multicluster-engine                                openshift-gitops-operator.v1.5.7             Red Hat OpenShift GitOps                     1.5.7                 openshift-gitops-operator.v1.5.6-0.1664915551.p   Succeeded
    multicluster-engine                                openshift-pipelines-operator-rh.v1.6.4       Red Hat OpenShift Pipelines                  1.6.4                 openshift-pipelines-operator-rh.v1.6.3            Succeeded

  2. Pour accéder au registre des conteneurs, copiez un secret d'extraction valide sur le serveur à installer :

    1. Créez le dossier .docker:

      $ mkdir /root/.docker
    2. Copiez le tirage valide du fichier config.json dans le dossier .docker/ précédemment créé :

      $ cp config.json /root/.docker/config.json 1
      1
      /root/.docker/config.json est le chemin par défaut où podman vérifie les identifiants de connexion au registre.
Note

Si vous utilisez un registre différent pour extraire les artefacts requis, vous devez copier le secret d'extraction approprié. Si le registre local utilise TLS, vous devez également inclure les certificats du registre.

21.13.4.3. Télécharger les images d'OpenShift Container Platform

L'outil factory-precaching-cli permet de pré-cacher toutes les images de conteneurs nécessaires au provisionnement d'une version spécifique d'OpenShift Container Platform.

Procédure

  • Pré-cachez la version en exécutant la commande suivante :

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools -- \
       factory-precaching-cli download \ 1
       -r 4.12.0 \ 2
       --acm-version 2.6.3 \ 3
       --mce-version 2.1.4 \ 4
       -f /mnt \ 5
       --img quay.io/custom/repository 6
    1
    Spécifie la fonction de téléchargement de l'outil factory-precaching-cli.
    2
    Définit la version d'OpenShift Container Platform.
    3
    Définit la version de RHACM.
    4
    Définit la version du MCE.
    5
    Définit le dossier dans lequel vous souhaitez télécharger les images sur le disque.
    6
    Facultatif. Définit le référentiel dans lequel vous stockez vos images supplémentaires. Ces images sont téléchargées et mises en cache sur le disque.

    Exemple de sortie

    Generated /mnt/imageset.yaml
    Generating list of pre-cached artifacts...
    Processing artifact [1/176]: ocp-v4.0-art-dev@sha256_6ac2b96bf4899c01a87366fd0feae9f57b1b61878e3b5823da0c3f34f707fbf5
    Processing artifact [2/176]: ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c
    Processing artifact [3/176]: ocp-v4.0-art-dev@sha256_a480390e91b1c07e10091c3da2257180654f6b2a735a4ad4c3b69dbdb77bbc06
    Processing artifact [4/176]: ocp-v4.0-art-dev@sha256_ecc5d8dbd77e326dba6594ff8c2d091eefbc4d90c963a9a85b0b2f0e6155f995
    Processing artifact [5/176]: ocp-v4.0-art-dev@sha256_274b6d561558a2f54db08ea96df9892315bb773fc203b1dbcea418d20f4c7ad1
    Processing artifact [6/176]: ocp-v4.0-art-dev@sha256_e142bf5020f5ca0d1bdda0026bf97f89b72d21a97c9cc2dc71bf85050e822bbf
    ...
    Processing artifact [175/176]: ocp-v4.0-art-dev@sha256_16cd7eda26f0fb0fc965a589e1e96ff8577e560fcd14f06b5fda1643036ed6c8
    Processing artifact [176/176]: ocp-v4.0-art-dev@sha256_cf4d862b4a4170d4f611b39d06c31c97658e309724f9788e155999ae51e7188f
    ...
    Summary:
    
    Release:                            4.12.0
    Hub Version:                        2.6.3
    ACM Version:                        2.6.3
    MCE Version:                        2.1.4
    Include DU Profile:                 No
    Workers:                            83

Vérification

  • Vérifiez que toutes les images sont compressées dans le dossier cible du serveur :

    $ ls -l /mnt 1
    1
    Il est recommandé de mettre les images en pré-cache dans le dossier /mnt.

    Exemple de sortie

    -rw-r--r--. 1 root root  136352323 Oct 31 15:19 ocp-v4.0-art-dev@sha256_edec37e7cd8b1611d0031d45e7958361c65e2005f145b471a8108f1b54316c07.tgz
    -rw-r--r--. 1 root root  156092894 Oct 31 15:33 ocp-v4.0-art-dev@sha256_ee51b062b9c3c9f4fe77bd5b3cc9a3b12355d040119a1434425a824f137c61a9.tgz
    -rw-r--r--. 1 root root  172297800 Oct 31 15:29 ocp-v4.0-art-dev@sha256_ef23d9057c367a36e4a5c4877d23ee097a731e1186ed28a26c8d21501cd82718.tgz
    -rw-r--r--. 1 root root  171539614 Oct 31 15:23 ocp-v4.0-art-dev@sha256_f0497bb63ef6834a619d4208be9da459510df697596b891c0c633da144dbb025.tgz
    -rw-r--r--. 1 root root  160399150 Oct 31 15:20 ocp-v4.0-art-dev@sha256_f0c339da117cde44c9aae8d0bd054bceb6f19fdb191928f6912a703182330ac2.tgz
    -rw-r--r--. 1 root root  175962005 Oct 31 15:17 ocp-v4.0-art-dev@sha256_f19dd2e80fb41ef31d62bb8c08b339c50d193fdb10fc39cc15b353cbbfeb9b24.tgz
    -rw-r--r--. 1 root root  174942008 Oct 31 15:33 ocp-v4.0-art-dev@sha256_f1dbb81fa1aa724e96dd2b296b855ff52a565fbef003d08030d63590ae6454df.tgz
    -rw-r--r--. 1 root root  246693315 Oct 31 15:31 ocp-v4.0-art-dev@sha256_f44dcf2c94e4fd843cbbf9b11128df2ba856cd813786e42e3da1fdfb0f6ddd01.tgz
    -rw-r--r--. 1 root root  170148293 Oct 31 15:00 ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c.tgz
    -rw-r--r--. 1 root root  168899617 Oct 31 15:16 ocp-v4.0-art-dev@sha256_f5099b0989120a8d08a963601214b5c5cb23417a707a8624b7eb52ab788a7f75.tgz
    -rw-r--r--. 1 root root  176592362 Oct 31 15:05 ocp-v4.0-art-dev@sha256_f68c0e6f5e17b0b0f7ab2d4c39559ea89f900751e64b97cb42311a478338d9c3.tgz
    -rw-r--r--. 1 root root  157937478 Oct 31 15:37 ocp-v4.0-art-dev@sha256_f7ba33a6a9db9cfc4b0ab0f368569e19b9fa08f4c01a0d5f6a243d61ab781bd8.tgz
    -rw-r--r--. 1 root root  145535253 Oct 31 15:26 ocp-v4.0-art-dev@sha256_f8f098911d670287826e9499806553f7a1dd3e2b5332abbec740008c36e84de5.tgz
    -rw-r--r--. 1 root root  158048761 Oct 31 15:40 ocp-v4.0-art-dev@sha256_f914228ddbb99120986262168a705903a9f49724ffa958bb4bf12b2ec1d7fb47.tgz
    -rw-r--r--. 1 root root  167914526 Oct 31 15:37 ocp-v4.0-art-dev@sha256_fa3ca9401c7a9efda0502240aeb8d3ae2d239d38890454f17fe5158b62305010.tgz
    -rw-r--r--. 1 root root  164432422 Oct 31 15:24 ocp-v4.0-art-dev@sha256_fc4783b446c70df30b3120685254b40ce13ba6a2b0bf8fb1645f116cf6a392f1.tgz
    -rw-r--r--. 1 root root  306643814 Oct 31 15:11 troubleshoot@sha256_b86b8aea29a818a9c22944fd18243fa0347c7a2bf1ad8864113ff2bb2d8e0726.tgz

21.13.4.4. Téléchargement des images de l'opérateur

Vous pouvez également mettre en pré-cache les opérateurs Day-2 utilisés dans la configuration du cluster 5G Radio Access Network (RAN) Distributed Unit (DU). Les opérateurs Day-2 dépendent de la version installée d'OpenShift Container Platform.

Important

Vous devez inclure les versions du hub RHACM et de l'opérateur MCE en utilisant les drapeaux --acm-version et --mce-version afin que l'outil factory-precaching-cli puisse pré-cacher les images de conteneurs appropriées pour les opérateurs RHACM et MCE.

Procédure

  • Prémettre en cache les images de l'opérateur :

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ 1
       -r 4.12.0 \ 2
       --acm-version 2.6.3 \ 3
       --mce-version 2.1.4 \ 4
       -f /mnt \ 5
       --img quay.io/custom/repository 6
       --du-profile -s 7
    1
    Spécifie la fonction de téléchargement de l'outil factory-precaching-cli.
    2
    Définit la version d'OpenShift Container Platform.
    3
    Définit la version de RHACM.
    4
    Définit la version du MCE.
    5
    Définit le dossier dans lequel vous souhaitez télécharger les images sur le disque.
    6
    Facultatif. Définit le référentiel dans lequel vous stockez vos images supplémentaires. Ces images sont téléchargées et mises en cache sur le disque.
    7
    Spécifie la mise en cache préalable des opérateurs inclus dans la configuration de l'UD.

    Exemple de sortie

    Generated /mnt/imageset.yaml
    Generating list of pre-cached artifacts...
    Processing artifact [1/379]: ocp-v4.0-art-dev@sha256_7753a8d9dd5974be8c90649aadd7c914a3d8a1f1e016774c7ac7c9422e9f9958
    Processing artifact [2/379]: ose-kube-rbac-proxy@sha256_c27a7c01e5968aff16b6bb6670423f992d1a1de1a16e7e260d12908d3322431c
    Processing artifact [3/379]: ocp-v4.0-art-dev@sha256_370e47a14c798ca3f8707a38b28cfc28114f492bb35fe1112e55d1eb51022c99
    ...
    Processing artifact [378/379]: ose-local-storage-operator@sha256_0c81c2b79f79307305e51ce9d3837657cf9ba5866194e464b4d1b299f85034d0
    Processing artifact [379/379]: multicluster-operators-channel-rhel8@sha256_c10f6bbb84fe36e05816e873a72188018856ad6aac6cc16271a1b3966f73ceb3
    ...
    Summary:
    
    Release:                            4.12.0
    Hub Version:                        2.6.3
    ACM Version:                        2.6.3
    MCE Version:                        2.1.4
    Include DU Profile:                 Yes
    Workers:                            83

21.13.4.5. Mise en cache d'images personnalisées dans des environnements déconnectés

L'argument --generate-imageset arrête l'outil factory-precaching-cli après que la ressource personnalisée (CR) ImageSetConfiguration a été générée. Cela vous permet de personnaliser la CR ImageSetConfiguration avant de télécharger des images. Après avoir personnalisé la CR, vous pouvez utiliser l'argument --skip-imageset pour télécharger les images que vous avez spécifiées dans la CR ImageSetConfiguration.

Vous pouvez personnaliser le ImageSetConfiguration CR de la manière suivante :

  • Ajouter des opérateurs et des images supplémentaires
  • Supprimer les opérateurs et les images supplémentaires
  • Modifier les sources de l'opérateur et du catalogue pour les remplacer par des registres locaux ou déconnectés

Procédure

  1. Prémettre les images en cache :

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ 1
       -r 4.12.0 \ 2
       --acm-version 2.6.3 \ 3
       --mce-version 2.1.4 \ 4
       -f /mnt \ 5
       --img quay.io/custom/repository 6
       --du-profile -s \ 7
       --generate-imageset 8
    1
    Spécifie la fonction de téléchargement de l'outil factory-precaching-cli.
    2
    Définit la version d'OpenShift Container Platform.
    3
    Définit la version de RHACM.
    4
    Définit la version du MCE.
    5
    Définit le dossier dans lequel vous souhaitez télécharger les images sur le disque.
    6
    Facultatif. Définit le référentiel dans lequel vous stockez vos images supplémentaires. Ces images sont téléchargées et mises en cache sur le disque.
    7
    Spécifie la mise en cache préalable des opérateurs inclus dans la configuration de l'UD.
    8
    L'argument --generate-imageset génère uniquement le CR ImageSetConfiguration, ce qui vous permet de personnaliser le CR.

    Exemple de sortie

    Generated /mnt/imageset.yaml

    Exemple ImageSetConfiguration CR

    apiVersion: mirror.openshift.io/v1alpha2
    kind: ImageSetConfiguration
    mirror:
      platform:
        channels:
        - name: stable-4.12
          minVersion: 4.12.0 1
          maxVersion: 4.12.0
      additionalImages:
        - name: quay.io/custom/repository
      operators:
        - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.12
          packages:
            - name: advanced-cluster-management 2
              channels:
                 - name: 'release-2.6'
                   minVersion: 2.6.3
                   maxVersion: 2.6.3
            - name: multicluster-engine 3
              channels:
                 - name: 'stable-2.1'
                   minVersion: 2.1.4
                   maxVersion: 2.1.4
            - name: local-storage-operator 4
              channels:
                - name: 'stable'
            - name: ptp-operator 5
              channels:
                - name: 'stable'
            - name: sriov-network-operator 6
              channels:
                - name: 'stable'
            - name: cluster-logging 7
              channels:
                - name: 'stable'
            - name: lvms-operator 8
              channels:
                - name: 'stable-4.12'
            - name: amq7-interconnect-operator 9
              channels:
                - name: '1.10.x'
            - name: bare-metal-event-relay 10
              channels:
                - name: 'stable'
        - catalog: registry.redhat.io/redhat/certified-operator-index:v4.12
          packages:
            - name: sriov-fec 11
              channels:
                - name: 'stable'

    1
    Les versions de la plate-forme correspondent aux versions transmises à l'outil.
    2 3
    Les versions des opérateurs RHACM et MCE correspondent aux versions transmises à l'outil.
    4 5 6 7 8 9 10 11
    Le CR contient tous les opérateurs DU spécifiés.
  2. Personnaliser la ressource du catalogue dans le CR :

    apiVersion: mirror.openshift.io/v1alpha2
    kind: ImageSetConfiguration
    mirror:
      platform:
    [...]
      operators:
        - catalog: eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/certified-operator-index:v4.12
          packages:
            - name: sriov-fec
              channels:
                - name: 'stable'

    Lorsque vous téléchargez des images en utilisant un registre local ou déconnecté, vous devez d'abord ajouter des certificats pour les registres dont vous voulez extraire le contenu.

  3. Pour éviter toute erreur, copiez le certificat de registre dans votre serveur :

    # cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
  4. Ensuite, mettez à jour la liste de confiance des certificats :

    # update-ca-trust
  5. Monter le dossier de l'hôte /etc/pki dans l'image factory-cli :

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- \
    factory-precaching-cli download \ 1
       -r 4.12.0 \ 2
       --acm-version 2.6.3 \ 3
       --mce-version 2.1.4 \ 4
       -f /mnt \ 5
       --img quay.io/custom/repository 6
       --du-profile -s \ 7
       --skip-imageset 8
    1
    Spécifie la fonction de téléchargement de l'outil factory-precaching-cli.
    2
    Définit la version d'OpenShift Container Platform.
    3
    Définit la version de RHACM.
    4
    Définit la version du MCE.
    5
    Définit le dossier dans lequel vous souhaitez télécharger les images sur le disque.
    6
    Facultatif. Définit le référentiel dans lequel vous stockez vos images supplémentaires. Ces images sont téléchargées et mises en cache sur le disque.
    7
    Spécifie la mise en cache préalable des opérateurs inclus dans la configuration de l'UD.
    8
    L'argument --skip-imageset vous permet de télécharger les images que vous avez spécifiées dans votre CR personnalisé ImageSetConfiguration.
  6. Télécharger les images sans générer un nouveau CR imageSetConfiguration:

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download -r 4.12.0 \
    --acm-version 2.6.3 --mce-version 2.1.4 -f /mnt \
    --img quay.io/custom/repository \
    --du-profile -s \
    --skip-imageset

Ressources supplémentaires

21.13.5. Mise en cache préalable des images dans ZTP

Le manifeste SiteConfig définit comment un cluster OpenShift doit être installé et configuré. Dans le flux de travail de provisionnement ZTP, l'outil factory-precaching-cli requiert les champs supplémentaires suivants dans le manifeste SiteConfig:

  • clusters.ignitionConfigOverride
  • nodes.installerArgs
  • nodes.ignitionConfigOverride

Exemple de SiteConfig avec des champs supplémentaires

apiVersion: ran.openshift.io/v1
kind: SiteConfig
metadata:
  name: "example-5g-lab"
  namespace: "example-5g-lab"
spec:
  baseDomain: "example.domain.redhat.com"
  pullSecretRef:
    name: "assisted-deployment-pull-secret"
  clusterImageSetNameRef: "img4.9.10-x86-64-appsub"
  sshPublicKey: "ssh-rsa ..."
  clusters:
  - clusterName: "sno-worker-0"
    clusterImageSetNameRef: "eko4-img4.11.5-x86-64-appsub"
    clusterLabels:
      group-du-sno: ""
      common-411: true
      sites : "example-5g-lab"
      vendor: "OpenShift"
    clusterNetwork:
      - cidr: 10.128.0.0/14
        hostPrefix: 23
    machineNetwork:
      - cidr: 10.19.32.192/26
    serviceNetwork:
      - 172.30.0.0/16
    networkType: "OVNKubernetes"
    additionalNTPSources:
      - clock.corp.redhat.com
    ignitionConfigOverride: '{"ignition":{"version":"3.1.0"},"systemd":{"units":[{"name":"var-mnt.mount","enabled":true,"contents":"[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-images.service\nBindsTo=precache-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-images.service"},{"name":"precache-images.service","enabled":true,"contents":"[Unit]\nDescription=Extracts the precached images in discovery stage\nAfter=var-mnt.mount\nBefore=agent.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ai.sh\n#TimeoutStopSec=30\n\n[Install]\nWantedBy=multi-user.target default.target\nWantedBy=agent.service"}]},"storage":{"files":[{"overwrite":true,"path":"/usr/local/bin/extract-ai.sh","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ai-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0A%23%20workaround%20while%20https%3A%2F%2Fgithub.com%2Fopenshift%2Fassisted-service%2Fpull%2F3546%0A%23cp%20%2Fvar%2Fmnt%2Fmodified-rhcos-4.10.3-x86_64-metal.x86_64.raw.gz%20%2Fvar%2Ftmp%2F.%0A%0Aexit%200"}},{"overwrite":true,"path":"/usr/local/bin/agent-fix-bz1964591","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fusr%2Fbin%2Fsh%0A%0A%23%20This%20script%20is%20a%20workaround%20for%20bugzilla%201964591%20where%20symlinks%20inside%20%2Fvar%2Flib%2Fcontainers%2F%20get%0A%23%20corrupted%20under%20some%20circumstances.%0A%23%0A%23%20In%20order%20to%20let%20agent.service%20start%20correctly%20we%20are%20checking%20here%20whether%20the%20requested%0A%23%20container%20image%20exists%20and%20in%20case%20%22podman%20images%22%20returns%20an%20error%20we%20try%20removing%20the%20faulty%0A%23%20image.%0A%23%0A%23%20In%20such%20a%20scenario%20agent.service%20will%20detect%20the%20image%20is%20not%20present%20and%20pull%20it%20again.%20In%20case%0A%23%20the%20image%20is%20present%20and%20can%20be%20detected%20correctly%2C%20no%20any%20action%20is%20required.%0A%0AIMAGE%3D%24%28echo%20%241%20%7C%20sed%20%27s%2F%3A.%2A%2F%2F%27%29%0Apodman%20image%20exists%20%24IMAGE%20%7C%7C%20echo%20%22already%20loaded%22%20%7C%7C%20echo%20%22need%20to%20be%20pulled%22%0A%23podman%20images%20%7C%20grep%20%24IMAGE%20%7C%7C%20podman%20rmi%20--force%20%241%20%7C%7C%20true"}}]}}'
    nodes:
      - hostName: "snonode.sno-worker-0.example.domain.redhat.com"
        role: "master"
        bmcAddress: "idrac-virtualmedia+https://10.19.28.53/redfish/v1/Systems/System.Embedded.1"
        bmcCredentialsName:
          name: "worker0-bmh-secret"
        bootMACAddress: "e4:43:4b:bd:90:46"
        bootMode: "UEFI"
        rootDeviceHints:
          deviceName: /dev/nvme0n1
        cpuset: "0-1,40-41"
        installerArgs: '["--save-partlabel", "data"]'
        ignitionConfigOverride: '{"ignition":{"version":"3.1.0"},"systemd":{"units":[{"name":"var-mnt.mount","enabled":true,"contents":"[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-ocp-images.service\nBindsTo=precache-ocp-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-ocp-images.service"},{"name":"precache-ocp-images.service","enabled":true,"contents":"[Unit]\nDescription=Extracts the precached OCP images into containers storage\nAfter=var-mnt.mount\nBefore=machine-config-daemon-pull.service nodeip-configuration.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ocp.sh\nTimeoutStopSec=60\n\n[Install]\nWantedBy=multi-user.target"}]},"storage":{"files":[{"overwrite":true,"path":"/usr/local/bin/extract-ocp.sh","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ocp-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0Aexit%200"}}]}}'
        nodeNetwork:
          config:
            interfaces:
              - name: ens1f0
                type: ethernet
                state: up
                macAddress: "AA:BB:CC:11:22:33"
                ipv4:
                  enabled: true
                  dhcp: true
                ipv6:
                  enabled: false
          interfaces:
            - name: "ens1f0"
              macAddress: "AA:BB:CC:11:22:33"

21.13.5.1. Comprendre le champ clusters.ignitionConfigOverride

Le champ clusters.ignitionConfigOverride ajoute une configuration au format Ignition pendant la phase de découverte ZTP. La configuration inclut les services systemd dans l'ISO monté sur un support virtuel. De cette manière, les scripts font partie de l'ISO live RHCOS de découverte et peuvent être utilisés pour charger les images de l'installateur assisté (AI).

systemd services
Les services systemd sont var-mnt.mount et precache-images.services. Le service precache-images.service dépend de la partition de disque qui doit être montée dans /var/mnt par l'unité var-mnt.mount. Le service appelle un script appelé extract-ai.sh.
extract-ai.sh
Le script extract-ai.sh extrait et charge les images requises de la partition du disque vers le conteneur de stockage local. Lorsque le script se termine avec succès, vous pouvez utiliser les images localement.
agent-fix-bz1964591
Le script agent-fix-bz1964591 est une solution de contournement pour un problème lié à AI. Pour empêcher AI de supprimer les images, ce qui peut obliger agent.service à les extraire à nouveau du registre, le script agent-fix-bz1964591 vérifie si les images de conteneur demandées existent.

21.13.5.2. Comprendre le champ nodes.installerArgs

Le champ nodes.installerArgs vous permet de configurer la façon dont l'utilitaire coreos-installer écrit l'ISO live RHCOS sur le disque. Vous devez indiquer de sauvegarder la partition du disque intitulée data car les artefacts sauvegardés dans la partition data sont nécessaires lors de l'étape d'installation d'OpenShift Container Platform.

Les paramètres supplémentaires sont transmis directement à l'utilitaire coreos-installer qui écrit le RHCOS live sur le disque. Au prochain redémarrage, le système d'exploitation démarre à partir du disque.

Vous pouvez transmettre plusieurs options à l'utilitaire coreos-installer:

OPTIONS:
...
    -u, --image-url <URL>
            Manually specify the image URL

    -f, --image-file <path>
            Manually specify a local image file

    -i, --ignition-file <path>
            Embed an Ignition config from a file

    -I, --ignition-url <URL>
            Embed an Ignition config from a URL
...
        --save-partlabel <lx>...
            Save partitions with this label glob

        --save-partindex <id>...
            Save partitions with this number or range
...
        --insecure-ignition
            Allow Ignition URL without HTTPS or hash

21.13.5.3. Comprendre le champ nodes.ignitionConfigOverride

De manière similaire à clusters.ignitionConfigOverride, le champ nodes.ignitionConfigOverride permet d'ajouter des configurations au format Ignition à l'utilitaire coreos-installer, mais au stade de l'installation d'OpenShift Container Platform. Lorsque le RHCOS est écrit sur le disque, la configuration supplémentaire incluse dans l'ISO de découverte ZTP n'est plus disponible. Pendant la phase de découverte, la configuration supplémentaire est stockée dans la mémoire de l'OS live.

Note

À ce stade, le nombre d'images de conteneurs extraites et chargées est plus important qu'à l'étape de découverte. En fonction de la version d'OpenShift Container Platform et de l'installation ou non des Day-2 Operators, le temps d'installation peut varier.

Au stade de l'installation, les services var-mnt.mount et precache-ocp.services systemd sont utilisés.

precache-ocp.service

Le service precache-ocp.service dépend de la partition de disque qui doit être montée dans /var/mnt par l'unité var-mnt.mount. Le service precache-ocp.service appelle un script appelé extract-ocp.sh.

Important

Pour extraire toutes les images avant l'installation d'OpenShift Container Platform, vous devez exécuter precache-ocp.service avant d'exécuter les services machine-config-daemon-pull.service et nodeip-configuration.service.

extract-ocp.sh
Le script extract-ocp.sh extrait et charge les images requises de la partition du disque vers le conteneur de stockage local. Lorsque le script se termine avec succès, vous pouvez utiliser les images localement.

Lorsque vous avez téléchargé le site SiteConfig et les ressources personnalisées (CR) PolicyGenTemplates facultatives sur le dépôt Git, qu'Argo CD surveille, vous pouvez démarrer le flux de travail ZTP en synchronisant les CR avec le cluster du hub.

21.13.6. Résolution de problèmes

21.13.6.1. Le catalogue rendu n'est pas valide

Lorsque vous téléchargez des images en utilisant un registre local ou déconnecté, vous pouvez rencontrer l'erreur The rendered catalog is invalid. Cela signifie qu'il vous manque les certificats du nouveau registre dont vous voulez extraire le contenu.

Note

L'image de l'outil factory-precaching-cli est construite sur une image UBI RHEL. Les chemins et emplacements des certificats sont les mêmes sur RHCOS.

Exemple d'erreur

Generating list of pre-cached artifacts...
error: unable to run command oc-mirror -c /mnt/imageset.yaml file:///tmp/fp-cli-3218002584/mirror --ignore-history --dry-run: Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/publish
Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/v2
Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/charts
Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/release-signatures
backend is not configured in /mnt/imageset.yaml, using stateless mode
backend is not configured in /mnt/imageset.yaml, using stateless mode
No metadata detected, creating new workspace
level=info msg=trying next host error=failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority host=eko4.cloud.lab.eng.bos.redhat.com:8443

The rendered catalog is invalid.

Run "oc-mirror list operators --catalog CATALOG-NAME --package PACKAGE-NAME" for more information.

error: error rendering new refs: render reference "eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/redhat-operator-index:v4.11": error resolving name : failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority

Procédure

  1. Copiez le certificat de registre dans votre serveur :

    # cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
  2. Mettre à jour la liste de confiance des certificats :

    # update-ca-trust
  3. Monter le dossier de l'hôte /etc/pki dans l'image factory-cli :

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged -it --rm quay.io/openshift-kni/telco-ran-tools:latest -- \
    factory-precaching-cli download -r 4.11.5 --acm-version 2.5.4 \
       --mce-version 2.0.4 -f /mnt \--img quay.io/custom/repository
       --du-profile -s --skip-imageset

Note légale

Copyright © 2023 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.