Todos os produtos
Search
Central de documentação

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

Última atualização: Jun 27, 2026

Provisione nós dedicados, configure o dimensionamento automático e ajuste os parâmetros do NGINX para suportar picos de tráfego.

Importante
  • Como o projeto open-source Ingress NGINX não será mais mantido após março de 2026, o Container Service for Kubernetes descontinuará a manutenção do componente NGINX Ingress controller. Esteja ciente dos riscos associados. Consulte Anúncio do produto: Descontinuação da manutenção do componente NGINX Ingress controller.

  • As configurações a seguir servem apenas como referência. Escolha parâmetros e especificações com base na carga real do seu NGINX Ingress controller.

Garanta recursos suficientes para os componentes

Implante em um node pool dedicado

Um node pool dedicado isola o NGINX Ingress controller de outras cargas de trabalho e evita contenção de recursos.

Importante

Definir resources.limits para pods do NGINX Ingress controller pode causar erros OOM devido a restrições de memória ou provocar interrupções de serviço e instabilidade por limitação de CPU. Não configure limites de recursos. Se for indispensável, defina a CPU para pelo menos 1 núcleo e a memória para pelo menos 2 GiB.

Crie um node pool dedicado

Crie um node pool dedicado para os pods do NGINX Ingress controller. Observe os seguintes pontos:

  • Selecione um tipo de instância: O desempenho de rede do pod é limitado pelo tipo de instância do nó host. Por exemplo, se o PPS de um nó for 300.000, o PPS máximo por pod também será 300.000. Escolha uma instância otimizada para rede com 32 ou mais núcleos de CPU.

  • Número de nós: O NGINX Ingress controller implanta dois pods com anti-afinidade por padrão; portanto, o node pool requer pelo menos dois nós.

  • Configure taints e rótulos: Adicione taints e rótulos para impedir que outros pods sejam agendados nesses nós. Por exemplo, adicione system-addon: nginx-ingress como taint e rótulo, com Effect definido como NoSchedule.

  • Selecione o tamanho do pod: Devido à sobrecarga básica do NGINX, um único pod de alta especificação (por exemplo, 32 núcleos) tem desempenho superior a vários pods de baixa especificação (por exemplo, dois pods de 16 núcleos) com o mesmo total de recursos. Prefira menos pods de alta especificação, mantendo a alta disponibilidade.

Configure o componente

Acesse o ACK console. Na página Add-ons, localize o cartão do NGINX Ingress controller e clique em Configuration.

  1. Em NodeSelector, adicione o rótulo do node pool dedicado.

    Não exclua os rótulos NodeSelector existentes.
  2. Em Tolerations, adicione o taint do node pool dedicado e defina Effect como NoSchedule.

  3. Clique em Confirm e verifique se os pods foram agendados no node pool dedicado.

Ajuste a especificação da instância CLB

A especificação da instância CLB determina o número máximo de conexões e o QPS do NGINX Ingress controller. Utilize uma instância de alta especificação.

Edite o Service para especificar a especificação da instância CLB com a anotação 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:
  ...
Apenas instâncias CLB pagas por especificação criadas antes de 2026 suportam esta operação. Consulte Especificações de desempenho .
Apenas instâncias CLB pagas por especificação criadas antes de junho de 2025 suportam esta operação. Consulte Especificações de desempenho .

Use HPA para dimensionamento automático

Se os pods do node pool dedicado não conseguirem absorver picos de tráfego, configure o HPA para dimensionar automaticamente o NGINX Ingress controller.

Importante

A redução de pods pode interromper algumas conexões ativas. Configure sua política de scale-in com cautela.

Salve o conteúdo abaixo como nginx-hpa.yaml e aplique com 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

Garanta desligamento gracioso para cargas de trabalho de backend

Durante atualizações contínuas, o NGINX Ingress controller mantém conexões em andamento com pods em fase de encerramento. Se um pod for finalizado imediatamente, essas requisições falharão.

Um hook preStop mantém o pod em execução após o sinal SIGTERM e permite que as requisições em andamento sejam concluídas:

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
 ...
Defina o tempo de espera do preStop como 1,5 a 2 vezes o seu tempo máximo de resposta. Certifique-se de que o comando sleep esteja disponível na imagem do contêiner.

Monitore o status do componente com métricas e logs

Logs do SLS

  • No ACK console, acesse a aba NGINX Ingress Overview na página Network > Ingresses. Visualize o painel de logs para verificar dados de acesso de clientes. Também é possível acessar Operations > Log Center > Application Logs > Logstore e selecione nginx-ingress para visualizar entradas de log específicas.

  • Caso o painel de logs exiba pontos de dados null ou se os logs nginx-ingress no Logstore estiverem vazios, o registro de logs não foi ativado durante a criação do cluster. Consulte Coletar e analisar logs de acesso do NGINX Ingress.

Monitoramento com Prometheus

Acesse o ACK console e acesse Operations > Prometheus Monitoring para visualizar o painel de monitoramento.

  • Se algum componente não estiver instalado, siga as instruções na tela para instalá-lo e verifique o painel.

  • Selecione a aba Ingresses. No menu suspenso Controller Class, escolha k8s.io/ingress-nginx para visualizar as métricas do NGINX Ingress. Se k8s.io/ingress-nginx não estiver listado, o NGINX Ingress controller não está instalado.

Adicione um campo host aos seus recursos Ingress. Recursos sem host não têm métricas coletadas por padrão. Para ignorar o monitoramento por host, adicione --metrics-per-host=false aos argumentos do controller no Deployment do NGINX Ingress.

Otimize a configuração do NGINX

Configure rotação automática de logs

Os pods do NGINX Ingress controller registram logs tanto em /dev/stdout quanto em /var/log/nginx/. À medida que os arquivos de log crescem, a gravação de novas entradas consome mais recursos. A rotação automática mitiga esse problema ao arquivar e limpar logs periodicamente.

  1. Faça login no nó que executa o pod do NGINX Ingress controller.

  2. Crie o arquivo nginx-log-rotate.sh em /root.

    Nó 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ó 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. Torne o script nginx-log-rotate.sh executável.

    chmod 755 /root/nginx-log-rotate.sh
  4. Adicione o seguinte conteúdo ao arquivo /etc/crontab:

    Esta configuração rotaciona os logs a cada 15 minutos. Ajuste o cronograma conforme necessário.
    */15 * * * *  root /root/nginx-log-rotate.sh

Desative a coleta de métricas

A coleta de métricas vem ativada por padrão e consome CPU. Desative-a caso não precise dessas informações.

Edite o Deployment do controller (kubectl edit deploy nginx-ingress-controller -n kube-system). Adicione --enable-metrics=false aos argumentos do contêiner para desativar as métricas.

v1.9.3 ou anterior

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

Versões posteriores à v1.9.3

Versões do NGINX Ingress controller posteriores à v1.9.3 permitem desativar métricas específicas. Por exemplo, adicione --exclude-socket-metrics para parar de coletar métricas relacionadas a sockets. Consulte cli-arguments.

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

Ative a compressão Brotli

O algoritmo Brotli geralmente oferece uma compressão 15%–30% melhor que o gzip para recursos web baseados em texto.

A melhoria real depende do seu cenário.

Edite o ConfigMap do NGINX Ingress (kubectl edit cm -n kube-system nginx-configuration) para ativar a compressão 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: Define se o Brotli deve ser ativado. Valores válidos: true, false.

  • brotli-level: Nível de compressão. Valores válidos: 1–11. Padrão: 4. Valores mais altos consomem mais CPU.

  • brotli-types: Tipos MIME a serem comprimidos com Brotli.

Ajuste a política de timeout

Reduzir os tempos limite de FIN_WAIT2 e TIME_WAIT permite que o NGINX Ingress controller recicle conexões finalizadas mais rapidamente e libere recursos.

Importante

Os parâmetros FIN_WAIT2 e TIME_WAIT afetam diretamente a reciclagem de conexões do NGINX Ingress controller. Configurações inadequadas podem causar exaustão do pool de conexões, esgotamento de portas ou congestionamento sob alta concorrência. Certifique-se de compreender os princípios de conexão TCP antes de fazer ajustes. Após a modificação, monitore continuamente o status das conexões e o uso de recursos.

Edite o Deployment do NGINX Ingress controller (kubectl edit deploy nginx-ingress-controller -n kube-system).

Adicione o seguinte em initContainers:

  • net.ipv4.tcp_fin_timeout: Timeout para FIN_WAIT2. Padrão: 60 segundos.

  • net.netfilter.nf_conntrack_tcp_timeout_time_wait: Timeout para TIME_WAIT. Padrão: 60 segundos.

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            

Otimize o desempenho HTTPS

Ajuste os seguintes parâmetros no ConfigMap nginx-configuration.

kubectl edit cm -n kube-system nginx-configuration
  • Cache e timeout de sessão SSL

    Definir o tamanho do cache de sessão SSL e o timeout reduz a sobrecarga de handshake.

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

    Configuração correspondente no nginx.conf

    É possível ajustar essa configuração no arquivo nginx.conf do NGINX de acordo com o seu cenário.

    ssl_session_cache shared:SSL:10m; # 1 MB can store about 4,000 sessions.
    ssl_session_timeout 10m;
  • Ative o OCSP stapling para reduzir o tempo de verificação de certificados.

    data:
      enable-ocsp: "true"
  • Ative o TLS 1.3 0-RTT para permitir que os clientes enviem dados antes da conclusão do handshake e reduzam a latência de estabelecimento de conexão.

    data:
      ssl-early-data: "true"
      ssl-protocols: "TLSv1.3"
  • Ajuste a prioridade de cifras (não requer ajuste manual)

    A prioridade do conjunto de cifras afeta a latência. O padrão do NGINX Ingress controller já vem otimizado.

    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.

Configure outras opções relacionadas a desempenho

As seguintes opções do ConfigMap nginx-configuration também afetam o desempenho. Execute kubectl edit cm -n kube-system nginx-configuration para editar.

Categoria

Parâmetro

Descrição

downstream keepalive

keep-alive: "60s"

Tempo máximo que uma conexão keepalive downstream permanece aberta.

keep-alive-requests: "10000"

Número máximo de requisições keepalive downstream.

upstream keepalive

upstream-keepalive-connections: "1000"

Número máximo de conexões keepalive upstream.

upstream-keepalive-requests: "2147483647"

Limite de requisições keepalive upstream.

upstream-keepalive-time: "1h"

Tempo máximo que uma conexão keepalive upstream permanece aberta.

upstream-keepalive-timeout: "150s"

Timeout de ociosidade para conexões keepalive upstream.

Conexões máximas por worker

max-worker-connections: "65536"

Quantidade máxima de conexões que um único worker pode gerenciar.

Configurações de timeout

Ajuste conforme o seu caso de uso.

proxy-connect-timeout: "3s"

Timeout para estabelecer uma conexão TCP.

proxy-read-timeout: "5s"

Timeout para leitura de dados.

proxy-send-timeout: "5s"

Timeout para envio de dados.

Mecanismo de nova tentativa

Novas tentativas excessivas podem aumentar a carga no backend e causar falhas em cascata quando os serviços estão instáveis. Consulte a documentação oficial do Ingress-nginx.

proxy-next-upstream-tries: "3"

Tentativas após falha. Padrão: 3 (uma tentativa inicial + duas novas tentativas).

proxy-next-upstream: "off"

Condições para nova tentativa. Defina como off para desativar as tentativas.

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

Timeout para novas tentativas de requisição. Ajuste conforme o seu cenário.

Referências

O plugin CNI afeta o desempenho da rede do cluster e impacta o NGINX Ingress controller. Recomendamos utilizar o plugin de rede Terway.