Service Mesh

Consul Service Mesh

Service mesh HashiCorp intégré à Consul. mTLS via intentions, multi-environnement Kubernetes et VMs, proxy Envoy. Licence BUSL 1.1 depuis août 2023.

Consul Service Mesh (anciennement Consul Connect) est la couche service mesh intégrée à HashiCorp Consul. Consul remplit trois rôles simultanément : découverte de services, gestion de la configuration (key/value store), et service mesh. Son point fort est de fonctionner uniformément sur Kubernetes, machines virtuelles et environnements bare-metal - contrairement à Istio ou Linkerd qui sont exclusivement Kubernetes.

Le contrôle des flux se fait via des intentions : des règles déclaratives qui autorisent ou refusent la communication entre services, indépendamment de l'IP ou du port. Le proxy de données est Envoy, géré par consul-dataplane (depuis Consul 1.14, remplace l'agent local sur K8s).

Licence : HashiCorp a changé la licence de Consul vers BUSL 1.1 (Business Source License) en août 2023. L'usage production commercial nécessite une évaluation de conformité. Cette décision a été très controversée dans la communauté open source (OpenTofu est né comme fork de Terraform suite à ce même changement, mais il n'existe pas d'équivalent communautaire majeur pour Consul à ce jour).


Informations essentielles

Origine : HashiCorp (États-Unis)  ·  Licence : BUSL 1.1 (depuis août 2023)  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : HashiCorp maintient les 2 dernières versions majeures. Les versions N-2 et plus ne reçoivent plus de correctifs de sécurité.

Stack par défaut

ComposantValeur
Proxy de donnéesEnvoy (géré par consul-dataplane)
Plan de contrôleConsul server (cluster 1, 3 ou 5 nœuds)
Autorité de certificationConsul Connect CA (intégré, ou délégué à Vault)
Contrôle d'accèsIntentions (L4) + intentions avec filtre L7
StockageConsul KV store (Raft, pas d'etcd externe)
Kubernetes minimum1.27+ (Consul 1.18)

Concepts clés

ComposantRôle
Consul serverPlan de contrôle - catalogue de services, KV, CA
consul-dataplaneProcessus sidecar sur K8s (gère Envoy, remplace l'agent depuis 1.14)
IntentionRègle allow/deny de service à service (L4 ou L7)
Connect CAAutorité de certification pour les certificats mTLS
Service mesh gatewayPasserelle pour le trafic cross-datacenter ou cross-namespace
Transparent proxyMode K8s où tout le trafic est redirigé via Envoy automatiquement

Intégrations écosystème HashiCorp

OutilIntégration
VaultDélégation de la CA à Vault PKI (secrets engine)
NomadService mesh natif pour les workloads Nomad
TerraformGestion des intentions et de la configuration Consul via IaC
HCP ConsulVersion managée sur HashiCorp Cloud Platform

Prérequis

RessourceValeur
Kubernetes1.27+
Helm3.x
Droitscluster-admin
Ports (serveurs Consul)8300 (RPC), 8301 (Serf LAN), 8500 (HTTP API), 8501 (HTTPS), 8600 (DNS)
Ports (dataplane)20000 (Envoy, configurable)

Installation sur Kubernetes

Via Helm (recommandé)

helm repo add hashicorp https://helm.releases.hashicorp.com
helm repo update

# Installation minimale avec service mesh activé
helm install consul hashicorp/consul \
  --namespace consul \
  --create-namespace \
  --set global.name=consul \
  --set global.datacenter=dc1 \
  --set server.replicas=3 \
  --set connectInject.enabled=true \
  --set connectInject.default=false \
  --set ui.enabled=true

# Vérifier
kubectl get pods -n consul

Fichier de valeurs recommandé pour la production

# consul-values.yaml
global:
  name: consul
  datacenter: dc1
  tls:
    enabled: true
    verify: true
  acls:
    manageSystemACLs: true

server:
  replicas: 3
  storage: 10Gi

connectInject:
  enabled: true
  default: false           # Injection opt-in par annotation

ui:
  enabled: true
  service:
    type: ClusterIP
helm install consul hashicorp/consul -n consul --create-namespace -f consul-values.yaml

Activer l'injection sur un pod

# Annotation sur le pod (pas le namespace)
metadata:
  annotations:
    consul.hashicorp.com/connect-inject: "true"

En mode connectInject.default=true, tous les pods sont injectés sauf ceux avec l'annotation "false".


Intentions (contrôle d'accès)

Via kubectl (CRD ServiceIntentions)

# Autoriser frontend → backend sur /api/
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceIntentions
metadata:
  name: backend
  namespace: production
spec:
  destination:
    name: backend
  sources:
  - name: frontend
    action: allow
    permissions:
    - http:
        methods: ["GET", "POST"]
        pathPrefix: /api/
  - name: "*"
    action: deny
kubectl apply -f intentions.yaml

# Lister les intentions
kubectl get serviceintentions -n production

Via CLI Consul

# Deny-all par défaut sur un namespace
consul intention create -deny "*" "*"

# Autoriser frontend → backend
consul intention create -allow frontend backend

# Lister
consul intention list

Gestion du trafic (L7)

# ServiceRouter : routing basé sur les headers HTTP
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceRouter
metadata:
  name: mon-service
  namespace: production
spec:
  routes:
  - match:
      http:
        header:
        - name: x-version
          exact: v2
    destination:
      service: mon-service-v2
  - destination:
      service: mon-service
---
# ServiceSplitter : canary deploy (90/10)
apiVersion: consul.hashicorp.com/v1alpha1
kind: ServiceSplitter
metadata:
  name: mon-service
  namespace: production
spec:
  splits:
  - weight: 90
    service: mon-service
    serviceSubset: v1
  - weight: 10
    service: mon-service
    serviceSubset: v2

Vault comme CA

Déléguer la gestion des certificats à Vault PKI pour une meilleure gouvernance :

# Dans consul-values.yaml
global:
  secretsBackend:
    vault:
      enabled: true
      consulServerRole: consul-server
      consulClientRole: consul-client
      consulCARole: consul-ca
  tls:
    enabled: true
    enableAutoEncrypt: true
    caCert:
      secretName: pki/cert/ca

connectInject:
  enabled: true

Mise à jour

# Vérifier la version courante
helm list -n consul
kubectl exec -n consul consul-server-0 -- consul version

# Mettre à jour le chart Helm
helm repo update
helm upgrade consul hashicorp/consul -n consul -f consul-values.yaml

# Vérifier l'état des pods
kubectl rollout status statefulset/consul-server -n consul
kubectl get pods -n consul

Ne jamais sauter de version majeure. Lire les notes de migration dans le changelog - certaines versions requirent des étapes manuelles (ex: migration ACL tokens, changements de schéma KV).


Troubleshooting

# État du cluster Consul
kubectl exec -n consul consul-server-0 -- consul members

# Logs du serveur Consul
kubectl logs -n consul consul-server-0 --tail=100

# Logs du sidecar consul-dataplane dans un pod applicatif
kubectl logs <pod> -c consul-dataplane -n production

# Vérifier les intentions actives
kubectl exec -n consul consul-server-0 -- consul intention list

# Vérifier les certificats TLS
kubectl exec -n consul consul-server-0 -- consul tls ca create --help

Pod non injecté

# Vérifier l'annotation
kubectl get pod <pod> -n production -o yaml | grep consul.hashicorp.com/connect-inject

# Vérifier le webhook d'injection
kubectl get mutatingwebhookconfigurations | grep consul

Erreur "connection refused" entre services

# Vérifier les intentions (une deny-all peut bloquer le trafic)
kubectl exec -n consul consul-server-0 -- consul intention check <source> <destination>

# Vérifier les endpoints Envoy
kubectl exec <pod> -c envoy-sidecar -- curl -s localhost:19000/clusters

Commandes utiles

# Accéder à l'UI Consul
kubectl port-forward -n consul svc/consul-ui 8500:80
# Ouvrir http://localhost:8500

# Membres du cluster
kubectl exec -n consul consul-server-0 -- consul members

# Santé d'un service
kubectl exec -n consul consul-server-0 -- consul health service <nom-service>

# Reloader la configuration Consul
kubectl exec -n consul consul-server-0 -- consul reload

# Générer un token ACL
kubectl exec -n consul consul-server-0 -- consul acl token create \
  --description "mon-app" --policy-name global-management

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