Aller au contenu
Conteneurs & Orchestration medium

Maîtriser les Ingress Kubernetes

18 min de lecture

logo kubernetes

Un Ingress est une ressource Kubernetes qui permet de gérer l’accès aux applications déployées dans un cluster. Il agit comme un reverse proxy en dirigeant les requêtes entrantes vers les bons Services en fonction des règles définies (routes, sous-domaines, SSL, authentification, etc.).

Sans Ingress, il faudrait utiliser des LoadBalancers coûteux ou des NodePorts peu flexibles. L’Ingress résout ce problème en agissant comme une passerelle unique qui gère le routage du trafic, le support du HTTPS et l’authentification.

Contrairement aux Services LoadBalancer de type LoadBalancer, un Ingress offre un routage avancé et permet de gérer plusieurs applications avec un seul point d’entrée. Il est particulièrement utile pour les applications web, les API, les applications multi-tenant et les applications nécessitant un routage fin.

Lorsqu’un utilisateur tente d’accéder à une application exposée via un Ingress, plusieurs étapes se déroulent :

  1. Requête entrante : L’utilisateur envoie une requête HTTP/HTTPS vers le cluster Kubernetes (exemple : https://mon-app.com).
  2. L’Ingress Controller intercepte la requête : Il analyse les règles définies dans l’Ingress pour déterminer où diriger le trafic.
  3. Routage vers le bon service : L’Ingress Controller transmet la requête au Service Kubernetes correspondant.
  4. Le Service redirige vers les Pods : Le Service distribue la requête vers l’un des Pods disponibles, assurant l’équilibrage de charge.
  5. Réponse vers le client : Le Pod répond et la réponse suit le même chemin en sens inverse jusqu’à l’utilisateur.

Fonctionnement d'un Ingress Kubernetes

Avant de manipuler les StorageClasses dans Kubernetes, il est essentiel de disposer d’un environnement fonctionnel et des outils adéquats. Voici ce dont vous aurez besoin :

kubectl est l’outil en ligne de commande indispensable pour gérer un cluster Kubernetes. Il permet de :

  • Appliquer des fichiers de configuration YAML
  • Lister et vérifier l’état des StorageClasses, PV et PVC
  • Debugger les éventuels problèmes liés au stockage

Helm est un gestionnaire de paquets pour Kubernetes, qui facilite l’installation et la gestion des applications complèxes. Il est souvent utilisé pour déployer des provisionneurs de stockage CSI (Container Storage Interface) dans un cluster.

Pour tester les StorageClasses et le provisionnement dynamique de volumes, vous devez disposer d’un cluster Kubernetes fonctionnel. Deux options s’offrent à vous :

  • Un cluster en production ou hébergé sur le cloud (AWS EKS, Azure AKS, Google GKE, OpenShift, etc.)
  • Un cluster local pour les tests et l’apprentissage Minikube est une solution simple à mettre en place sur une machine locale.

Vérifiez que votre cluster est bien opérationnel avec la commande :

Fenêtre de terminal
kubectl cluster-info
Kubernetes control plane is running at https://192.168.50.141:8443
CoreDNS is running at https://192.168.50.141:8443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

Si votre cluster est en place, vous devriez voir une sortie indiquant l’adresse de l’API Kubernetes.

Un éditeur de code pour manipuler les fichiers YAML

Section intitulée « Un éditeur de code pour manipuler les fichiers YAML »

Pour éditer et appliquer vos fichiers de configuration Kubernetes, il est recommandé d’utiliser un éditeur de code adapté comme :

  • VS Code avec l’extension Kubernetes
  • Vim ou Nano si vous préférez un éditeur en ligne de commande
  • IntelliJ IDEA avec le plugin Kubernetes

Sans Ingress Controller, les ressources Ingress ne sont que des configurations sans effet. Il faut impérativement en déployer un pour que les règles soient appliquées.

Il existe plusieurs Ingress Controllers compatibles avec Kubernetes, chacun ayant ses spécificités :

Ingress ControllerPoints forts
NGINX Ingress ControllerLe plus utilisé, stable, supporte HTTPS et annotations avancées.
TraefikLéger, dynamique, parfait pour les microservices et le cloud natif.
HAProxy IngressTrès performant, idéal pour les charges élevées.
ContourOptimisé pour l’intégration avec Envoy Proxy.
Istio GatewayUtilisé dans les architectures service mesh pour un contrôle avancé du trafic.

Avant de pouvoir utiliser un Ingress, il faut donc installer un Ingress Controller dans le cluster Kubernetes. Nous allons voir comment installer NGINX Ingress Controller. Pour installer NGINX Ingress Controller, vous pouvez utiliser Helm :

Fenêtre de terminal
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install my-ingress ingress-nginx/ingress-nginx

Une fois installé, Kubernetes peut maintenant utiliser les ressources Ingress pour gérer le trafic.

Maintenant que nous avons installé un Ingress Controller, nous allons voir comment créer un Ingress pour exposer une application.

Préparer une application et un Service Kubernetes

Section intitulée « Préparer une application et un Service Kubernetes »

Avant de créer un Ingress, il faut d’abord disposer d’une application exposée via un Service. Voici un exemple avec une application web simple.

Déploiement de l’application (webapp-deployment.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:
name: webapp
spec:
replicas: 2
selector:
matchLabels:
app: webapp
template:
metadata:
labels:
app: webapp
spec:
containers:
- name: webapp
image: nginx
ports:
- containerPort: 80

Création du Service (webapp-service.yaml)

apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: 80

Appliquez ces fichiers :

Fenêtre de terminal
kubectl apply -f webapp-deployment.yaml
kubectl apply -f webapp-service.yaml

Nous allons maintenant créer un Ingress qui redirige le trafic externe vers notre Service.

Fichier webapp-ingress.yaml :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: webapp.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp-service
port:
number: 80

Appliquez cet Ingress :

Fenêtre de terminal
kubectl apply -f webapp-ingress.yaml

Si vous êtes en local (Minikube, Kind, etc.) Ajoutez l’IP du cluster et le nom de domaine dans le fichier /etc/hosts :

Fenêtre de terminal
echo "127.0.0.1 webapp.local" | sudo tee -a /etc/hosts

Puis testez l’accès à l’application :

Fenêtre de terminal
curl http://webapp.local

Si vous utilisez un cluster cloud (GKE, AKS, EKS, etc.) Récupérez l’IP publique de l’Ingress et testez :

Fenêtre de terminal
kubectl get ingress webapp-ingress

Nous avons maintenant un Ingress fonctionnel ! Il permet de rediriger le trafic vers notre application sans exposer directement les Pods.

Configurer un Ingress avancé : multi-domaines, HTTPS et sécurité

Section intitulée « Configurer un Ingress avancé : multi-domaines, HTTPS et sécurité »

Maintenant que nous avons un Ingress fonctionnel, voyons comment le rendre plus puissant et sécurisé avec des fonctionnalités avancées :

  • Gérer plusieurs domaines et sous-domaines
  • Rediriger des chemins spécifiques vers différentes applications
  • Sécuriser l’Ingress avec HTTPS (Let’s Encrypt, Cert-Manager)
  • Ajouter une authentification basique

Un Ingress peut gérer plusieurs applications à la fois, en fonction du nom de domaine ou du chemin de la requête.

Exemple d’usage :

  • app.monsite.com redirige vers une application web
  • api.monsite.com redirige vers un backend API

Fichier multi-domain-ingress.yaml :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-app-ingress
spec:
rules:
- host: app.monsite.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp-service
port:
number: 80
- host: api.monsite.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80

Déployez cet Ingress :

Fenêtre de terminal
kubectl apply -f multi-domain-ingress.yaml

Si vous êtes en local, ajoutez les domaines à /etc/hosts

Fenêtre de terminal
echo "127.0.0.1 app.monsite.com api.monsite.com" | sudo tee -a /etc/hosts

Ajouter un certifica avec Let’s Encrypt et Cert-Manager

Section intitulée « Ajouter un certifica avec Let’s Encrypt et Cert-Manager »

Par défaut, un Ingress fonctionne en HTTP. Pour sécuriser les connexions, on peut utiliser Let’s Encrypt avec Cert-Manager pour générer et gérer automatiquement des certificats SSL.

Dans un premier temps, installez Cert-Manager :

Fenêtre de terminal
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.0/cert-manager.yaml

Vérifiez si une version plus récente est disponible sur le site officiel de Cert-Manager.

Puis créer un ClusterIssuer pour Let’s Encrypt :

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: votremail@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx

Le ClusterIssuer permet de définir les paramètres de connexion à Let’s Encrypt et de générer des certificats SSL.

Déployez-le :

Fenêtre de terminal
kubectl apply -f cluster-issuer.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: secure-ingress
annotations:
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- monsite.com
secretName: monsite-tls
rules:
- host: monsite.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp-service
port:
number: 80

Le simple fait d’ajouter l’annotation cert-manager.io/cluster-issuer permet à Cert-Manager de générer un certificat SSL pour le domaine spécifié.

Déployez cet Ingress sécurisé :

Fenêtre de terminal
kubectl apply -f secure-ingress.yaml

Votre Ingress est maintenant en HTTPS !

Si vous souhaitez protéger l’accès à certaines routes, vous pouvez ajouter une authentification basique avec NGINX Ingress Controller.

Commencez par créer un fichier auth contenant un nom d’utilisateur et un mot de passe chiffré avec htpasswd :

Fenêtre de terminal
htpasswd -c auth myuser
kubectl create secret generic basic-auth --from-file=auth

Je vous recommande de regarder les sealed-secrets pour chiffrer les secrets.

Ensuite ajoutez les annotations suivantes à votre Ingress :

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: auth-ingress
annotations:
nginx.ingress.kubernetes.io/auth-type: "basic"
nginx.ingress.kubernetes.io/auth-secret: "basic-auth"
nginx.ingress.kubernetes.io/auth-realm: "Veuillez vous identifier"
cert-manager.io/cluster-issuer: "letsencrypt-prod"
spec:
tls:
- hosts:
- monsite.com
secretName: monsite-tls
rules:
- host: monsite.com
http:
paths:
- path: /admin
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 80

Déployez cet Ingress :

Fenêtre de terminal
kubectl apply -f auth-ingress.yaml

Désormais, toute requête sur /admin demandera un nom d’utilisateur et un mot de passe !

La plupart des Ingress Controllers offrent des annotations pour personnaliser le comportement de l’Ingress. Voici quelques exemples avec NGINX Ingress Controller :

Si vous souhaitez restreindre l’accès à votre application à une liste d’adresses IP spécifiques (exemple : limiter l’accès à un réseau interne ou à certaines IPs autorisées), vous pouvez utiliser les annotations NGINX Ingress suivantes :

metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24, 203.0.113.42"

Explication : Seules les IPs 192.168.1.0/24 (réseau interne) et 203.0.113.42 (IP spécifique) pourront accéder à l’application. Toutes les autres seront bloquées.

Les attaques par déni de service (DDoS), le brute force et d’autres types d’abus peuvent affecter vos applications exposées via un Ingress. Kubernetes et les Ingress Controllers permettent d’atténuer ces risques avec :

Rate Limiting (limitation du nombre de requêtes par client) :

metadata:
annotations:
nginx.ingress.kubernetes.io/limit-rpm: "100"
nginx.ingress.kubernetes.io/limit-burst-multiplier: "5"

Explication :

  • limit-rpm: 100 → Chaque IP ne pourra pas dépasser 100 requêtes par minute.
  • limit-burst-multiplier: 5 → Autorise un pic temporaire de 500 requêtes avant de ralentir.

Ajout de Headers de sécurité

Protégez votre application contre les vulnérabilités courantes en ajoutant des headers HTTP de sécurité :

metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
more_set_headers "X-Frame-Options: DENY";
more_set_headers "X-XSS-Protection: 1; mode=block";
more_set_headers "X-Content-Type-Options: nosniff";

Explication :

  • X-Frame-Options: DENY → Empêche l’application d’être chargée dans un iframe (protection contre le clickjacking).
  • X-XSS-Protection: 1; mode=block → Active la protection contre les attaques XSS.
  • X-Content-Type-Options: nosniff → Empêche les navigateurs d’essayer de deviner le type de contenu (protection contre le MIME sniffing).

Vous pourrez trouver des exemples d’Ingress avancés dans la documentation officielle de NGINX Ingress.

Même avec une configuration soignée, un Ingress peut rencontrer des problèmes : erreurs d’accès, mauvais routage, problèmes de performances…

Voici quelques étapes pour déboguer un Ingress et résoudre les problèmes courants.

Lorsqu’un Ingress ne fonctionne pas comme prévu, la première chose à faire est de consulter les logs de l’Ingress Controller.

Récupérer les logs du contrôleur NGINX Ingress :

Fenêtre de terminal
kubectl logs -n ingress-nginx deploy/ingress-nginx-controller

Que chercher dans les logs ?

  • 404 Not Found : Le chemin ou le service cible n’existe pas.
  • 502 Bad Gateway : Le service backend est inaccessible.
  • 503 Service Unavailable : Aucune instance disponible pour gérer la requête.
  • Erreur 404 - Page non trouvée :

Cause : L’Ingress ne trouve pas de règle correspondant à la requête. Solution : Vérifier que l’Ingress et le Service existent et sont bien configurés.

Fenêtre de terminal
kubectl get ingress
kubectl describe ingress <nom-de-l’ingress>
kubectl get svc
  • Erreur 502 - Bad Gateway :

Cause : Le Service est inaccessible ou ne répond pas. Solution : Vérifier l’état des Pods et du Service associé.

Fenêtre de terminal
kubectl get pods -l app=<nom-app>
kubectl get svc <nom-service>
kubectl describe pod <nom-pod>
  • Erreur 503 - Service Unavailable :

Cause : Aucun Pod n’est disponible pour gérer les requêtes. Solution : Vérifier si les Pods sont en état Running.

Fenêtre de terminal
kubectl get pods
kubectl describe pod <nom-du-pod>

Si des Pods sont en CrashLoopBackOff ou Pending, inspectez leurs logs :

Fenêtre de terminal
kubectl logs <nom-du-pod>

Un Ingress bien configuré ne doit pas seulement fonctionner, il doit aussi offrir des performances optimales pour éviter les ralentissements et réduire la charge sur votre infrastructure.

La mise en cache permet de réduire la charge sur les services backend en servant directement certaines réponses depuis l’Ingress Controller.

Avec NGINX Ingress, ajoutez ces annotations :

metadata:
annotations:
nginx.ingress.kubernetes.io/cache-enable: "true"
nginx.ingress.kubernetes.io/cache-key: "$host$request_uri"
nginx.ingress.kubernetes.io/cache-methods: "GET HEAD"

Avantages : Moins de requêtes aux services backend, amélioration des performances.

Activer la compression des réponses (Gzip, Brotli)

Section intitulée « Activer la compression des réponses (Gzip, Brotli) »

Activer la compression des réponses HTTP réduit le temps de chargement des pages et optimise l’utilisation de la bande passante.

Avec NGINX Ingress, ajoutez :

metadata:
annotations:
nginx.ingress.kubernetes.io/configuration-snippet: |
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

Avantages : Réduction de la taille des réponses, amélioration du temps de chargement.

Si vous avez plusieurs Pods derrière un Ingress, Kubernetes répartit les requêtes entre eux via un Service en mode ClusterIP. Vous pouvez améliorer cette répartition en modifiant la stratégie de load balancing :

metadata:
annotations:
nginx.ingress.kubernetes.io/load-balance: "round_robin"

Modes possibles :

  • Round Robin (par défaut) : envoie les requêtes aux Pods de manière équilibrée.
  • Least Connections : priorise les Pods avec le moins de connexions actives.
  • IP Hash : maintient la session d’un utilisateur sur un même Pod.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

7 questions
5 min.
90% requis

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

Dans ce guide, nous avons découvert les Ingress et leur rôle essentiel dans la gestion du trafic au sein d’un cluster Kubernetes. Vous avez vu comment ils permettent de simplifier l’accès aux applications, de gérer plusieurs domaines, d’activer HTTPS et de sécuriser les connexions.

Mais ce n’est que le début ! Un Ingress Controller offre bien d’autres fonctionnalités avancées et selon votre besoin, certains contrôleurs comme NGINX, Traefik, HAProxy ou Istio peuvent être plus adaptés que d’autres.

Dans de prochains guides, nous explorerons plus en détail certaines de ces solutions :

  • Configurer NGINX Ingress Controller pour un usage avancé
  • Découvrir Traefik, une alternative légère et dynamique

L’avenir des Ingress : la montée en puissance des API Gateway

Section intitulée « L’avenir des Ingress : la montée en puissance des API Gateway »

Si les Ingress sont aujourd’hui largement utilisés, Kubernetes évolue et une nouvelle ressource commence à les remplacer progressivement : Gateway API.

Pourquoi cette transition ? :

  • Plus de flexibilité : meilleure gestion des routes et des stratégies avancées.
  • Standardisation : un modèle plus adapté aux architectures modernes et multi-cloud.
  • Extensibilité : intégration plus poussée avec des solutions comme Istio ou Contour.

Que faire aujourd’hui ? :

Les Ingress restent une solution stable et fiable pour la majorité des cas d’usage. Cependant, si vous démarrez un projet long terme, il peut être intéressant d’explorer les Gateway API pour assurer une transition en douceur.

Nous verrons dans de futurs guides comment migrer d’un Ingress vers une API Gateway et quelles sont les bonnes pratiques à adopter ! Abonnez-vous à mon compte linkedin pour être informé des prochaines publications.

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.