Service Mesh

Istio

Service mesh CNCF open source basé sur Envoy. mTLS automatique, gestion du trafic (VirtualService, Gateway), observabilité. Install via istioctl ou Helm.

Istio est le service mesh le plus complet de l'écosystème Kubernetes, créé en 2016 par Google, IBM et Lyft, intégré à la CNCF en 2022 (graduated 2023). Il intercepte tout le trafic réseau entre services via un proxy Envoy injecté automatiquement comme sidecar dans chaque pod, sans modification du code applicatif. Il gère le chiffrement mTLS, le routage avancé, les retries, le circuit breaking et l'observabilité de manière transparente.

Depuis Istio 1.22 (mai 2024), le mode ambient est stable : il élimine les sidecars au profit d'un composant ztunnel par nœud pour la couche L4, et de waypoint proxies optionnels pour la couche L7.


Informations essentielles

Origine : Google, IBM, Lyft → CNCF  ·  Licence : Apache 2.0  ·  Architectures : x86_64, ARM64

Liens : Site officiel  ·  Documentation  ·  GitHub  ·  Releases

Support : Istio maintient les 3 dernières versions mineures (~12 mois par version). Les versions plus anciennes ne reçoivent plus de correctifs de sécurité.

Stack par défaut

ComposantValeur
Proxy de donnéesEnvoy (sidecar injecté automatiquement, ou ztunnel en mode ambient)
Plan de contrôleistiod (Pilot + Citadel + Galley unifiés depuis 1.5)
IngressIstio Gateway ou Gateway API
Autorité de certificationistiod CA (certificats SPIFFE/X.509, rotation automatique)
ObservabilitéNon inclus - Prometheus, Grafana, Kiali, Jaeger en option
Kubernetes minimum1.29+ (Istio 1.24)

Concepts clés

RessourceRôle
VirtualServiceRègles de routage (poids, headers, retries, timeouts, fault injection)
DestinationRuleLoad balancing, circuit breaking, TLS par sous-ensemble de pods
GatewayPoint d'entrée pour le trafic externe (ingress et egress)
ServiceEntryEnregistrer des services externes au mesh
PeerAuthenticationMode mTLS par namespace ou workload (STRICT / PERMISSIVE)
AuthorizationPolicyContrôle d'accès L4/L7 (quels services peuvent appeler quoi)

Overhead du sidecar Envoy (mode sidecar) : environ 0,5 ms de latence additionnelle, ~50 MB de RAM par proxy, 10 m CPU en charge faible.


Prérequis

RessourceValeur
Kubernetes1.29 - 1.32 (Istio 1.24)
kubectlCompatible avec le cluster cible
Droitscluster-admin pour créer CRDs et MutatingWebhookConfiguration
RAM supplémentaire~50 MB par pod (proxy Envoy)

Installation

Option 1 : istioctl (recommandé)

# Télécharger istioctl
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.24.3 sh -
cd istio-1.24.3
export PATH=$PWD/bin:$PATH

# Vérifier les prérequis cluster
istioctl x precheck

# Installer avec le profil default
istioctl install --set profile=default -y

# Vérifier l'installation
istioctl verify-install
kubectl get pods -n istio-system

Profils disponibles

ProfilUsage
defaultProduction - istiod + ingressgateway
demoÉvaluation - tout activé + addons
minimalistiod uniquement, pas de gateway
ambientMode sans sidecar (ztunnel + waypoint proxies)

Option 2 : Helm

helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update

# CRDs
helm install istio-base istio/base -n istio-system --create-namespace \
  --set defaultRevision=default

# Plan de contrôle
helm install istiod istio/istiod -n istio-system --wait

# Ingress Gateway (namespace dédié recommandé)
kubectl create namespace istio-ingress
helm install istio-ingressgateway istio/gateway -n istio-ingress

Activer l'injection par namespace

# Marquer le namespace pour injection automatique
kubectl label namespace production istio-injection=enabled

# Vérifier
kubectl get namespace -L istio-injection

# Relancer les pods existants pour recevoir le sidecar
kubectl rollout restart deployment -n production

mTLS

Par défaut, Istio est en mode PERMISSIVE : trafic chiffré et non-chiffré acceptés. Passer en STRICT pour forcer mTLS sur un namespace :

# peer-auth-strict.yaml
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: production
spec:
  mtls:
    mode: STRICT
kubectl apply -f peer-auth-strict.yaml

# Vérifier le mode mTLS actif sur un pod
istioctl x describe pod <pod-name> -n production

Gestion du trafic

Routage par poids (canary / blue-green)

# Envoyer 10 % du trafic vers la v2
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mon-service
  namespace: production
spec:
  hosts:
  - mon-service
  http:
  - route:
    - destination:
        host: mon-service
        subset: v1
      weight: 90
    - destination:
        host: mon-service
        subset: v2
      weight: 10
---
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: mon-service
  namespace: production
spec:
  host: mon-service
  subsets:
  - name: v1
    labels:
      version: v1
  - name: v2
    labels:
      version: v2

Retries et timeouts

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: mon-service
  namespace: production
spec:
  hosts:
  - mon-service
  http:
  - timeout: 5s
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: 5xx,reset,connect-failure
    route:
    - destination:
        host: mon-service

Politique d'autorisation L7

# Autoriser uniquement le frontend à appeler le backend sur /api/*
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: backend-policy
  namespace: production
spec:
  selector:
    matchLabels:
      app: backend
  action: ALLOW
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/production/sa/frontend"]
    to:
    - operation:
        methods: ["GET", "POST"]
        paths: ["/api/*"]

Observabilité

Installer les addons de démonstration (non destinés à la production) :

kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/prometheus.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/grafana.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/kiali.yaml
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.24/samples/addons/jaeger.yaml

# Accéder aux dashboards (port-forward automatique)
istioctl dashboard kiali
istioctl dashboard grafana
istioctl dashboard jaeger

En production, installer Prometheus et Grafana via leur opérateur et configurer le scraping des métriques Istio. Chaque proxy Envoy expose ses métriques sur le port 15020 (/stats/prometheus).


Mise à jour

Méthode in-place (patch et minor)

# Télécharger la nouvelle version d'istioctl
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.24.3 sh -

# Mise à jour
istioctl upgrade

# Vérifier
istioctl verify-install

# Réinjecter les proxies dans les namespaces managés
kubectl rollout restart deployment -n production

Canary upgrade (sans interruption de service)

# Installer la nouvelle révision en parallèle
istioctl install --revision=1-24 --set profile=default -y

# Migrer un namespace vers la nouvelle révision
kubectl label namespace production istio.io/rev=1-24 istio-injection-

# Redémarrer les pods du namespace
kubectl rollout restart deployment -n production

# Vérifier, puis supprimer l'ancienne révision
istioctl uninstall --revision=1-23

Troubleshooting

# Analyser la configuration (détecte les erreurs courantes)
istioctl analyze -n production
istioctl analyze -A                          # Tous les namespaces

# Diagnostiquer un pod
istioctl x describe pod <pod-name> -n production
istioctl proxy-status                        # État de synchronisation des proxies

# Inspecter la configuration Envoy d'un pod
istioctl proxy-config clusters <pod>.<namespace>
istioctl proxy-config listeners <pod>.<namespace>
istioctl proxy-config routes <pod>.<namespace>

# Logs du proxy Envoy
kubectl logs <pod-name> -c istio-proxy -n production

# Logs d'istiod
kubectl logs -n istio-system -l app=istiod --tail=100

# Activer les logs debug sur un proxy
istioctl proxy-config log <pod>.<namespace> --level debug

Pod non injecté après istio-injection=enabled

# Vérifier le label du namespace
kubectl get namespace production -L istio-injection

# Vérifier si le pod a une annotation d'exclusion explicite
kubectl get pod <pod> -n production -o yaml | grep sidecar.istio.io

# Les pods doivent être recrées après activation du label
kubectl rollout restart deployment <name> -n production

Erreur 503 entre services

# Vérifier que le service de destination a des endpoints actifs
istioctl proxy-config endpoint <pod>.<namespace> | grep <service>

# Vérifier les VirtualService et DestinationRule du namespace
kubectl get virtualservice,destinationrule -n production

# Vérifier qu'il n'y a pas de AuthorizationPolicy bloquante
kubectl get authorizationpolicy -n production

Commandes utiles

# Ressources Istio d'un namespace
kubectl get vs,dr,gw,se,pa,ap -n production

# Voir le mode mTLS de tous les namespaces
kubectl get peerauthentication -A

# Visualiser le trafic (nécessite Kiali)
istioctl dashboard kiali

# Désinstaller Istio complètement
istioctl uninstall --purge
kubectl delete namespace istio-system
# Vérifications rapides
istioctl version                             # Versions client / control plane / data plane
istioctl proxy-status                        # Proxies synchronisés ou en retard
istioctl x precheck                          # Vérifier que le cluster peut accueillir Istio

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