Tous les produits
Search
Centre de documentation

Container Service for Kubernetes:Configure NGINX Ingress controller for high loads

Dernière mise à jour :Aug 11, 2026

Provisionnez des nœuds dédiés, configurez la mise à l'échelle automatique et ajustez les paramètres NGINX afin de soutenir le trafic de pointe.

Important
  • Le projet open source Ingress NGINX n'étant plus maintenu après mars 2026, Container Service for Kubernetes arrêtera la maintenance du composant NGINX Ingress controller. Prenez conscience des risques associés. Consultez la page Annonce de produit : Arrêt de la maintenance du composant NGINX Ingress controller.

  • Les configurations ci-dessous sont fournies à titre indicatif. Choisissez les paramètres et les spécifications en fonction de la charge réelle de votre NGINX Ingress controller.

Garantir des ressources suffisantes pour le composant

Déployer sur un pool de nœuds dédié

Un pool de nœuds dédié isole le NGINX Ingress controller des autres charges de travail, évitant ainsi toute contention de ressources.

Important

La définition de limites de ressources via resources.limits pour les pods NGINX Ingress controller peut déclencher des erreurs d'insuffisance de mémoire (OOM) ou provoquer des interruptions de service et une instabilité dues à la limitation du CPU. Ne configurez pas de limites de ressources. Si cela s'avère indispensable, définissez au minimum 1 cœur CPU et 2 GiB de mémoire.

Créer un pool de nœuds dédié

Créez un pool de nœuds dédié pour les pods du NGINX Ingress controller. Tenez compte des points suivants :

  • Sélectionnez un type d'instance : Les performances réseau des pods sont limitées par le type d'instance du nœud hôte. Par exemple, si le débit PPS (paquets par seconde) d'un nœud est de 300 000, le débit maximal par pod sera également de 300 000. Optez pour une instance optimisée pour le réseau disposant d'au moins 32 cœurs CPU.

  • Nombre de nœuds : Le NGINX Ingress controller déploie par défaut deux pods avec une anti-affinité ; le pool de nœuds doit donc comporter au moins deux nœuds.

  • Configurez les taints et les labels : Ajoutez des taints et des labels pour empêcher la planification d'autres pods sur ces nœuds. Par exemple, ajoutez system-addon: nginx-ingress en tant que taint et label, avec l'effet défini sur NoSchedule.

  • Sélectionnez la taille des pods : En raison de la surcharge de base de NGINX, un pod aux spécifications élevées (par exemple, 32 cœurs) offre de meilleures performances que plusieurs pods aux spécifications inférieures (par exemple, deux pods de 16 cœurs) pour un total de ressources équivalent. Privilégiez un nombre réduit de pods puissants tout en maintenant la haute disponibilité.

Configurer le composant

Connectez-vous à la console ACK. Sur la page Add-ons, localisez la carte NGINX Ingress controller et cliquez sur Configuration.

  1. Dans NodeSelector, ajoutez le label du pool de nœuds dédié.

    Ne supprimez pas les labels NodeSelector existants.
  2. Dans Tolerations, ajoutez le taint du pool de nœuds dédié et définissez Effect sur NoSchedule.

  3. Cliquez sur Confirm, puis vérifiez que les pods sont planifiés sur le pool de nœuds dédié.

Ajuster la spécification de l'instance CLB

La spécification de l'instance CLB détermine le nombre maximal de connexions et le QPS pour le NGINX Ingress controller. Utilisez une instance de haute spécification.

Modifiez le Service pour spécifier la spécification de l'instance CLB à l'aide de l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec :

kubectl edit service -n kube-system nginx-ingress-lb
apiVersion: v1
kind: Service
metadata:
  annotations:
    ...
    service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s3.large" # Specify the CLB instance specification
  name: nginx-ingress-lb
  namespace: kube-system
  ...
spec:
  ...
Seules les instances CLB facturées selon la spécification et créées avant juin 2025 prennent en charge cette opération. Consultez la page Spécifications de performance .

Utiliser HPA pour la mise à l'échelle automatique

Si les pods du pool de nœuds dédié ne peuvent pas absorber les pics de trafic, configurez HPA pour assurer la mise à l'échelle automatique du NGINX Ingress controller.

Important

La réduction du nombre de pods (scale-in) peut interrompre certaines connexions actives. Configurez votre politique de scale-in avec précaution.

Enregistrez le contenu suivant dans le fichier nginx-hpa.yaml et appliquez-le avec la commande kubectl apply -f nginx-hpa.yaml :

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-ingress-controller-hpa
  namespace: kube-system
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx-ingress-controller
  minReplicas: 2
  maxReplicas: 5
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50

Garantir un arrêt gracieux des charges de travail backend

Lors des mises à jour progressives, le NGINX Ingress controller maintient les connexions en cours vers les pods en cours de terminaison. Si un pod s'arrête immédiatement, ces requêtes échouent.

Un hook preStop permet de maintenir le pod actif après la réception du signal SIGTERM, laissant ainsi le temps aux requêtes en cours de se terminer :

apiVersion: apps/v1
kind: Deployment
spec:
  template:
    spec:
      containers:
      - name: app
        lifecycle:
          # Configure a preStop hook to wait for 30 seconds before exiting.
          # The sleep command must exist in the container.
          preStop:
            exec:
              command:
              - sleep
              - 30
 ...
Définissez le délai d'attente preStop à 1,5–2 fois votre temps de réponse maximal. Assurez-vous que la commande sleep est disponible dans l'image du conteneur.

Surveiller l'état du composant via les métriques et les journaux

Journaux SLS

  • Dans la console ACK, accédez à l'onglet NGINX Ingress Overview situé sur la page Network > Ingresses. Vous pouvez y consulter le tableau de bord des journaux pour vérifier les données d'accès client. Vous pouvez également accéder à Operations > Log Center > Application Logs > Logstore et sélectionner nginx-ingress pour afficher les entrées de journal spécifiques.

  • Si le tableau de bord des journaux affiche des points de données null, ou si les journaux nginx-ingress dans Logstore sont vides, la journalisation n'a pas été activée lors de la création du cluster. Consultez la page Collecter et analyser les journaux d'accès NGINX Ingress.

Surveillance Prometheus

Connectez-vous à la console ACK, puis accédez à Operations > Prometheus Monitoring pour consulter le tableau de bord de surveillance.

  • Si un composant n'est pas installé, suivez les instructions pour l'installer et consultez le tableau de bord.

  • Sélectionnez l'onglet Ingresses. Dans la liste déroulante Controller Class, sélectionnez k8s.io/ingress-nginx pour afficher les métriques NGINX Ingress. Si k8s.io/ingress-nginx n'apparaît pas dans la liste, le NGINX Ingress controller n'est pas installé.

Ajoutez un champ host à vos ressources Ingress. Par défaut, les ressources sans host ne font pas l'objet d'une collecte de métriques. Pour ignorer la surveillance par hôte, ajoutez --metrics-per-host=false aux arguments du controller dans le déploiement NGINX Ingress.

Optimiser la configuration NGINX

Configurer la rotation automatique des journaux

Les pods du NGINX Ingress controller écrivent les journaux à la fois dans /dev/stdout et /var/log/nginx/ . À mesure que les fichiers journaux grossissent, l'écriture de nouvelles entrées consomme davantage de ressources. La rotation automatique atténue ce problème en archivant et en vidant périodiquement les journaux.

  1. Connectez-vous au nœud exécutant le pod NGINX Ingress controller.

  2. Créez le script nginx-log-rotate.sh dans le répertoire /root.

    Nœud Containerd

    #!/bin/bash
    # The maximum number of log files to keep. Adjust as needed.
    keep_log_num=5
    
    # Get the IDs of all running ingress-nginx containers.
    ingress_nginx_container_ids=$(crictl ps | grep nginx-ingress-controller | grep -v pause | awk '{print $1}')
    if [[ -z "$ingress_nginx_container_ids" ]]; then
     echo "error: failed to get ingress nginx container ids"
     exit 1
    fi
    
    # Sleep for a random interval between 5 and 10 seconds.
    sleep $(( RANDOM % (10 - 5 + 1 ) + 5 ))
    for id in $ingress_nginx_container_ids; do
     crictl exec $id bash -c "cd /var/log/nginx; if [[ \$(ls access.log-* | wc -l) -gt $keep_log_num ]]; then rm -f \$(ls -t access.log-* | tail -1); fi ; mv access.log access.log-\$(date +%F:%T) ; kill -USR1 \$(cat /tmp/nginx/nginx.pid)"
    done

    Nœud Docker

    #!/bin/bash
    # The maximum number of log files to keep. Adjust as needed.
    keep_log_num=5
    
    # Get the IDs of all running ingress-nginx containers.
    ingress_nginx_container_ids=$(docker ps | grep nginx-ingress-controller | grep -v pause | awk '{print $1}')
    if [[ -z "$ingress_nginx_container_ids" ]]; then
     echo "error: failed to get ingress nginx container ids"
     exit 1
    fi
    
    # Sleep for a random interval between 5 and 10 seconds.
    sleep $(( RANDOM % (10 - 5 + 1 ) + 5 ))
    for id in $ingress_nginx_container_ids; do
     docker exec $id bash -c "cd /var/log/nginx; if [[ \$(ls access.log-* | wc -l) -gt $keep_log_num ]]; then rm -f \$(ls -t access.log-* | tail -1); fi ; mv access.log access.log-\$(date +%F:%T) ; kill -USR1 \$(cat /tmp/nginx/nginx.pid)"
    done
  3. Rendez le script nginx-log-rotate.sh exécutable.

    chmod 755 /root/nginx-log-rotate.sh
  4. Ajoutez la ligne suivante au fichier /etc/crontab :

    Cette configuration effectue une rotation des journaux toutes les 15 minutes. Ajustez la planification selon vos besoins.
    */15 * * * *  root /root/nginx-log-rotate.sh

Désactiver la collecte de métriques

La collecte de métriques est activée par défaut et consomme du CPU. Désactivez-la si vous n'en avez pas besoin.

Modifiez le déploiement du contrôleur (kubectl edit deploy nginx-ingress-controller -n kube-system). Ajoutez --enable-metrics=false aux arguments du conteneur pour désactiver les métriques.

v1.9.3 ou antérieur

spec:
  containers:
  - args:
    - ...
    - --enable-metrics=false

Versions ultérieures à v1.9.3

Les versions du NGINX Ingress controller postérieures à v1.9.3 permettent de désactiver des métriques spécifiques. Par exemple, ajoutez --exclude-socket-metrics pour arrêter la collecte des métriques liées aux sockets. Consultez la documentation cli-arguments.

spec:
  containers:
  - args:
    - ...
    - --enable-metrics=true
    - --exclude-socket-metrics # Effective only when --enable-metrics=true

Activer la compression Brotli

L'algorithme Brotli offre généralement une compression supérieure de 15 % à 30 % par rapport à gzip pour les ressources web textuelles.

L'amélioration réelle dépend de votre scénario.

Modifiez la ConfigMap NGINX Ingress (kubectl edit cm -n kube-system nginx-configuration) pour activer la compression Brotli.

data:
  enable-brotli: "true"
  brotli-level: "6"
  brotli-types: "text/xml image/svg+xml application/x-font-ttf image/vnd.microsoft.icon application/x-font-opentype application/json font/eot application/vnd.ms-fontobject application/javascript font/otf application/xml application/xhtml+xml text/javascript application/x-javascript text/plain application/x-font-truetype application/xml+rss image/x-icon font/opentype text/css image/x-win-bitmap"
  • enable-brotli : Indique s'il faut activer Brotli. Valeurs valides : true, false.

  • brotli-level : Niveau de compression. Valeurs valides : 1–11. Par défaut : 4. Des valeurs plus élevées consomment davantage de CPU.

  • brotli-types : Types MIME à compresser avec Brotli.

Ajuster la politique de délai d'attente

La réduction des délais d'attente FIN_WAIT2 et TIME_WAIT permet au NGINX Ingress controller de recycler plus rapidement les connexions terminées, libérant ainsi des ressources.

Important

Les paramètres FIN_WAIT2 et TIME_WAIT affectent directement le recyclage des connexions du NGINX Ingress controller. Des réglages inappropriés peuvent entraîner l'épuisement du pool de connexions, l'épuisement des ports ou une congestion en cas de forte concurrence. Assurez-vous de bien comprendre les principes des connexions TCP avant d'effectuer des ajustements. Après modification, surveillez en continu l'état des connexions et l'utilisation des ressources.

Modifiez le déploiement du NGINX Ingress controller (kubectl edit deploy nginx-ingress-controller -n kube-system).

Ajoutez les éléments suivants à initContainers :

  • net.ipv4.tcp_fin_timeout : Délai d'attente FIN_WAIT2. Par défaut : 60 secondes.

  • net.netfilter.nf_conntrack_tcp_timeout_time_wait : Délai d'attente TIME_WAIT. Par défaut : 60 secondes.

dnsPolicy: ...
initContainers:
- command:  
  - /bin/sh
  - -c
  - |
    if [ "$POD_IP" != "$HOST_IP" ]; then
    mount -o remount rw /proc/sys
    sysctl -w net.core.somaxconn=65535
    sysctl -w net.ipv4.ip_local_port_range="1024 65535"
    sysctl -w kernel.core_uses_pid=0
    sysctl -w net.ipv4.tcp_fin_timeout=15 # Set the timeout for the FIN_WAIT2 state to 15 seconds
    sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30 # Set the timeout for the TIME_WAIT state to 30 seconds
    fi
  env:                                                           
    ...                                                     
  image: ...
  imagePullPolicy: IfNotPresent                           
  name: init-sysctl            

Optimiser les performances HTTPS

Ajustez les paramètres suivants dans la ConfigMap nginx-configuration .

kubectl edit cm -n kube-system nginx-configuration
  • Cache de session SSL et délai d'attente

    La définition de la taille du cache de session SSL et du délai d'attente réduit la surcharge liée aux handshakes.

    data:
      ssl-session-cache-size: "10m"
      ssl-session-timeout: "10m"

    Configuration nginx.conf correspondante

    Vous pouvez ajuster cette configuration dans le fichier NGINX nginx.conf en fonction de votre scénario.

    ssl_session_cache shared:SSL:10m; # 1 MB can store about 4,000 sessions.
    ssl_session_timeout 10m;
  • Activez l'agrafage OCSP pour réduire le temps de vérification des certificats.

    data:
      enable-ocsp: "true"
  • Activez TLS 1.3 0-RTT pour permettre aux clients d'envoyer des données avant la fin du handshake, réduisant ainsi la latence d'établissement de la connexion.

    data:
      ssl-early-data: "true"
      ssl-protocols: "TLSv1.3"
  • Ajuster la priorité des chiffrements (aucun réglage manuel requis)

    La priorité de la suite de chiffrements affecte la latence. La valeur par défaut du NGINX Ingress controller est déjà optimisée.

    ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384';
    ssl_prefer_server_ciphers on;    # Prioritize the server's cipher configuration.

Configurer d'autres options liées aux performances

Les options suivantes de la ConfigMap nginx-configuration influent également sur les performances. Exécutez kubectl edit cm -n kube-system nginx-configuration pour les modifier.

Catégorie

Paramètre

Description

keepalive descendant

keep-alive: "60s"

Durée maximale pendant laquelle une connexion keepalive descendante reste ouverte.

keep-alive-requests: "10000"

Nombre maximal de requêtes keepalive descendantes.

keepalive amont

upstream-keepalive-connections: "1000"

Nombre maximal de connexions keepalive amont.

upstream-keepalive-requests: "2147483647"

Nombre maximal de requêtes keepalive amont.

upstream-keepalive-time: "1h"

Durée maximale pendant laquelle une connexion keepalive amont reste ouverte.

upstream-keepalive-timeout: "150s"

Délai d'inactivité pour les connexions keepalive amont.

Connexions maximales par worker

max-worker-connections: "65536"

Nombre maximal de connexions qu'un seul worker peut gérer.

Paramètres de délai d'attente

Ajustez en fonction de votre cas d'utilisation.

proxy-connect-timeout: "3s"

Délai d'attente pour l'établissement d'une connexion TCP.

proxy-read-timeout: "5s"

Délai d'attente pour la lecture des données.

proxy-send-timeout: "5s"

Délai d'attente pour l'envoi des données.

Mécanisme de nouvelle tentative

Des tentatives excessives peuvent augmenter la charge du backend et provoquer des défaillances en cascade lorsque les services sont instables. Consultez la documentation officielle Ingress-nginx.

proxy-next-upstream-tries: "3"

Nouvelles tentatives après échec. Par défaut : 3 (une tentative initiale + deux nouvelles tentatives).

proxy-next-upstream: "off"

Conditions de nouvelle tentative. Définissez sur off pour désactiver les nouvelles tentatives.

proxy-next-upstream-timeout: "5s"

Délai d'attente pour les nouvelles tentatives de requête. Ajustez en fonction de votre scénario.

Références

Le plugin CNI affecte les performances réseau du cluster, ce qui a un impact sur le NGINX Ingress controller. Nous recommandons d'utiliser le plugin réseau Terway.