Service Mesh

Traefik Mesh

Service mesh Kubernetes de Traefik Labs (ex-Maesh). Architecture sans sidecar - proxy par nœud via DaemonSet. Conforme SMI. Simple à déployer avec Helm.

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

ComposantValeur
Proxy de donnéesTraefik (DaemonSet - 1 par nœud, pas de sidecar)
Plan de contrôletraefik-mesh-controller
DNSCoreDNS (modifié pour rediriger le trafic vers le proxy local)
mTLSNon activé par défaut (optionnel)
SpécificationSMI (Service Mesh Interface)
Kubernetes minimum1.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

RessourceValeur
Kubernetes1.21+
CoreDNSObligatoire (pas compatible avec kube-dns)
Helm3.x
Droitscluster-admin
Traefik IngressNon 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

Newsletter · 2 000+ abonnés

Reste au courant de ce qui bouge en prod

RudeOps veille devops hebdo, droit au but.

Gratuit · Sans spam · Désinscription en un clic