nano http-to-https-ingress.yaml
Contenu du fichier http-to-https-ingress.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app1-http
namespace: demo-apps
annotations:
nginx.ingress.kubernetes.io/permanent-redirect: "https://app1.kube.local$request_uri"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/force-ssl-redirect: "true"
spec:
rules:
- host: app1.kube.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
kubectl apply -f http-to-https-ingress.yaml
curl -v http://app1.kube.local
Vous devriez voir une réponse 301 (Moved Permanently) qui redirige vers https://app1.kube.local.
permanent-redirect
: Définit l'URL vers laquelle rediriger (avec code 301)ssl-redirect
: Active la redirection vers HTTPSforce-ssl-redirect
: Force la redirection même si le backend n'est pas configuré pour HTTPSCette configuration est particulièrement utile pour assurer que toutes les connexions aux applications utilisent HTTPS, améliorant ainsi la sécurité.
nano rate-limit-ingress.yaml
Contenu du fichier rate-limit-ingress.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app1-rate-limited
namespace: demo-apps
annotations:
nginx.ingress.kubernetes.io/limit-rps: "10"
nginx.ingress.kubernetes.io/limit-connections: "5"
nginx.ingress.kubernetes.io/limit-req-status-code: "429"
nginx.ingress.kubernetes.io/limit-whitelist: "192.168.1.1/32,10.0.0.0/24"
spec:
tls:
- hosts:
- app1.kube.local
secretName: app1-tls
rules:
- host: app1.kube.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
# Supprimer d'abord l'Ingress existant pour app1.kube.local pour éviter les conflits
kubectl delete ingress tls-ingress -n demo-apps
kubectl apply -f rate-limit-ingress.yaml
# Générer plusieurs requêtes rapides
for i in {1..20}; do curl -k https://app1.kube.local & done
limit-rps
: Limite le nombre de requêtes par seconde (10 dans cet exemple)limit-connections
: Limite le nombre de connexions simultanées par adresse IPlimit-req-status-code
: Code HTTP renvoyé lorsque la limite est dépassée (429 - Too Many Requests)limit-whitelist
: Liste d'adresses IP ou de réseaux exemptés des limitationsLe rate limiting est essentiel pour se protéger contre les attaques DoS, les robots malveillants et pour garantir une répartition équitable des ressources entre les utilisateurs.
nano custom-error-pages.yaml
Contenu du fichier custom-error-pages.yaml
:
apiVersion: v1
kind: ConfigMap
metadata:
name: custom-error-pages
namespace: demo-apps
data:
404.html: |
<!DOCTYPE html>
<html>
<head>
<title>Page non trouvée - 404</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
padding-top: 50px;
background-color: #f7f7f7;
}
.container {
width: 80%;
margin: 0 auto;
background-color: white;
padding: 20px;
border-radius: 10px;
box-shadow: 0 0 10px rgba(0,0,0,0.1);
}
h1 {
color: #e74c3c;
}
img {
max-width: 300px;
margin: 20px 0;
}
a {
color: #3498db;
text-decoration: none;
}
</style>
</head>
<body>
<div class="container">
<h1>Oups ! Page non trouvée</h1>
<p>La page que vous recherchez n'existe pas ou a été déplacée.</p>
<p>Retourner à <a href="/">l'accueil</a></p>
</div>
</body>
</html>
nano error-pages-deployment.yaml
Contenu du fichier error-pages-deployment.yaml
:
apiVersion: apps/v1
kind: Deployment
metadata:
name: custom-error-pages
namespace: demo-apps
spec:
replicas: 1
selector:
matchLabels:
app: custom-error-pages
template:
metadata:
labels:
app: custom-error-pages
spec:
containers:
- name: nginx
image: nginx:1.19
ports:
- containerPort: 80
volumeMounts:
- name: error-pages
mountPath: /usr/share/nginx/html
volumes:
- name: error-pages
configMap:
name: custom-error-pages
---
apiVersion: v1
kind: Service
metadata:
name: custom-error-pages
namespace: demo-apps
spec:
selector:
app: custom-error-pages
ports:
- port: 80
targetPort: 80
nano custom-error-ingress.yaml
Contenu du fichier custom-error-ingress.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app1-custom-error
namespace: demo-apps
annotations:
nginx.ingress.kubernetes.io/custom-http-errors: "404,500,503"
nginx.ingress.kubernetes.io/default-backend: custom-error-pages
spec:
tls:
- hosts:
- app1.kube.local
secretName: app1-tls
rules:
- host: app1.kube.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
kubectl apply -f custom-error-pages.yaml
kubectl apply -f error-pages-deployment.yaml
kubectl delete ingress rate-limit-ingress -n demo-apps
kubectl apply -f custom-error-ingress.yaml
curl -k https://app1.kube.local/page-inexistante
custom-http-errors
: Liste des codes d'erreur HTTP pour lesquels afficher une page personnaliséedefault-backend
: Service à utiliser pour servir les pages d'erreur personnaliséesCette configuration intercepte les erreurs spécifiées et redirige vers le service custom-error-pages
qui sert les pages d'erreur personnalisées. Cela améliore l'expérience utilisateur en fournissant des messages d'erreur plus informatifs et en ligne avec le style de votre application.
# Installer apache2-utils si nécessaire (pour la commande htpasswd)
sudo apt-get install apache2-utils -y
# Générer le fichier htpasswd
htpasswd -c auth admin
# Entrez le mot de passe lorsque demandé (par exemple "password123")
kubectl create secret generic basic-auth --from-file=auth -n demo-apps
nano auth-ingress.yaml
Contenu du fichier auth-ingress.yaml
:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app1-auth
namespace: demo-apps
annotations:
nginx.ingress.kubernetes.io/auth-type: basic
nginx.ingress.kubernetes.io/auth-secret: basic-auth
nginx.ingress.kubernetes.io/auth-realm: "Zone sécurisée. Veuillez vous authentifier."
spec:
tls:
- hosts:
- app1.kube.local
secretName: app1-tls
rules:
- host: app1.kube.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app1-service
port:
number: 80
kubectl delete ingress custom-error-ingress -n demo-apps
kubectl apply -f auth-ingress.yaml
# Sans authentification (devrait échouer)
curl -k https://app1.kube.local
# Avec authentification (devrait réussir)
curl -k -u admin:password123 https://app1.kube.local
auth-type
: Type d'authentification (basic dans cet exemple)auth-secret
: Secret Kubernetes contenant les informations d'authentificationauth-realm
: Message affiché dans la boîte de dialogue d'authentificationL'authentification basique est une méthode simple pour protéger les applications contre les accès non autorisés. Elle est particulièrement utile pour les environnements de développement, les applications internes ou les applications qui n'ont pas leur propre système d'authentification.
Remarque importante : En production, l'authentification basique devrait toujours être utilisée avec HTTPS pour éviter que les identifiants soient transmis en clair sur le réseau.
Ces exercices montrent la puissance et la flexibilité des Ingress Controllers dans Kubernetes, en particulier NGINX Ingress Controller. En combinant ces différentes fonctionnalités, vous pouvez créer des configurations d'accès sophistiquées pour vos applications, améliorant à la fois la sécurité et l'expérience utilisateur.
Pour une utilisation en production, il est recommandé d'approfondir chacun de ces sujets et d'explorer d'autres fonctionnalités comme :