NGINX始终致力于帮助您充分发挥我们软件的价值。我们提供的解决方案简介和容量规划指南是一项重要资源。通过实测不同计算能力下可达到的性能,我们帮助您利用现有基础设施充分提升应用交付性能,并准确确定为实现预期性能和规模所需的运营支出。
我们最近更新了NGINX Ingress Controller解决方案简介,新增了Amazon Elastic Kubernetes Service (EKS)的规模估算指南。该简介概述了NGINX Ingress Controller在Amazon EKS中各种实例类型上运行时可实现的性能,以及预计的每月总体拥有成本(TCO)。本文将说明这些数据的计算方式,并提供自行开展类似测试所需的全部信息。
拓扑
下图显示了测试所用的拓扑。

- 管理员是通过运行以下各节中指定的命令来执行测试的用户。
- Amazon ECR(弹性容器注册表)托管测试中使用的官方NGINX Plus Ingress Controller Docker镜像。请参阅《部署NGINX Plus Ingress Controller》。
- Amazon EC2(弹性计算云)托管运行
wrk并生成请求的c5n.9xlarge映像。请参阅《测试方法》。 - Amazon EKS(Elastic Kubernetes Service)托管用于NGINX Plus Ingress Controller和后端应用程序的c5n.9xlarge映像。请参阅“创建Amazon EKS集群”。
- NGINX Plus Ingress Controller将
wrk生成的请求代理到后端应用,并返回应用的响应。请参阅《部署NGINX Plus Ingress Controller》。 - 后端应用响应由NGINX代理的请求。请参阅“部署后端Pod”。
创建Amazon EKS集群
部署EKS集群之前,请在本地计算机上执行以下步骤。该计算机在图中以“Admin”图标表示:
- 下载
eksctl,即Amazon EKS的官方命令行界面。如果本地计算机上已安装eksctl,请务必将其更新到最新版本。 - 将相应的AWS管理员凭据添加到“${HOME}/.aws/credentials”文件中。
- 从我们的Gist存储库下载本博客所需的YAML文件。
- 从GitHub上的rbac.yaml(如果使用NGINX App Protect,则下载ap-rbac.yaml)NGINX Ingress Controller代码库下载。
要部署EKS集群,请在本地计算机上运行以下eksctl命令。(此处省略--nodes标志,因为该命令默认会创建测试所需的两个节点:一个用于NGINX Plus Ingress Controller,另一个用于基础后端应用。)
注意:可以在除us-west-1之外的任何区域部署EKS集群。该区域不支持订阅Amazon Marketplace for Containers中的NGINX Plus Ingress Controller镜像(请参阅下一节)。
# eksctl create cluster --instance-types=c5n.9xlarge --managed --ssh-access=true --ssh-public-key=/path/to/public-key要通过SSH连接到集群节点,请运行此命令。测试期间,需要连接到NGINX Plus Ingress Controller节点并运行htop命令,确认wrk客户端产生的负载足以使该节点的CPU使用率达到100%。
# ssh -i /path/to/private-key ec2-user@<public-IP-address-of-EKS-node>部署NGINX Plus Ingress Controller
现在,在Amazon EKS上部署NGINX Plus Ingress Controller比以往更加轻松。
- 为EKS集群创建OIDC身份提供商(IdP)。
# eksctl utils associate-iam-oidc-provider --region=<eks-cluster-region> --cluster=<eks-cluster-name> --approve- 创建“
iamserviceaccount”,即EKS的标准配对IAM角色和服务账户(IRSA),并附加AWSMarketplaceMeteringRegisterUsageIAM策略,以监控NGINX Plus Ingress Controller镜像的使用情况并授权部署。此命令会自动创建一个带有注解的服务账户,该注解链接到“iamserviceaccount”。
# eksctl create iamserviceaccount --name <service-account-name> --namespace nginx-ingress --cluster <eks-cluster-name> --region <eks-cluster-region> --attach-policy-arn arn:aws:iam::aws:policy/AWSMarketplaceMeteringRegisterUsage --approve- 在RBAC的YAML文件中,编辑
name在subjects字段中的值,使其与上一步设置的service-account-name一致。该值位于rbac.yaml的第104行和ap-rbac.yaml的第23行。如有必要,还需编辑namespace的值(第105行或第24行),但上述命令使用默认值nginx-ingress。 - 应用YAML文件(根据需要替换为ap-rbac.yaml)。
# kubectl apply –f rbac.yaml- 在本地计算机上安装Docker客户端软件。
- 订阅NGINX Plus Ingress Controller (Premium Edition)在Amazon Marketplace for Containers中的产品。
- 向托管NGINX Plus Ingress Controller Docker镜像的Amazon ECR验证Docker客户端身份。
- 编辑nginx-ingress.yaml中的以下值:
kubernetes.io/hostname,位于nodeSelector字段(第23行),表示EKS集群中NGINX Plus Ingress Controller节点的标签,可通过kubectlgetnodes--show-labels命令获取serviceAccountName(第24行):iamserviceaccountIRSA的名称,在service-account-name中指定为第2步。image,位于containers字段(第26行),即NGINX Plus Ingress Controller Docker镜像在Amazon ECR中的位置
- 应用YAML清单:
# kubectl apply –f nginx-ingress.yaml部署后端Pod
按照以下步骤部署后端应用程序:
- 在backend-deployment.yaml中,编辑
kubernetes.io/hostname在nodeSelector字段中的值(第 15 行),将其替换为通过kubectlgetnodes--show-labels命令获取的标签。 - 应用YAML清单:
# kubectl apply –f backend-deployment.yaml- 将后端应用扩展到3个副本,足以处理由
wrk生成的负载:
# kubectl scale deployment web-server-payload --replicas=3测试方法
在Amazon EC2中托管的客户端c5n.9xlarge AMI上运行以下wrk命令,并根据需要调整参数值,使NGINX Plus Ingress Controller实例的CPU使用率在每次测试运行中达到100%:
# wrk -t <number-of-threads> -c <number-of-connections> -d 180s http[s]://<address-of-NGINX-Plus-Ingress-Controller>- The
–c选项用于指定要创建的TCP连接数。根据需要设置此选项,使CPU使用率达到100%,连接数最多为500。 - The
–d选项用于指定生成流量的时长(即每次测试运行的持续时间)。请将此选项设置为180秒(3分钟)。 - The
–t选项用于指定要创建的线程数。根据需要设置此选项,以使CPU使用率达到100%,最多可设置为16个线程(测试运行期间,客户端上使用的每个CPU对应一个线程)。
我们使用的是2021年7月GitHub上提供的wrk版本,建议在复现测试时使用当前版本。
运行测试以收集两项性能指标:
- 每秒请求数(RPS):NGINX Plus Ingress Controller每秒可处理的请求数,取固定时间段内的平均值。在本例中,请在http://方案中使用
wrk命令。NGINX Plus Ingress Controller接收对1 KB文件(静态内容)的请求,并将这些请求负载均衡到后端应用Pod。该文件的大小与小型CSS或JavaScript文件或极小图像大致相当。 - 每秒SSL/TLS事务数(TPS):NGINX Plus Ingress Controller每秒可建立并处理的新HTTPS连接数。在这种情况下,请在https://方案的
wrk命令中进行测试。使用密钥长度为2048位的RSA和完全正向保密;SSL密码套件为ECDHE-RSA-AES256-GCM-SHA384。客户端发送一系列HTTPS请求,每个请求均使用新连接。客户端与NGINX Plus Ingress Controller执行TLS握手以建立安全连接,随后NGINX Plus Ingress Controller解析请求并返回0 KB响应。请求处理完成后,连接关闭。
如创建Amazon EKS集群中所述,为简化操作,可以在每次测试运行时,在c5n.9xlarge实例上运行NGINX Plus Ingress Controller。要控制每次测试运行期间可用的CPU数量(根据性能分析中的表格,为1至36个),请设置worker_processes指令的参数。
所用软件
我们使用了以下软件进行测试:
- 运行
wrk的客户端计算机生成了由Ingress Controller代理的流量。测试使用的是2021年7月GitHub上提供的wrk版本;建议在复现测试时使用当前版本。 - NGINX Plus Ingress Controller 1.11.0版
- 所有三台计算机均运行Amazon Linux 2 LTS,并使用OpenSSL 1.0.2k–fips
性能分析
如上所述,每次测试运行时,我们都在c5n.9xlarge实例上运行NGINX Plus Ingress Controller,并使用worker_processes指令控制所使用的CPU数量。下表列出了c5n系列中支持相应CPU数量的实例类型,以及该实例类型的每月总拥有成本。
该表列出了在为NGINX Plus Ingress Controller分配不同数量的CPU时所达到的RPS和SSL TPS,数据来自“测试方法”中所述的测试。
请注意,RPS不会随CPU数量增加而线性增长。事实上,随着CPU数量增加,性能提升百分比往往会下降。超过16个核心后,提升幅度会进一步降低,因为c5n.9xlarge实例启用了超线程,配备18个核心,每个核心有2个线程,最多共计36个CPU。超线程对RPS的提升非常有限。
SSL TPS与CPU数量之间的关系也并非线性,但在扩展到超过16个CPU之前,性能增幅的下降并不明显。超线程确实可以提升TLS握手等受CPU限制且可并行操作的性能。因此,即使扩展到超过18个CPU,SSL TPS性能仍会提升。
| AWS实例类型 | CPU | RPS | SSL TPS(RSA) | 平均每月TCO |
|---|---|---|---|---|
| c5n.large | 1 | 45,000 | 6,700 | $100 |
| c5n.large | 2 | 80,000 | 12,600 | $100 |
| c5n.xlarge | 4 | 135,000 | 23,000 | $200 |
| c5n.2xlarge | 8 | 175,000 | 40,000 | $400 |
| c5n.4xlarge | 16 | 237,000 | 68,500 | $795 |
| c5n.9xlarge | 32 | 290,000 | 88,800 | $1790 |
| c5n.9xlarge | 36 | 300,000 | 92,800 | $1790 |
结论
我们提供了相关部署详情,可用于确定在Amazon EKS中运行的NGINX Plus Ingress Controller的预期性能。您可以据此测试其他系列的EKS实例,并以合理的成本配置满足Kubernetes生产工作负载性能和扩展要求的解决方案。
HTTP RPS测试结果表明,随着CPU数量翻倍,性能提升的百分比逐渐下降,并趋近于约300,000 RPS。SSL TPS测试结果表明,随着CPU数量翻倍,性能几乎呈线性增长。即使开始启用超线程(每个核心使用两个线程),这一趋势依然保持,因为TLS握手受CPU性能限制。
查看解决方案简介,亲自测试NGINX Plus Ingress Controller的性能,立即开始使用!
要试用搭配NGINX Open Source的NGINX Ingress Controller,可以获取源代码,也可以从DockerHub下载预构建容器。
关于作者
相关博客文章
NGINX Plus R26 正式发布
NGINX Plus R26通过缓存JSON Web密钥集加快JWT验证,并强化TLS握手,从而提升安全性。NGINX JavaScript的新功能包括增强对异步函数的支持,以及实现WebCrypto API。
使用NGINX App Protect DoS保护gRPC应用,抵御严重的DoS攻击
gRPC具备开发人员设计和部署现代应用所需的速度与灵活性,但其开放性也使其极易受到第7层DoS攻击。NGINX App Protect DoS可保护gRPC应用免受此类破坏性攻击。
Ingress Controller 选型指南(第 2 部分):风险与面向未来的规划
了解选择错误的Ingress控制器可能带来的风险,以及如何从关键方面着手,让您的选择更好地适应未来需求。
NGINX Plus R19 正式发布
NGINX Plus R19扩展了监控功能,不仅提供更多指标,还新增了指标分析方式;增加试运行模式,用于测试限速效果;增强键值存储,以支持IP地址范围;并使限速更加动态。
NGINX现已正式加入F5
NGINX现已正式成为F5的一部分。Gus Robertson现任F5 NGINX业务部门负责人。他阐述了两家公司在人才、文化和愿景方面融合的价值,以及双方将如何携手增强NGINX的开源产品和商业产品。

