
Un Ingress expose vos Services HTTP/HTTPS vers l'extérieur du cluster avec du routage par domaine et chemin. Au lieu de créer un LoadBalancer par application, vous centralisez l'entrée du trafic sur un point unique, avec gestion TLS intégrée. Ce guide vous montre comment configurer un Ingress fonctionnel.
Une précision s'impose, parce que les deux nouvelles se mélangent facilement. L'API Ingress, la ressource elle-même, reste stable et supportée : ce n'est pas elle qui s'arrête. Elle est en revanche gelée depuis 2022, donc sans nouvelles fonctionnalités. Dès que vous avez besoin de routage gRPC, de répartition de trafic pondérée, de sélection par en-tête ou de mTLS, c'est vers Gateway API que Kubernetes vous oriente.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre le rôle d'un Ingress et d'un Ingress Controller
- Créer un Ingress avec
ingressClassName - Configurer le routage par domaine et par chemin
- Activer TLS avec cert-manager
- Débugger les erreurs courantes
Ingress vs Gateway API : que choisir ?
Section intitulée « Ingress vs Gateway API : que choisir ? »Les deux API coexistent dans le même cluster et peuvent être servies par le même contrôleur, elles ne s'excluent pas. La différence tient au périmètre couvert par la spécification : tout ce qu'Ingress ne sait pas exprimer (redirection, réécriture, découpage de trafic) passe par des annotations propriétaires, alors que Gateway API le décrit dans ses propres ressources. Le tableau suivant résume les critères qui pèsent au moment du choix.
| Critère | Ingress | Gateway API |
|---|---|---|
| Statut | Stable, gelé (pas d'évolution) | Stable, en développement actif |
| Cas d'usage | HTTP/HTTPS simple, routage host/path | HTTP/HTTPS avancé, gRPC, TCP, traffic splitting |
| Portabilité | Dépend fortement des annotations du contrôleur | Plus standardisé |
| Recommandation Kubernetes | Maintenu pour compatibilité | Recommandé pour nouveaux projets |
En résumé : Ingress reste valide pour les cas simples. Pour du routage avancé ou un nouveau projet, préférez Gateway API.
Pourquoi ingress-nginx s'est arrêté, et ce que vous devez faire
Section intitulée « Pourquoi ingress-nginx s'est arrêté, et ce que vous devez faire »Le projet communautaire ingress-nginx, longtemps le contrôleur de
référence, a été retiré le 24 mars 2026. Son dépôt GitHub est en lecture
seule : plus aucune version, plus aucun correctif de faille. La cause tient en
deux mots, une charge de maintenance devenue insoutenable et une accumulation de
vulnérabilités liées aux annotations snippets.
Cinq jours avant l'arrêt, une dernière faille critique a été publiée : CVE-2026-4342, de score CVSS 8.8. Une combinaison d'annotations Ingress injecte de la configuration dans nginx, ce qui permet l'exécution de code arbitraire dans le contrôleur et la divulgation des Secrets auxquels il accède, soit ceux de tout le cluster dans une installation par défaut. Le droit de créer une simple ressource Ingress suffit à l'exploiter. Elle est corrigée dans les versions 1.13.9, 1.14.5 et 1.15.1, les dernières que ce projet publiera : appliquez-en une sans attendre si vous l'exploitez encore, car les failles suivantes ne seront jamais corrigées.
Trois conduites à tenir selon votre situation :
| Situation | Ce qu'il faut faire |
|---|---|
Cluster existant sous ingress-nginx | Appliquer un des trois correctifs, puis planifier la migration. Les exemples Helm ingress-nginx/ingress-nginx continuent de fonctionner, sans aucun correctif de sécurité. |
| Nouveau cluster | Préférer Gateway API, ou un contrôleur Ingress activement maintenu : Traefik, Contour, HAProxy Ingress. |
| Besoin d'un support commercial | Le NGINX Ingress Controller de NGINX Inc. est un produit différent du projet communautaire ingress-nginx, et il est maintenu. La confusion de noms est la principale source d'erreur ici. |
Sources : Ingress NGINX Retirement, SIG Network et l'advisory CVE-2026-4342.
Comment fonctionne un Ingress ?
Section intitulée « Comment fonctionne un Ingress ? »Le trafic n'entre jamais dans un objet Ingress : il entre dans le Service du contrôleur, généralement de type LoadBalancer ou NodePort. Le contrôleur surveille en permanence les objets Ingress de tous les namespaces et régénère sa propre configuration à chaque changement, en quelques secondes. Le routage se fait ensuite en une seule traversée, sans rebond par l'API Kubernetes.
-
L'utilisateur envoie une requête vers
https://mon-app.example.com -
L'Ingress Controller intercepte la requête et consulte les règles définies dans les objets Ingress
-
Le Controller route vers le Service correspondant au host et au path
-
Le Service distribue aux Pods disponibles
-
La réponse remonte via le même chemin
Prérequis
Section intitulée « Prérequis »- Cluster Kubernetes fonctionnel. Sur kind, le cluster de cette formation, il demande deux réglages précis : voir juste en dessous.
- kubectl configuré pour accéder au cluster
- Un Ingress Controller installé (voir section suivante)
- DNS ou
/etc/hostspour résoudre vos domaines de test
Vérifiez votre cluster :
kubectl cluster-infoInstaller un Ingress Controller
Section intitulée « Installer un Ingress Controller »Un cluster peut héberger plusieurs contrôleurs en parallèle, chacun déclarant sa propre IngressClass. C'est ce qui rend une migration progressive possible : les Ingress migrés changent de ingressClassName, les autres continuent de fonctionner. Le tableau ci-dessous donne l'état de maintenance de chaque projet, critère décisif depuis l'archivage de ingress-nginx.
| Controller | Statut 2026 | Points forts |
|---|---|---|
| ingress-nginx (projet communautaire) | ❌ Archivé depuis le 24 mars 2026 | Le plus répandu historiquement, beaucoup d'exemples, mais plus de correctifs CVE |
| NGINX Ingress Controller (NGINX Inc., commercial / open source distinct) | ✅ Activement maintenu | Produit F5/NGINX, à ne pas confondre avec ingress-nginx |
| Traefik | ✅ Activement maintenu | Léger, config dynamique, bon pour microservices, supporte aussi Gateway API |
| HAProxy Ingress | ✅ Activement maintenu | Performant, adapté aux charges élevées |
| Contour | ✅ Activement maintenu | Basé sur Envoy, moderne, supporte Gateway API |
Installation avec Helm (Traefik recommandé en 2026)
Section intitulée « Installation avec Helm (Traefik recommandé en 2026) »Les exemples de ce guide utilisent Traefik comme contrôleur de référence : activement maintenu, installable en une commande Helm, et il supporte aussi Gateway API, ce qui rend la migration ultérieure cohérente.
helm repo add traefik https://traefik.github.io/chartshelm repo update
helm install my-ingress traefik/traefik \ --namespace traefik \ --create-namespaceVérifiez l'installation :
kubectl get pods -n traefikkubectl get svc -n traefikkubectl get ingressclassLa sortie de kubectl get ingressclass doit afficher traefik, c'est le nom à utiliser dans ingressClassName plus loin.
Sur kind : deux réglages, et deux pièges
Section intitulée « Sur kind : deux réglages, et deux pièges »Un cluster kind neuf n'a ni contrôleur Ingress ni répartiteur de charge.
kubectl get ingressclass y répond No resources found, et c'est normal :
contrairement à k3d, kind ne préinstalle rien. Il faut donc préparer le cluster
avant de le créer, puis installer le contrôleur.
Le fichier de configuration fait deux choses : il ouvre les ports 80 et 443 vers votre poste, et il marque le nœud pour que le contrôleur sache où se placer.
kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes: - role: control-plane labels: ingress-ready: "true" extraPortMappings: - containerPort: 80 hostPort: 8080 protocol: TCP - containerPort: 443 hostPort: 8443 protocol: TCPkind create cluster --name doc-ingress \ --image kindest/node:v1.37.0 --config kind-ingress.yamlInstallez ensuite Traefik en lui demandant trois choses : se poser sur le nœud marqué, tolérer le taint du control plane, et écouter sur les ports du nœud.
helm repo add traefik https://traefik.github.io/chartshelm repo update
helm install traefik traefik/traefik \ --namespace traefik --create-namespace \ --set service.type=ClusterIP \ --set-string nodeSelector.ingress-ready=true \ --set tolerations[0].key=node-role.kubernetes.io/control-plane \ --set tolerations[0].operator=Exists \ --set tolerations[0].effect=NoSchedule \ --set ports.web.hostPort=80 \ --set ports.websecure.hostPort=443 \ --waittraefik with docker.io/traefik:v3.7.13 has been deployed successfully on traefik namespace!kubectl get ingressclassNAME CONTROLLER PARAMETERS AGEtraefik (default) traefik.io/ingress-controller <none> 28sVotre Ingress est désormais joignable sur http://localhost:8080, le port que
le fichier de configuration a mis en correspondance avec le port 80 du nœud.
Créer votre premier Ingress
Section intitulée « Créer votre premier Ingress »Un Ingress ne pointe pas vers des Pods mais vers un Service, qui doit donc exister avant lui. Créer l'Ingress en premier ne produit aucune erreur : la ressource est acceptée, le contrôleur renvoie simplement du 503 tant que le backend est absent. On déploie donc l'application, puis le Service, puis l'Ingress.
Préparer l'application et le Service
Section intitulée « Préparer l'application et le Service »Le manifeste ci-dessous crée le Deployment et son Service dans le même fichier, séparés par ---. Le port du Service (80) est celui que l'Ingress référencera ; le targetPort est celui qu'écoute le conteneur.
apiVersion: apps/v1kind: Deploymentmetadata: name: webappspec: replicas: 2 selector: matchLabels: app: webapp template: metadata: labels: app: webapp spec: containers: - name: webapp image: nginx:1.25.4@sha256:9ff236ed47fe39cf1f0acf349d0e5137f8b8a6fd0b46e5117a401010e56222e1 ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: webapp-servicespec: selector: app: webapp ports: - protocol: TCP port: 80 targetPort: 80kubectl apply -f webapp-deployment.yamlCréer l'Ingress
Section intitulée « Créer l'Ingress »La règle ci-dessous ne répond qu'aux requêtes portant l'en-tête Host: webapp.local : une requête sur l'IP nue tombera en 404.
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: webapp-ingressspec: ingressClassName: traefik rules: - host: webapp.local http: paths: - path: / pathType: Prefix backend: service: name: webapp-service port: number: 80kubectl apply -f webapp-ingress.yamlTester l'accès
Section intitulée « Tester l'accès »Le test suppose deux choses : connaître l'adresse d'écoute du contrôleur et faire correspondre le nom de domaine à cette adresse, puisque c'est lui qui déclenche la règle.
Récupérez l'adresse du Controller :
Avec le extraPortMappings posé plus haut, le contrôleur écoute sur
localhost:8080, sans Service de type LoadBalancer et sans port-forward.
kubectl get ingressNAME CLASS HOSTS ADDRESS PORTS AGEwebapp-ingress traefik webapp.local 80 13sLa colonne ADDRESS reste vide, et ce n'est pas une panne. Elle n'est
remplie que par un contrôleur adossé à un LoadBalancer, ce que kind ne fournit
pas. Le routage fonctionne quand même, par les ports du nœud.
Traefik est exposé par k3d via le LoadBalancer intégré, sur les ports 80 et 443 du host.
# Vérifier le Service Traefik (namespace kube-system pour k3s)kubectl get svc -n kube-system traefikL'IP utile est 127.0.0.1 (le LB k3d le forward localement) ou l'IP du nœud (172.21.x.x).
kubectl get svc -n traefik my-ingressRécupérez l'IP/EXTERNAL-IP. Sur un cluster sans LoadBalancer cloud, utilisez kubectl port-forward ou exposez via un NodePort.
minikube ipConfigurez la résolution DNS (fichier /etc/hosts) :
# Remplacez par l'IP réelle de votre Controllerecho "127.0.0.1 webapp.local" | sudo tee -a /etc/hostsSur le cluster kind préparé plus haut, le Host peut aussi se passer en
en-tête, ce qui évite de toucher à /etc/hosts :
curl -H 'Host: webapp.local' http://localhost:8080Deux résultats valent une démonstration. Avec le bon Host, la page
répond ; sans lui, le contrôleur ne trouve aucune règle et rend un 404.
C'est la preuve directe que le routage se fait bien sur le nom de domaine, et
non sur le port.
curl -H 'Host: webapp.local' http://localhost:8080 -> HTTP 200curl http://localhost:8080 -> HTTP 404Le port à interroger est 8080, pas 80
Section intitulée « Le port à interroger est 8080, pas 80 »C'est l'erreur qui fait croire à une panne d'Ingress alors que tout fonctionne. Le fichier de configuration met en correspondance le port 8080 de votre poste avec le port 80 du nœud, et kind ne publie rien d'autre. La commande qui le prouve, une fois le cluster créé :
docker port doc-ingress-control-plane80/tcp -> 0.0.0.0:8080443/tcp -> 0.0.0.0:84436443/tcp -> 127.0.0.1:32933Un curl http://127.0.0.1 sans port, ou un curl http://webapp.local après
avoir renseigné /etc/hosts, visent donc le port 80 de votre poste, que rien
ne relie au cluster. Si une réponse arrive quand même, elle vient d'autre chose
qui tourne sur votre machine, et elle vous induira en erreur. La ligne
/etc/hosts reste utile, mais le port s'écrit :
curl http://webapp.local:8080Routage multi-domaines
Section intitulée « Routage multi-domaines »Un même objet Ingress accepte plusieurs entrées host, chacune avec ses propres chemins. Regrouper les domaines dans une seule ressource garde la configuration lisible, mais tous les domaines partagent alors le même cycle de vie : supprimer l'Ingress coupe tout d'un coup. Sur des applications gérées par des équipes différentes, préférez un Ingress par application, ils peuvent viser le même contrôleur sans conflit.
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: multi-app-ingressspec: ingressClassName: traefik rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: webapp-service port: number: 80 - host: api.example.com http: paths: - path: / pathType: Prefix backend: service: name: api-service port: number: 80Routage par chemin
Section intitulée « Routage par chemin »Sous un même domaine, plusieurs chemins peuvent viser des Services distincts, ce qui permet d'exposer une API et son interface web sans sous-domaine dédié. Le chemin est transmis tel quel au backend : /api/users arrive en /api/users sur api-service, sauf réécriture explicite. Le path: / sert de règle par défaut pour tout ce qui ne correspond à aucun préfixe plus long.
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: path-routingspec: ingressClassName: traefik rules: - host: myapp.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80 - path: / pathType: Prefix backend: service: name: frontend-service port: number: 80Le champ pathType décide de ce que « correspondre » veut dire, et deux valeurs couvrent presque tous les cas. Prefix fait correspondre /api à /api, /api/ et /api/users : c'est celle qu'on veut presque toujours. Exact ne fait correspondre que /api, au caractère près. L'ordre dans lequel vous écrivez les chemins n'a aucune importance : Kubernetes retient le préfixe le plus spécifique, ce qui permet de laisser path: / en dernier filet sans qu'il capte le trafic des autres règles.
Configurer TLS avec cert-manager
Section intitulée « Configurer TLS avec cert-manager »Le champ tls d'un Ingress attend un Secret de type kubernetes.io/tls déjà présent dans le même namespace que l'Ingress. cert-manager automatise la création et le renouvellement de ce Secret : il observe les Ingress annotés, demande le certificat à l'autorité configurée et renouvelle par défaut à deux tiers de la durée de vie, soit environ 30 jours avant l'expiration pour Let's Encrypt.
Installer cert-manager
Section intitulée « Installer cert-manager »Le guide dédié cert-manager détaille l'installation, les Issuer et les certificats Let's Encrypt. Installation rapide :
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.20.3/cert-manager.yamlVérifiez l'installation :
kubectl get pods -n cert-managerCréer un ClusterIssuer pour Let's Encrypt
Section intitulée « Créer un ClusterIssuer pour Let's Encrypt »Un ClusterIssuer est non namespacé : il sert tous les namespaces du cluster, contrairement à un Issuer. L'email reçoit les avertissements d'expiration de Let's Encrypt et le privateKeySecretRef désigne le Secret où cert-manager stocke la clé du compte ACME, à ne pas confondre avec le certificat lui-même.
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: letsencrypt-prodspec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: votre-email@example.com privateKeySecretRef: name: letsencrypt-prod solvers: - http01: ingress: ingressClassName: traefikkubectl apply -f cluster-issuer.yamlConfigurer l'Ingress avec TLS
Section intitulée « Configurer l'Ingress avec TLS »Le secretName désigne un Secret que vous n'avez pas besoin de créer : cert-manager le remplit après validation du challenge. Le nom de domaine du bloc tls doit être identique à celui de la règle rules, sinon le certificat émis ne couvrira pas le trafic servi.
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: secure-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod"spec: ingressClassName: traefik tls: - hosts: - monsite.example.com secretName: monsite-tls rules: - host: monsite.example.com http: paths: - path: / pathType: Prefix backend: service: name: webapp-service port: number: 80kubectl apply -f secure-ingress.yaml
# Vérifier le certificatkubectl get certificatekubectl describe certificate monsite-tlsAnnotations courantes (par contrôleur)
Section intitulée « Annotations courantes (par contrôleur) »Tout ce que la spécification Ingress ne couvre pas, redirection HTTPS, filtrage d'IP, limites de taille, se règle par des annotations interprétées par le contrôleur. Une annotation inconnue est ignorée en silence : aucune erreur à l'apply, la fonctionnalité ne s'applique simplement jamais. C'est le premier réflexe de diagnostic quand un comportement attendu ne se produit pas après une migration de contrôleur.
Les annotations sont la principale dette de portabilité d'Ingress : chaque contrôleur a son préfixe, traefik.ingress.kubernetes.io/*, nginx.ingress.kubernetes.io/*, haproxy.org/*. Changer de contrôleur oblige donc à toutes les réécrire, et c'est précisément ce que Gateway API corrige en décrivant ces comportements dans l'API elle-même. Les exemples ci-dessous montrent le même besoin sous Traefik, le contrôleur de ce guide, et sous ingress-nginx, que vous croiserez encore sur des clusters existants.
Redirection HTTPS
Section intitulée « Redirection HTTPS »Sans cette redirection, le site reste joignable en HTTP clair même quand le bloc tls est présent : activer TLS n'interdit pas le port 80.
Avec Traefik, la redirection HTTPS se configure via un Middleware (CRD Traefik) référencé par annotation :
# Middleware (à créer une fois)apiVersion: traefik.io/v1alpha1kind: Middlewaremetadata: name: redirect-httpsspec: redirectScheme: scheme: https permanent: true---# Ingress référençant le middlewaremetadata: annotations: traefik.ingress.kubernetes.io/router.middlewares: default-redirect-https@kubernetescrdmetadata: annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true"Restriction par IP
Section intitulée « Restriction par IP »Le filtrage s'applique à l'IP source vue par le contrôleur : derrière un load balancer cloud qui ne préserve pas l'adresse d'origine, toutes les requêtes arrivent avec l'IP du load balancer et la règle bloque tout ou rien.
# MiddlewareapiVersion: traefik.io/v1alpha1kind: Middlewaremetadata: name: ip-allowlistspec: ipAllowList: sourceRange: - 192.168.1.0/24 - 10.0.0.0/8metadata: annotations: nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24,10.0.0.0/8"Taille maximale du body et timeouts
Section intitulée « Taille maximale du body et timeouts »Avec Traefik, ces réglages sont des EntryPoint options côté contrôleur, pas des annotations Ingress. Configurer dans les values Helm de Traefik :
ports: web: transport: respondingTimeouts: readTimeout: "60s" writeTimeout: "60s" idleTimeout: "180s"Avec ingress-nginx, les anciennes annotations restent disponibles mais le projet n'est plus maintenu :
metadata: annotations: nginx.ingress.kubernetes.io/proxy-body-size: "50m" nginx.ingress.kubernetes.io/proxy-connect-timeout: "30" nginx.ingress.kubernetes.io/proxy-read-timeout: "60"Authentification basique
Section intitulée « Authentification basique »L'authentification basique protège une route par un couple identifiant/mot de passe stocké dans un Secret, sans toucher au code de l'application. Elle transite en clair si vous n'avez pas activé TLS sur la route : réservez-la aux interfaces d'administration déjà servies en HTTPS. Sous Traefik, elle passe par un Middleware référencé depuis l'Ingress, en trois temps.
-
Créez le Secret avec le couple user/password
Fenêtre de terminal htpasswd -c auth admin# Entrez le mot de passekubectl create secret generic basic-auth --from-file=auth -
Créez un Middleware Traefik
basic-auth-middleware.yaml apiVersion: traefik.io/v1alpha1kind: Middlewaremetadata:name: basic-authspec:basicAuth:secret: basic-authFenêtre de terminal kubectl apply -f basic-auth-middleware.yaml -
Référencez le Middleware dans l'Ingress
auth-ingress.yaml apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: auth-ingressannotations:traefik.ingress.kubernetes.io/router.middlewares: default-basic-auth@kubernetescrdspec:ingressClassName: traefikrules:- host: admin.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: admin-serviceport:number: 80
Sur un cluster encore servi par ingress-nginx, le même résultat s'obtient par trois annotations, nginx.ingress.kubernetes.io/auth-type: basic, auth-secret et auth-realm. Le format du Secret est identique, c'est toujours le fichier auth produit par htpasswd : seule la façon de le référencer change d'un contrôleur à l'autre.
Réécriture d'URL
Section intitulée « Réécriture d'URL »Quand l'URL exposée diffère de celle attendue par le backend (par exemple /api/users côté Ingress doit arriver en /users côté Service), il faut un Middleware côté Traefik. Le préfixe retiré n'est pas restitué au backend : une application qui génère des liens absolus renverra des URL sans le /api, et les redirections qu'elle émet casseront. C'est la raison pour laquelle la réécriture se paie souvent en configuration supplémentaire côté application.
# Middleware de réécritureapiVersion: traefik.io/v1alpha1kind: Middlewaremetadata: name: api-stripspec: stripPrefix: prefixes: - /api---apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: rewrite-ingress annotations: traefik.ingress.kubernetes.io/router.middlewares: default-api-strip@kubernetescrdspec: ingressClassName: traefik rules: - host: myapp.example.com http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80Effet : /api/users arrive en /users côté api-service.
Un dernier conseil avant d'écrire une réécriture : essayez de vous en passer. Elle complique le diagnostic, parce que le chemin observé dans les journaux du contrôleur n'est plus celui que reçoit l'application. Quand vous maîtrisez le backend, le configurer pour accepter les chemins tels qu'ils sont exposés coûte moins cher à long terme qu'un Middleware de plus.
Vous croiserez encore l'équivalent ingress-nginx dans du code existant et
dans beaucoup de tutoriels : l'annotation historique
nginx.ingress.kubernetes.io/rewrite-target: /$2, avec un chemin
/api(/|$)(.*) en pathType: ImplementationSpecific. Cette syntaxe à base
d'expressions régulières n'est pas standard, et c'est précisément ce qui la rend
difficile à porter vers un autre contrôleur, Traefik compris. Une raison de plus
de ne pas en écrire de nouvelles.
Dépannage
Section intitulée « Dépannage »Un Ingress qui ne fonctionne pas se diagnostique de l'extérieur vers l'intérieur : contrôleur joignable, règle reconnue, Service peuplé, Pods vivants. Le code HTTP renvoyé indique à quel étage la chaîne se rompt, ce qui évite de relire le YAML alors que le problème est un sélecteur de Service. Les commandes ci-dessous suivent cet ordre.
Vérifier l'état de l'Ingress
Section intitulée « Vérifier l'état de l'Ingress »Le champ ADDRESS demande une lecture prudente, car il est vide dans deux
situations opposées. Sur un cluster adossé à un LoadBalancer, un ADDRESS
vide signale effectivement qu'aucun contrôleur n'a pris la ressource, donc un
ingressClassName erroné ou un contrôleur absent. Sur kind, où il n'y a pas
de LoadBalancer, il reste vide même quand tout fonctionne.
Ne concluez donc rien de ce champ seul : la preuve qui compte est une requête qui aboutit.
# Liste des Ingresskubectl get ingress
# Détails d'un Ingresskubectl describe ingress webapp-ingress
# Adresse assignée ?kubectl get ingress webapp-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}'Vérifier l'Ingress Controller
Section intitulée « Vérifier l'Ingress Controller »Le contrôleur journalise chaque rechargement de sa configuration : si votre domaine n'apparaît jamais dans ses journaux, c'est qu'il n'a pas retenu la règle, et le problème se situe donc avant le routage.
# Identifier le namespace du Controller (traefik ici, kube-system sur k3s)kubectl get pods -A | grep -iE 'traefik|ingress|haproxy|contour'
# Logs du Controller (adapter le namespace et le nom du deployment)kubectl logs -n traefik deploy/traefik --tail=100
# Événements du namespacekubectl get events -n traefik --sort-by=.lastTimestamp | tail -20Erreurs courantes
Section intitulée « Erreurs courantes »Le code renvoyé situe la panne : un 404 vient du contrôleur qui n'a trouvé aucune règle, un 502 ou 503 vient du contrôleur qui a trouvé la règle mais pas de backend joignable derrière.
| Erreur | Cause probable | Solution |
|---|---|---|
| 404 Not Found | Pas de règle correspondante | Vérifiez host, path et Service |
| 502 Bad Gateway | Service ou Pods inaccessibles | Vérifiez endpoints et pods |
| 503 Service Unavailable | Aucun Pod disponible | Vérifiez kubectl get pods |
| Connection refused | Controller non exposé | Vérifiez le Service du Controller |
Debug pas à pas
Section intitulée « Debug pas à pas »Cette séquence remonte la chaîne maillon par maillon. L'étape des endpoints est celle qui révèle le plus d'erreurs : un Service sans endpoint signifie que son selector ne correspond à aucun label de Pod, et le YAML reste pourtant valide.
-
L'Ingress existe-t-il ?
Fenêtre de terminal kubectl get ingress webapp-ingress -
Le Service existe-t-il ?
Fenêtre de terminal kubectl get svc webapp-service -
Le Service a-t-il des endpoints ?
Fenêtre de terminal kubectl get endpointslice -l kubernetes.io/service-name=webapp-service -
Les Pods sont-ils Running ?
Fenêtre de terminal kubectl get pods -l app=webapp -
Le Controller voit-il l'Ingress ?
Fenêtre de terminal # Adapter selon le contrôleur installékubectl logs -n traefik deploy/traefik | grep webapp
Bonnes pratiques
Section intitulée « Bonnes pratiques »Ces règles répondent aux deux faiblesses structurelles de l'API Ingress : son absence de valeurs par défaut explicites et sa dépendance aux annotations. Les appliquer dès la première ressource évite d'avoir à démêler le comportement d'un cluster où plusieurs contrôleurs cohabitent.
Configuration
Section intitulée « Configuration »Ces trois règles portent sur la prévisibilité : savoir quel contrôleur traite quelle ressource, et retrouver l'Ingress d'une application sans grep.
- Toujours spécifier
ingressClassName: évite les comportements imprévisibles - Un Ingress par application : plus facile à maintenir et débugger
- Nommage cohérent,
<app>-ingresspour identifier facilement
Sécurité
Section intitulée « Sécurité »Un Ingress est le point d'entrée public du cluster : ce qui n'y est pas filtré arrive jusqu'aux Pods. Les noms d'annotations cités ci-dessous sont ceux de ingress-nginx ; sous Traefik, les équivalents sont le Middleware ipAllowList et les respondingTimeouts de l'EntryPoint, décrits plus haut.
- Activez TLS : utilisez cert-manager pour automatiser les certificats
- Restreignez les IPs,
whitelist-source-rangepour les routes sensibles - Limitez la taille des requêtes,
proxy-body-sizepour éviter les abus
Production
Section intitulée « Production »Le contrôleur concentre le trafic de toutes les applications exposées : sa panne les coupe toutes à la fois, d'où le besoin d'observabilité dédiée et d'un environnement de pré-production pour valider les annotations avant mise en ligne.
- Surveillez les logs du Controller : configurez la collecte de logs
- Monitorez les métriques : la plupart des Controllers exposent des métriques Prometheus
- Testez en staging : les annotations peuvent avoir des effets inattendus
À retenir
Section intitulée « À retenir »| Concept | Description |
|---|---|
| Ingress | Objet qui définit les règles de routage HTTP/HTTPS |
| Ingress Controller | Composant qui implémente réellement le routage |
ingressClassName | Spécifie quel Controller gère l'Ingress |
rules | Définit le routage par host et path |
tls | Configure HTTPS avec un certificat |
| Annotations | Extensions spécifiques au Controller (non portables) |
Règle d'or : L'API Ingress est stable mais gelée. Pour les cas simples, elle reste parfaitement valide. Pour les besoins avancés ou les nouveaux projets, évaluez Gateway API.
FAQ : questions fréquentes sur l'Ingress
Section intitulée « FAQ : questions fréquentes sur l'Ingress »Ces questions reviennent souvent quand on expose des applications web dans Kubernetes. Les réponses ci-dessous reprennent les points clés du guide, rôle de l'Ingress Controller, choix entre Ingress et Gateway API, configuration TLS et diagnostic des erreurs 404.
tls dans l'Ingress, qui associe un nom de domaine à un Secret de type TLS contenant le certificat. Gérer ces certificats à la main est pénible : installez cert-manager et déclarez un ClusterIssuer (par exemple Let's Encrypt). cert-manager obtient et renouvelle alors les certificats automatiquement.- Le host ou le path de la requête ne correspond à aucune règle.
- L'
ingressClassNameest absent ou erroné : aucun contrôleur ne prend l'Ingress en charge. - Le Service cible n'a aucun endpoint (selector qui ne correspond pas aux Pods).
kubectl describe ingress et les logs du contrôleur.ingress-nginx a été archivé le 24 mars 2026 : dépôt en lecture seule, plus aucune release ni correctif de sécurité.La dernière faille est corrigée, les suivantes ne le seront pas
Sa dernière vulnérabilité, CVE-2026-4342 (CVSS 8.8), permet d'injecter de la configuration nginx via des annotations Ingress, menant à l'exécution de code dans le contrôleur et à la divulgation des Secrets du cluster. Un simple droit de créer un Ingress suffit. Elle est corrigée en 1.13.9, 1.14.5 et 1.15.1 : les dernières versions jamais publiées. Toute faille découverte ensuite restera ouverte.Que faire
- Cluster existant : passer immédiatement sur une version corrigée, puis planifier la migration.
- Nouveau cluster : partir sur la Gateway API, ou un contrôleur maintenu (Traefik, Contour, HAProxy Ingress).
ingressClassName indique lequel doit traiter une ressource Ingress donnée. S'il est absent (et qu'aucune classe par défaut n'existe) ou erroné, aucun contrôleur ne s'approprie l'Ingress : les règles ne sont jamais appliquées et le trafic n'est pas routé. C'est l'une des premières choses à vérifier en cas de panne.Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Sept questions sur les points qui bloquent : le rôle du contrôleur, le
champ ingressClassName, et ce que le routage par domaine exige côté
client.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
Pour aller plus loin
Section intitulée « Pour aller plus loin »- Network Policies : Le filtrage du trafic vers les Pods exposés par l'Ingress Controller.
- Troubleshooting cluster : La méthode pour remonter la chaîne quand une règle Ingress reste sans effet.