====== Infrastructure de Test : Cisco TRex & Stack d'Observabilité (Docker Compose) ======
Ce document détaille la configuration, le déploiement et l'observabilité de la plateforme de génération de trafic **Cisco TRex v3.08** entièrement conteneurisée et supervisée en temps réel à l'aide de **Prometheus** et **Grafana**.
===== 1. Architecture Globale =====
La solution est orchestrée via un unique fichier **Docker Compose** exécutant 4 services complémentaires :
* **trex-server** (TRex) : Le moteur de génération de trafic s'exécutant en mode privilégié et réseau hôte pour permettre l'accès matériel direct via DPDK aux interfaces réseau physiques.
* **ciscotrex-exporter** : Un exportateur de télémétrie Python qui se connecte au serveur TRex sur le port API ZMQ ''4501'', convertit les statistiques brutes et les expose pour Prometheus sur le port ''8000''.
* **prometheus** : La base de données de séries temporelles configurée pour scraper l'exportateur toutes les 10 secondes.
* **grafana** : L'interface de visualisation affichant les graphiques temps réel de trafic (Bitrates, PPS, Utilisation CPU et Perte de paquets).
===== 2. Structure des Répertoires =====
Le projet est structuré sur l'hôte sous le chemin `/home/jonathan/docker/trex-bundle/` de la manière suivante :
/home/jonathan/docker/trex-bundle/
├── docker-compose.yaml # Fichier d'orchestration multi-conteneurs
├── docker-compose.yaml.bak # Copie de sauvegarde historique
├── trex/ # Répertoire dédié au service TRex
│ ├── Dockerfile # Image système TRex (Ubuntu 24.04 + Setuptools)
│ ├── trex_cfg.yaml # Fichier de configuration d'interfaces et CPU
│ └── scratch/ # Dossier monté contenant les binaires et profils
└── monitoring/ # Répertoire dédié à la stack d'observabilité
├── Dockerfile # Image système de l'exportateur Prometheus
├── prometheus.yml # Configuration de collecte (Scraping)
└── grafana-datasource.yml # Provisionnement automatique de la source Prometheus
===== 3. Configuration de l'Orchestrateur (docker-compose.yaml) =====
Ce fichier orchestre l'ensemble des dépendances, gère l'accès privilégié au matériel hôte et configure les volumes persistants.
services:
trex:
build:
context: .
dockerfile: ./trex/Dockerfile
container_name: trex-server
image: local/trex:3.08
restart: unless-stopped
privileged: true
network_mode: "host"
volumes:
# Montage du dossier scratch contenant les scripts et exécutables TRex
- ./trex/scratch:/scratch
# Montage de la configuration réseau/matériel TRex
- ./trex/trex_cfg.yaml:/etc/trex_cfg.yaml
# Montage des Hugepages pour les performances d'accès mémoire DPDK (Critique)
- /dev/hugepages:/dev/hugepages
# Montage en lecture seule des modules noyau de l'hôte pour le chargement des pilotes
- /lib/modules:/lib/modules:ro
# Montage des répertoires systèmes pour le mapping PCI
- /sys:/sys
- /dev:/dev
working_dir: /scratch
command: ["-i", "--no-watchdog"]
ciscotrex-exporter:
build:
context: .
dockerfile: ./monitoring/Dockerfile
container_name: ciscotrex-exporter
network_mode: "host"
environment:
- TREX_EXT_LIBS=/scratch/external_libs
- TREX_HOST=127.0.0.1
- TREX_ZMQ_PORT=4501
- PYTHONPATH=/scratch/automation/trex_control_plane/interactive
volumes:
- ./trex/scratch:/scratch:ro
restart: unless-stopped
depends_on:
- trex
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
ports:
- "9090:9090"
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- ./monitoring/prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
grafana:
image: grafana/grafana-oss:latest
container_name: grafana
restart: unless-stopped
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- ./monitoring/grafana-datasource.yml:/etc/grafana/provisioning/datasources/datasource.yml
- grafana-data:/var/lib/grafana
volumes:
prometheus-data:
grafana-data:
===== 4. Service TRex (Dossier /trex) =====
==== Dockerfile (trex/Dockerfile) ====
Ce fichier utilise **Ubuntu 24.04** comme base. Afin d'assurer la compatibilité avec l'API interne de TRex v3.08 écrite pour des versions de Python antérieures à Python 3.12 (qui a déprécié/retiré ''distutils''), le paquet ''python3-setuptools'' est installé pour émuler l'import de ''distutils'' à la volée.
FROM ubuntu:24.04
# Évite les interruptions lors des installations interactives APT
ENV DEBIAN_FRONTEND=noninteractive
# Supprime les avertissements de syntaxe hérités d'anciennes versions de Python
ENV PYTHONWARNINGS="ignore"
# Installation des dépendances requises par DPDK et TRex
RUN apt-get update && apt-get install -y --no-install-recommends \
python3 \
python3-setuptools \
libz-dev \
pciutils \
iproute2 \
kmod \
procps \
libc6 \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /scratch
ENV PATH="/scratch:${PATH}"
ENTRYPOINT ["./t-rex-64"]
==== Configuration TRex (trex/trex_cfg.yaml) ====
Définit les adresses PCI des ports réseau configurés pour le test ainsi que la topologie CPU (Socket 0, Threads 4 à 7 dédiés à la génération de paquets).
- version: 2
interfaces: ['03:00.0', '03:00.1']
port_info:
- ip: '192.168.100.11' # Port 0 TRex IP
default_gw: '192.168.100.1' # Port 0 Router Gateway IP
- ip: '192.168.101.12' # Port 1 TRex IP
default_gw: '192.168.101.1' # Port 1 Router Gateway IP
platform:
master_thread_id: 0
latency_thread_id: 1
dual_if:
- socket: 0
threads: [4,5,6,7]
===== 5. Service Observabilité (Dossier /monitoring) =====
==== Dockerfile de l'exportateur (monitoring/Dockerfile) ====
Utilise une image légère Debian-slim et clone le dépôt de l'exportateur officiel de Cisco TRex pour l'exposer sur l'hôte.
FROM python:3.10-slim
# Installation de git pour cloner le dépôt de l'exportateur
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
# Clonage de l'exportateur Prometheus pour TRex
RUN git clone https://github.com/Civil/ciscotrex_exporter.git /app
WORKDIR /app
# Installation des paquets Python (ZMQ, Prometheus Client, etc.)
RUN pip install --no-cache-dir -r requirements.txt
EXPOSE 9362
ENV TREX_EXT_LIBS=/scratch/external_libs
ENV TREX_HOST=127.0.0.1
ENV TREX_ZMQ_PORT=4501
ENTRYPOINT ["python", "main.py"]
CMD ["--web.listen-address=0.0.0.0:9362"]
==== Configuration de Collecte (monitoring/prometheus.yml) ====
Configure Prometheus pour requêter l'exportateur local à une fréquence rapide (toutes les 10 secondes) afin de capturer l'ensemble des spikes de trafic.
global:
scrape_interval: 10s
evaluation_interval: 10s
scrape_configs:
- job_name: 'cisco-trex'
static_configs:
- targets: ['host.docker.internal:8000']
==== Provisionnement de la Source de Données (monitoring/grafana-datasource.yml) ====
Ajoute automatiquement Prometheus comme source de données active lors de l'initialisation de Grafana.
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
access: proxy
url: http://prometheus:9090
isDefault: true
===== 6. Configuration Requise sur l'Hôte (Prise en charge DPDK) =====
Avant de démarrer le conteneur, l'hôte physique doit disposer des modules noyau adéquats et de mémoire Hugepages configurée.
==== Allocation des Hugepages ====
# Allouer 1024 pages de 2MB (2 Go de RAM au total pour DPDK)
echo 1024 | sudo tee /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# Rendre la modification permanente au redémarrage
echo "vm.nr_hugepages = 1024" | sudo tee -a /etc/sysctl.conf
==== Chargement des Pilotes Noyau ====
Assurez-vous que les modules requis par DPDK sont actifs sur l'hôte physique :
sudo modprobe uio
sudo modprobe vfio-pci
sudo modprobe uio_pci_generic
===== 7. Guide d'Exploitation (Commandes Clés) =====
^ Description de l'action ^ Commande ^
| **Construire & Démarrer la stack** | ''docker compose up -d --build'' |
| **Arrêter la stack** | ''docker compose down'' |
| **Afficher les logs globaux** | ''docker compose logs -f'' |
| **Vérifier l'export des métriques** | ''curl http://localhost:8000/metrics'' |
| **Accéder à la Console interactive TRex** | ''docker exec -it trex-server ./trex-console'' |
===== 8. Adresses d'Accès aux Services =====
* **Prometheus Dashboard** : [[http://:9090/targets]] //(Vérifier que le statut du endpoint "cisco-trex" est à "UP")//
* **Grafana Web UI** : [[http://:3000]]
* **Identifiants de connexion** : ''admin'' / ''admin''
* **Dashboard TRex Officiel** : Menu > Dashboards > Import > Saisir l'ID **23559** > Sélectionner la source de données **Prometheus** > Import**.
===== 9. Référence des Commandes TRex (Cheat Sheet) =====
Cette section regroupe les commandes essentielles pour administrer le serveur, interagir avec la console et lancer des profils de trafic.
==== 9.1. Gestion du Serveur ====
Démarrer le serveur TRex en mode interactif (Stateless) tout en désactivant le thread de surveillance matérielle :
sudo ./t-rex-64 -i --no-watchdog
==== 9.2. Connexion à la Console ====
Ouvrir la console CLI interactive permettant d'acquérir les ports et d'injecter le trafic :
sudo ./trex-console
==== 9.3. Gestion des Ports et Mode Service ====
Ces commandes sont executees directement a l'interieur de trex-console :
Acquerir le controle exclusif des ports de test :
acquire
Activer le Mode Service (necessaire pour le trafic ARP et de controle) :
service
Activer le mode Promiscuous (promiscuite) sur tous les ports :
portattr -a --prom on
Desactiver le Mode Service (retour au mode haute performance) :
service --off
==== 9.4. Lancement et Arret du Trafic IMIX ====
Lancer le trafic IMIX a un taux de 10 000 PPS sur le Port 0 :
start -f stl/imix.py -m 10kpps --port 0
Lancer le trafic IMIX a un taux de 10 000 PPS sur le Port 1 :
start -f stl/imix.py -m 10kpps --port 1
Arreter la generation de trafic sur le Port 0 :
stop --port 0
Arreter la generation de trafic sur le Port 1 :
stop --port 1
Arreter la generation sur les Ports 0 et 1 simultanement :
stop --port 0 1
==== 9.5. Visualisation des Statistiques en Console ====
Ouvrir l'interface utilisateur textuelle (TUI) en temps reel :
tui
Afficher un tableau recapitulatif instantane des compteurs :
stats
==== 9.6. Profils Avances et Tests L3 (Routage SRX) ====
Ces commandes simulent des flux IP traversant votre equipement Juniper SRX300.
Gaspillage de bande passante UDP (Port 0 uniquement, trames de 512 octets) :
start -f stl/udp_1pkt-jo1.py -m 960mbps --port 0 -t fsize=512
Test UDP bidirectionnel a 985 Mbps (Trames de 1518 octets) :
start -f stl/udp_1pkt-jo1.py -m 985mbps --port 0 1 -t fsize=1518
Simulation de flux UDP Route (L3) a 960 Mbps de Port 0 a Port 1 :
start -f stl/udp_1pkt-l3.py -m 960mbps --port 0 -t fsize=1518,src_ip=192.168.100.11,dst_ip=192.168.101.12
Simulation de flux TCP Route (L3) a 960 Mbps de Port 0 a Port 1 :
start -f stl/tcp_1pkt-l3.py -m 960mbps --port 0 -t fsize=1518,src_ip=192.168.100.11,dst_ip=192.168.101.12
Simulation de flux TCP Route (L3) a 960 Mbps de Port 1 a Port 0 :
start -f stl/tcp_1pkt-l3.py -m 960mbps --port 1 -t fsize=1518,src_ip=192.168.101.12,dst_ip=192.168.100.11