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
| Composant | Valeur |
|---|---|
| Proxy de données | Envoy (sidecar injecté automatiquement, ou ztunnel en mode ambient) |
| Plan de contrôle | istiod (Pilot + Citadel + Galley unifiés depuis 1.5) |
| Ingress | Istio Gateway ou Gateway API |
| Autorité de certification | istiod CA (certificats SPIFFE/X.509, rotation automatique) |
| Observabilité | Non inclus - Prometheus, Grafana, Kiali, Jaeger en option |
| Kubernetes minimum | 1.29+ (Istio 1.24) |
Concepts clés
| Ressource | Rôle |
|---|---|
| VirtualService | Règles de routage (poids, headers, retries, timeouts, fault injection) |
| DestinationRule | Load balancing, circuit breaking, TLS par sous-ensemble de pods |
| Gateway | Point d'entrée pour le trafic externe (ingress et egress) |
| ServiceEntry | Enregistrer des services externes au mesh |
| PeerAuthentication | Mode mTLS par namespace ou workload (STRICT / PERMISSIVE) |
| AuthorizationPolicy | Contrô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
| Ressource | Valeur |
|---|---|
| Kubernetes | 1.29 - 1.32 (Istio 1.24) |
| kubectl | Compatible avec le cluster cible |
| Droits | cluster-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
| Profil | Usage |
|---|---|
default | Production - istiod + ingressgateway |
demo | Évaluation - tout activé + addons |
minimal | istiod uniquement, pas de gateway |
ambient | Mode 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
- Documentation officielle : https://istio.io/latest/docs/
- Concepts : https://istio.io/latest/docs/concepts/
- Tâches (how-to) : https://istio.io/latest/docs/tasks/
- Référence des ressources CRD : https://istio.io/latest/docs/reference/config/networking/
- GitHub : https://github.com/istio/istio
- Kiali (dashboard de visualisation du mesh) : https://kiali.io
- Releases : https://github.com/istio/istio/releases