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
| Composant | Valeur |
|---|---|
| Proxy de données | Envoy (géré par consul-dataplane) |
| Plan de contrôle | Consul server (cluster 1, 3 ou 5 nœuds) |
| Autorité de certification | Consul Connect CA (intégré, ou délégué à Vault) |
| Contrôle d'accès | Intentions (L4) + intentions avec filtre L7 |
| Stockage | Consul KV store (Raft, pas d'etcd externe) |
| Kubernetes minimum | 1.27+ (Consul 1.18) |
Concepts clés
| Composant | Rôle |
|---|---|
| Consul server | Plan de contrôle - catalogue de services, KV, CA |
| consul-dataplane | Processus sidecar sur K8s (gère Envoy, remplace l'agent depuis 1.14) |
| Intention | Règle allow/deny de service à service (L4 ou L7) |
| Connect CA | Autorité de certification pour les certificats mTLS |
| Service mesh gateway | Passerelle pour le trafic cross-datacenter ou cross-namespace |
| Transparent proxy | Mode K8s où tout le trafic est redirigé via Envoy automatiquement |
Intégrations écosystème HashiCorp
| Outil | Intégration |
|---|---|
| Vault | Délégation de la CA à Vault PKI (secrets engine) |
| Nomad | Service mesh natif pour les workloads Nomad |
| Terraform | Gestion des intentions et de la configuration Consul via IaC |
| HCP Consul | Version managée sur HashiCorp Cloud Platform |
Prérequis
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.27+ |
| Helm | 3.x |
| Droits | cluster-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
- Documentation Consul Service Mesh : https://developer.hashicorp.com/consul/docs/connect
- Helm chart reference : https://developer.hashicorp.com/consul/docs/k8s/helm
- Intentions : https://developer.hashicorp.com/consul/docs/connect/intentions
- Intégration Vault : https://developer.hashicorp.com/consul/docs/connect/ca/vault
- GitHub : https://github.com/hashicorp/consul
- Releases : https://github.com/hashicorp/consul/releases