nginx - 为什么我不能在 Kubernetes 上横向扩展一个简单的 HTTP/2 服务?

标签 nginx kubernetes horizontal-scaling

我已经部署了一些简单的服务作为概念证明:用 https://stackoverflow.com/a/8217856/735231 打补丁的 nginx 网络服务器高性能。

我还编辑了 /etc/nginx/conf.d/default.conf 使行 listen 80; 变成 listen 80 http2;.

我正在使用 Locust 分布式负载测试工具,其中一个类将 requests 模块替换为 hyper 以测试 HTTP/2 工作负载。这在性能方面可能不是最佳的,但我可以产生很多蝗虫 worker ,所以这不是一个大问题。

为了测试,我在 5 台机器、2 个 vCPU、每台 4GB RAM 的 GKE 上生成了一个集群,安装了 Helm 和这些服务的图表(如果有用,我可以稍后将它们发布到要点上)。

我用 min_time=0 和 max_time=0 测试了 Locust,以便它产生尽可能多的请求;有 10 个 worker 针对单个 nginx 实例。

有 10 个工作人员,总共 140 个“客户端”,我每秒收到约 2.1k 个请求 (RPS)。

10 workers, 260 clients: I get ~2.0k RPS
10 workers, 400 clients: ~2.0k RPS

现在,我尝试水平扩展:我生成 5 个 nginx 实例并获得:

10 workers, 140 clients: ~2.1k RPS
10 workers, 280 clients: ~2.1k RPS
20 workers, 140 clients: ~1.7k RPS
20 workers, 280 clients: ~1.9k RPS
20 workers, 400 clients: ~1.9k RPS

正如 kubectl top pod 所描绘的那样,资源使用率非常低(这是针对 10 个工作人员,280 个客户端;nginx 不受资源限制,locust 工作人员每个 pod 限制为 1 个 CPU):

user@cloudshell:~ (project)$ kubectl top pod
NAME                           CPU(cores)   MEMORY(bytes)
h2test-nginx-cc4d4c69f-4j267   34m          68Mi
h2test-nginx-cc4d4c69f-4t6k7   27m          68Mi
h2test-nginx-cc4d4c69f-l942r   30m          69Mi
h2test-nginx-cc4d4c69f-mfxf8   32m          68Mi
h2test-nginx-cc4d4c69f-p2jgs   45m          68Mi
lt-master-5f495d866c-k9tw2     3m           26Mi
lt-worker-6d8d87d6f6-cjldn     524m         32Mi
lt-worker-6d8d87d6f6-hcchj     518m         33Mi
lt-worker-6d8d87d6f6-hnq7l     500m         33Mi
lt-worker-6d8d87d6f6-kf9lj     403m         33Mi
lt-worker-6d8d87d6f6-kh7wt     438m         33Mi
lt-worker-6d8d87d6f6-lvt6j     559m         33Mi
lt-worker-6d8d87d6f6-sxxxm     503m         34Mi
lt-worker-6d8d87d6f6-xhmbj     500m         33Mi
lt-worker-6d8d87d6f6-zbq9v     431m         32Mi
lt-worker-6d8d87d6f6-zr85c     480m         33Mi

我在 GKE 上描绘了这个测试以便于复制,但我在私有(private)云集群中得到了相同的结果。

为什么似乎我生成多少个服务实例并不重要?

更新:根据第一个答案,我正在更新有关节点的信息以及单个 Locust worker 发生的情况。

1 worker, 1 clients: 22 RPS
1 worker, 2 clients: 45 RPS
1 worker, 4 clients: 90 RPS
1 worker, 8 clients: 174 RPS
1 worker, 16 clients: 360 RPS
32 clients: 490 RPS
40 clients: 480 RPS (this seems over max. sustainable clients per worker)

但最重要的是,根本问题似乎是我的能力极限:

user@cloudshell:~ (project)$ kubectl top pod
NAME                                 CPU(cores)   CPU%      MEMORY(bytes)   MEMORY%
gke-sc1-default-pool-cbbb35bb-0mk4   1903m        98%       695Mi           24%
gke-sc1-default-pool-cbbb35bb-9zgl   2017m        104%      727Mi           25%
gke-sc1-default-pool-cbbb35bb-b02k   1991m        103%      854Mi           30%
gke-sc1-default-pool-cbbb35bb-mmcs   2014m        104%      776Mi           27%
gke-sc1-default-pool-cbbb35bb-t6ch   1109m        57%       743Mi           26%

最佳答案

如果我理解正确的话,你确实在与你的 Pod 相同的集群/节点上运行了负载测试,这肯定会对整体结果产生影响,我建议你将客户端与服务器分开在不同的节点上,以便一个互不影响。

对于您报告的值,可以清楚地看到工作人员消耗的 CPU 多于 nginx 服务器。

您应该检查:

  • 主机 CPU 利用率,由于线程数量远高于可用 CPU 数量,它可能在上下文切换时承受高压力。
  • 网络瓶颈,也许您可​​以尝试添加更多节点或增加工作人员容量 (SKU) 并将客户端与服务器分离。
  • 客户端没有足够的容量来产生负载,您增加线程但原始限制是相同的

您还应该测试单个服务器容量以验证每个服务器的限制,因此您有一个参数可以比较结果是否符合预期值。

关于nginx - 为什么我不能在 Kubernetes 上横向扩展一个简单的 HTTP/2 服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54668853/

相关文章:

nginx - 如何在一个域名下托管多个应用程序?

docker - Kubernetes HPA实现细节

docker - 如何查看kubernetes的入口端点?

java - JAVA ORM应用程序中RDBMS数据库的水平扩展

python - Flask 模板在本地环境中工作,但在 nginx 下返回错误 404

node.js - 使用 Node.js 应用程序配置 nginx 时出现问题

mysql - 将 kubernetes 上托管的 jenkins 连接到 Google Cloud Platform 上的 MySQL

kubernetes - 在 kubernetes 中,什么时候在同一节点中复制 pod 才有意义?

javascript - Google 表格脚本错误 - cell.setHorizo​​ntalAlignment(SpreadsheetApp.Horizo​​ntalAlignment.CENTER)

nginx - 如何在维护模式下使用 Nginx 提供静态 Assets (503)