Aller au contenu
Conteneurs & Orchestration medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Gateway API : routage avancé et gouvernance réseau

17 min de lecture

logo kubernetes

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.

  • 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

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
LimitationImpact
Annotations vendor-specificConfiguration non portable
Un seul niveau de configPas de séparation infra/dev
HTTP(S) uniquementPas de TCP/UDP natif
Routage basiqueManipulation headers limitée
Pas de traffic splittingCanary complexe à implémenter
AvantageRé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
ExpressifRoutage avancé sans annotations propriétaires
Séparation des rôlesInfra vs développeurs clairement modélisée
Multi-protocoleHTTP, HTTPS, TCP, UDP, gRPC au niveau du modèle d’API — le support opérationnel dépend du contrôleur
ExtensiblePolicies pour rate limiting, auth, etc.
BesoinIngressGateway 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

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 │
└─────────────────────────────────────────────────────────┘
RessourceQui la gèreResponsabilité
GatewayClassCluster adminChoix du contrôleur
GatewayÉquipe plateformePorts, TLS, domaines autorisés
HTTPRouteDéveloppeursRègles de routage applicatif
ReferenceGrantÉquipe plateformeAutorise les références cross-namespace

Gateway API publie ses fonctionnalités via deux canaux :

CanalUsageStabilité
StandardProductionFonctionnalités GA, stables
ExperimentalTests, labsFonctionnalités en développement, peuvent changer

Pour connaître les fonctionnalités de chaque canal, consultez le guide Getting Started officiel.

Gateway API n’est pas inclus par défaut. Installez les CRDs depuis le Standard channel :

Fenêtre de terminal
# 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érification
kubectl get crd | grep gateway

Les CRDs seuls ne suffisent pas. Vous avez besoin d’un contrôleur qui implémente Gateway API :

ContrôleurNotes
TraefikSupport complet, simple à déployer
Envoy GatewayRéférence Gateway API, très complet
NGINX Gateway FabricPerformant, support enterprise
CiliumeBPF-based, intégré au CNI
IstioService mesh complet
KongAPI Gateway avec plugins

Définit l’implémentation utilisée (géré par l’admin cluster) :

gatewayclass.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: GatewayClass
metadata:
name: traefik
spec:
controllerName: traefik.io/gateway-controller

Vérifiez les GatewayClass disponibles :

Fenêtre de terminal
kubectl get gatewayclass

Configure les points d’entrée (géré par l’équipe plateforme) :

gateway.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
name: main-gateway
namespace: gateway-system
spec:
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

Définit les règles de routage (géré par les développeurs) :

httproute.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
name: api-routes
namespace: mon-app
spec:
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: 80

Autorise les références cross-namespace (essentiel pour la gouvernance) :

referencegrant.yaml
apiVersion: gateway.networking.k8s.io/v1
kind: ReferenceGrant
metadata:
name: allow-gateway-to-secret
namespace: cert-namespace
spec:
from:
- group: gateway.networking.k8s.io
kind: Gateway
namespace: gateway-system
to:
- group: ""
kind: Secret
name: wildcard-cert

Ce ReferenceGrant permet au Gateway dans gateway-system de référencer le Secret wildcard-cert dans cert-namespace.

Gateway API fournit un status riche sur chaque ressource. Utilisez-le pour diagnostiquer :

Fenêtre de terminal
kubectl get gatewayclass
# La colonne ACCEPTED doit être True
Fenêtre de terminal
kubectl get gateways -A
kubectl describe gateway main-gateway -n gateway-system
# Cherchez les conditions : Accepted, Programmed
Fenêtre de terminal
kubectl get httproutes -A
kubectl describe httproute api-routes -n mon-app
# Cherchez : Parents (le Gateway parent) et les conditions Accepted/ResolvedRefs

C’est le problème le plus courant. Votre HTTPRoute existe mais le trafic ne passe pas.

  1. 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
  2. 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"
  3. 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
  4. 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
  5. Vérifiez que le Service backend existe

    Fenêtre de terminal
    kubectl get svc api-service -n mon-app
SymptômeCause probableSolution
HTTPRoute Accepted: FalseGateway introuvable ou mauvais namespaceVérifiez parentRefs
HTTPRoute ResolvedRefs: FalseService backend introuvableVérifiez le nom/port du Service
Gateway Programmed: FalseContrôleur pas prêtVérifiez les logs du contrôleur
Trafic ne passe pasNamespace non autoriséVérifiez allowedRoutes et labels
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: 80
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: 80
spec:
rules:
- matches:
- path:
type: PathPrefix
value: /api
backendRefs:
- name: api-v1
port: 80
weight: 90
- name: api-v2
port: 80
weight: 10
spec:
rules:
- matches:
- path:
type: Exact
value: /old-page
filters:
- type: RequestRedirect
requestRedirect:
scheme: https
hostname: new.example.com
statusCode: 301
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: 80

La migration depuis Ingress suppose généralement qu’une équipe plateforme ait déjà :

  1. Déployé un contrôleur compatible Gateway API
  2. Créé une GatewayClass (ou utilisé celle créée automatiquement)
  3. Publié un Gateway auquel 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.

IngressGateway API
IngressClassGatewayClass
IngressGateway + HTTPRoute
host:HTTPRoute hostnames:
path:HTTPRoute matches.path:
backend:HTTPRoute backendRefs:
Annotations TLSGateway listeners.tls:
Annotations rewriteHTTPRoute filters.URLRewrite:

Ingress (avant) :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
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: 80

Gateway 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/v1
kind: HTTPRoute
metadata:
name: api-route
namespace: mon-app
spec:
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: 80
AspectÉtat (2026)
HTTPRoute, Gateway, GatewayClassGA (Standard channel)
GRPCRoute, TLSRouteGA sur certaines implémentations
ReferenceGrantGA
TCPRoute, UDPRouteExperimental sur certaines implémentations
BackendTLSPolicyExperimental

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.

RessourceRôleGéré par
GatewayClassChoix implémentationAdmin cluster
GatewayListeners, TLS, namespaces autorisésÉquipe plateforme
HTTPRouteRègles de routageDéveloppeurs
ReferenceGrantAutorise références cross-namespaceÉquipe plateforme

Ce que Gateway API apporte :

  1. Gouvernance — Séparation claire des responsabilités infra/dev
  2. Portabilité — Configuration standardisée (mais vérifiez le support du contrôleur)
  3. Traffic splitting — Canary natif sans annotations
  4. Manipulation headers — Filtres intégrés
  5. Multi-protocole — HTTP, TCP, gRPC (selon implémentation)

Ce que Gateway API demande :

  1. Plus de préparation — Gateway doit exister avant les routes
  2. Vérification de conformité — Toutes les features ne sont pas supportées partout
  3. 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.

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn