Aller au contenu principal

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