Are you an LLM? Read llms.txt for a summary of the docs, or llms-full.txt for the full context.
Skip to content

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

Diagramme Réseau Simplifié

Points clés :
  • 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 Services Kubernetes 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'IngressingressClassNameVIPAlias DNS wildcard (tests uniquement)Accessibilité
PublicpublicFournie à la livraison*.public.{XXXX}.sdv.frInternet complet
PrivéprivateFournie à la livraison*.internal.{XXXX}.sdv.frVPN 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 :

service.yaml
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
Validation :
Terminal
# 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.com

Exemple 2 : Ingress Public avec Backend HTTPS

Lorsque votre application backend communique en HTTPS (certificat applicatif), configurez l'annotation secure-backends :

ingress-public-secure-backends.yaml
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 HTTPS

Exemple 3 : Ingress Public avec TLS/HTTPS (Let's Encrypt)

Configuration d'un Ingress avec terminaison TLS au niveau de l'Ingress Controller :

ingress-public-tls.yaml
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 Ingress

Exemple 4 : Ingress Privé (VPN)

Pour exposer un service uniquement sur le réseau privé (VPN) :

ingress-private.yaml
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: 8080

Gestion 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 :

Terminal
# 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 production

Mé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 :

ChallengeDescriptionCas d'usagePrérequis
HTTP-01Validation via fichier HTTP accessible sur http://domaine/.well-known/acme-challenge/Domaines individuels avec Ingress accessible publiquementPort 80 accessible, Ingress fonctionnel
DNS-01Validation via enregistrement TXT DNSCertificats wildcard (*.domaine.com), domaines non exposés publiquementAccès API du provider DNS (Cloudflare, Route53, etc.)
Exemple simplifié de ClusterIssuer Let's Encrypt (HTTP-01) :
cluster-issuer-prod.yaml
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: public
Utilisation avec un Ingress :
ingress-with-cluster-issuer.yaml
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: 8080

Mé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 :

ingress-with-cert-signer.yaml
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: 8080

Vérification des certificats

Terminal
# 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 -dates

Renouvellement automatique

Cert-Manager renouvelle automatiquement les certificats 30 jours avant leur expiration. Vous pouvez forcer un renouvellement :

Terminal
# 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 production

Bonnes 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.

Fonctionnement :
  1. Vous créez un Service de type LoadBalancer
  2. MetalLB alloue une adresse IP depuis le pool configuré par SdV
  3. MetalLB annonce cette adresse IP sur le réseau via BGP
  4. Le trafic vers cette adresse IP est routé directement vers les Nodes kubernetes qui font suivre vers les Pods du Service

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)

service-tcp.yaml
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
Validation :
Terminal
# 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 database

Exemple 2 : Serveur de jeu (UDP)

service-udp.yaml
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: 27015

Exemple 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-loadbalancer-pg.yaml
# 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: TCP

ExternalTrafficPolicy : conservation de l'IP source

Le champ externalTrafficPolicy contrôle comment le trafic externe est routé vers les Pods :

ValeurComportementCas d'usage
Cluster (défaut)Le trafic peut être routé vers n'importe quel nœud, puis SNAT vers le PodLoad-balancing global, pas besoin de l'IP source
LocalLe trafic est routé uniquement vers les Pods sur le nœud qui reçoit la requêteLogs avec IP source réelle, audit, sécurité
Exemple avec conservation de l'IP source :
service.yaml
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: TCP

Sécurisation des Services LoadBalancer

Exemple de Service sécurisé :
service-lb.yaml
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: TCP

Egress 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 :

Terminal
# 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 NetworkPolicy ne sélectionne un Pod, tout le trafic est autorisé
  • Dès qu'une NetworkPolicy sé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 :

networkpolicy.yaml
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 :

networkpolicy-from-ingress.yaml
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: 8080

Exemple 3 : Communication inter-namespaces contrôlée

Autoriser un backend à communiquer avec une base de données dans un autre namespace :

networkpolicy-ns-controlled.yaml
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: 5432

Exemple 4 : Règles Egress (trafic sortant)

Autoriser un Pod à communiquer uniquement avec des services spécifiques :

networkpolicy-egress.yaml
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: 443

Bonnes pratiques NetworkPolicies

Validation et troubleshooting

Terminal
# 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 production

Troubleshooting 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

Terminal
# 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.local

Symptôme : Erreur 502 Bad Gateway

Terminal
# 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>:8080

Symptôme : Certificat TLS invalide ou auto-signé

Terminal
# 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-certificat

Problè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 loadBalancerSourceRanges

Problèmes de NetworkPolicy

Symptôme : Communication bloquée entre Pods

Terminal
# 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=50

Outils 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 client

Commandes 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

RessourceLimite recommandéeNotes
Règles par Ingress< 100 hosts/pathsAu-delà, privilégier plusieurs Ingress
Certificats TLS< 50 par IngressUtiliser des certificats wildcard
Connexions simultanéesSelon infrastructure SdVContactez SdV pour dimensionnement
Timeout par défaut50s (configurable)Ajustable via annotations
Taille max body (upload)ConfigurableAnnotation proxy-body-size

Optimisation de performance

Ressources et références

Documentation officielle

Documentation des composants SdV

Outils et utilitaires