
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.
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 ? »| 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.
Comment fonctionne un Ingress ?
Section intitulée « Comment fonctionne un Ingress ? »-
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 (Minikube, Kind, K3s, ou cloud)
- 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 »Plusieurs Ingress Controllers existent, chacun avec ses spécificités :
| Controller | Points forts |
|---|---|
| ingress-nginx | Le plus répandu, stable, beaucoup d’exemples |
| Traefik | Léger, config dynamique, bon pour microservices |
| HAProxy Ingress | Performant, adapté aux charges élevées |
| Contour | Basé sur Envoy, moderne |
Installation avec Helm (ingress-nginx)
Section intitulée « Installation avec Helm (ingress-nginx) »helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginxhelm repo update
helm install my-ingress ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespaceVérifiez l’installation :
kubectl get pods -n ingress-nginxkubectl get svc -n ingress-nginxCréer votre premier Ingress
Section intitulée « Créer votre premier Ingress »Préparer l’application et le Service
Section intitulée « Préparer l’application et le Service »Déployez une application simple :
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 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 »apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: webapp-ingressspec: ingressClassName: nginx 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 »Récupérez l’adresse du Controller :
# Adresse du Service Ingress Controllerkubectl get svc -n ingress-nginx my-ingress-ingress-nginx-controller
# Sur Minikubeminikube ip
# Sur Kind avec port mapping# Généralement 127.0.0.1 si configuréConfigurez la résolution DNS (fichier /etc/hosts) :
# Remplacez par l'IP réelle de votre Controllerecho "192.168.49.2 webapp.local" | sudo tee -a /etc/hostsTestez :
curl http://webapp.localRoutage multi-domaines
Section intitulée « Routage multi-domaines »Un Ingress peut router plusieurs domaines vers différents Services :
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: multi-app-ingressspec: ingressClassName: nginx 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 »Vous pouvez aussi router différents chemins vers différents Services :
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: path-routingspec: ingressClassName: nginx 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: 80Configurer TLS avec cert-manager
Section intitulée « Configurer TLS avec cert-manager »Installer cert-manager
Section intitulée « Installer cert-manager »Consultez la documentation officielle cert-manager pour la version actuelle. Installation typique :
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.0/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 »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: nginxkubectl apply -f cluster-issuer.yamlConfigurer l’Ingress avec TLS
Section intitulée « Configurer l’Ingress avec TLS »apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: secure-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod"spec: ingressClassName: nginx 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 ingress-nginx courantes
Section intitulée « Annotations ingress-nginx courantes »Redirection HTTPS
Section intitulée « Redirection HTTPS »metadata: annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true"Restriction par IP
Section intitulée « Restriction par IP »metadata: annotations: nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24,10.0.0.0/8"Taille maximale du body
Section intitulée « Taille maximale du body »metadata: annotations: nginx.ingress.kubernetes.io/proxy-body-size: "50m"Timeouts
Section intitulée « Timeouts »metadata: annotations: nginx.ingress.kubernetes.io/proxy-connect-timeout: "30" nginx.ingress.kubernetes.io/proxy-read-timeout: "60" nginx.ingress.kubernetes.io/proxy-send-timeout: "60"Authentification basique
Section intitulée « Authentification basique »Pour protéger une route avec un login/mot de passe :
-
Créez le fichier htpasswd
Fenêtre de terminal htpasswd -c auth myuser# Entrez le mot de passe -
Créez le Secret
Fenêtre de terminal kubectl create secret generic basic-auth --from-file=auth -
Configurez l’Ingress
auth-ingress.yaml apiVersion: networking.k8s.io/v1kind: Ingressmetadata:name: auth-ingressannotations:nginx.ingress.kubernetes.io/auth-type: "basic"nginx.ingress.kubernetes.io/auth-secret: "basic-auth"nginx.ingress.kubernetes.io/auth-realm: "Zone protégée"spec:ingressClassName: nginxrules:- host: admin.example.comhttp:paths:- path: /pathType: Prefixbackend:service:name: admin-serviceport:number: 80
Réécriture d’URL
Section intitulée « Réécriture d’URL »Quand l’URL exposée diffère de celle attendue par le backend :
apiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: rewrite-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2spec: ingressClassName: nginx rules: - host: myapp.example.com http: paths: - path: /api(/|$)(.*) pathType: ImplementationSpecific backend: service: name: api-service port: number: 80Exemple : /api/users est réécrit en /users avant d’être envoyé au backend.
Dépannage
Section intitulée « Dépannage »Vérifier l’état de l’Ingress
Section intitulée « Vérifier l’état de l’Ingress »# 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 »# Pods du Controllerkubectl get pods -n ingress-nginx
# Logs du Controllerkubectl logs -n ingress-nginx deploy/my-ingress-ingress-nginx-controller --tail=100
# Événementskubectl get events -n ingress-nginx --sort-by=.lastTimestampErreurs courantes
Section intitulée « Erreurs courantes »| 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 »-
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 endpoints 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 kubectl logs -n ingress-nginx deploy/my-ingress-ingress-nginx-controller | grep webapp
Bonnes pratiques
Section intitulée « Bonnes pratiques »Configuration
Section intitulée « Configuration »- 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é »- 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 »- 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
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »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
À 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.