v2ray core

v2ray core : Chaos Engineering sur Kubernetes

Référence pratique RubyAvancé

v2ray core : Chaos Engineering sur Kubernetes

L’instabilité réseau est le premier facteur de panne dans un cluster Kubernetes. Utiliser v2ray core comme agent de chaos permet de manipuler le trafic inter-pod de manière granulaire sans modifier le code applicatif.

Contrairement aux outils comme Chaos Mesh qui injectent des règles au niveau du noyau, l’approche v2ray core s’appuie sur l’interception au niveau user-space. Les benchmarks sur Go 1.22 montrent une latence d’injection de 2ms pour un overhead CPU de seulement 3% sur des flux TCP standard.

Vous saurez configurer des sidecars de proxy, manipuler les règles de routage pour simuler des partitions réseau et automatiser l’injection de fautes avec Ruby.

v2ray core

🛠️ Prérequis

Environnement de test Kubernetes opérationnel avec les versions suivantes :

  • Kubernetes 1.29+
  • kubectl 1.29+
  • v2ray core v1.55.0+
  • Ruby 3.3.0+ (pour l’automatisation)
  • gem k8s-client (version 0.15.0+)

📚 Comprendre v2ray core

Le principe repose sur le pattern Sidecar. On injecte un conteneur v2ray core dans le Pod cible. Ce conteneur utilise iptables pour rediriger le trafic entrant et sortant vers son propre socket proxy.

Pod (App) --> iptables (lo/eth0) --> v2ray core (Proxy) --> Destination (Service B)

Contrairement à l’approche Ruby/Sinatra qui est souvent orientée vers les tests unitaires, ici nous traitons le réseau comme un composant asynchrone. On applique le principe du moindre étonnement : le développeur ne voit pas le proxy, seul le réseau change de comportement.

💎 Le code — v2ray core

Ruby
require 'k8s-client'
require 'json'

# Script pour injecter un sidecar v2 de chaos dans un deployment
class ChaosInjector
  def initialize(kubeconfig_path)
    @client = K8s::Client.new(K8s::Config.load_file(kubeconfig_path))
  end

  def inject_v2ray_sidecar(namespace, deployment_name)
    deployment = @client.api('apps/v1').resource('deployments', namespace: namespace).get(deployment_name)
    
    # Définition du conteneur de chaos
    sidecar = {
      name: 'v2ray-chaos-agent',
      image: 'v2fly/v2ray-core:v1.55.0',
      args: ['run', '-c', '/etc/v2ray/config.json'],
      volumeMounts: [{ name: 'v2ray-config', mountPath: '/etc/v2ray' }]
    }

    # Patch du deployment existant
    patch_data = {
      spec: {
        template: {
          spec: {
            containers: [sidecar],
            volumes: [{ name: 'v2ray-config', configMap: { name: 'v2ray-chaos-config' } }]
          }
        }
      }
    }

    @client.api('apps/v1').resource('deployments', namespace: namespace).patch(deployment_name, patch_data)
    puts "Injection réussie pour #{deployment_name}"
  rescue K8s::Error::NotFound
    puts "Erreur : Deployment non trouvé."
  end
end

📖 Explication

Dans le script Ruby, l’utilisation de patch_data évite de renvoyer l’objet Deployment complet, ce qui respecte les bonnes pratiques de l’API Kubernetes. Le volumeMounts est crucial : il permet de mettre à jour la configuration de chaos sans reconstruire l’image du conteneur.

Dans le JSON de configuration, la règle ip: ["10.0.0.0/8"] avec l’outbound blackhole est un piège classique : elle risque de couper tout le trafic interne du cluster si vous ne ciblez pas des sous-réseaux précis. Testez toujours avec une plage IP restreinte (ex: /32) pour isoler un seul service.

Documentation officielle Ruby

🔄 Second exemple

Ruby
{
  "inbounds": [{"port": 1080, "protocol": "socks", "settings": {"auth": "noauth"}}],
  "outbounds": [{"protocol": "freedom", "settings": {}, "tag": "direct"}, {"protocol": "blackhole", "settings": {}, "tag": "drop"}],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["10.0.0.0/8"], 
        "outboundTag": "drop" 
      }
    ]
  }\
}

▶️ Exemple d’utilisation

Exécution du script d’injection sur un namespace de staging :

injector = ChaosInjector.new("./kubeconfig")
injector.inject_v2ray_sidecar("staging", "api-gateway")

Sortie console attendue :

Injection réussie pour api-gateway
[INFO] Deployment api-gateway patched with v2ray-chaos-agent

🚀 Cas d’usage avancés

1. **Test de timeout de base de données** : Injectez 5s de latence sur le port 5432 via v2ray core pour vérifier que votre pool de connexions Ruby ne sature pas. v2ray core intercepte le flux TCP et retient les paquets.

2. **Simulation de panne DNS** : Redirigez les requêtes DNS vers un outbound blackhole pour valider que votre mécanisme de retry DNS fonctionne sur Kubernetes 1.29.

3. **Chaos de sécurité** : Utilisez v2ray core pour simuler un détournement de trafic (Man-in-the-middle) en redirigeant le trafic HTTPS vers un proxy qui présente des certificats invalides.

✅ Bonnes pratiques

Pour une utilisation industrielle de v2ray core en chaos engineering, respectez ces règles :

  • Immutabilité : Ne modifiez jamais un Deployment en production. Utilisez des namespaces de test dédiés.
  • Observabilité : Coupleurs v2ray core avec Prometheus pour monitorer le nombre de paquets « droppés ».
  • Nettoyage : Prévoyez toujours un script de ‘rollback’ qui supprime le conteneur sidecar et restaure les règles iptables.
  • Scope Limité : Utilisez des NetworkPolicy pour empêcher que votre agent de chaos ne s’attaque à des services critiques hors de sa zone.
  • Idempotence : Votre script Ruby doit pouvoir être exécuté plusieurs fois sans créer de doublons de volumes ou de conteneurs.
Points clés

  • v2ray core permet une manipulation granulaire du trafic via proxy user-space.
  • L'injection de sidecar via Ruby automatise les tests de résilience.
  • Le pattern blackhole est idéal pour simuler des pannes de service.
  • Attention au piège de la boucle infinie iptables avec l'UID owner.
  • L'utilisation de Go 1.22 assure des performances minimales sur le plan de données.
  • Le routage basé sur les domaines est plus précis que l'IP pour le chaos.
  • L'overhead CPU reste acceptable (<5%) pour des tests de charge.
  • Le nettoyage des ressources est aussi important que l'injection.

❓ Questions fréquentes

Est-ce que v2ray core ralentit mes applications en production ?

Si configuré comme sidecar de chaos, il ne doit être présent que dans les environnements de test. En production, son usage est risqué à cause de l’interception iptables.

Peut-on simuler des erreurs HTTP 500 avec v2ray core ?

v2ray core travaille au niveau TCP/Layer 4. Pour du Layer 7 (HTTP), il faudra coupler l’agent avec un outil comme Envoy ou utiliser un module de modification de payload.

Comment savoir si mon injection a réussi ?

Vérifiez les logs du conteneur `v2ray-chaos-agent` et utilisez `kubectl exec` pour tenter un `curl` vers la cible.

Est-ce compatible avec Istio ?

Oui, mais attention aux conflits de redirection iptables. Il faut configure Istio pour ignorer le trafic destiné au port du proxy de chaos.

📚 Sur le même blog

🔗 Le même sujet sur nos autres blogs

📝 Conclusion

L’utilisation de v2ray core comme plateforme de chaos engineering offre une alternative légère et programmable aux outils traditionnels. La clé du succès réside dans la gestion précise des règles de routage et l’automatisation du nettoyage des sidecars. Pour approfondir la manipulation des flux réseau, consultez la documentation Ruby officielle. Un agent de chaos qui ne peut pas être supprimé est une bombe à retardement pour votre cluster.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *