Na NGINX, estamos constantemente buscando maneiras de ajudar você a aproveitar ao máximo nosso software. Nossos resumos de soluções e guias de dimensionamento são um recurso importante que fornecemos. Ao testar empiricamente o desempenho que você pode esperar em diferentes níveis de poder de computação, ajudamos você a maximizar o desempenho de entrega de aplicativos com a infraestrutura que você já tem e a determinar despesas operacionais precisas para o desempenho e a escala para os quais você está se preparando.
Atualizamos recentemente o resumo da solução do NGINX Ingress Controller com diretrizes de dimensionamento para o Amazon Elastic Kubernetes Service (EKS). O resumo descreve o desempenho que você pode esperar alcançar com o NGINX Ingress Controller em execução em vários tipos de instância no Amazon EKS, juntamente com o custo total de propriedade (TCO) mensal estimado. Neste blog, explicamos como chegamos a esses números, incluindo todas as informações necessárias para você fazer testes semelhantes.
O diagrama a seguir mostra a topologia usada para o teste.
o wrk
é executado, gerando as solicitações. Veja Metodologia de Testes .wrk
para o aplicativo de backend e retorna as respostas do aplicativo. Consulte Implantando o NGINX Plus Ingress Controller .Antes de implantar o cluster EKS, execute estas etapas na máquina local, que é representada pelo ícone Admin no diagrama:
o eksctl
, a interface de linha de comando oficial do Amazon EKS. Se você já tiver o eksctl
instalado em sua máquina, atualize-o para a versão mais recente.Para implantar o cluster EKS, execute o seguinte comando eksctl
na máquina local. (O sinalizador --nodes
é omitido porque, por padrão, o comando cria os dois nós necessários para o teste: um para o NGINX Plus Ingress Controller e um para o aplicativo de backend base.)
Observação: Você pode implantar o cluster EKS em qualquer região diferente de us-west-1 . A assinatura da imagem do NGINX Plus Ingress Controller no Amazon Marketplace for Containers (consulte a próxima seção ) não é compatível com essa região.
# eksctl create cluster --instance-types=c5n.9xlarge --managed --ssh-access=true --ssh-public-key=/caminho/para/a-chave-publica
Para se conectar a um nó de cluster via SSH, execute este comando. Durante o teste, você precisa se conectar ao nó do NGINX Plus Ingress Controller para executar o comando htop
e verificar se a carga do cliente wrk
é suficiente para levar o uso da CPU no nó a 100%.
# ssh -i /caminho/para/a-chave-privada ec2-user@< endereço-IP-público-do-nó-EKS >
A implantação do NGINX Plus Ingress Controller no Amazon EKS agora está mais fácil do que nunca.
Crie um Provedor de Identidade OIDC (IdP) para seu cluster EKS.
# eksctl utils associar-iam-oidc-provider --region=< eks-cluster-region > --cluster=< eks-cluster-name > --approve
Crie iamserviceaccount
, a função do IAM e a conta de serviço (IRSA) pareadas padrão para EKS, e anexe a política do IAM AWSMarketplaceMeteringRegisterUsage
para monitorar o uso da imagem do NGINX Plus Ingress Controller e autorizar a implantação. Este comando cria automaticamente uma Conta de Serviço com uma anotação vinculada a iamserviceaccount
.
# eksctl create iamserviceaccount --name < nome-da-conta-de-serviço > --namespace nginx-ingress --cluster < nome-do-cluster-eks > --region < região-do-cluster-eks > --attach-policy-arn arn:aws:iam::aws:policy/AWSMarketplaceMeteringRegisterUsage --approve
No arquivo YAML para RBAC, edite o valor do nome
no campo subjects
para corresponder ao service-account-name
que você definiu na etapa anterior. Isso está na linha 104 em rbac.yaml e na linha 23 em ap-rbac.yaml . Edite também o valor do namespace se necessário (linha 105 ou linha 24), mas o comando acima usa o padrão, nginx-ingress
.
Aplique o arquivo YAML (substitua ap-rbac.yaml conforme apropriado).
# kubectl aplicar –f rbac.yaml
Instale o software cliente Docker na máquina local.
Assine a listagem do NGINX Plus Ingress Controller (Premium Edition) no Amazon Marketplace for Containers .
Autentique seu cliente Docker com o Amazon ECR que hospeda a imagem Docker do NGINX Plus Ingress Controller.
Edite os seguintes valores em nginx-ingress.yaml :
kubernetes.io/hostname
no campo nodeSelector
(linha 23) – O rótulo para o nó do NGINX Plus Ingress Controller no cluster EKS, obtido do comando kubectl
get
nodes
--show-labels
serviceAccountName
(linha 24) — O nome do iamserviceaccount
IRSA, especificado como service-account-name
na Etapa 2 .imagem
no campo de contêineres
(linha 26) – O local da imagem do Docker do NGINX Plus Ingress Controller no Amazon ECRAplique o manifesto YAML:
# kubectl aplicar –f nginx-ingress.yaml
Execute as seguintes etapas para implantar o aplicativo de backend:
Em backend-deployment.yaml , edite o valor de kubernetes.io/hostname
no campo nodeSelector
(linha 15), substituindo o rótulo obtido do comando kubectl
get
nodes
--show-labels
.
Aplique o manifesto YAML:
# kubectl apply –f implantação de backend.yaml
Escale o aplicativo de backend até três réplicas, o suficiente para lidar com a carga gerada pelo wrk
:
# kubectl escala implantação web-server-payload --replicas=3
Execute o seguinte comando wrk
no cliente c5n.9xlarge AMI hospedado no Amazon EC2, ajustando os valores conforme necessário para fazer com que o uso da CPU na instância do NGINX Plus Ingress Controller atinja 100% em cada execução de teste:
# wrk -t < número-de-threads > -c < número-de-conexões > -d 180s http[s]://< endereço-do-controlador-de-entrada-NGINX-Plus >
–c
especifica o número de conexões TCP a serem criadas. Defina esta opção conforme necessário para atingir 100% de uso da CPU, até 500 conexões.–d
especifica por quanto tempo gerar tráfego (a duração de cada execução de teste). Defina esta opção para 180 segundos (3 minutos).–t
especifica o número de threads a serem criados. Defina esta opção conforme necessário para atingir 100% de uso da CPU, até 16 threads (um para cada CPU usada no cliente durante a execução do teste).Usamos a versão do wrk
disponível no GitHub em julho de 2021 e recomendamos usar a versão atual ao reproduzir os testes.
Execute testes para coletar duas métricas de desempenho:
Solicitações por segundo (RPS) – O número de solicitações que o NGINX Plus Ingress Controller pode processar por segundo, com média em um período de tempo fixo. Neste caso, use o esquema http:// no comando wrk
.
O NGINX Plus Ingress Controller aceita as solicitações de um arquivo de 1 KB (conteúdo estático) e as balanceia entre os pods do aplicativo de backend. O arquivo tem aproximadamente o tamanho de um pequeno arquivo CSS ou JavaScript, ou de uma imagem muito pequena.
Transações SSL/TLS por segundo (TPS) – O número de novas conexões HTTPS que o NGINX Plus Ingress Controller pode estabelecer e atender por segundo. Neste caso, use o esquema https:// no comando wrk
. Use RSA com um tamanho de chave de 2048 bits e Perfect Forward Secrecy; a cifra SSL é ECDHE-RSA-AES256-GCM-SHA384
.
O cliente envia uma série de solicitações HTTPS, cada uma em uma nova conexão. O cliente e o NGINX Plus Ingress Controller realizam um handshake TLS para estabelecer uma conexão segura. Em seguida, o NGINX Plus Ingress Controller analisa a solicitação e retorna uma resposta de 0 KB . A conexão é fechada após a solicitação ser atendida.
Conforme observado em Criando o cluster do Amazon EKS , para simplificar, você pode executar o NGINX Plus Ingress Controller em uma instância c5n.9xlarge em cada execução de teste. Para controlar quantas CPUs estão disponíveis durante cada execução de teste (de 1 a 36, conforme especificado na tabela em Análise de Desempenho ), defina o parâmetro para a diretiva worker_processes
.
Utilizamos o seguinte software para os testes:
o wrk
gerou o tráfego que o Ingress Controller enviou por proxy. Usamos a versão do wrk
que estava disponível no GitHub em julho de 2021 e recomendamos usar a versão atual ao reproduzir os testes.Conforme mencionado acima, executamos o NGINX Plus Ingress Controller em uma instância c5n.9xlarge em cada execução de teste, usando a diretiva worker_processes
para controlar quantas CPUs foram usadas. Na tabela abaixo, relatamos o tipo de instância na família c5n que suporta cada número de CPUs, juntamente com o TCO mensal para esse tipo de instância.
A tabela relata o número de RPS e SSL TPS alcançados com diferentes números de CPUs disponíveis para o NGINX Plus Ingress Controller, a partir dos testes descritos em Metodologia de Testes .
Observe que os RPS não crescem linearmente com um número maior de CPUs e, de fato, a melhoria percentual tende a diminuir à medida que o número de CPUs aumenta. A taxa de melhoria cai ainda mais acima de 16 núcleos, porque as instâncias c5n.9xlarge são habilitadas com hyperthreading e equipadas com 18 núcleos e 2 threads por núcleo, para até 36 CPUs no total. O hyperthreading melhora apenas marginalmente o número de RPS.
A relação entre SSL TPS e número de CPUs também é menos que linear, mas não cai tão drasticamente até que escalemos além de 16 CPUs. O hyperthreading melhora o desempenho de operações paralelizáveis limitadas à CPU, como handshakes TLS. Por isso, o desempenho do SSL TPS aumenta mesmo quando escalamos mais de 18 CPUs.
Tipo de instância AWS | CPUs | RPS | SSL TPS (RSA) | TCO mensal médio |
---|---|---|---|---|
c5n.grande | 1 | 45,000 | 6,700 | $ 100 |
c5n.grande | 2 | 80,000 | 12,600 | $ 100 |
c5n.xgrande | 4 | 135,000 | 23,000 | $ 200 |
c5n.2xgrande | 8 | 175,000 | 40,000 | $ 400 |
c5n.4xgrande | 16 | 237,000 | 68,500 | $ 795 |
c5n.9xgrande | 32 | 290,000 | 88,800 | $ 1790 |
c5n.9xgrande | 36 | 300,000 | 92,800 | $ 1790 |
Fornecemos detalhes de implantação que você pode usar para determinar o desempenho esperado do NGINX Plus Ingress Controller em execução no Amazon EKS. Você pode usá-lo para testar outras famílias de instâncias EKS e provisionar uma solução acessível que atenda aos seus requisitos de desempenho e dimensionamento para cargas de trabalho de produção no Kubernetes.
Nossos resultados para HTTP RPS mostram que a porcentagem de melhoria no desempenho diminui à medida que dobramos o número de CPUs, convergindo para aproximadamente 300.000 RPS. Os resultados para SSL TPS mostram que o desempenho aumenta quase linearmente à medida que dobramos o número de CPUs, mesmo quando iniciamos o hyperthreading (usando dois threads por núcleo), porque os handshakes TLS são limitados pela CPU.
Confira o resumo da solução e teste você mesmo o desempenho do NGINX Plus Ingress Controller – comece hoje mesmo!
Para testar o NGINX Ingress Controller com o NGINX Open Source, você pode obter o código-fonte ou baixar um contêiner pré-criado do DockerHub .
"Esta postagem do blog pode fazer referência a produtos que não estão mais disponíveis e/ou não têm mais suporte. Para obter as informações mais atualizadas sobre os produtos e soluções F5 NGINX disponíveis, explore nossa família de produtos NGINX . O NGINX agora faz parte do F5. Todos os links anteriores do NGINX.com redirecionarão para conteúdo semelhante do NGINX no F5.com."