Ingress, Egress, LoadBalancers et TLS
Introduction
Ce document décrit l'architecture réseau des clusters Kubernetes managés par SdV, les différentes méthodes d'exposition des services (HTTP/HTTPS via Ingress, TCP/UDP via LoadBalancer), ainsi que les bonnes pratiques associées.
Architecture réseau simplifiée

- Les VIP (Virtual IP) sont des adresses IP publiques ou privées configurées sur l'infrastructure réseau SdV
- Le trafic HTTP/HTTPS passe par l'Ingress Controller (HAProxy)
- Le trafic TCP/UDP custom nécessite des Services de type LoadBalancer avec MetalLB
- Deux types d'accès : public (Internet) et privé (VPN)
Routage http et https
L'accès réseau depuis Internet à destination des Pods se fait par le biais de VIP (Virtual IP) configurées sur les loadbalancers de l'infrastructure SdV. Ces derniers dirigent ensuite le trafic vers l'Ingress Controller Kubernetes (HAProxy).
Ingress Controller : HAProxy
Les clusters SdV utilisent HAProxy Ingress Controller comme contrôleur d'Ingress. C'est un composant critique qui :
- Réceptionne le trafic HTTP/HTTPS depuis les VIP
- Route les requêtes vers les
ServicesKubernetes appropriés selon les règles d'Ingress - Prend en charge la terminaison TLS/SSL
- Offre des fonctionnalités avancées (rate limiting, redirections, authentification, etc.)
VIP : Adresses IP publiques et privées
Chaque cluster dispose de deux VIP avec leurs alias DNS dynamiques pour les tests :
| Type d'Ingress | ingressClassName | VIP | Alias DNS wildcard (tests uniquement) | Accessibilité |
|---|---|---|---|---|
| Public | public | Fournie à la livraison | *.public.{XXXX}.sdv.fr | Internet complet |
| Privé | private | Fournie à la livraison | *.internal.{XXXX}.sdv.fr | VPN uniquement |
Configurations avancées
Exemples
Lors de la configuration de vos Ingress vous devez préciser si vous comptez utiliser la VIP privée ou la VIP publique. Cela se fait avec le champ ingressClassName dans l'objet Ingress.
Ingress Public et Backend http
Vous trouverez ci-dessous un exemple de configuration d’un Service associé à un Ingress public :
apiVersion: v1
kind: Service
metadata:
name: mon-application
namespace: production
labels:
app: mon-application
tier: frontend
spec:
type: ClusterIP
selector:
app: mon-application
ports:
- name: http
port: 80
targetPort: 8080 # Port sur lequel l'application écoute dans le Pod
protocol: TCP# Vérifier le Service
kubectl get svc mon-application -n production
# Vérifier l'Ingress et son adresse IP
kubectl get ingress mon-application-public -n production
# Tester l'accès (remplacer par votre domaine)
curl -I http://www.votre-domaine.comExemple 2 : Ingress Public avec Backend HTTPS
Lorsque votre application backend communique en HTTPS (certificat applicatif), configurez l'annotation secure-backends :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mon-application-secure-backend
namespace: production
annotations:
# Active la communication HTTPS entre l'Ingress et le backend
ingress.kubernetes.io/secure-backends: "true"
# Optionnel : désactiver la vérification du certificat backend (non recommandé en prod)
# ingress.kubernetes.io/secure-verify-ca-secret: "false"
spec:
ingressClassName: public
rules:
- host: secure-backend.votre-domaine.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mon-application
port:
number: 443 # Le service écoute en HTTPSExemple 3 : Ingress Public avec TLS/HTTPS (Let's Encrypt)
Configuration d'un Ingress avec terminaison TLS au niveau de l'Ingress Controller :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mon-application-tls
namespace: production
annotations:
# Force HTTPS (redirection 301)
ingress.kubernetes.io/ssl-redirect: "true"
# Cert-Manager générera automatiquement le certificat (si le cluster issuer est configuré)
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: public
tls:
- hosts:
- api.votre-domaine.com
secretName: api-votre-domaine-tls # Cert-Manager créera ce Secret automatiquement
rules:
- host: api.votre-domaine.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mon-application
port:
number: 80 # Backend en HTTP, TLS terminé au niveau IngressExemple 4 : Ingress Privé (VPN)
Pour exposer un service uniquement sur le réseau privé (VPN) :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mon-application-private
namespace: production
annotations:
ingress.kubernetes.io/whitelist-source-range: "10.0.0.0/8,172.16.0.0/12" # Restriction IP
spec:
ingressClassName: private # Exposition sur la VIP privée uniquement
rules:
- host: internal-api.internal.{XXXX}.sdv.fr
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: mon-application-backend
port:
number: 8080Gestion des Certificats TLS
Cette section détaille la configuration et la gestion des certificats TLS/SSL pour sécuriser vos services exposés via Ingress.
Pourquoi utiliser TLS ?
- Chiffrement des données en transit entre le client et le serveur
- Authentification du serveur (vérification de l'identité)
- Confiance des utilisateurs (pas d'avertissement de sécurité dans le navigateur)
- Conformité réglementaire (RGPD, PCI-DSS, etc.)
- SEO : Google favorise les sites en HTTPS
Méthodes de gestion des certificats
Méthode 1 : Certificats manuels
Créer un Secret TLS à partir de vos certificats existants :
# Créer un Secret TLS à partir d'un certificat et d'une clé privée
kubectl create secret tls mon-certificat \
--cert=chemin/vers/cert.crt \
--key=chemin/vers/cert.key \
-n productionMéthode 2 : Cert-Manager (recommandé)
Cert-Manager automatise la génération, le renouvellement et la gestion des certificats TLS via Let's Encrypt ou d'autres autorités de certification.
Types de challenges ACME :Let's Encrypt utilise le protocole ACME pour valider que vous contrôlez le nom de domaine avant d'émettre un certificat. Deux méthodes principales :
| Challenge | Description | Cas d'usage | Prérequis |
|---|---|---|---|
| HTTP-01 | Validation via fichier HTTP accessible sur http://domaine/.well-known/acme-challenge/ | Domaines individuels avec Ingress accessible publiquement | Port 80 accessible, Ingress fonctionnel |
| DNS-01 | Validation via enregistrement TXT DNS | Certificats wildcard (*.domaine.com), domaines non exposés publiquement | Accès API du provider DNS (Cloudflare, Route53, etc.) |
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# URL du serveur Let's Encrypt (production)
server: https://acme-v02.api.letsencrypt.org/directory
email: admin@votre-domaine.com
privateKeySecretRef:
name: letsencrypt-prod-account-key
solvers:
# Challenge HTTP-01 via Ingress
- http01:
ingress:
class: publicIngress :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mon-app-auto-tls
namespace: production
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
ingressClassName: public
tls:
- hosts:
- www.votre-domaine.com
- api.votre-domaine.com
secretName: votre-domaine-tls # Cert-Manager créera automatiquement ce Secret
rules:
- host: www.votre-domaine.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
- host: api.votre-domaine.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-api
port:
number: 8080Méthode 3 : ACME via l'Ingress Controller HAProxy
SdV active par défaut la prise en charge du protocole ACME v2 directement au niveau de l'Ingress Controller HAProxy. La prise en charge est limitée à l'Ingress public car la validation du certificat n'est possible que en mode http01 qui nécessite une adresse IP publique.
La configuration déployée permet de faire cohabiter ACME dans l'Ingress Controller et Cert-Manager. Le choix se fait dans les annotations de l'object Ingress (voir dans les exemples fournis).
L'utilisation de acme dans l'ingress est très simple, voici un exemple :
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: mon-app-acme-tls
annotations:
ingress.kubernetes.io/cert-signer: acme
spec:
ingressClassName: public
tls:
- hosts:
- www.votre-domaine.com
- api.votre-domaine.com
secretName: votre-domaine-tls # HAProxy créera automatiquement ce Secret
rules:
- host: www.votre-domaine.com
http:
paths:
- path: /
pathType: ImplementationSpecific
backend:
service:
name: frontend
port:
number: 80
- host: api.votre-domaine.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: backend-api
port:
number: 8080Vérification des certificats
# Vérifier l'état du certificat géré par Cert-Manager
kubectl get certificate -n production
kubectl describe certificate votre-domaine-tls -n production
# Vérifier le Secret TLS créé
kubectl get secret votre-domaine-tls -n production
# Tester le certificat via OpenSSL
openssl s_client -connect www.votre-domaine.com:443 -servername www.votre-domaine.com
# Vérifier l'expiration du certificat
echo | openssl s_client -connect www.votre-domaine.com:443 -servername www.votre-domaine.com 2>/dev/null | openssl x509 -noout -datesRenouvellement automatique
Cert-Manager renouvelle automatiquement les certificats 30 jours avant leur expiration. Vous pouvez forcer un renouvellement :
# Forcer le renouvellement d'un certificat
kubectl delete certificaterequest -n production -l cert-manager.io/certificate-name=votre-domaine-tls
# Ou supprimer le Secret pour forcer une régénération
kubectl delete secret votre-domaine-tls -n productionBonnes pratiques TLS
Routage TCP/UDP
Les contrôleurs Ingress HAProxy sont limités aux protocoles HTTP et HTTPS sur les ports 80 et 443.
Pour exposer des services utilisant d'autres protocoles TCP ou UDP (bases de données, services RPC, protocoles custom), il est nécessaire d'utiliser des Services de type LoadBalancer avec MetalLB.
MetalLB : LoadBalancer pour Kubernetes
MetalLB est un load-balancer réseau pour Kubernetes qui permet d'allouer des adresses IP externes aux Services de type LoadBalancer dans des environnements bare-metal ou sur des infrastructures qui ne fournissent pas nativement ce service.
- Vous créez un Service de type
LoadBalancer - MetalLB alloue une adresse IP depuis le pool configuré par SdV
- MetalLB annonce cette adresse IP sur le réseau via BGP
- Le trafic vers cette adresse IP est routé directement vers les
Nodeskubernetes qui font suivre vers lesPodsduService
Cas d'usage des Services LoadBalancer
Exemples d'applications nécessitant TCP/UDP :
- Bases de données : PostgreSQL (5432), MySQL (3306), MongoDB (27017), Redis (6379)
- Messagerie : RabbitMQ (5672, 15672), Kafka (9092), MQTT (1883)
- Protocoles personnalisés : Applications legacy, protocoles métiers
- Transfert de fichiers : FTP (20, 21), SFTP (22)
- RPC : gRPC sur TCP (sans HTTP/2), Thrift
- Gaming : Serveurs de jeux (ports UDP variables)
- VoIP et Streaming : SIP, RTP, RTSP
- DNS custom : Serveurs DNS internes (53/UDP et TCP)
Configuration des Services LoadBalancer
Suite à l'activation de MetalLB par SdV, vous recevrez un pool d'adresses IP dédié à votre cluster.
Exemple 1 : Base de données PostgreSQL (TCP)
apiVersion: v1
kind: Service
metadata:
name: postgres-external
namespace: production
labels:
app: postgres
spec:
type: LoadBalancer
# Adresse IP fournie par SdV dans le pool MetalLB
loadBalancerIP: "203.0.113.10"
selector:
app: postgres
tier: database
ports:
- name: postgres
protocol: TCP
port: 5432
targetPort: 5432# Vérifier l'allocation de l'IP externe
kubectl get svc postgres-external -n production
# Attendez que EXTERNAL-IP affiche l'IP configurée
# Tester la connexion depuis l'extérieur
psql -h 203.0.113.10 -U username -d databaseExemple 2 : Serveur de jeu (UDP)
apiVersion: v1
kind: Service
metadata:
name: gameserver-udp
namespace: gaming
spec:
type: LoadBalancer
loadBalancerIP: "203.0.113.20"
selector:
app: gameserver
ports:
- name: game-udp
protocol: UDP
port: 7777
targetPort: 7777
- name: game-query
protocol: UDP
port: 27015
targetPort: 27015Exemple 3 : Partage d'IP entre plusieurs services
Vous pouvez partager une même IP externe entre plusieurs Services si :
- Vous utilisez la même clé
metallb.io/allow-shared-ip - Les Services déclarent des ports différents (pas de conflit TCP/UDP sur le même port)
- Les Services déclarent la même IP dans
loadBalancerIP
# Service 1 : PostgreSQL sur 5432/TCP
apiVersion: v1
kind: Service
metadata:
name: postgres
namespace: production
annotations:
metallb.io/allow-shared-ip: "shared-db-ip"
spec:
type: LoadBalancer
loadBalancerIP: "203.0.113.30"
selector:
app: postgres
ports:
- port: 5432
protocol: TCPExternalTrafficPolicy : conservation de l'IP source
Le champ externalTrafficPolicy contrôle comment le trafic externe est routé vers les Pods :
| Valeur | Comportement | Cas d'usage |
|---|---|---|
| Cluster (défaut) | Le trafic peut être routé vers n'importe quel nœud, puis SNAT vers le Pod | Load-balancing global, pas besoin de l'IP source |
| Local | Le trafic est routé uniquement vers les Pods sur le nœud qui reçoit la requête | Logs avec IP source réelle, audit, sécurité |
apiVersion: v1
kind: Service
metadata:
name: api-external
namespace: production
spec:
type: LoadBalancer
loadBalancerIP: "203.0.113.40"
externalTrafficPolicy: Local # L'IP source du client est préservée
selector:
app: api-gateway
ports:
- port: 8080
protocol: TCPSécurisation des Services LoadBalancer
Exemple de Service sécurisé :apiVersion: v1
kind: Service
metadata:
name: postgres-secure
namespace: production
spec:
type: LoadBalancer
loadBalancerIP: "10.0.1.50" # IP privée
externalTrafficPolicy: Local
# Restriction par IP source
loadBalancerSourceRanges:
- "10.0.0.0/8" # Réseau interne
- "172.16.0.0/12" # Réseau VPN
selector:
app: postgres
ports:
- port: 5432
protocol: TCPEgress réseau (sortie du cluster)
Passerelle de sortie commune
Tous les clusters Kubernetes installés dans le réseau d’un client partagent la même passerelle de sortie (egress gateway) pour accéder à Internet ou à des ressources externes. Cela signifie que, quelle que soit la source (Pod, Node, Namespace), le trafic sortant du cluster passera par cette passerelle unique, ce qui facilite la gestion des flux, la traçabilité et l’application de politiques de sécurité côté client.
Trouver l’IP de la passerelle de sortie
Pour identifier l’IP de la passerelle utilisée par votre cluster, vous pouvez lancer un Pod temporaire et observer la route par défaut :
# Lancer un pod temporaire
kubectl run -it --rm debug \
--image=curlimages/curl \
--restart=Never \
-- curl -s 'https://api.ipify.org?format=json'La sortie affichera une ligne du type :
{
"ip": "213.225.160.2"
}NetworkPolicies
Les NetworkPolicies Kubernetes permettent de contrôler les flux réseau au niveau des Pods, agissant comme un firewall applicatif distribué.
Concepts de base
Par défaut, Kubernetes autorise toutes les communications entre Pods. Les NetworkPolicies permettent de :
- Restreindre les flux entrants (Ingress) et sortants (Egress)
- Implémenter une micro-segmentation réseau
- Renforcer la sécurité en limitant la surface d'attaque
- Respecter le principe du moindre privilège réseau
Comportement par défaut
- Si aucune
NetworkPolicyne sélectionne un Pod, tout le trafic est autorisé - Dès qu'une
NetworkPolicysélectionne un Pod, seul le trafic explicitement autorisé est permis (deny-by-default) - Les règles sont additives : si plusieurs NetworkPolicies sélectionnent le même Pod, l'union des règles s'applique
Exemple 1 : Isolation complète d'un namespace
Bloquer tout le trafic entrant et sortant pour tous les Pods d'un namespace :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: production
spec:
podSelector: {} # Sélectionne tous les Pods du namespace
policyTypes:
- Ingress
- Egress
# Pas de règles ingress/egress = tout est bloquéExemple 2 : Autoriser uniquement le trafic depuis l'Ingress
Autoriser un frontend à recevoir du trafic uniquement depuis l'Ingress Controller :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-from-ingress
namespace: production
spec:
podSelector:
matchLabels:
app: frontend
policyTypes:
- Ingress
ingress:
- from:
# Autoriser le trafic depuis les Pods de l'Ingress Controller
- namespaceSelector:
matchLabels:
name: ingress-controller
podSelector:
matchLabels:
app: haproxy-ingress
ports:
- protocol: TCP
port: 8080Exemple 3 : Communication inter-namespaces contrôlée
Autoriser un backend à communiquer avec une base de données dans un autre namespace :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: postgres-allow-backend
namespace: databases
spec:
podSelector:
matchLabels:
app: postgres
policyTypes:
- Ingress
ingress:
- from:
# Autoriser uniquement depuis le namespace "production"
- namespaceSelector:
matchLabels:
name: production
podSelector:
matchLabels:
app: backend-api
ports:
- protocol: TCP
port: 5432Exemple 4 : Règles Egress (trafic sortant)
Autoriser un Pod à communiquer uniquement avec des services spécifiques :
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: backend-egress
namespace: production
spec:
podSelector:
matchLabels:
app: backend-api
policyTypes:
- Egress
egress:
# Autoriser DNS (nécessaire pour la résolution de noms)
- to:
- namespaceSelector:
matchLabels:
name: kube-system
podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
# Autoriser PostgreSQL
- to:
- namespaceSelector:
matchLabels:
name: databases
podSelector:
matchLabels:
app: postgres
ports:
- protocol: TCP
port: 5432
# Autoriser accès HTTPS externe (API tierces)
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
ports:
- protocol: TCP
port: 443Bonnes pratiques NetworkPolicies
Validation et troubleshooting
# Lister les NetworkPolicies d'un namespace
kubectl get networkpolicy -n production
# Afficher les détails d'une NetworkPolicy
kubectl describe networkpolicy allow-from-ingress -n production
# Tester la connectivité depuis un Pod
kubectl exec -it mon-pod -n production -- curl http://service-cible:8080
# Tester la résolution DNS
kubectl exec -it mon-pod -n production -- nslookup kubernetes.default
# Vérifier les règles appliquées sur un nœud (si Calico)
kubectl exec -n kube-system calico-node-xxxxx -- iptables-save | grep productionTroubleshooting réseau
Cette section détaille les commandes et méthodes pour diagnostiquer les problèmes réseau courants.
Problèmes d'Ingress
Symptôme : Site inaccessible via nom de domaine
# 1. Vérifier la résolution DNS
dig www.votre-domaine.com
nslookup www.votre-domaine.com
# 2. Vérifier l'Ingress
kubectl get ingress -n production
kubectl describe ingress mon-ingress -n production
# 3. Vérifier le Service
kubectl get svc mon-application -n production
# 4. Vérifier les Pods backend
kubectl get pods -n production -l app=mon-application
# 5. Vérifier les logs de l'Ingress Controller
kubectl logs -n ingress-controller -l app=haproxy-ingress --tail=100
# 6. Tester depuis un Pod dans le cluster
kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- \
curl -v -H "Host: www.votre-domaine.com" http://mon-application.production.svc.cluster.localSymptôme : Erreur 502 Bad Gateway
# Vérifier que les `Pods` backend sont en Running et Ready
kubectl get pods -n production -l app=mon-application -o wide
# Vérifier les logs applicatifs
kubectl logs -n production mon-application-xxxxx --tail=50
# Vérifier que le port targetPort correspond bien au port d'écoute de l'application
kubectl get svc mon-application -n production -o yaml | grep -A 5 ports
# Tester la connectivité directe au Pod
kubectl exec -it debug-pod -n production -- curl http://<POD_IP>:8080Symptôme : Certificat TLS invalide ou auto-signé
# Vérifier le Secret TLS
kubectl get secret mon-certificat-tls -n production
# Vérifier le contenu du certificat
kubectl get secret mon-certificat-tls -n production -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
# Vérifier l'état du Certificate (si Cert-Manager)
kubectl get certificate -n production
kubectl describe certificate mon-certificat -n production
# Vérifier les logs de Cert-Manager
kubectl logs -n cert-manager -l app=cert-manager --tail=100
# Forcer un renouvellement
kubectl delete certificaterequest -n production -l cert-manager.io/certificate-name=mon-certificatProblèmes de Service LoadBalancer
Symptôme : EXTERNAL-IP reste en <Pending>
# Vérifier les événements du Service
kubectl describe svc mon-service-lb -n production
# Contacter les équipes SdV si le pool IP n'est pas configuréSymptôme : Impossible de se connecter à l'IP externe
# Vérifier que le Service a bien une EXTERNAL-IP
kubectl get svc mon-service-lb -n production
# Vérifier les endpoints du Service
kubectl get endpoints mon-service-lb -n production
# Vérifier que les `Pods` backend sont en Running
kubectl get pods -n production -l app=mon-app
# Tester la connectivité réseau depuis l'extérieur
telnet <EXTERNAL_IP> <PORT>
nc -zv <EXTERNAL_IP> <PORT>
# Vérifier les règles firewall et loadBalancerSourceRanges
kubectl get svc mon-service-lb -n production -o yaml | grep -A 10 loadBalancerSourceRangesProblèmes de NetworkPolicy
Symptôme : Communication bloquée entre Pods
# Lister les NetworkPolicies appliquées au Pod source
kubectl get networkpolicy -n production
# Vérifier les sélecteurs de la NetworkPolicy
kubectl describe networkpolicy ma-policy -n production
# Vérifier les labels du Pod
kubectl get pod mon-pod -n production --show-labels
# Tester la connectivité avec netcat/curl depuis le Pod
kubectl exec -it mon-pod -n production -- curl -v http://service-cible:8080
# Désactiver temporairement une NetworkPolicy pour tester
kubectl delete networkpolicy ma-policy -n production
# (N'oubliez pas de la recréer ensuite !)Problèmes DNS
Symptôme : Échec de résolution de noms
# Vérifier le Service kube-dns
kubectl get svc -n kube-system kube-dns
# Vérifier les `Pods` CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns
# Tester la résolution DNS depuis un Pod
kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup kubernetes.default
# Vérifier la configuration CoreDNS
kubectl get configmap coredns -n kube-system -o yaml
# Logs de CoreDNS
kubectl logs -n kube-system -l k8s-app=kube-dns --tail=50Outils de diagnostic réseau
# Déployer un `Pod` de debug avec outils réseau
kubectl run netshoot --rm -it --image=nicolaka/netshoot -- /bin/bash
# Une fois dans le Pod, vous avez accès à :
# - curl, wget, http
# - ping, traceroute, mtr
# - nslookup, dig, host
# - netcat (nc)
# - tcpdump
# - iperf3
# Exemple : analyser le trafic réseau
tcpdump -i any -n port 8080
# Exemple : tester la bande passante
iperf3 -s # Sur le serveur
iperf3 -c <SERVER_IP> # Sur le clientCommandes utiles
# Afficher tous les Services avec leurs EXTERNAL-IP
kubectl get svc --all-namespaces -o wide
# Afficher tous les Ingress avec leurs hôtes
kubectl get ingress --all-namespaces
# Afficher les Endpoints pour vérifier la connectivité Service→Pods
kubectl get endpoints -n production
# Suivre les événements en temps réel
kubectl get events -n production --watch
# Vérifier les quotas réseau (si configurés)
kubectl describe resourcequota -n production
# Afficher la configuration réseau d'un Pod
kubectl get pod mon-pod -n production -o jsonpath='{.status.podIP}'
kubectl get pod mon-pod -n production -o jsonpath='{.spec.containers[0].ports}'Limites et considérations de performance
Limites d'Ingress HAProxy
| Ressource | Limite recommandée | Notes |
|---|---|---|
| Règles par Ingress | < 100 hosts/paths | Au-delà, privilégier plusieurs Ingress |
| Certificats TLS | < 50 par Ingress | Utiliser des certificats wildcard |
| Connexions simultanées | Selon infrastructure SdV | Contactez SdV pour dimensionnement |
| Timeout par défaut | 50s (configurable) | Ajustable via annotations |
| Taille max body (upload) | Configurable | Annotation proxy-body-size |
Optimisation de performance
Ressources et références
Documentation officielle
Documentation des composants SdV
- HAProxy Ingress - Documentation complète
- HAProxy Ingress - Annotations
- MetalLB - Documentation officielle
- Cert-Manager - Documentation
Outils et utilitaires
- Testing SSL/TLS : SSL Labs
- Testing DNS : DNS Checker
- Debugging réseau : netshoot Docker image