Chapitre 8.2 - Ingress Controller
Objectifs d'Apprentissage
À la fin de ce chapitre, vous serez capable de:
- Comprendre ce qu'est un Ingress Controller
- Installer NGINX Ingress Controller
- Configurer un Ingress Controller
- Comprendre les différents types de contrôleurs
- Gérer les annotations et configurations avancées
- Dépanner un Ingress Controller
Introduction
Un Ingress Controller est un Pod qui surveille les ressources Ingress et configure un load balancer pour implémenter les règles de routage. Sans Ingress Controller, les ressources Ingress ne fonctionnent pas.
Qu'est-ce qu'un Ingress Controller?
Un Ingress Controller est un reverse proxy qui:
- Surveille les ressources Ingress dans le cluster
- Configure un load balancer selon les règles Ingress
- Gère le routage HTTP/HTTPS
- Termine TLS/SSL
- Fournit le load balancing
Important: Un Ingress Controller doit être installé séparément. Kubernetes ne fournit pas de contrôleur par défaut.
Types d'Ingress Controllers
1. NGINX Ingress Controller
Le plus populaire
Avantages:
- Très performant
- Beaucoup de fonctionnalités
- Bien documenté
- Support actif
Installation:
# Kubernetes officiel
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
# Vérifier l'installation
kubectl get pods -n ingress-nginx
2. Traefik
Simple et moderne
Avantages:
- Auto-configuration
- Dashboard intégré
- Configuration simple
- Support Let's Encrypt intégré
Installation:
# Helm
helm repo add traefik https://traefik.github.io/charts
helm install traefik traefik/traefik
3. HAProxy Ingress
Très performant
Avantages:
- Performance exceptionnelle
- Configuration avancée
- Support TCP/UDP
4. Istio Gateway
Pour service mesh
Avantages:
- Intégration avec Istio
- Fonctionnalités avancées
- Service mesh complet
Installation NGINX Ingress Controller
Méthode 1: Manifest Kubernetes
# Installation standard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
# Vérifier
kubectl get pods -n ingress-nginx
kubectl get svc -n ingress-nginx
Méthode 2: Helm
# Ajouter le repository
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
# Installer
helm install ingress-nginx ingress-nginx/ingress-nginx \
--namespace ingress-nginx \
--create-namespace
Vérification
# Voir les Pods
kubectl get pods -n ingress-nginx
# Voir le Service
kubectl get svc -n ingress-nginx
# Voir l'IP externe
kubectl get svc ingress-nginx-controller -n ingress-nginx
Configuration de Base
IngressClass
Définir quelle classe d'Ingress utiliser:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
Ingress Resource
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
Annotations NGINX
Les annotations permettent de configurer NGINX de manière avancée:
Rewrite
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$1
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /api/(.*)
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
SSL Redirect
metadata:
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
Rate Limiting
metadata:
annotations:
nginx.ingress.kubernetes.io/limit-rps: "100"
CORS
metadata:
annotations:
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/cors-allow-origin: "*"
Authentication
metadata:
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Authentication Required"
Configuration Avancée
ConfigMap pour NGINX
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-config
namespace: ingress-nginx
data:
proxy-body-size: "50m"
ssl-protocols: "TLSv1.2 TLSv1.3"
client-max-body-size: "50m"
Appliquer la Configuration
apiVersion: apps/v1
kind: Deployment
metadata:
name: ingress-nginx-controller
namespace: ingress-nginx
spec:
template:
spec:
containers:
- name: controller
args:
- /nginx-ingress-controller
- --configmap=$(POD_NAMESPACE)/nginx-config
Exemple Complet
Étape 1: Service
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
selector:
app: web
ports:
- port: 80
targetPort: 8080
Étape 2: Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
ingressClassName: nginx
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
tls:
- hosts:
- example.com
secretName: example-tls
Commandes Utiles
Vérification
# Voir les Pods du Controller
kubectl get pods -n ingress-nginx
# Logs du Controller
kubectl logs -n ingress-nginx -l app.kubernetes.io/component=controller
# Voir les Services
kubectl get svc -n ingress-nginx
# Voir les Ingress
kubectl get ingress
kubectl describe ingress web-ingress
Dépannage
# Vérifier la configuration NGINX
kubectl exec -n ingress-nginx <controller-pod> -- cat /etc/nginx/nginx.conf
# Tester la connectivité
curl -H "Host: example.com" http://<ingress-ip>/
# Voir les événements
kubectl get events -n ingress-nginx
Bonnes Pratiques
1. Namespace Dédié
Installer l'Ingress Controller dans un namespace dédié (ingress-nginx).
2. Ressources
Définir des limites de ressources pour le Controller.
3. High Availability
Déployer plusieurs réplicas du Controller pour la haute disponibilité.
4. Monitoring
Surveiller les métriques du Controller (requêtes, latence, erreurs).
5. Sécurité
- Utiliser TLS partout
- Configurer les rate limits
- Activer l'authentification si nécessaire
Résumé
Dans ce chapitre, vous avez appris:
Ingress Controller: Pod qui implémente les règles Ingress
Types: NGINX (populaire), Traefik (simple), HAProxy (performant), Istio (service mesh)
Installation: Manifest Kubernetes ou Helm
Configuration: IngressClass, annotations, ConfigMap
Annotations: Rewrite, SSL redirect, rate limiting, CORS, auth
Dépannage: Logs, configuration NGINX, événements
Bonnes pratiques: Namespace dédié, HA, monitoring, sécurité
Prochaines Étapes
Chapitre 8.3: Routage et TLS
Lab 8.1: Déploiement d'un Ingress Controller
Chapitre créé le: Décembre 2024