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.

Un Ingress qui route vers plusieurs Services

Chaque règle relie une URL (hôte et/ou chemin) à un Service :

  • par hôte : app.example.com → Service frontend, api.example.com → Service api ;
  • 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 Ingress du 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.tls référence un Secret de type kubernetes.io/tls contenant 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 (ou kubectl 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