Traefik Mesh (anciennement Maesh, renommé en 2021) est un service mesh Kubernetes développé par Traefik Labs (France). Son architecture est fondamentalement différente de celle d'Istio, Linkerd ou Kuma : pas d'injection de sidecar. À la place, un proxy Traefik tourne en DaemonSet sur chaque nœud, et les services sont redirigés via une modification des entrées DNS dans CoreDNS. Chaque pod communique avec le proxy sur son nœud local, qui gère le trafic vers la destination.
Cette approche rend l'installation moins intrusive (pas de modification des pods), mais offre moins de granularité qu'un modèle sidecar. Traefik Mesh implémente la spécification SMI (Service Mesh Interface) pour l'interopérabilité. Il est particulièrement adapté aux environnements qui utilisent déjà Traefik comme Ingress et veulent un service mesh léger sans la complexité d'Istio.
Informations essentielles
Origine : Traefik Labs - Containous (France) · Licence : Apache 2.0 · Architectures : x86_64, ARM64
Liens : Site officiel · Documentation · GitHub · Releases
Support : Le projet est maintenu par Traefik Labs mais évolue moins vite que Istio ou Linkerd. Vérifier la compatibilité Kubernetes avant mise à jour.
Stack par défaut
| Composant | Valeur |
|---|---|
| Proxy de données | Traefik (DaemonSet - 1 par nœud, pas de sidecar) |
| Plan de contrôle | traefik-mesh-controller |
| DNS | CoreDNS (modifié pour rediriger le trafic vers le proxy local) |
| mTLS | Non activé par défaut (optionnel) |
| Spécification | SMI (Service Mesh Interface) |
| Kubernetes minimum | 1.21+ |
Différence architecturale
Modèle sidecar (Istio, Linkerd, Kuma)
[Pod A] → iptables → [Envoy sidecar] → [réseau] → [Envoy sidecar] → [Pod B]
Modèle per-node de Traefik Mesh
[Pod A] → [résolution DNS: svc → traefik-mesh-node-IP] → [Traefik sur nœud A] → [réseau] → [Pod B]
Le proxy Traefik sur le nœud intercepte le trafic destiné à service.namespace.svc.cluster.local en remplaçant dans CoreDNS les réponses DNS par l'IP du proxy local.
Avantages : pas de modification des pods, overhead très faible, déploiement non-intrusif.
Limites : la granularité est per-nœud (pas per-pod), certaines fonctionnalités mTLS avancées sont plus limitées, moins adapté aux politiques de sécurité très fines.
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.21+ |
| CoreDNS | Obligatoire (pas compatible avec kube-dns) |
| Helm | 3.x |
| Droits | cluster-admin |
| Traefik Ingress | Non obligatoire, mais recommandé si déjà en place |
Vérifier que CoreDNS est utilisé (et non kube-dns) :
kubectl get pods -n kube-system -l k8s-app=kube-dns
# Doit afficher des pods "coredns-*"
Installation
Via Helm
helm repo add traefik https://traefik.github.io/charts
helm repo update
helm install traefik-mesh traefik/traefik-mesh \
--namespace traefik-mesh \
--create-namespace
# Vérifier
kubectl get pods -n traefik-mesh
Le contrôleur Traefik Mesh patche automatiquement la ConfigMap de CoreDNS pour rediriger les requêtes DNS des services mesh.
Options d'installation
# traefik-mesh-values.yaml
controller:
logLevel: INFO
mesh:
defaultMode: http # http ou tcp
acl:
enabled: false # Activer le contrôle d'accès SMI (TrafficPolicy)
tracing:
jaeger:
localAgentHostPort: "" # Adresse Jaeger si tracing activé
helm install traefik-mesh traefik/traefik-mesh \
-n traefik-mesh --create-namespace \
-f traefik-mesh-values.yaml
Vérifier le patch CoreDNS
kubectl get configmap coredns -n kube-system -o yaml | grep traefik-mesh
# Doit afficher des règles de réécriture DNS vers traefik-mesh
Activation par service
Traefik Mesh fonctionne sur les services annotés. Par défaut, les services existants ne sont pas dans le mesh tant qu'ils n'ont pas l'annotation.
# Activer le mesh sur un Service existant
apiVersion: v1
kind: Service
metadata:
name: backend
namespace: production
annotations:
traefik.io/service.nativeLB: "false" # Utiliser le proxy Traefik Mesh
spec:
selector:
app: backend
ports:
- port: 80
targetPort: 8080
En mode ACL activé (acl.enabled=true), tous les services sont dans le mesh et le trafic est refusé par défaut (deny-all). Il faut alors créer des TrafficPolicy SMI.
Contrôle d'accès (SMI - mode ACL)
Activer le mode ACL active le deny-all par défaut et exige des politiques explicites :
helm upgrade traefik-mesh traefik/traefik-mesh \
-n traefik-mesh \
--set acl.enabled=true
# TrafficPolicy SMI : autoriser frontend → backend
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
name: api-routes
namespace: production
spec:
matches:
- name: all
pathRegex: ".*"
methods: ["*"]
---
apiVersion: access.smi-spec.io/v1alpha2
kind: TrafficTarget
metadata:
name: frontend-to-backend
namespace: production
spec:
destination:
kind: ServiceAccount
name: backend
namespace: production
rules:
- kind: HTTPRouteGroup
name: api-routes
matches:
- all
sources:
- kind: ServiceAccount
name: frontend
namespace: production
Traffic splitting (canary)
# SMI TrafficSplit
apiVersion: split.smi-spec.io/v1alpha4
kind: TrafficSplit
metadata:
name: backend-split
namespace: production
spec:
service: backend
backends:
- service: backend-v1
weight: 900m # 90%
- service: backend-v2
weight: 100m # 10%
Mise à jour
helm repo update
# Vérifier les changements du chart
helm diff upgrade traefik-mesh traefik/traefik-mesh -n traefik-mesh
# Appliquer
helm upgrade traefik-mesh traefik/traefik-mesh \
-n traefik-mesh \
-f traefik-mesh-values.yaml
# Vérifier
kubectl rollout status daemonset/traefik-mesh -n traefik-mesh
kubectl rollout status deployment/traefik-mesh-controller -n traefik-mesh
Troubleshooting
# État des pods Traefik Mesh
kubectl get pods -n traefik-mesh
# Logs du contrôleur
kubectl logs -n traefik-mesh -l app=traefik-mesh-controller --tail=100
# Logs du proxy sur un nœud spécifique
kubectl logs -n traefik-mesh -l component=maesh-mesh --tail=100
# Vérifier le patch CoreDNS
kubectl get configmap coredns -n kube-system -o yaml
Le trafic ne passe pas par le mesh
# Vérifier que CoreDNS a été patché
kubectl describe configmap coredns -n kube-system | grep traefik
# Vérifier la résolution DNS depuis un pod
kubectl run dns-test --image=busybox --rm -it --restart=Never -- \
nslookup backend.production.svc.cluster.local
# L'IP retournée doit être celle du DaemonSet Traefik Mesh, pas l'IP du Service
# Si CoreDNS n'est pas patché, déclencher manuellement
kubectl annotate configmap coredns -n kube-system traefik-mesh/created-by=controller
Vérifier les endpoints
# Dashboard Traefik (port-forward)
kubectl port-forward -n traefik-mesh <pod-traefik-mesh> 8080:8080
# Ouvrir http://localhost:8080/dashboard/
Commandes utiles
# Ressources SMI dans le cluster
kubectl get traffictarget -A
kubectl get trafficsplit -A
kubectl get httproutegroup -A
# DaemonSet Traefik Mesh (1 proxy par nœud)
kubectl get daemonset -n traefik-mesh
kubectl get pods -n traefik-mesh -o wide # Voir sur quels nœuds les proxies tournent
# Contrôleur
kubectl get deployment -n traefik-mesh
# Tester la connectivité au travers du mesh
kubectl run test --image=curlimages/curl --rm -it --restart=Never -- \
curl -s http://backend.production.svc.cluster.local/health
Ressources
- Documentation officielle : https://doc.traefik.io/traefik-mesh/
- SMI Specification : https://smi-spec.io/
- GitHub Traefik Mesh : https://github.com/traefik/mesh
- Releases : https://github.com/traefik/mesh/releases
- Traefik Labs : https://traefik.io/traefik-mesh/