23.10. Utilisation de DPDK et RDMA
L'application conteneurisée Data Plane Development Kit (DPDK) est prise en charge sur OpenShift Container Platform. Vous pouvez utiliser du matériel réseau de virtualisation d'E/S à racine unique (SR-IOV) avec le kit de développement du plan de données (DPDK) et avec l'accès direct à la mémoire à distance (RDMA).
Pour plus d'informations sur les appareils pris en charge, reportez-vous à la section Appareils pris en charge.
23.10.1. Utilisation d'une fonction virtuelle en mode DPDK avec un NIC Intel
Conditions préalables
-
Installez le CLI OpenShift (
oc
). - Installer l'opérateur de réseau SR-IOV.
-
Connectez-vous en tant qu'utilisateur disposant des privilèges
cluster-admin
.
Procédure
Créez l'objet
SriovNetworkNodePolicy
suivant, puis enregistrez le YAML dans le fichierintel-dpdk-node-policy.yaml
.apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: intel-dpdk-node-policy namespace: openshift-sriov-network-operator spec: resourceName: intelnics nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" priority: <priority> numVfs: <num> nicSelector: vendor: "8086" deviceID: "158b" pfNames: ["<pf_name>", ...] rootDevices: ["<pci_bus_id>", "..."] deviceType: vfio-pci 1
- 1
- Spécifiez le type de pilote pour les fonctions virtuelles à
vfio-pci
.
NoteVoir la section
Configuring SR-IOV network devices
pour une explication détaillée de chaque option deSriovNetworkNodePolicy
.Lors de l'application de la configuration spécifiée dans un objet
SriovNetworkNodePolicy
, l'opérateur SR-IOV peut vidanger les nœuds et, dans certains cas, les redémarrer. L'application d'une modification de configuration peut prendre plusieurs minutes. Assurez-vous au préalable qu'il y a suffisamment de nœuds disponibles dans votre cluster pour gérer la charge de travail expulsée.Après l'application de la mise à jour de la configuration, tous les pods de l'espace de noms
openshift-sriov-network-operator
passeront à l'étatRunning
.Créez l'objet
SriovNetworkNodePolicy
en exécutant la commande suivante :$ oc create -f intel-dpdk-node-policy.yaml
Créez l'objet
SriovNetwork
suivant, puis enregistrez le YAML dans le fichierintel-dpdk-network.yaml
.apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: intel-dpdk-network namespace: openshift-sriov-network-operator spec: networkNamespace: <target_namespace> ipam: |- # ... 1 vlan: <vlan> resourceName: intelnics
- 1
- Spécifier un objet de configuration pour le plugin CNI ipam sous la forme d'un bloc YAML scalaire. Le plugin gère l'attribution des adresses IP pour la définition des pièces jointes.
NoteVoir la section "Configuration du réseau supplémentaire SR-IOV" pour une explication détaillée de chaque option sur
SriovNetwork
.Une bibliothèque optionnelle, app-netutil, fournit plusieurs méthodes API pour collecter des informations réseau sur le pod parent d'un conteneur.
Créez l'objet
SriovNetwork
en exécutant la commande suivante :$ oc create -f intel-dpdk-network.yaml
Créez la spécification
Pod
suivante, puis enregistrez le YAML dans le fichierintel-dpdk-pod.yaml
.apiVersion: v1 kind: Pod metadata: name: dpdk-app namespace: <target_namespace> 1 annotations: k8s.v1.cni.cncf.io/networks: intel-dpdk-network spec: containers: - name: testpmd image: <DPDK_image> 2 securityContext: runAsUser: 0 capabilities: add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3 volumeMounts: - mountPath: /dev/hugepages 4 name: hugepage resources: limits: openshift.io/intelnics: "1" 5 memory: "1Gi" cpu: "4" 6 hugepages-1Gi: "4Gi" 7 requests: openshift.io/intelnics: "1" memory: "1Gi" cpu: "4" hugepages-1Gi: "4Gi" command: ["sleep", "infinity"] volumes: - name: hugepage emptyDir: medium: HugePages
- 1
- Spécifiez le même
target_namespace
où l'objetSriovNetwork
intel-dpdk-network
est créé. Si vous souhaitez créer le pod dans un espace de noms différent, modifieztarget_namespace
à la fois dans la spécificationPod
et dans l'objetSriovNetowrk
. - 2
- Spécifiez l'image DPDK qui inclut votre application et la bibliothèque DPDK utilisée par l'application.
- 3
- Spécifier les capacités supplémentaires requises par l'application à l'intérieur du conteneur pour l'allocation de pages énormes, l'allocation de ressources système et l'accès à l'interface réseau.
- 4
- Monter un volume hugepage sur le pod DPDK sous
/dev/hugepages
. Le volume hugepage est soutenu par le type de volume emptyDir, le support étantHugepages
. - 5
- Facultatif : Spécifiez le nombre de dispositifs DPDK alloués au pod DPDK. Cette demande de ressource et cette limite, si elles ne sont pas explicitement spécifiées, seront automatiquement ajoutées par l'injecteur de ressources du réseau SR-IOV. L'injecteur de ressources réseau SR-IOV est un composant du contrôleur d'admission géré par l'opérateur SR-IOV. Il est activé par défaut et peut être désactivé en définissant l'option
enableInjector
surfalse
dans le CRSriovOperatorConfig
par défaut. - 6
- Spécifiez le nombre d'unités centrales. Le pod DPDK nécessite généralement que des CPU exclusifs soient alloués par le kubelet. Pour ce faire, définissez la politique du gestionnaire de CPU sur
static
et créez un pod avecGuaranteed
QoS. - 7
- Spécifiez la taille de la page d'accueil
hugepages-1Gi
ouhugepages-2Mi
et la quantité de pages d'accueil qui seront allouées au module DPDK. Configurez2Mi
et1Gi
hugepages séparément. La configuration de la page d'accueil1Gi
nécessite l'ajout d'arguments de noyau aux nœuds. Par exemple, l'ajout des arguments du noyaudefault_hugepagesz=1GB
,hugepagesz=1G
ethugepages=16
aura pour effet d'allouer16*1Gi
hugepages lors du démarrage du système.
Créez le module DPDK en exécutant la commande suivante :
$ oc create -f intel-dpdk-pod.yaml
23.10.2. Utilisation d'une fonction virtuelle en mode DPDK avec un NIC Mellanox
Vous pouvez créer une stratégie de nœud de réseau et créer un pod Data Plane Development Kit (DPDK) à l'aide d'une fonction virtuelle en mode DPDK avec un NIC Mellanox.
Conditions préalables
-
Vous avez installé l'OpenShift CLI (
oc
). - Vous avez installé l'opérateur de réseau SR-IOV (Single Root I/O Virtualization).
-
Vous vous êtes connecté en tant qu'utilisateur avec les privilèges
cluster-admin
.
Procédure
SriovNetworkNodePolicy
Enregistrez la configuration YAML suivante dans un fichiermlx-dpdk-node-policy.yaml
:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: mlx-dpdk-node-policy namespace: openshift-sriov-network-operator spec: resourceName: mlxnics nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" priority: <priority> numVfs: <num> nicSelector: vendor: "15b3" deviceID: "1015" 1 pfNames: ["<pf_name>", ...] rootDevices: ["<pci_bus_id>", "..."] deviceType: netdevice 2 isRdma: true 3
- 1
- Indiquez le code hexadécimal du périphérique du réseau SR-IOV.
- 2
- Spécifiez le type de pilote pour les fonctions virtuelles à
netdevice
. Une fonction virtuelle (VF) Mellanox SR-IOV peut fonctionner en mode DPDK sans utiliser le type de périphériquevfio-pci
. Le périphérique VF apparaît comme une interface réseau du noyau à l'intérieur d'un conteneur. - 3
- Activer le mode RDMA (Remote Direct Memory Access). Ceci est nécessaire pour que les cartes Mellanox fonctionnent en mode DPDK.
NoteVoir Configuring an SR-IOV network device pour une explication détaillée de chaque option de l'objet
SriovNetworkNodePolicy
.Lors de l'application de la configuration spécifiée dans un objet
SriovNetworkNodePolicy
, l'opérateur SR-IOV peut vidanger les nœuds et, dans certains cas, les redémarrer. L'application d'une modification de configuration peut prendre plusieurs minutes. Assurez-vous au préalable qu'il y a suffisamment de nœuds disponibles dans votre cluster pour gérer la charge de travail expulsée.Après l'application de la mise à jour de la configuration, tous les pods de l'espace de noms
openshift-sriov-network-operator
passeront à l'étatRunning
.Créez l'objet
SriovNetworkNodePolicy
en exécutant la commande suivante :$ oc create -f mlx-dpdk-node-policy.yaml
SriovNetwork
Enregistrez la configuration YAML suivante dans un fichiermlx-dpdk-network.yaml
:apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: mlx-dpdk-network namespace: openshift-sriov-network-operator spec: networkNamespace: <target_namespace> ipam: |- 1 ... vlan: <vlan> resourceName: mlxnics
- 1
- Spécifier un objet de configuration pour le plugin IPAM (gestion des adresses IP) Container Network Interface (CNI) sous la forme d'un bloc YAML scalaire. Le plugin gère l'attribution des adresses IP pour la définition de l'attachement.
NoteVoir Configuring an SR-IOV network device pour une explication détaillée de chaque option de l'objet
SriovNetwork
.La bibliothèque d'options
app-netutil
fournit plusieurs méthodes API pour collecter des informations réseau sur le module parent d'un conteneur.Créez l'objet
SriovNetwork
en exécutant la commande suivante :$ oc create -f mlx-dpdk-network.yaml
Pod
Enregistrez la configuration YAML suivante dans un fichiermlx-dpdk-pod.yaml
:apiVersion: v1 kind: Pod metadata: name: dpdk-app namespace: <target_namespace> 1 annotations: k8s.v1.cni.cncf.io/networks: mlx-dpdk-network spec: containers: - name: testpmd image: <DPDK_image> 2 securityContext: runAsUser: 0 capabilities: add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3 volumeMounts: - mountPath: /dev/hugepages 4 name: hugepage resources: limits: openshift.io/mlxnics: "1" 5 memory: "1Gi" cpu: "4" 6 hugepages-1Gi: "4Gi" 7 requests: openshift.io/mlxnics: "1" memory: "1Gi" cpu: "4" hugepages-1Gi: "4Gi" command: ["sleep", "infinity"] volumes: - name: hugepage emptyDir: medium: HugePages
- 1
- Spécifiez le même
target_namespace
où l'objetSriovNetwork
mlx-dpdk-network
est créé. Pour créer le pod dans un espace de noms différent, modifieztarget_namespace
à la fois dans la spécificationPod
et dans l'objetSriovNetwork
. - 2
- Spécifiez l'image DPDK qui inclut votre application et la bibliothèque DPDK utilisée par l'application.
- 3
- Spécifier les capacités supplémentaires requises par l'application à l'intérieur du conteneur pour l'allocation de pages énormes, l'allocation de ressources système et l'accès à l'interface réseau.
- 4
- Montez le volume hugepage sur le pod DPDK sous
/dev/hugepages
. Le volume hugepage est soutenu par le type de volumeemptyDir
, le support étantHugepages
. - 5
- Facultatif : Spécifiez le nombre de périphériques DPDK alloués pour le module DPDK. Si elle n'est pas explicitement spécifiée, cette demande de ressource et cette limite sont automatiquement ajoutées par l'injecteur de ressources du réseau SR-IOV. L'injecteur de ressources réseau SR-IOV est un composant du contrôleur d'admission géré par l'opérateur SR-IOV. Il est activé par défaut et peut être désactivé en définissant l'option
enableInjector
surfalse
dans le CRSriovOperatorConfig
par défaut. - 6
- Spécifiez le nombre d'unités centrales. Le pod DPDK nécessite généralement que des CPU exclusifs soient alloués à partir du kubelet. Pour ce faire, définissez la politique du gestionnaire de CPU sur
static
et créez un pod avecGuaranteed
Quality of Service (QoS). - 7
- Spécifiez la taille de la page d'accueil
hugepages-1Gi
ouhugepages-2Mi
et la quantité de pages d'accueil qui seront allouées au module DPDK. Configurez séparément2Mi
et1Gi
hugepages. La configuration de1Gi
hugepages nécessite l'ajout d'arguments de noyau à Nodes.
Créez le module DPDK en exécutant la commande suivante :
$ oc create -f mlx-dpdk-pod.yaml
23.10.3. Vue d'ensemble de l'obtention d'un débit de ligne DPDK spécifique
Pour atteindre un débit de ligne spécifique du kit de développement du plan de données (DPDK), déployez un opérateur de réglage de nœud et configurez la virtualisation d'E/S à racine unique (SR-IOV). Vous devez également régler les paramètres du DPDK pour les ressources suivantes :
- CPU isolés
- Hugepages
- Le planificateur de topologie
Dans les versions précédentes 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 Container Platform. Dans OpenShift Container Platform 4.11 et les versions ultérieures, cette fonctionnalité fait partie de l'opérateur Node Tuning.
Environnement de test DPDK
Le diagramme suivant montre les composants d'un environnement de test de trafic :

- Traffic generator: Une application qui peut générer un trafic de paquets important.
- SR-IOV-supporting NIC: Carte d'interface réseau compatible avec SR-IOV. La carte exécute un certain nombre de fonctions virtuelles sur une interface physique.
- Physical Function (PF): Fonction PCI Express (PCIe) d'un adaptateur réseau qui prend en charge l'interface SR-IOV.
- Virtual Function (VF): Une fonction PCIe légère sur un adaptateur de réseau qui prend en charge le SR-IOV. Le VF est associé à la PF PCIe de l'adaptateur réseau. Le VF représente une instance virtualisée de l'adaptateur réseau.
- Switch: Un commutateur de réseau. Les nœuds peuvent également être connectés dos à dos.
-
testpmd
: Une application d'exemple incluse dans le DPDK. L'applicationtestpmd
peut être utilisée pour tester le DPDK dans un mode de transmission de paquets. L'applicationtestpmd
est également un exemple de construction d'une application complète à l'aide du kit de développement logiciel (SDK) DPDK. - worker 0 et worker 1: Nœuds OpenShift Container Platform.
23.10.4. Utilisation du SR-IOV et du Node Tuning Operator pour atteindre un débit de ligne DPDK
Vous pouvez utiliser le Node Tuning Operator pour configurer des CPU isolés, des hugepages et un planificateur de topologie. Vous pouvez ensuite utiliser l'opérateur de réglage de nœud avec la virtualisation d'E/S à racine unique (SR-IOV) pour atteindre un débit de ligne spécifique du kit de développement du plan de données (DPDK).
Conditions préalables
-
Vous avez installé l'OpenShift CLI (
oc
). - Vous avez installé l'opérateur de réseau SR-IOV.
-
Vous vous êtes connecté en tant qu'utilisateur avec les privilèges
cluster-admin
. Vous avez déployé un Node Tuning Operator autonome.
NoteDans les versions précédentes 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.
Procédure
Créez un objet
PerformanceProfile
en vous inspirant de l'exemple suivant :apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: globallyDisableIrqLoadBalancing: true cpu: isolated: 21-51,73-103 1 reserved: 0-20,52-72 2 hugepages: defaultHugepagesSize: 1G 3 pages: - count: 32 size: 1G net: userLevelNetworking: true numa: topologyPolicy: "single-numa-node" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
- 1
- Si l'hyperthreading est activé sur le système, allouez les liens symboliques appropriés aux groupes de CPU
isolated
etreserved
. Si le système contient plusieurs nœuds d'accès à la mémoire non uniforme (NUMA), allouez les CPU des deux NUMA aux deux groupes. Vous pouvez également utiliser le Créateur de profil de performance pour cette tâche. Pour plus d'informations, voir Creating a performance profile. - 2
- Vous pouvez également spécifier une liste de périphériques dont les files d'attente seront définies en fonction du nombre d'unités centrales réservées. Pour plus d'informations, voir Reducing NIC queues using the Node Tuning Operator.
- 3
- Allouer le nombre et la taille des hugepages nécessaires. Vous pouvez spécifier la configuration NUMA pour les hugepages. Par défaut, le système alloue un nombre pair à chaque nœud NUMA du système. Si nécessaire, vous pouvez demander l'utilisation d'un noyau en temps réel pour les nœuds. Pour plus d'informations, voir Provisioning a worker with real-time capabilities pour plus d'informations.
-
Enregistrez le fichier
yaml
sousmlx-dpdk-perfprofile-policy.yaml
. Appliquez le profil de performance à l'aide de la commande suivante :
$ oc create -f mlx-dpdk-perfprofile-policy.yaml
23.10.4.1. Exemple d'opérateur de réseau SR-IOV pour les fonctions virtuelles
Vous pouvez utiliser l'opérateur de réseau de virtualisation d'E/S à racine unique (SR-IOV) pour allouer et configurer des fonctions virtuelles (VF) à partir de cartes d'interface réseau de fonctions physiques supportant la SR-IOV sur les nœuds.
Pour plus d'informations sur le déploiement de l'opérateur, voir Installing the SR-IOV Network Operator. Pour plus d'informations sur la configuration d'un périphérique réseau SR-IOV, voir Configuring an SR-IOV network device.
Il existe quelques différences entre l'exécution des charges de travail du kit de développement du plan de données (DPDK) sur les VF Intel et les VF Mellanox. Cette section fournit des exemples de configuration d'objets pour les deux types de VF. Voici un exemple d'objet sriovNetworkNodePolicy
utilisé pour exécuter des applications DPDK sur des cartes réseau Intel :
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-1 namespace: openshift-sriov-network-operator spec: deviceType: vfio-pci 1 needVhostNet: true 2 nicSelector: pfNames: ["ens3f0"] nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 10 priority: 99 resourceName: dpdk_nic_1 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-1 namespace: openshift-sriov-network-operator spec: deviceType: vfio-pci needVhostNet: true nicSelector: pfNames: ["ens3f1"] nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 10 priority: 99 resourceName: dpdk_nic_2
- 1
- Pour les NIC d'Intel,
deviceType
doit êtrevfio-pci
. - 2
- Si la communication du noyau avec les charges de travail DPDK est nécessaire, ajoutez
needVhostNet: true
. Cela permet de monter les périphériques/dev/net/tun
et/dev/vhost-net
dans le conteneur afin que l'application puisse créer un périphérique de prise et connecter le périphérique de prise à la charge de travail DPDK.
Voici un exemple d'objet sriovNetworkNodePolicy
pour les cartes d'interface réseau Mellanox :
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-1 namespace: openshift-sriov-network-operator spec: deviceType: netdevice 1 isRdma: true 2 nicSelector: rootDevices: - "0000:5e:00.1" nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 5 priority: 99 resourceName: dpdk_nic_1 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: dpdk-nic-2 namespace: openshift-sriov-network-operator spec: deviceType: netdevice isRdma: true nicSelector: rootDevices: - "0000:5e:00.0" nodeSelector: node-role.kubernetes.io/worker-cnf: "" numVfs: 5 priority: 99 resourceName: dpdk_nic_2
- 1
- Pour les dispositifs Mellanox, le site
deviceType
doit êtrenetdevice
. - 2
- Pour les dispositifs Mellanox,
isRdma
doit êtretrue
. Les cartes Mellanox sont connectées aux applications DPDK en utilisant la bifurcation de flux. Ce mécanisme divise le trafic entre l'espace utilisateur Linux et l'espace noyau, et peut améliorer la capacité de traitement du débit de ligne.
23.10.4.2. Exemple d'opérateur de réseau SR-IOV
Voici un exemple de définition d'un objet sriovNetwork
. Dans ce cas, les configurations Intel et Mellanox sont identiques :
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: dpdk-network-1 namespace: openshift-sriov-network-operator spec: ipam: '{"type": "host-local","ranges": [[{"subnet": "10.0.1.0/24"}]],"dataDir": "/run/my-orchestrator/container-ipam-state-1"}' 1 networkNamespace: dpdk-test 2 spoofChk: "off" trust: "on" resourceName: dpdk_nic_1 3 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: dpdk-network-2 namespace: openshift-sriov-network-operator spec: ipam: '{"type": "host-local","ranges": [[{"subnet": "10.0.2.0/24"}]],"dataDir": "/run/my-orchestrator/container-ipam-state-1"}' networkNamespace: dpdk-test spoofChk: "off" trust: "on" resourceName: dpdk_nic_2
- 1
- Vous pouvez utiliser une implémentation différente de la gestion des adresses IP (IPAM), telle que Whereabouts. Pour plus d'informations, voir Dynamic IP address assignment configuration with Whereabouts.
- 2
- Vous devez demander l'adresse
networkNamespace
où la définition de la pièce jointe au réseau sera créée. Vous devez créer le CRsriovNetwork
sous l'espace de nomsopenshift-sriov-network-operator
. - 3
- La valeur de
resourceName
doit correspondre à celle deresourceName
créée soussriovNetworkNodePolicy
.
23.10.4.3. Exemple de charge de travail de base DPDK
Voici un exemple de conteneur du kit de développement du plan de données (DPDK) :
apiVersion: v1 kind: Namespace metadata: name: dpdk-test --- apiVersion: v1 kind: Pod metadata: annotations: k8s.v1.cni.cncf.io/networks: '[ 1 { "name": "dpdk-network-1", "namespace": "dpdk-test" }, { "name": "dpdk-network-2", "namespace": "dpdk-test" } ]' irq-load-balancing.crio.io: "disable" 2 cpu-load-balancing.crio.io: "disable" cpu-quota.crio.io: "disable" labels: app: dpdk name: testpmd namespace: dpdk-test spec: runtimeClassName: performance-performance 3 containers: - command: - /bin/bash - -c - sleep INF image: registry.redhat.io/openshift4/dpdk-base-rhel8 imagePullPolicy: Always name: dpdk resources: 4 limits: cpu: "16" hugepages-1Gi: 8Gi memory: 2Gi requests: cpu: "16" hugepages-1Gi: 8Gi memory: 2Gi securityContext: capabilities: add: - IPC_LOCK - SYS_RESOURCE - NET_RAW - NET_ADMIN runAsUser: 0 volumeMounts: - mountPath: /mnt/huge name: hugepages terminationGracePeriodSeconds: 5 volumes: - emptyDir: medium: HugePages name: hugepages
- 1
- Demandez les réseaux SR-IOV dont vous avez besoin. Les ressources pour les appareils seront injectées automatiquement.
- 2
- Désactiver la base d'équilibrage de charge du CPU et de l'IRQ. Pour plus d'informations, voir Disabling interrupt processing for individual pods pour plus d'informations.
- 3
- Réglez le
runtimeClass
sur leperformance-performance
. Ne définissez pasruntimeClass
surHostNetwork
ouprivileged
. - 4
- Demander un nombre égal de ressources pour les demandes et les limites afin de démarrer le pod avec
Guaranteed
Qualité de service (QoS).
Ne démarrez pas le pod avec SLEEP
puis exécutez dans le pod pour démarrer le testpmd ou la charge de travail DPDK. Cela peut ajouter des interruptions supplémentaires car le processus exec
n'est rattaché à aucun processeur.
23.10.4.4. Exemple de script testpmd
Voici un exemple de script pour l'exécution de testpmd
:
#!/bin/bash set -ex export CPU=$(cat /sys/fs/cgroup/cpuset/cpuset.cpus) echo ${CPU} dpdk-testpmd -l ${CPU} -a ${PCIDEVICE_OPENSHIFT_IO_DPDK_NIC_1} -a ${PCIDEVICE_OPENSHIFT_IO_DPDK_NIC_2} -n 4 -- -i --nb-cores=15 --rxd=4096 --txd=4096 --rxq=7 --txq=7 --forward-mode=mac --eth-peer=0,50:00:00:00:00:01 --eth-peer=1,50:00:00:00:00:02
Cet exemple utilise deux CR sriovNetwork
différents. La variable d'environnement contient l'adresse PCI de la fonction virtuelle (VF) qui a été allouée au module. Si vous utilisez le même réseau dans la définition du pod, vous devez diviser le pciAddress
. Il est important de configurer les adresses MAC correctes du générateur de trafic. Cet exemple utilise des adresses MAC personnalisées.
23.10.5. Utilisation d'une fonction virtuelle en mode RDMA avec un NIC Mellanox
RDMA over Converged Ethernet (RoCE) 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.
RDMA over Converged Ethernet (RoCE) est le seul mode pris en charge lors de l'utilisation de RDMA sur OpenShift Container Platform.
Conditions préalables
-
Installez le CLI OpenShift (
oc
). - Installer l'opérateur de réseau SR-IOV.
-
Connectez-vous en tant qu'utilisateur disposant des privilèges
cluster-admin
.
Procédure
Créez l'objet
SriovNetworkNodePolicy
suivant, puis enregistrez le YAML dans le fichiermlx-rdma-node-policy.yaml
.apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: mlx-rdma-node-policy namespace: openshift-sriov-network-operator spec: resourceName: mlxnics nodeSelector: feature.node.kubernetes.io/network-sriov.capable: "true" priority: <priority> numVfs: <num> nicSelector: vendor: "15b3" deviceID: "1015" 1 pfNames: ["<pf_name>", ...] rootDevices: ["<pci_bus_id>", "..."] deviceType: netdevice 2 isRdma: true 3
NoteVoir la section
Configuring SR-IOV network devices
pour une explication détaillée de chaque option deSriovNetworkNodePolicy
.Lors de l'application de la configuration spécifiée dans un objet
SriovNetworkNodePolicy
, l'opérateur SR-IOV peut vidanger les nœuds et, dans certains cas, les redémarrer. L'application d'une modification de configuration peut prendre plusieurs minutes. Assurez-vous au préalable qu'il y a suffisamment de nœuds disponibles dans votre cluster pour gérer la charge de travail expulsée.Après l'application de la mise à jour de la configuration, tous les pods de l'espace de noms
openshift-sriov-network-operator
passeront à l'étatRunning
.Créez l'objet
SriovNetworkNodePolicy
en exécutant la commande suivante :$ oc create -f mlx-rdma-node-policy.yaml
Créez l'objet
SriovNetwork
suivant, puis enregistrez le YAML dans le fichiermlx-rdma-network.yaml
.apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: mlx-rdma-network namespace: openshift-sriov-network-operator spec: networkNamespace: <target_namespace> ipam: |- 1 # ... vlan: <vlan> resourceName: mlxnics
- 1
- Spécifier un objet de configuration pour le plugin CNI ipam sous la forme d'un bloc YAML scalaire. Le plugin gère l'attribution des adresses IP pour la définition des pièces jointes.
NoteVoir la section "Configuration du réseau supplémentaire SR-IOV" pour une explication détaillée de chaque option sur
SriovNetwork
.Une bibliothèque optionnelle, app-netutil, fournit plusieurs méthodes API pour collecter des informations réseau sur le pod parent d'un conteneur.
Créez l'objet
SriovNetworkNodePolicy
en exécutant la commande suivante :$ oc create -f mlx-rdma-network.yaml
Créez la spécification
Pod
suivante, puis enregistrez le YAML dans le fichiermlx-rdma-pod.yaml
.apiVersion: v1 kind: Pod metadata: name: rdma-app namespace: <target_namespace> 1 annotations: k8s.v1.cni.cncf.io/networks: mlx-rdma-network spec: containers: - name: testpmd image: <RDMA_image> 2 securityContext: runAsUser: 0 capabilities: add: ["IPC_LOCK","SYS_RESOURCE","NET_RAW"] 3 volumeMounts: - mountPath: /dev/hugepages 4 name: hugepage resources: limits: memory: "1Gi" cpu: "4" 5 hugepages-1Gi: "4Gi" 6 requests: memory: "1Gi" cpu: "4" hugepages-1Gi: "4Gi" command: ["sleep", "infinity"] volumes: - name: hugepage emptyDir: medium: HugePages
- 1
- Spécifiez le même
target_namespace
où l'objetSriovNetwork
mlx-rdma-network
est créé. Si vous souhaitez créer le pod dans un espace de noms différent, modifieztarget_namespace
dans la spécificationPod
et dans l'objetSriovNetowrk
. - 2
- Spécifiez l'image RDMA qui inclut votre application et la bibliothèque RDMA utilisée par l'application.
- 3
- Spécifier les capacités supplémentaires requises par l'application à l'intérieur du conteneur pour l'allocation de pages énormes, l'allocation de ressources système et l'accès à l'interface réseau.
- 4
- Monter le volume hugepage sur le pod RDMA sous
/dev/hugepages
. Le volume hugepage est sauvegardé par le type de volume emptyDir, le support étantHugepages
. - 5
- Spécifiez le nombre de CPU. Le pod RDMA nécessite généralement que des CPU exclusifs soient alloués par le kubelet. Pour ce faire, définissez la politique du gestionnaire de CPU sur
static
et créez un pod avecGuaranteed
QoS. - 6
- Spécifiez la taille de la page d'accueil
hugepages-1Gi
ouhugepages-2Mi
et la quantité de pages d'accueil qui seront allouées au pod RDMA. Configurez2Mi
et1Gi
hugepages séparément. La configuration de1Gi
hugepage nécessite l'ajout d'arguments de noyau à Nodes.
Créez le pod RDMA en exécutant la commande suivante :
$ oc create -f mlx-rdma-pod.yaml
23.10.6. Un modèle de pod de test pour les clusters qui utilisent OVS-DPDK sur OpenStack
Le pod testpmd
suivant illustre la création d'un conteneur avec des pages énormes, des unités centrales réservées et le port SR-IOV.
Un exemple de pod testpmd
apiVersion: v1 kind: Pod metadata: name: testpmd-dpdk namespace: mynamespace annotations: cpu-load-balancing.crio.io: "disable" cpu-quota.crio.io: "disable" # ... spec: containers: - name: testpmd command: ["sleep", "99999"] image: registry.redhat.io/openshift4/dpdk-base-rhel8:v4.9 securityContext: capabilities: add: ["IPC_LOCK","SYS_ADMIN"] privileged: true runAsUser: 0 resources: requests: memory: 1000Mi hugepages-1Gi: 1Gi cpu: '2' openshift.io/dpdk1: 1 1 limits: hugepages-1Gi: 1Gi cpu: '2' memory: 1000Mi openshift.io/dpdk1: 1 volumeMounts: - mountPath: /dev/hugepages name: hugepage readOnly: False runtimeClassName: performance-cnf-performanceprofile 2 volumes: - name: hugepage emptyDir: medium: HugePages
- 1
- Le nom
dpdk1
dans cet exemple correspond à une ressourceSriovNetworkNodePolicy
créée par l'utilisateur. Vous pouvez remplacer ce nom par celui d'une ressource que vous créez. - 2
- Si votre profil de performance ne s'appelle pas
cnf-performance profile
, remplacez cette chaîne par le nom correct du profil de performance.
23.10.7. Un modèle de pod de test pour les clusters qui utilisent le déchargement matériel OVS sur OpenStack
Le pod testpmd
suivant démontre le déchargement matériel d'Open vSwitch (OVS) sur Red Hat OpenStack Platform (RHOSP).
Un exemple de pod testpmd
apiVersion: v1
kind: Pod
metadata:
name: testpmd-sriov
namespace: mynamespace
annotations:
k8s.v1.cni.cncf.io/networks: hwoffload1
spec:
runtimeClassName: performance-cnf-performanceprofile 1
containers:
- name: testpmd
command: ["sleep", "99999"]
image: registry.redhat.io/openshift4/dpdk-base-rhel8:v4.9
securityContext:
capabilities:
add: ["IPC_LOCK","SYS_ADMIN"]
privileged: true
runAsUser: 0
resources:
requests:
memory: 1000Mi
hugepages-1Gi: 1Gi
cpu: '2'
limits:
hugepages-1Gi: 1Gi
cpu: '2'
memory: 1000Mi
volumeMounts:
- mountPath: /dev/hugepages
name: hugepage
readOnly: False
volumes:
- name: hugepage
emptyDir:
medium: HugePages
- 1
- Si votre profil de performance ne s'appelle pas
cnf-performance profile
, remplacez cette chaîne par le nom correct du profil de performance.
23.10.8. Ressources supplémentaires
- Création d'un profil de performance
- Réduction des files d'attente NIC à l'aide de l'opérateur Node Tuning
- Fournir à un travailleur des capacités en temps réel
- Installation de l'opérateur de réseau SR-IOV
- Configuration d'un périphérique de réseau SR-IOV
- Configuration de l'attribution dynamique d'adresses IP avec Whereabouts
- Désactivation du traitement des interruptions pour les pods individuels
- Configuration d'une connexion au réseau Ethernet SR-IOV
- La bibliothèque app-netutil fournit plusieurs méthodes API pour collecter des informations réseau sur le pod parent d'un conteneur.