Provisione nós dedicados, configure o dimensionamento automático e ajuste os parâmetros do NGINX para suportar picos de tráfego.
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.
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-ingresscomo taint e rótulo, com Effect definido comoNoSchedule.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.
-
Em NodeSelector, adicione o rótulo do node pool dedicado.
Não exclua os rótulos NodeSelector existentes.
Em Tolerations, adicione o taint do node pool dedicado e defina Effect como NoSchedule.
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.
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 dopreStopcomo 1,5 a 2 vezes o seu tempo máximo de resposta. Certifique-se de que o comandosleepesteja 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 . Visualize o painel de logs para verificar dados de acesso de clientes. Também é possível acessar 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 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 campohostaos seus recursos Ingress. Recursos semhostnão têm métricas coletadas por padrão. Para ignorar o monitoramento por host, adicione--metrics-per-host=falseaos argumentos docontrollerno 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.
Faça login no nó que executa o pod do NGINX Ingress controller.
-
Crie o arquivo
nginx-log-rotate.shem/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)" doneNó 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 -
Torne o script
nginx-log-rotate.shexecutável.chmod 755 /root/nginx-log-rotate.sh -
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.
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" -
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 |
|
Tempo máximo que uma conexão |
|
|
Número máximo de requisições |
|
|
upstream |
|
Número máximo de conexões |
|
|
Limite de requisições |
|
|
|
Tempo máximo que uma conexão |
|
|
|
Timeout de ociosidade para conexões |
|
|
Conexões máximas por worker |
|
Quantidade máxima de conexões que um único worker pode gerenciar. |
|
Configurações de timeout Ajuste conforme o seu caso de uso. |
|
Timeout para estabelecer uma conexão TCP. |
|
|
Timeout para leitura de dados. |
|
|
|
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. |
|
Tentativas após falha. Padrão: 3 (uma tentativa inicial + duas novas tentativas). |
|
|
Condições para nova tentativa. Defina como |
|
|
|
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.