1

Beim Versuch, eine hoch verfügbare Webserver-Einrichtung zu erreichen, führte ich einen Belastungstest gegen einen extrem einfachen NGINX-Docker-Container durch, der eine einzige statische Datei lieferte.Warum werden beim Erhöhen von Knoten/Pods auf einem einfachen NGINX-Dockercluster keine höheren gleichzeitigen Anforderungen angezeigt?

Zuerst versuchte ich mit einem einzigen Knoten (n1-standard-4) & single pod Cluster, um zu messen, wie viel eine "Einheit" tun könnte. Dieses Einzelknoten-/Pod-Setup konnte mit etwa 20.000 gleichzeitigen Anfragen fertig werden, bevor mit dem Timeout für einige Anfragen/Durchsatzeinbrüche begonnen wurde.

Ich fügte dann einen anderen Knoten desselben Maschinentyps hinzu und skalierte die Pods auf zwei Replikate. Nachdem ich bestätigt hatte, dass beide Pods/Nodes aktiv waren, habe ich den Test erneut mit 20k durchgeführt. Die Leistung war gut und ich stieg auf 40k - in der Erwartung, dass ich ähnliche Ergebnisse wie die 20k beim 1-Knoten/Pod-Setup sehen würde.

Allerdings war die Leistung sehr schlecht, niemals mit Anfragen pro Sekunde, die heftig zwischen 15k und 30k springen.

Ich versuchte den gleichen Test erneut mit 4 Knoten/Pods und sah ähnliche, wenn nicht etwas schlechtere Ergebnisse.

Meine Frage (n) sind:

  • Bin ich falsch zu glauben, dass meine gleichzeitige Anforderungen mit GKE/Container/Kubernetes linear auf diese Weise skalieren sollte?

  • Was vermisse ich, um die gewünschten Ergebnisse zu erzielen, um N gleichzeitige Benutzer mit M Knoten/Pods im Cluster zu bewältigen?

EDIT: Ich glaube auch nicht, dass es ein Problem mit dem Lasttest-Tool - wie ich einen externen bezahlten Dienst verwende, die 100k gleichzeitige Anforderungen simulieren bis zu können, behauptet.

EDIT 2: Hier einige weitere Informationen über das Setup:

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:

Ich habe den Dienst "LoadBalancer" verwendet, von dem ich glaube, dass er ein Google Cloud Balancer ist (ich habe dies bestätigt und festgestellt, dass die Knoten hinzugefügt wurden). Hier sind die Dateien, die ich mit kubernetes verwendet habe, um den Cluster zu verwalten.

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 

Dienstleistungen.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 
+0

Geben Sie uns einige weitere, um weiterzugehen .. Können Sie einen Link zu Ihrer Dockerfile bereitstellen? Wie balancierst du deine Ladung? Das Clustering hängt stark von einer guten Lastausgleichsmethode ab. Von Ihren Tags gehe ich davon aus, dass Sie kubernetes verwendet haben. Haben Sie den Loadbalancer benutzt? Siehst du den Verkehr zu beiden Knoten? – RoyB

+0

Hey @RoyB - danke für den Kommentar. Ich habe die Frage bearbeitet, um die wichtigen Dateien (einschließlich der Dockerfile) einzuschließen. Ich habe tatsächlich den LoadBalancer-Dienst mit Kubernetes verwendet, der einen Google Cloud Balancer erstellt hat - und ich habe gesehen, dass die Knoten hinzugefügt wurden. Ich habe jedoch nicht direkt auf einem der Knoten nach Verkehr gesucht. – Sam

+0

Hi @Sam, die Überprüfung des Datenverkehrs auf jedem Knoten kann hilfreich sein. Es kann helfen, festzustellen, ob Google Cloud Balancer der Engpass ist. – caesarxuchao

Antwort

1

Wenn Sie eine vorkonfigurierte Lasttest ausführen möchten, können Sie die Anweisungen für die kubernetes scale-demo überprüfen, die zeigt, wie eine Million QPS von statischen Dateien dienen nginx verwenden, die zu Ihrem Test sehr ähnlich ist Konfiguration.

Denken Sie auch daran, dass eine einzelne VM (unabhängig von der Anzahl der Pods) auf how much bandwidth begrenzt ist und wie viele Pakete pro Sekunde sie verarbeiten kann. Um mehr Last bereitzustellen, sollten Sie einen größeren VM-Typ erstellen oder zusätzliche VMs hinzufügen.

Verwandte Themen