为什么在简单的NGINX docker集群上增加节点/ pod时,我没有看到更高的并发请求?

时间:2016-06-23 08:08:11

标签: docker kubernetes scaling high-availability google-kubernetes-engine

在尝试实现高可用性的Web服务器设置时,我对一个非常简单的NGINX docker容器进行了负载测试,该容器提供单个静态文件。

首先,我尝试使用单个节点(n1-standard-4)&单个pod群集,用于衡量一个“单位”可以做多少。这个单节点/ pod设置可以在开始超时之前处理大约20k个并发请求,以满足某些请求/吞吐量的下降。

然后我添加了相同机器类型的另一个节点,并将pod缩放为两个副本。一旦我确认两个pod /节点都已启动,我再次以20k运行测试。性能很好,所以我提升到40k - 期望我在1节点/ pod设置上看到类似的结果到20k。

然而,表现非常糟糕,从未在每秒15k到30k之间猛烈跳跃。

我再次使用4个节点/ pod尝试相同的测试,并且看到类似的,如果不是稍微差一点的结果。

我的问题是:

  • 我认为我的并发请求应该使用GKE / containers / kubernetes以这种方式线性扩展我错了吗?

  • 为了达到能够应对群集中M个节点/ pod的N个并发用户的预期效果,我缺少什么?

编辑:我也不相信这是负载测试工具的问题 - 因为我使用的是外部付费服务,声称可以模拟多达10万个并发请求。

编辑2:以下是有关设置的更多信息:

Dockerfile:

FROM nginx

ADD nginx.conf /etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
ADD data.json /usr/share/nginx/html/data.json

nginx.conf:

user  nginx;
worker_processes  4;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  4096;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';

    access_log off;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;


    server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /usr/share/nginx/html;

        # Serve the index.html page
        location / {
            try_files /index.html =404;
        }
    }

    include /etc/nginx/conf.d/*.conf;
}

的index.html:

<head><title>Load Test Page</title></head><body><h3>Load Test!</h3></body>

我使用了“LoadBalancer”服务,我认为该服务设置了Google Cloud Balancer(我确认了这一点并看到了添加到其中的节点)。以下是我与kubernetes一起用来管理集群的文件。

rc.yml:

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx-rc
  labels:
    name: nginx-rc
spec:
  replicas: 2
  selector:
    name: nginx-server
  template:
    metadata:
      labels:
        name: nginx-server
      name: nginx-server
    spec:
      containers:
      - name: nginx-server
        image: [[ my image ]]
        ports:
        - containerPort: 80
          hostPort: 80

services.yml:

apiVersion: v1
kind: Service
metadata:
  labels:
    name: nginx-lb
  name: nginx-lb
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    name: nginx-server
  type: LoadBalancer

1 个答案:

答案 0 :(得分:1)

如果您想运行预配置的负载测试,可以查看kubernetes scale-demo的说明,其中显示了如何使用nginx提供100万QPS的静态文件,这与您的测试设置非常相似。

另请注意,单个VM(无论其上运行的pod数量如何)都将限制为how much bandwidth它可以使用以及它可以处理的每秒数据包数。要提供更多负载,您应该创建更大的VM类型或添加其他VM。