Sep 22, 2021 | Kubernetes, Tutorial

Benutzerdefiniertes Verbindungslimit für Load Balancer

von

Du würdest gerne ein eigenes Limit für eingehende Verbindungen an deinem Load Balancer festlegen? In diesem Tutorial lernst du wie das geht.

Über das Verbindungslimit

Das Verbindungslimit (engl. „connection limit“) beschreibt die maximal zugelassene Anzahl an Verbindungen pro Sekunde, die für einen Load Balancer Listener (offenen Frontend-Port) erlaubt sind. Du fragst dich vielleicht, wieso sollte man überhaupt ein Verbindungslimit festlegen? Der naheliegendste Grund ist, um eine Überflutung von HTTP-Anfragen an die Kubernetes Apps vorzubeugen. Mit einer stärkeren Limitierung werden die überschüssigen Verbindungen abgelehnt, wodurch verhindert wird, dass die Kapazitäten des Clusters überlastet werden. Wenn du in deinem Cluster bereits Vorkehrungen für solche Fälle getroffen hast und eine Flut an Anfragen z.B. mittels Autoscaling ausgleichen kannst, so ist es natürlich auch möglich, das Verbindungslimit am Load Balancer weiter zu erhöhen.

Probleme bei hohen Verbindungslimits

In früheren Versionen unseres Load Balancer Dienstes „Octavia“ war die Anzahl an erlaubten Verbindungen nicht limitiert. Allerdings führte das unter bestimmten Umständen zu Problemen bei den Load Balancern. Wenn mehr als drei Listener am Load Balancer konfiguriert werden und kein Verbindungslimit gesetzt ist, dann führt dies dazu, dass die HAProxy-Prozesse des Load Balancers abstürzen. Das Problem wird in diesem Bug-Report näher beschrieben. Um zu vermeiden, dass unsere Kunden in dieses Problem laufen, haben wir uns entschieden, das standardmäßige Verbindungslimit auf 50000 Verbindungen festzulegen. Dieses Tutorial zeigt dir, wie du das Limit selber anpassen kannst.  

Service Annotations für Load Balancer

Da die Kubernetes Cluster von NWS in unserer OpenStack Cloud betrieben werden, wird die Interaktion zwischen Kubernetes und OpenStack über den „Cloud Provider OpenStack“ realisiert. In der Dokumentation des Providers findet man eine Sektion, die alle verfügbaren Kubernetes Service Annotations für Load Balancers beinhaltet. Die Annotation, die wir benötigen, um ein benutzerdefiniertes Verbindungslimit setzen zu können ist „loadbalancer.openstack.org/connection-limit“.

Setzen der Annotation

Die Annotation wird im Kubernetes Cluster an einem Service Objekt des Load Balancers gesetzt. Du solltest in deiner Serviceliste einen Service vom Typ „LoadBalancer“ finden. 

~ $ kubectl get service
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP       PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.254.194.107   193.111.222.333   80:30919/TCP,443:32016/TCP   2d
ingress-nginx-controller-admission   ClusterIP      10.254.36.121    <none>            443/TCP                      2d
kubernetes                           ClusterIP      10.254.0.1       <none>            443/TCP                      2d17h
my-k8s-app                           ClusterIP      10.254.192.193   <none>            80/TCP                       47h

 

In meinem Beispiel wurde der Service automatisch eingerichtet, als ich einen Nginx Ingress Controller per Helm installiert habe. Ich kann den Service einfach editieren und die gewünschte Annotation hinzufügen: 

~ $ kubectl edit service ingress-nginx-controller

 

Nun setzt man die Annotation für das Verbindungslimit auf den gewünschten Wert (in dem Beispiel „100000“): 

apiVersion: v1
kind: Service
metadata:
  annotations:
    loadbalancer.openstack.org/connection-limit: "100000"
    meta.helm.sh/release-name: ingress-nginx
    meta.helm.sh/release-namespace: default
  creationTimestamp: "2021-09-08T08:40:59Z"
...

 

Die Änderungen sichert man und verlässt anschließend den Editormodus. Man erhält als Bestätigung die folgende Meldung: 

service/ingress-nginx-controller edited

 

Wenn nicht, dann sollte man prüfen, ob man einen Tippfehler bei der Annotation hat und ob der gewünschte Wert auch in doppelten Anführungszeichen gesetzt ist. Sobald die Anpassung des Services erfolgreich durchgeführt wurde, dauert es für gewöhnlich 10 bis 15 Sekunden, bis die Änderungen an dem OpenStack Load Balancer durchgeführt wurden. Du kannst den Status deines Load Balancers im Webinterface von NWS prüfen. Der „Provisioning Status“ steht auf „PENDING_UPDATE“ während die Änderungen ausgeführt werden und wechselt zurück auf „ACTIVE“ sobald diese abgeschlossen wurden.  

Fazit

In bestimmten Fällen kann es nützlich sein, ein benutzerdefiniertes Verbindungslimit an einem Load Balancer zu setzen und wie wir eben sehen konnten, ist die Umsetzung ziemlich einfach zu bewerkstelligen. Man sollte allerdings beachten, dass sehr hohe Limits in Kombination mit einer großen Anzahl an Listenern nach wie vor zu Problemen führen kann.

Erhalte den nächsten Artikel

Mehr Artikel in Kubernetes | Tutorial
Ingress-NGINX mit Cert-Manager absichern

Ingress-NGINX mit Cert-Manager absichern

In einem der ersten Tutorials auf unserer Seite haben wir dir gezeigt, wie du Ingress-NGINX in deinem Cluster installieren und einrichten kannst. Heute gehen wir einen Schritt weiter und schauen uns an, wie du Ingress-NGINX und deine Services mit Hilfe von...

Migration von Servern auf VMware zu OpenStack

Migration von Servern auf VMware zu OpenStack

In diesem Tutorial befassen wir uns mit der Migration von Servern auf VMware zu OpenStack. Nach der kürzlichen Übernahme VMwares durch Broadcom haben in den vergangenen Wochen viele kleinere Cloud Service Provider (CSPs) Mitteilung zur Kündigung ihrer Mitgliedschaft...

Meistere Kubernetes mit Cilium: Traffic Filterung auf L7 Basis

Meistere Kubernetes mit Cilium: Traffic Filterung auf L7 Basis

Mit der neuen Version des Cilium CNI auf unserem Kubernetes-Service erhältst Du die Möglichkeit, den Datenverkehr anhand von L7-Eigenschaften zu filtern. Das ist normalerweise Service-Meshes vorbehalten und kann bei der Sicherheit deiner Dienste sehr hilfreich sein....

Terraform und OpenStack

Terraform und OpenStack

Viele von Euch sind vermutlich bereits mit der Verwendung von Terraform in Kombination mit Azure oder AWS vertraut. Und obwohl dies die am häufigsten verwendeten Plattformen sind, gibt es - oftmals im Bezug auf Datenschutz (DSGVO) - Unwägbarkeiten und somit weiterhin...

Dynamic Inventory – Eine Ansible und OpenStack Lovestory

Dynamic Inventory – Eine Ansible und OpenStack Lovestory

Für diejenigen unter euch, die mit Ansible möglicherweise nicht allzu vertraut sind: Es ist ein großartiges Tool, um in die Welt der Automatisierung einzusteigen und erleichtert euer Leben im Konfigurationsmanagement erheblich.   Die Kennenlernphase In diesem Tutorial...

ReadWriteMany (RWX) mit dem NFS Ganesha Provisioner

ReadWriteMany (RWX) mit dem NFS Ganesha Provisioner

Einführung Du hast die Anforderung, dass Deine Anwendung für eine Lastverteilung über mehrere Nodes skalieren muss, aber Zugriff auf ein gemeines PVC benötigt? Zu diesem Zweck benötigst Du ein PVC welches RWX-fähig ist. Im Rahmen unserer Managed Kubernetes Cluster ist...

Persistente Volumes in Kubernetes vergrößern

Persistente Volumes in Kubernetes vergrößern

Du willst ein PersistentVolume (PV) in Kubernetes vergrößern? In diesem Blogeintrag erfährst du wie das funktioniert. Was PVs sind und wie man diese anlegt wird im Tutorial Persistente Volumes in Kubernetes erstellen erklärt, auf welchem das vorliegende Tutorial...

Wie Du Deine NETWAYS Managed Database startest

Wie Du Deine NETWAYS Managed Database startest

Im ersten Tutorial hat Sebastian bereits erklärt, was es mit Vitess auf sich hat und welche Möglichkeiten es Dir beim Betrieb Deiner Anwendung, im Vergleich zu einer gewöhnlichen Datenbank, bietet. Im folgenden Text möchte ich nun darauf eingehen, wie Du Dir in...

Was ist Vitess?

Was ist Vitess?

Im Jahr 2010 wurde eine Lösung entwickelt, um die massiven Skalierbarkeitsprobleme von MySQL bei YouTube zu lösen - und somit war Vitess geboren. Später - im Jahr 2018 - wurde das Projekt Teil der Cloud Native Computing Foundation und ist seit 2019 als eines der...