Ingress - ii02735/learn-k8 GitHub Wiki
Les Ingress
Qu'est-ce qu'un Ingress ?
Un Ingress est un ensemble de règles de routage HTTP/HTTPS qui expose des Services vers l'extérieur du cluster. C'est du routage de niveau 7 (L7) : l'Ingress sait lire l'hôte et le chemin de la requête, ce que ne sait pas faire un Service.
Chaque règle relie une URL (hôte et/ou chemin) à un Service :
- par hôte :
app.example.com→ Servicefrontend,api.example.com→ Serviceapi; - par chemin :
example.com/→frontend,example.com/api→api; - et l'on peut bien sûr combiner les deux.
L'Ingress Controller : le moteur
:warning: Un objet Ingress ne fait rien tout seul : c'est une simple règle déclarative. Il faut un Ingress Controller pour l'appliquer réellement.
L'Ingress Controller est un composant (souvent un reverse proxy / load balancer) qui :
- observe les ressources
Ingressdu cluster ; - configure un proxy (nginx, Traefik, HAProxy, Envoy…) pour router le trafic entrant ;
- gère lui-même le load balancing vers les Pods.
On peut voir l'Ingress comme la configuration et le controller comme le moteur.
- Il n'est pas installé par défaut dans la plupart des clusters : il faut le déployer (ex.
ingress-nginx). - On choisit le controller du cluster via
spec.ingressClassName(ex.nginx). - Controllers courants : ingress-nginx, Traefik, HAProxy Ingress, Kong, Contour, ou les controllers managés des clouds (ALB sur AWS, GCE sur Google…).
Pourquoi un Ingress plutôt qu'un NodePort / LoadBalancer ?
- Un seul point d'entrée (une IP, un load balancer) pour plusieurs Services, au lieu d'un load balancer par Service (coûteux et vite ingérable).
- Routage applicatif : par hôte (virtual hosting), par chemin, redirections, réécriture d'URL…
- Terminaison TLS centralisée.
Le champ pathType
Prefix: correspondance par préfixe de chemin (le plus courant) ;Exact: correspondance exacte du chemin ;ImplementationSpecific: laissé à l'appréciation du controller.
TLS
- La section
spec.tlsréférence un Secret de typekubernetes.io/tlscontenant le certificat et la clé privée ; l'Ingress y termine le HTTPS. - cert-manager permet d'automatiser l'émission et le renouvellement des certificats (ex. Let's Encrypt).
Un manifeste Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: api
port:
number: 8080
Les Services ciblés sont typiquement des ClusterIP : ils n'ont pas besoin d'être exposés eux-mêmes, c'est l'Ingress qui est le point d'entrée.
[!NOTE] Le Gateway API est le successeur annoncé de l'Ingress : plus expressif (rôles séparés pour l'infra et les équipes, support du TCP/UDP et du gRPC, etc.). L'Ingress reste néanmoins très répandu.
Ne pas confondre Service et Ingress
- Service : niveau 4 (TCP/UDP), une IP stable devant un ensemble de Pods.
- Ingress : niveau 7 (HTTP/HTTPS), du routage par hôte/chemin devant des Services.
Les commandes principales
- Lister les Ingress :
kubectl get ingress(oukubectl get ing) - Obtenir les détails :
kubectl describe ingress web - Voir les classes d'Ingress du cluster :
kubectl get ingressclass - Appliquer un manifeste :
kubectl apply -f ingress.yaml - Supprimer un Ingress :
kubectl delete ingress web