This tool visualizes the communication patterns between namespaces in a Kubernetes cluster based on nginx logs analysis. It creates an interactive graph showing the connections and provides metrics about HTTP status codes and request volumes.
- Interactive Graph Visualization: Shows nodes representing namespaces and connections between them
- Real-time Updates: Automatically refreshes data at configurable intervals
- Filtering: Filter by namespace to focus on specific areas
- Physics Simulation: Interactive graph with physics controls for better visualization
- Error Tracking: View HTTP status code statistics for connections
- Multithreaded Processing: Parallel log collection and parsing for improved performance
- Customizable: Adjust refresh rates, physics parameters, and threading settings to suit your needs
-
Clone this repository:
git clone https://github.com/yourusername/kubernetes-communications-graph.git cd kubernetes-communications-graph
-
Create and activate a virtual environment (optional but recommended):
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
-
Install dependencies:
pip install -r requirements.txt
Run the web application with:
python app.py
This will start the web server on port 6200. Open your browser and navigate to:
http://localhost:6200
The web application includes the following features:
- Control Panel: Tools to manage the graph visualization
- Refresh Button: Manually trigger a data update
- Physics Controls: Toggle and adjust the physics simulation
- Namespace Filters: Show/hide specific namespaces
- Update Interval: Configure how often the graph automatically refreshes
You can also use the command-line version for one-time graph generation:
python graph_k8s_new.py [options]
Options:
-d, --debug
: Debug level (0=minimal, 1=info, 2=debug)-o, --output
: Output file path--static
: Generate a static image instead of interactive HTML--viz
: Visualization library to use (bokeh or pyvis)--no-logs
: Skip log extraction and use simplified communication patterns--context
: Specify the kube-context to use
- Python 3.6+
- Kubernetes cluster with kubectl configured
- nginx logs with proper formatting
- Dependencies listed in requirements.txt
You can customize the appearance and behavior of the graph by modifying:
static/css/style.css
: Styling of the web interfacestatic/js/main.js
: Client-side behavior and graph optionsapp.py
: Server-side logic and data processing
- Ensure your kubectl is properly configured to access your cluster
- Check that your nginx logs are properly formatted
- If the graph doesn't appear, check the browser console for errors
- Analyse des logs des pods web dans chaque namespace
- Visualisation interactive des communications entre namespaces sous forme de graphe
- Regroupement des services par namespace pour une visualisation simplifiée
- Une seule arête par direction de communication entre namespaces
- Distinction visuelle entre les différents namespaces (couleurs)
- Annotations numériques sur les arêtes indiquant le nombre exact d'appels mesurés
- Visualisation hautement interactive avec PyVis (déplacement des nœuds, zoom, survol)
- Option d'utilisation de Bokeh comme alternative pour la visualisation interactive
- Journalisation détaillée pour le débogage
- Python 3.6+
- Accès à un cluster Kubernetes (configuration kubectl fonctionnelle)
- Permissions suffisantes pour lire les logs des pods dans les namespaces cibles
Les namespaces à exclure de l'analyse sont définis dans le fichier excluded-ns.txt
, un par ligne. Par défaut, les namespaces suivants sont exclus:
kube-system
default
calico-system
calico-apiserver
cert-manager
Vous pouvez modifier ce fichier pour ajouter ou supprimer des namespaces à exclure.
The project is organized into the following directories:
-
config/
: Contains configuration files and constantsconstants.py
: Global constants used throughout the applicationexcluded-ns.txt
: List of namespaces to exclude from analysislog_format_nginx.txt
: Example format of nginx logslog_format_java.txt
: Example format of Java logs
-
libs/
: Contains the main library codelogging.py
: Logging setup and configurationparsing/
: Modules for parsing logs and Kubernetes resourceslogs.py
: Functions for parsing and extracting logskubernetes.py
: Functions for interacting with Kubernetes API
graph/
: Modules for building and manipulating graphscommunication_graph.py
: Main class for building the communication graphgraph_builder.py
: Helper functions for graph construction
visualization/
: Modules for visualizing the graphpyvis_viz.py
: PyVis-based interactive visualizationbokeh_viz.py
: Bokeh-based interactive visualizationmatplotlib_viz.py
: Matplotlib-based static visualization
-
static/
: Contains static assets for the web interfacejs/
: JavaScript filescss/
: CSS stylesheets
-
outputs/
: Default directory for generated visualizations
Assurez-vous que kubectl est configuré pour accéder à votre cluster Kubernetes, puis exécutez:
python graph_k8s_new.py
Le script accepte les options suivantes:
-d
,--debug
: Niveau de débogage (0=minimal, 1=info, 2=debug). Par défaut: 1-o
,--output
: Chemin du fichier de sortie. Par défaut: k8s_communications_graph.html--static
: Générer une image statique (.png) au lieu d'une visualisation interactive (.html)--viz
: Bibliothèque de visualisation à utiliser ('pyvis' ou 'bokeh'). Par défaut: pyvis
Exemples:
# Exécuter avec un niveau de débogage détaillé
python graph_k8s_new.py --debug 2
# Générer une visualisation statique
python graph_k8s_new.py --static
# Utiliser Bokeh au lieu de PyVis pour la visualisation
python graph_k8s_new.py --viz bokeh
# Spécifier un fichier de sortie personnalisé
python graph_k8s_new.py --output mon_graphe.html
Le script génère des informations de débogage à deux endroits:
- Dans la console (sortie standard)
- Dans un fichier
graph_k8s.log
Les niveaux de débogage sont:
- 0 (minimal): Affiche uniquement les erreurs et avertissements
- 1 (info): Affiche également les informations générales sur le processus (par défaut)
- 2 (debug): Affiche des informations détaillées pour le débogage
La visualisation par défaut utilise PyVis et offre une expérience très interactive:
- Zoom avancé: Molette de la souris pour agrandir/réduire le graphe avec animation fluide
- Déplacement du graphe: Cliquez et faites glisser pour déplacer l'ensemble du graphe
- Déplacement des nœuds: Cliquez et faites glisser un nœud pour le repositionner
- Survol des nœuds: Affiche la liste des services regroupés dans le namespace
- Survol des arêtes: Montre le nombre exact de communications détectées
- Physique dynamique: Les nœuds réagissent aux déplacements de manière réaliste
- Multi-sélection: Sélectionnez plusieurs nœuds à la fois
- Outils de contrôle: Boutons pour ajuster la visualisation
La visualisation avec Bokeh (activée avec --viz bokeh
) offre une autre perspective:
- Zoom et déplacement: Outils dédiés pour naviguer dans le graphe
- Infobulle au survol: Informations détaillées sur les namespaces et connections
- Disposition statique initiale: Les nœuds conservent leur position initiale
Le script crée désormais un graphe simplifié avec les caractéristiques suivantes:
- Un seul nœud par namespace: Tous les services d'un même namespace sont regroupés
- Une seule arête par direction: Les communications multiples entre mêmes namespaces sont consolidées
- Taille des nœuds proportionnelle: Plus un namespace contient de services, plus son nœud est grand
- Épaisseur des arêtes significative: Proportionnelle au nombre de communications
- Étiquettes numériques précises: Le nombre exact de communications est affiché sur chaque arête
Le script va:
- Se connecter au cluster Kubernetes
- Récupérer la liste des namespaces (hors exclusions)
- Pour chaque namespace, trouver un pod web et extraire ses logs
- Analyser les logs pour détecter les communications entre services
- Créer un graphe détaillé des communications entre services
- Simplifier le graphe en regroupant par namespace
- Générer une visualisation interactive avec PyVis (ou Bokeh)
- Sauvegarder le graphique sous forme de fichier HTML interactif (ou PNG si option --static)
- Nœuds: Chaque nœud représente un namespace ou "external" pour les services extérieurs
- Arêtes: Les flèches représentent la direction des communications entre namespaces
- Chiffres sur les arêtes: Nombre total de communications détectées entre ces namespaces
- Taille des nœuds: Proportionnelle au nombre de services dans le namespace
- Infobulle des nœuds: Liste les services individuels regroupés dans le namespace
- L'analyse est limitée à 100 lignes de logs par pod
- Un seul pod "web" est analysé par namespace
- Les logs doivent être au format JSON défini dans
log_format_nginx.txt
Si vous rencontrez des problèmes:
- Vérifiez que votre configuration kubectl fonctionne correctement
- Assurez-vous d'avoir les permissions nécessaires pour lire les logs des pods
- Vérifiez que les logs sont bien au format JSON attendu
- Utilisez l'option
--debug 2
pour obtenir des informations détaillées sur l'exécution - Consultez le fichier
graph_k8s.log
pour voir les messages de journalisation complets - Assurez-vous que toutes les dépendances sont installées (
pip install -r requirements.txt
)
This tool uses multithreading to significantly improve log collection and parsing performance, especially for clusters with many namespaces.
For details on the multithreading implementation and tuning options, see Multithreading Documentation.
The application uses MariaDB to store node error counts. To set up the database:
-
Install MariaDB if not already installed:
# On macOS with Homebrew brew install mariadb # On Ubuntu/Debian sudo apt-get install mariadb-server
-
Start the MariaDB service:
# On macOS brew services start mariadb # On Ubuntu/Debian sudo systemctl start mariadb
-
Configure the database connection:
- Edit
config/database.py
to set your database credentials:DB_CONFIG = { 'host': 'localhost', 'user': 'your_username', 'password': 'your_password', 'database': 'k8s_graph' }
- Edit
-
The database and tables will be automatically created when you first run the application.