
Gateway API est la nouvelle approche recommandée pour les besoins de routage avancés dans Kubernetes. Elle complète et dépasse les capacités d’Ingress, dont l’API reste stable mais gelée. Ce guide présente les concepts clés, les différences avec Ingress, et comment adopter Gateway API progressivement.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Les limitations d’Ingress et pourquoi Gateway API existe
- Les ressources GatewayClass, Gateway, HTTPRoute et ReferenceGrant
- La différence entre canaux Standard et Experimental
- Créer et vérifier une configuration de routage
- Les fonctionnalités avancées (headers, redirections, weights)
- Quand choisir Ingress ou Gateway API
Pourquoi Gateway API ?
Section intitulée « Pourquoi Gateway API ? »Ce que Gateway API change fondamentalement
Section intitulée « Ce que Gateway API change fondamentalement »Gateway API n’est pas seulement “Ingress avec plus de features”. C’est une manière différente d’organiser les responsabilités réseau dans Kubernetes :
- Plus gouvernable — Séparation claire entre admin cluster, équipe plateforme et développeurs
- Plus composable — Ressources distinctes qui s’assemblent
- Plus standardisé — Modèle portable entre implémentations
- Plus exigeant — Demande plus de préparation qu’Ingress
Limitations d’Ingress
Section intitulée « Limitations d’Ingress »| Limitation | Impact |
|---|---|
| Annotations vendor-specific | Configuration non portable |
| Un seul niveau de config | Pas de séparation infra/dev |
| HTTP(S) uniquement | Pas de TCP/UDP natif |
| Routage basique | Manipulation headers limitée |
| Pas de traffic splitting | Canary complexe à implémenter |
Ce qu’apporte Gateway API
Section intitulée « Ce qu’apporte Gateway API »| Avantage | Réalité |
|---|---|
| Standardisé | Le modèle et les ressources sont portables, mais le niveau de support des fonctionnalités dépend encore de l’implémentation choisie |
| Expressif | Routage avancé sans annotations propriétaires |
| Séparation des rôles | Infra vs développeurs clairement modélisée |
| Multi-protocole | HTTP, HTTPS, TCP, UDP, gRPC au niveau du modèle d’API — le support opérationnel dépend du contrôleur |
| Extensible | Policies pour rate limiting, auth, etc. |
Quand choisir Ingress ou Gateway API ?
Section intitulée « Quand choisir Ingress ou Gateway API ? »| Besoin | Ingress | Gateway API |
|---|---|---|
| Exposer vite une appli simple | ✅ Bien adapté | ⚠️ Possible mais plus structuré |
| Routage avancé multi-équipes | ⚠️ Limité | ✅ Très adapté |
| Politique claire infra/dev | ❌ Faible | ✅ Forte |
| Portabilité inter-contrôleurs | ⚠️ Moyenne (annotations) | ✅ Meilleure |
| Adoption dans cluster existant simple | ✅ Plus facile | ⚠️ Demande plus de préparation |
| Traffic splitting natif | ❌ Non | ✅ Oui |
| TCP/UDP/gRPC | ❌ Non | ✅ Selon contrôleur |
Recommandation :
- Nouveau projet avec besoins avancés → Gateway API
- Projet existant stable et simple → Ingress reste acceptable
- Besoin de gouvernance multi-équipes → Gateway API
Architecture et concepts
Section intitulée « Architecture et concepts »Gateway API sépare les responsabilités en trois niveaux :
┌─────────────────────────────────────────────────────────┐│ GatewayClass (Cluster Admin) ││ → Définit l'implémentation (Traefik, Envoy, NGINX...) │└─────────────────────┬───────────────────────────────────┘ │┌─────────────────────▼───────────────────────────────────┐│ Gateway (Platform Team) ││ → Configure les listeners (ports, TLS, domaines) │└─────────────────────┬───────────────────────────────────┘ │┌─────────────────────▼───────────────────────────────────┐│ HTTPRoute / GRPCRoute (Developers) ││ → Définit le routage vers les Services │└─────────────────────────────────────────────────────────┘| Ressource | Qui la gère | Responsabilité |
|---|---|---|
| GatewayClass | Cluster admin | Choix du contrôleur |
| Gateway | Équipe plateforme | Ports, TLS, domaines autorisés |
| HTTPRoute | Développeurs | Règles de routage applicatif |
| ReferenceGrant | Équipe plateforme | Autorise les références cross-namespace |
Canaux Standard et Experimental
Section intitulée « Canaux Standard et Experimental »Gateway API publie ses fonctionnalités via deux canaux :
| Canal | Usage | Stabilité |
|---|---|---|
| Standard | Production | Fonctionnalités GA, stables |
| Experimental | Tests, labs | Fonctionnalités en développement, peuvent changer |
Pour connaître les fonctionnalités de chaque canal, consultez le guide Getting Started officiel.
Installation
Section intitulée « Installation »Installer les CRDs
Section intitulée « Installer les CRDs »Gateway API n’est pas inclus par défaut. Installez les CRDs depuis le Standard channel :
# Consultez la dernière version sur https://gateway-api.sigs.k8s.io/guides/# Exemple avec une version récente (à adapter) :kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.2.1/standard-install.yaml
# Vérificationkubectl get crd | grep gatewayInstaller un contrôleur
Section intitulée « Installer un contrôleur »Les CRDs seuls ne suffisent pas. Vous avez besoin d’un contrôleur qui implémente Gateway API :
| Contrôleur | Notes |
|---|---|
| Traefik | Support complet, simple à déployer |
| Envoy Gateway | Référence Gateway API, très complet |
| NGINX Gateway Fabric | Performant, support enterprise |
| Cilium | eBPF-based, intégré au CNI |
| Istio | Service mesh complet |
| Kong | API Gateway avec plugins |
Ressources Gateway API
Section intitulée « Ressources Gateway API »GatewayClass
Section intitulée « GatewayClass »Définit l’implémentation utilisée (géré par l’admin cluster) :
apiVersion: gateway.networking.k8s.io/v1kind: GatewayClassmetadata: name: traefikspec: controllerName: traefik.io/gateway-controllerVérifiez les GatewayClass disponibles :
kubectl get gatewayclassConfigure les points d’entrée (géré par l’équipe plateforme) :
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: main-gateway namespace: gateway-systemspec: gatewayClassName: traefik listeners: - name: http port: 80 protocol: HTTP allowedRoutes: namespaces: from: Same - name: https port: 443 protocol: HTTPS tls: mode: Terminate certificateRefs: - name: wildcard-cert allowedRoutes: namespaces: from: Selector selector: matchLabels: gateway-access: "true"Points clés :
- listeners — Définit les ports et protocoles
- allowedRoutes — Contrôle quels namespaces peuvent attacher des routes
- tls — Configuration TLS par listener
HTTPRoute
Section intitulée « HTTPRoute »Définit les règles de routage (géré par les développeurs) :
apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: api-routes namespace: mon-appspec: parentRefs: - name: main-gateway namespace: gateway-system hostnames: - "api.example.com" rules: - matches: - path: type: PathPrefix value: /api/v1 backendRefs: - name: api-service port: 80 - matches: - path: type: PathPrefix value: /api/v2 backendRefs: - name: api-v2-service port: 80ReferenceGrant
Section intitulée « ReferenceGrant »Autorise les références cross-namespace (essentiel pour la gouvernance) :
apiVersion: gateway.networking.k8s.io/v1kind: ReferenceGrantmetadata: name: allow-gateway-to-secret namespace: cert-namespacespec: from: - group: gateway.networking.k8s.io kind: Gateway namespace: gateway-system to: - group: "" kind: Secret name: wildcard-certCe ReferenceGrant permet au Gateway dans gateway-system de référencer le Secret wildcard-cert dans cert-namespace.
Vérifier l’état des ressources
Section intitulée « Vérifier l’état des ressources »Gateway API fournit un status riche sur chaque ressource. Utilisez-le pour diagnostiquer :
Vérifier les GatewayClass
Section intitulée « Vérifier les GatewayClass »kubectl get gatewayclass# La colonne ACCEPTED doit être TrueVérifier les Gateway
Section intitulée « Vérifier les Gateway »kubectl get gateways -A
kubectl describe gateway main-gateway -n gateway-system# Cherchez les conditions : Accepted, ProgrammedVérifier les HTTPRoute
Section intitulée « Vérifier les HTTPRoute »kubectl get httproutes -A
kubectl describe httproute api-routes -n mon-app# Cherchez : Parents (le Gateway parent) et les conditions Accepted/ResolvedRefsDépannage : HTTPRoute non attaché
Section intitulée « Dépannage : HTTPRoute non attaché »C’est le problème le plus courant. Votre HTTPRoute existe mais le trafic ne passe pas.
-
Vérifiez que le Gateway existe et est ACCEPTED
Fenêtre de terminal kubectl get gateway main-gateway -n gateway-system# Status doit être ACCEPTED -
Vérifiez que l’HTTPRoute référence le bon Gateway
Fenêtre de terminal kubectl describe httproute api-routes -n mon-app | grep -A5 "Parent Refs" -
Vérifiez les conditions de l’HTTPRoute
Fenêtre de terminal kubectl describe httproute api-routes -n mon-app | grep -A10 "Status"# Cherchez : Accepted, ResolvedRefs -
Vérifiez que le namespace est autorisé
Si le Gateway utilise
allowedRoutes.namespaces.from: Selector, vérifiez que votre namespace a le bon label :Fenêtre de terminal kubectl get ns mon-app --show-labels -
Vérifiez que le Service backend existe
Fenêtre de terminal kubectl get svc api-service -n mon-app
| Symptôme | Cause probable | Solution |
|---|---|---|
HTTPRoute Accepted: False | Gateway introuvable ou mauvais namespace | Vérifiez parentRefs |
HTTPRoute ResolvedRefs: False | Service backend introuvable | Vérifiez le nom/port du Service |
Gateway Programmed: False | Contrôleur pas prêt | Vérifiez les logs du contrôleur |
| Trafic ne passe pas | Namespace non autorisé | Vérifiez allowedRoutes et labels |
Exemples pratiques
Section intitulée « Exemples pratiques »Routage par chemin
Section intitulée « Routage par chemin »spec: rules: - matches: - path: type: PathPrefix value: /users backendRefs: - name: users-service port: 80 - matches: - path: type: PathPrefix value: /orders backendRefs: - name: orders-service port: 80Routage par header
Section intitulée « Routage par header »spec: rules: - matches: - headers: - name: X-Version value: "beta" backendRefs: - name: api-beta port: 80 - matches: - path: type: PathPrefix value: /api backendRefs: - name: api-stable port: 80Traffic splitting (Canary)
Section intitulée « Traffic splitting (Canary) »spec: rules: - matches: - path: type: PathPrefix value: /api backendRefs: - name: api-v1 port: 80 weight: 90 - name: api-v2 port: 80 weight: 10Redirections
Section intitulée « Redirections »spec: rules: - matches: - path: type: Exact value: /old-page filters: - type: RequestRedirect requestRedirect: scheme: https hostname: new.example.com statusCode: 301Manipulation de headers
Section intitulée « Manipulation de headers »spec: rules: - matches: - path: type: PathPrefix value: /api filters: - type: RequestHeaderModifier requestHeaderModifier: add: - name: X-Environment value: "staging" remove: - X-Internal-Header backendRefs: - name: api-service port: 80Migration depuis Ingress
Section intitulée « Migration depuis Ingress »Prérequis pour migrer
Section intitulée « Prérequis pour migrer »La migration depuis Ingress suppose généralement qu’une équipe plateforme ait déjà :
- Déployé un contrôleur compatible Gateway API
- Créé une
GatewayClass(ou utilisé celle créée automatiquement) - Publié un
Gatewayauquel les équipes applicatives peuvent rattacher leurs routes
Les développeurs ne “remplacent” pas juste un Ingress par un HTTPRoute — ils attachent leur route à un Gateway existant.
Équivalence des concepts
Section intitulée « Équivalence des concepts »| Ingress | Gateway API |
|---|---|
| IngressClass | GatewayClass |
| Ingress | Gateway + HTTPRoute |
host: | HTTPRoute hostnames: |
path: | HTTPRoute matches.path: |
backend: | HTTPRoute backendRefs: |
| Annotations TLS | Gateway listeners.tls: |
| Annotations rewrite | HTTPRoute filters.URLRewrite: |
Exemple de migration
Section intitulée « Exemple de migration »Ingress (avant) :
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: api-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /spec: ingressClassName: nginx rules: - host: api.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80Gateway API (après) :
# L'équipe plateforme a déjà créé le Gateway# Le développeur crée uniquement l'HTTPRoute :apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata: name: api-route namespace: mon-appspec: parentRefs: - name: main-gateway namespace: gateway-system hostnames: - "api.example.com" rules: - matches: - path: type: PathPrefix value: /api filters: - type: URLRewrite urlRewrite: path: type: ReplacePrefixMatch replacePrefixMatch: / backendRefs: - name: api-service port: 80Maturité et évolution
Section intitulée « Maturité et évolution »| Aspect | État (2026) |
|---|---|
| HTTPRoute, Gateway, GatewayClass | GA (Standard channel) |
| GRPCRoute, TLSRoute | GA sur certaines implémentations |
| ReferenceGrant | GA |
| TCPRoute, UDPRoute | Experimental sur certaines implémentations |
| BackendTLSPolicy | Experimental |
Gateway API est en GA pour son socle principal et continue d’évoluer via les canaux Standard et Experimental. Consultez régulièrement les release notes pour suivre les nouveautés.
À retenir
Section intitulée « À retenir »| Ressource | Rôle | Géré par |
|---|---|---|
| GatewayClass | Choix implémentation | Admin cluster |
| Gateway | Listeners, TLS, namespaces autorisés | Équipe plateforme |
| HTTPRoute | Règles de routage | Développeurs |
| ReferenceGrant | Autorise références cross-namespace | Équipe plateforme |
Ce que Gateway API apporte :
- Gouvernance — Séparation claire des responsabilités infra/dev
- Portabilité — Configuration standardisée (mais vérifiez le support du contrôleur)
- Traffic splitting — Canary natif sans annotations
- Manipulation headers — Filtres intégrés
- Multi-protocole — HTTP, TCP, gRPC (selon implémentation)
Ce que Gateway API demande :
- Plus de préparation — Gateway doit exister avant les routes
- Vérification de conformité — Toutes les features ne sont pas supportées partout
- Compréhension du modèle — Plus de concepts qu’Ingress
Message clé : Ingress reste acceptable pour les cas simples. Gateway API devient le meilleur choix dès qu’on veut de la gouvernance, du routage avancé, ou une standardisation durable.