
Benutzerdefiniertes Verbindungslimit für Load Balancer
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 47hIn 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-controllerNun 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 editedWenn 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.
Recent Comments