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

Ingress Kubernetes : exposer vos applications HTTP/HTTPS

14 min de lecture

logo kubernetes

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.

  • 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
CritèreIngressGateway API
StatutStable, gelé (pas d’évolution)Stable, en développement actif
Cas d’usageHTTP/HTTPS simple, routage host/pathHTTP/HTTPS avancé, gRPC, TCP, traffic splitting
PortabilitéDépend fortement des annotations du contrôleurPlus standardisé
Recommandation KubernetesMaintenu 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.

  1. L’utilisateur envoie une requête vers https://mon-app.example.com

  2. L’Ingress Controller intercepte la requête et consulte les règles définies dans les objets Ingress

  3. Le Controller route vers le Service correspondant au host et au path

  4. Le Service distribue aux Pods disponibles

  5. La réponse remonte via le même chemin

  • 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/hosts pour résoudre vos domaines de test

Vérifiez votre cluster :

Fenêtre de terminal
kubectl cluster-info

Plusieurs Ingress Controllers existent, chacun avec ses spécificités :

ControllerPoints forts
ingress-nginxLe plus répandu, stable, beaucoup d’exemples
TraefikLéger, config dynamique, bon pour microservices
HAProxy IngressPerformant, adapté aux charges élevées
ContourBasé sur Envoy, moderne
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 \
--namespace ingress-nginx \
--create-namespace

Vérifiez l’installation :

Fenêtre de terminal
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx

Déployez une application simple :

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:1.25.4
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: webapp-service
spec:
selector:
app: webapp
ports:
- protocol: TCP
port: 80
targetPort: 80
Fenêtre de terminal
kubectl apply -f webapp-deployment.yaml
webapp-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: webapp-ingress
spec:
ingressClassName: nginx
rules:
- host: webapp.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp-service
port:
number: 80
Fenêtre de terminal
kubectl apply -f webapp-ingress.yaml

Récupérez l’adresse du Controller :

Fenêtre de terminal
# Adresse du Service Ingress Controller
kubectl get svc -n ingress-nginx my-ingress-ingress-nginx-controller
# Sur Minikube
minikube ip
# Sur Kind avec port mapping
# Généralement 127.0.0.1 si configuré

Configurez la résolution DNS (fichier /etc/hosts) :

Fenêtre de terminal
# Remplacez par l'IP réelle de votre Controller
echo "192.168.49.2 webapp.local" | sudo tee -a /etc/hosts

Testez :

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

Un Ingress peut router plusieurs domaines vers différents Services :

multi-domain-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-app-ingress
spec:
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: 80

Vous pouvez aussi router différents chemins vers différents Services :

path-routing-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-routing
spec:
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: 80

Consultez la documentation officielle cert-manager pour la version actuelle. Installation typique :

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

Vérifiez l’installation :

Fenêtre de terminal
kubectl get pods -n cert-manager
cluster-issuer.yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: votre-email@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
ingressClassName: nginx
Fenêtre de terminal
kubectl apply -f cluster-issuer.yaml
secure-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
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: 80
Fenêtre de terminal
kubectl apply -f secure-ingress.yaml
# Vérifier le certificat
kubectl get certificate
kubectl describe certificate monsite-tls
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.1.0/24,10.0.0.0/8"
metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-body-size: "50m"
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"

Pour protéger une route avec un login/mot de passe :

  1. Créez le fichier htpasswd

    Fenêtre de terminal
    htpasswd -c auth myuser
    # Entrez le mot de passe
  2. Créez le Secret

    Fenêtre de terminal
    kubectl create secret generic basic-auth --from-file=auth
  3. Configurez l’Ingress

    auth-ingress.yaml
    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: "Zone protégée"
    spec:
    ingressClassName: nginx
    rules:
    - host: admin.example.com
    http:
    paths:
    - path: /
    pathType: Prefix
    backend:
    service:
    name: admin-service
    port:
    number: 80

Quand l’URL exposée diffère de celle attendue par le backend :

rewrite-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
ingressClassName: nginx
rules:
- host: myapp.example.com
http:
paths:
- path: /api(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: api-service
port:
number: 80

Exemple : /api/users est réécrit en /users avant d’être envoyé au backend.

Fenêtre de terminal
# Liste des Ingress
kubectl get ingress
# Détails d'un Ingress
kubectl describe ingress webapp-ingress
# Adresse assignée ?
kubectl get ingress webapp-ingress -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
Fenêtre de terminal
# Pods du Controller
kubectl get pods -n ingress-nginx
# Logs du Controller
kubectl logs -n ingress-nginx deploy/my-ingress-ingress-nginx-controller --tail=100
# Événements
kubectl get events -n ingress-nginx --sort-by=.lastTimestamp
ErreurCause probableSolution
404 Not FoundPas de règle correspondanteVérifiez host, path et Service
502 Bad GatewayService ou Pods inaccessiblesVérifiez endpoints et pods
503 Service UnavailableAucun Pod disponibleVérifiez kubectl get pods
Connection refusedController non exposéVérifiez le Service du Controller
  1. L’Ingress existe-t-il ?

    Fenêtre de terminal
    kubectl get ingress webapp-ingress
  2. Le Service existe-t-il ?

    Fenêtre de terminal
    kubectl get svc webapp-service
  3. Le Service a-t-il des endpoints ?

    Fenêtre de terminal
    kubectl get endpoints webapp-service
  4. Les Pods sont-ils Running ?

    Fenêtre de terminal
    kubectl get pods -l app=webapp
  5. Le Controller voit-il l’Ingress ?

    Fenêtre de terminal
    kubectl logs -n ingress-nginx deploy/my-ingress-ingress-nginx-controller | grep webapp
  1. Toujours spécifier ingressClassName — Évite les comportements imprévisibles
  2. Un Ingress par application — Plus facile à maintenir et débugger
  3. Nommage cohérent<app>-ingress pour identifier facilement
  1. Activez TLS — Utilisez cert-manager pour automatiser les certificats
  2. Restreignez les IPswhitelist-source-range pour les routes sensibles
  3. Limitez la taille des requêtesproxy-body-size pour éviter les abus
  1. Surveillez les logs du Controller — Configurez la collecte de logs
  2. Monitorez les métriques — La plupart des Controllers exposent des métriques Prometheus
  3. Testez en staging — Les annotations peuvent avoir des effets inattendus

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

ConceptDescription
IngressObjet qui définit les règles de routage HTTP/HTTPS
Ingress ControllerComposant qui implémente réellement le routage
ingressClassNameSpécifie quel Controller gère l’Ingress
rulesDéfinit le routage par host et path
tlsConfigure HTTPS avec un certificat
AnnotationsExtensions 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.

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