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.
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.
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-ingressen tant que taint et label, avec l'effet défini surNoSchedule.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.
-
Dans NodeSelector, ajoutez le label du pool de nœuds dédié.
Ne supprimez pas les labels NodeSelector existants.
Dans Tolerations, ajoutez le taint du pool de nœuds dédié et définissez Effect sur NoSchedule.
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.
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'attentepreStopà 1,5–2 fois votre temps de réponse maximal. Assurez-vous que la commandesleepest 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 . 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 à 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 à 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 champhostà vos ressources Ingress. Par défaut, les ressources sanshostne font pas l'objet d'une collecte de métriques. Pour ignorer la surveillance par hôte, ajoutez--metrics-per-host=falseaux arguments ducontrollerdans 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.
Connectez-vous au nœud exécutant le pod NGINX Ingress controller.
-
Créez le script
nginx-log-rotate.shdans 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)" doneNœ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 -
Rendez le script
nginx-log-rotate.shexécutable.chmod 755 /root/nginx-log-rotate.sh -
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.
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" -
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 |
|
|
|
Durée maximale pendant laquelle une connexion |
|
|
Nombre maximal de requêtes |
|
|
|
|
Nombre maximal de connexions |
|
|
Nombre maximal de requêtes |
|
|
|
Durée maximale pendant laquelle une connexion |
|
|
|
Délai d'inactivité pour les connexions |
|
|
Connexions maximales par worker |
|
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. |
|
Délai d'attente pour l'établissement d'une connexion TCP. |
|
|
Délai d'attente pour la lecture des données. |
|
|
|
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. |
|
Nouvelles tentatives après échec. Par défaut : 3 (une tentative initiale + deux nouvelles tentatives). |
|
|
Conditions de nouvelle tentative. Définissez sur |
|
|
|
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.