Überblick und Vergleich von Ingress-Controllern fĂŒr Kubernetes

Überblick und Vergleich von Ingress-Controllern fĂŒr Kubernetes

Beim Start eines Kubernetes-Clusters fĂŒr eine bestimmte Anwendung sollte man verstehen, welche Anforderungen die Anwendung, das Unternehmen und die Entwickler an diese Ressource stellen. Mit diesen Informationen kann man mit der architektonischen Entscheidungsfindung beginnen, insbesondere mit der Auswahl eines spezifischen Ingress-Controllers, von denen es heutzutage bereits viele gibt. Um eine grundlegende Vorstellung von den verfĂŒgbaren Optionen zu erhalten, ohne eine Vielzahl von Artikeln/Dokumentationen usw. durchlesen zu mĂŒssen, haben wir diesen Überblick vorbereitet und dabei die wichtigsten (produktionsbereiten) Ingress-Controller aufgenommen.

Wir hoffen, dass er den Kollegen bei der Auswahl der architektonischen Lösung hilft — zumindest als Ausgangspunkt fĂŒr detailliertere Informationen und praktische Experimente dient. Vorab haben wir andere Ă€hnliche Materialien im Netz untersucht und, merkwĂŒrdigerweise, kein einziges umfassendes, vor allem aber strukturiertes, Review gefunden. Lassen Sie uns also diese LĂŒcke fĂŒllen!

Kriterien

Um ĂŒberhaupt einen Vergleich anzustellen und ein einigermaßen nĂŒtzliches Ergebnis zu erzielen, muss man nicht nur das Fachgebiet verstehen, sondern auch eine konkrete Liste von Kriterien haben, die den Forschungsschwerpunkt bestimmen. Ohne den Anspruch, alle möglichen AnwendungsfĂ€lle von Ingress/Kubernetes zu analysieren, haben wir versucht, die allgemeinsten Anforderungen an Controllers herauszuarbeiten — seien Sie darauf vorbereitet, dass Sie alle spezifischen Details und Besonderheiten dennoch separat studieren mĂŒssen.

Ich werde jedoch mit den Merkmalen beginnen, die so vertraut geworden sind, dass sie in allen Lösungen implementiert sind und nicht weiter betrachtet werden:

  • dynamische Service-Erkennung (service discovery);
  • SSL-Terminierung;
  • Arbeiten mit Websockets.

Jetzt zu den Vergleichspunkten:

UnterstĂŒtzte Protokolle

Eines der grundlegenden Kriterien fĂŒr die Auswahl. Ihre Software arbeitet möglicherweise nicht mit dem Standard-HTTP oder erfordert die gleichzeitige Nutzung mehrerer Protokolle. Wenn Ihr Fall nicht standardisiert ist, sollten Sie diesen Faktor unbedingt berĂŒcksichtigen, um spĂ€teren Aufwand bei der Neukonfiguration des Clusters zu vermeiden. Bei allen Controllern variiert die Liste der unterstĂŒtzten Protokolle.

Software im Kern

Es gibt mehrere Varianten von Anwendungen, auf denen der Controller basiert. Beliebte sind nginx, traefik, haproxy, envoy. Im Allgemeinen hat dies möglicherweise keinen wesentlichen Einfluss darauf, wie der Datenverkehr empfangen und ĂŒbertragen wird, jedoch ist es immer nĂŒtzlich, die potenziellen Nuancen und Besonderheiten zu kennen, die „unter der Haube“ verborgen sind.

Datenverkehrsweiterleitung

Auf welcher Basis kann man entscheiden, in welchen Dienst der Datenverkehr geleitet wird? Normalerweise sind dies host und path, aber es gibt auch zusÀtzliche Möglichkeiten.

Namensraum innerhalb des Clusters

Ein Namensraum (namespace) ist die Möglichkeit, Ressourcen in Kubernetes logisch zu organisieren (zum Beispiel in stage, production usw.). Es gibt Ingress-Controller, die separat in jeden Namensraum installiert werden mĂŒssen (und dann kann er den Datenverkehr nur in die Pods dieses Namensraums lenken). Es gibt jedoch auch solche (und die sind eindeutig in der Mehrheit), die global fĂŒr das gesamte Cluster arbeiten — in ihnen wird der Datenverkehr an jeden Pod im Cluster geleitet, unabhĂ€ngig vom Namensraum.

Health Checks fĂŒr Upstreams

Wie wird sichergestellt, dass der Datenverkehr an gesunde Instanzen von Anwendungen und Diensten geleitet wird? Es gibt Optionen mit aktiven und passiven ÜberprĂŒfungen, Wiederholungen (retries), circuit breakers (mehr dazu siehe zum Beispiel in dem Artikel ĂŒber Istio), eigenen Implementierungen von StatusprĂŒfungen (custom health checks) usw. Ein Ă€ußerst wichtiger Parameter, wenn Sie hohe Anforderungen an die VerfĂŒgbarkeit und zum rechtzeitigen Ausschluss ausgefallener Dienste haben.

Lastenausgleichsalgorithmen

Hier gibt es viele Optionen: von traditionellen round-robin bis hin zu exotischen wie rdp-cookie, sowie separate Möglichkeiten wie Sticky Sessions.

Authentifizierung

Welche Autorisierungsschemata unterstĂŒtzt der Controller? Basic, Digest, OAuth, External-Auth — ich denke, diese Optionen sollten bekannt sein. Dies ist ein wichtiges Kriterium, wenn mehrere Konturen fĂŒr Entwickler (und/oder einfach geschlossene) verwendet werden, auf die ĂŒber Ingress zugegriffen wird.

Verteilung des Datenverkehrs

UnterstĂŒtzt der Controller gĂ€ngige Mechanismen zur Verteilung des Datenverkehrs wie Canary-Deployments, A/B-Tests, Datenverkehrs-Mirroring (mirroring/shadowing)? Dies ist ein wirklich schwieriges Thema fĂŒr Anwendungen, die prĂ€zise und sorgfĂ€ltige Datenverkehrssteuerung fĂŒr produktive Tests, Produktfehlerdebugging ohne ProduktionsausfĂ€lle (oder mit minimalen Verlusten), Datenverkehrsanalyse usw. erfordern.

Bezahltes Abonnement

Gibt es eine kostenpflichtige Variante des Controllers mit erweiterten FunktionalitÀten und/oder technischem Support?

Grafische BenutzeroberflÀche (Web-UI)

Gibt es eine grafische BenutzeroberflĂ€che zur Verwaltung der Controller-Konfiguration? Vor allem fĂŒr die „Benutzerfreundlichkeit“ und/oder fĂŒr diejenigen, die Änderungen an der Ingress-Konfiguration vornehmen mĂŒssen, wĂ€hrend die Arbeit mit „rohen“ Vorlagen unangenehm ist. Könnte nĂŒtzlich sein, wenn Entwickler in Echtzeit mit dem Verkehr experimentieren wollen.

JWT-Validierung

Vorhandensein einer integrierten PrĂŒfung von JSON-Web-Token zur Autorisierung und Validierung von Benutzern im Endanwendung.

Anpassungsmöglichkeiten der Konfiguration

Erweiterbarkeit der Vorlagen hinsichtlich des Vorhandenseins von Mechanismen, die das HinzufĂŒgen eigener Direktiven, Flags usw. zu den Standardkonfigurationsvorlagen ermöglichen.

Grundlegende DDoS-Schutzmechanismen

Einfache Rate-Limitierungsalgorithmen oder komplexere Varianten zur Filterung des Verkehrs basierend auf Adressen, White-Listen, LĂ€ndern usw.

Anforderungsverfolgung

Beobachtungs-, Überwachungs- und Debugging-Möglichkeiten fĂŒr Anforderungen von Ingress zu bestimmten Diensten/Pods und idealerweise auch zwischen Diensten/Pods.

WAF

Bestellen Anwendungsfirewall.

Ingress-Controller

Die Liste der Controller wurde auf Basis von offiziellen Kubernetes-Dokumentation und dieser Tabelle. Einige von ihnen haben wir aus der Übersicht ausgeschlossen aufgrund ihrer SpezifitĂ€t oder geringen Verbreitung (frĂŒhe Entwicklungsphase). Die verbleibenden werden nachfolgend behandelt. Wir beginnen mit einer allgemeinen Beschreibung der Lösungen und setzen die Zusammenfassung in einer Tabelle fort.

Ingress von Kubernetes

Website: github.com/kubernetes/ingress-nginx
Lizenz: Apache 2.0

Dies ist der offizielle Controller fĂŒr Kubernetes, der von der Community entwickelt wird. Offensichtlich aus dem Namen, basiert er auf Nginx und wird durch eine Vielzahl von Lua-Plugins ergĂ€nzt, die zur Implementierung zusĂ€tzlicher Funktionen verwendet werden. Aufgrund der PopularitĂ€t von Nginx und der minimalen Modifikationen, die bei der Verwendung als Controller vorgenommen werden, kann diese Variante die einfachste und verstĂ€ndlichste Konfiguration fĂŒr einen durchschnittlichen Ingenieur (mit Web-Erfahrung) sein.

Ingress von NGINX Inc

Website: github.com/nginxinc/kubernetes-ingress
Lizenz: Apache 2.0

Offizielles Produkt der Nginx-Entwickler. Hat eine kostenpflichtige Version, die auf NGINX Plus. Die Hauptidee ist ein hohes Maß an StabilitĂ€t, stĂ€ndige AbwĂ€rtskompatibilitĂ€t, das Fehlen von Fremdmodulen und die angekĂŒndigte erhöhte Geschwindigkeit (im Vergleich zum offiziellen Controller), die durch den Verzicht auf Lua erreicht wurde.

Die kostenlose Version ist erheblich eingeschrĂ€nkt, selbst im Vergleich zum offiziellen Controller (aufgrund des Fehlens der gleichen Lua-Module). Die kostenpflichtige Version bietet hingegen eine ziemlich breite zusĂ€tzliche FunktionalitĂ€t: Echtzeit-Metriken, JWT-Validierung, aktive Health Checks und mehr. Ein wichtiges Vorteil gegenĂŒber NGINX Ingress ist die vollstĂ€ndige UnterstĂŒtzung von TCP/UDP-Verkehr (auch in der Community-Version!). Nachteil — das Fehlen von Funktionen zur Verkehrsverteilung, was jedoch „höchste PrioritĂ€t fĂŒr die Entwickler hat“, aber Zeit zur Umsetzung erfordert.

Kong Ingress

Website: github.com/Kong/kubernetes-ingress-controller
Lizenz: Apache 2.0

Ein Produkt, das von der Firma Kong Inc. in zwei Varianten entwickelt wird: kommerziell und kostenlos. Es basiert auf NGINX, dessen Möglichkeiten durch eine große Anzahl an Lua-Modulen erweitert werden.

UrsprĂŒnglich war es auf die Verarbeitung und das Routing von API-Anfragen, d.h. als API Gateway, ausgelegt, hat sich jedoch inzwischen zu einem vollwertigen Ingress-Controller entwickelt. Zu den Hauptvorteilen gehören zahlreiche zusĂ€tzliche Module (auch von Drittanbietern), die leicht installiert und konfiguriert werden können und mit denen ein breites Spektrum zusĂ€tzlicher Funktionen realisiert werden kann. Dennoch bieten die eingebauten Funktionen bereits viele Möglichkeiten. Die Konfiguration erfolgt ĂŒber CRD-Ressourcen.

Ein wichtiges Merkmal des Produkts ist die Arbeit innerhalb eines einzelnen Kontexts (anstatt cross-namespaced), was ein strittiges Thema ist: Manche werden es als Nachteil empfinden (man muss EntitĂ€ten fĂŒr jeden Kontext erstellen), wĂ€hrend es fĂŒr andere ein Feature ist (grĂ¶ĂŸere Isolation, da, wenn ein Controller ausfĂ€llt, das Problem nur auf einen einzigen Kontext beschrĂ€nkt ist).ogithub.com/containous/traefik

Traefik

Website: github.com/containous/traefik
Lizenz: MIT

Ein Proxy, der ursprĂŒnglich fĂŒr die Bearbeitung von Anfragen und das Routing fĂŒr Microservices und deren dynamische Umgebung entwickelt wurde. Daher auch viele nĂŒtzliche Funktionen: Konfigurationsupdates völlig ohne Neustarts, UnterstĂŒtzung zahlreicher Lastverteilungsmethoden, Web-Interface, Durchreichen von Metriken, UnterstĂŒtzung verschiedener Protokolle, REST API, Canary-Releases und vieles mehr. Ein angenehmer Aspekt ist auch die UnterstĂŒtzung von Let’s Encrypt-Zertifikaten out of the box. Nachteil – fĂŒr die GewĂ€hrleistung von hoher VerfĂŒgbarkeit (HA) muss der Controller ein eigenes KV-Speicher einrichten und verbinden.

HAProxy

Website: github.com/jcmoraisjr/haproxy-ingress
Lizenz: Apache 2.0

HAProxy ist seit langem als Proxy und Lastverteiler bekannt. Im Rahmen des Kubernetes-Clusters wird ein "sanftes" Konfigurationsupgrade (ohne Traffic-Verlust) angeboten, Service Discovery auf Basis von DNS, dynamische Konfiguration ĂŒber API. Besonders attraktiv ist die vollstĂ€ndige Anpassung des Konfigurationsmusters durch Ersetzen der CM sowie die Möglichkeit, Funktionen aus der Sprig-Bibliothek zu nutzen. Insgesamt liegt der Hauptfokus der Lösung auf hoher Geschwindigkeit, Optimierung und Effizienz im Ressourcenverbrauch. Ein Vorteil des Controllers ist die UnterstĂŒtzung einer Rekordzahl verschiedener Lastverteilungsverfahren.

Voyager

Website: github.com/appscode/voyager
Lizenz: Apache 2.0

Ein auf HAProxy basierender Controller, der als universelle Lösung positioniert ist und umfangreiche Funktionen auf einer Vielzahl von Anbietern unterstĂŒtzt. Er bietet die Möglichkeit, den Traffic auf L7 und L4 zu balancieren, wobei die Balance von TCP L4-Traffic insgesamt als eines der Hauptmerkmale der Lösung bezeichnet werden kann.

Contour

Website: github.com/heptio/contour
Lizenz: Apache 2.0

Dieses Konzept basiert nicht nur auf Envoy: es wurde entwickelt gemeinsam von den Autoren dieses beliebten Proxys. Ein wichtiges Merkmal ist die Möglichkeit, die Verwaltung der Ingress-Ressourcen mithilfe von CRD-Ressourcen IngressRoute zu trennen. FĂŒr Organisationen mit zahlreichen Entwicklungsteams, die einen Cluster nutzen, hilft dies, den Umgang mit Traffic in benachbarten Containern maximal abzusichern und sie vor Fehlern bei der Änderung von Ingress-Ressourcen zu schĂŒtzen.

Es wird auch ein erweitertes Set an Methoden zur Lastverteilung angeboten (einschließlich Anfragen-Spiegelung, automatische Wiederholungen, Ratenbegrenzung und vieles mehr), detaillierte Überwachung des Datenverkehrs und von AusfĂ€llen. FĂŒr einige könnte das Fehlen der UnterstĂŒtzung von Sticky Sessions ein wesentlicher Nachteil sein (obwohl bereits daran gearbeitet wird. Es werden bereits Arbeiten durchgefĂŒhrt.).

Istio Ingress

Website: istio.io/docs/tasks/traffic-management/ingress
Lizenz: Apache 2.0

Eine umfassende Service-Mesh-Lösung, die nicht nur als Ingress-Controller fungiert, der den eingehenden Verkehr von außen verwaltet, sondern auch den gesamten Verkehr innerhalb des Clusters kontrolliert. 'Unter der Haube' wird Envoy als Sidecar-Proxy fĂŒr jeden Dienst verwendet. Essenziell ist dies ein großes Kraftpaket, das 'alles kann', und seine Hauptidee besteht darin, maximalen Einfluss, Erweiterbarkeit, Sicherheit und Transparenz zu bieten. Mit seiner Hilfe können Sie die Datenverkehrsroute, den Zugriff zwischen den Diensten, die Lastverteilung, das Monitoring, Canary-Releases und vieles mehr bis ins kleinste Detail konfigurieren. Weitere Informationen zu Istio finden Sie in der Artikelreihe „ZurĂŒck zu Mikrodiensten mit Istio».

Ambassador

Website: github.com/datawire/ambassador
Lizenz: Apache 2.0

Eine weitere Lösung auf Basis von Envoy. VerfĂŒgbar in kostenlosen und kommerziellen Versionen. Positioniert sich als 'vollstĂ€ndig nativ fĂŒr Kubernetes', was entsprechende Vorteile mit sich bringt (enge Integration mit den Methoden und EntitĂ€ten des K8s-Clusters).

Vergleichstabelle

Die Höhepunkt des Artikels ist diese riesige Tabelle:

Überblick und Vergleich von Ingress-Controllern fĂŒr Kubernetes

Sie ist klickbar, um eine detailliertere Ansicht zu ermöglichen, und steht auch im Format Google Sheets.

Lassen Sie uns zusammenfassen

Ziel des Artikels ist es, ein umfassenderes VerstĂ€ndnis zu vermitteln (wenn auch nicht vollstĂ€ndig!), welche Wahl Sie in Ihrem speziellen Fall treffen sollten. Wie ĂŒblich hat jeder Controller seine Vor- und Nachteile...

Der klassische Ingress von Kubernetes ĂŒberzeugt durch seine VerfĂŒgbarkeit und VerlĂ€sslichkeit sowie durch recht umfangreiche Funktionen – in den meisten FĂ€llen sollte er „ausreichend sein“. Wenn jedoch höhere Anforderungen an StabilitĂ€t, Feature-Stufen und Entwicklung bestehen, ist es ratsam, sich Ingress mit NGINX Plus und einem kostenpflichtigen Abonnement anzusehen. Kong bietet eine sehr umfangreiche Sammlung von Plugins (und damit verbundenen Möglichkeiten), wobei in der kostenpflichtigen Version sogar noch mehr vorhanden sind. Er hat weitreichende Funktionen als API-Gateway, dynamische Konfiguration basierend auf CRD-Ressourcen sowie grundlegende Kubernetes-Dienste.

Bei höheren Anforderungen an das Lastenausgleich und die Autorisierungsmethoden sollten Sie sich Traefik und HAProxy genauer ansehen. Diese Open-Source-Projekte sind seit Jahren erprobt, sehr stabil und werden aktiv weiterentwickelt. Contour existiert seit einigen Jahren, wirkt aber immer noch zu jung und hat nur grundlegende Funktionen, die auf Envoy aufgebaut sind. Wenn es Anforderungen an das Vorhandensein/Integration eines WAF vor der Anwendung gibt, sollte man ebenfalls auf Ingress von Kubernetes oder HAProxy achten.

Die funktional reichhaltigsten Produkte basieren auf Envoy, insbesondere Istio. Es prĂ€sentiert sich als umfassende Lösung, die „alles kann“, was allerdings auch einen bedeutend höheren Konfigurations- und Administrationsaufwand im Vergleich zu anderen Lösungen bedeutet.

Wir haben als Standard-Controller den Ingress von Kubernetes ausgewĂ€hlt, der weiterhin verwendet wird und 80–90 % der Anforderungen abdeckt. Er ist zuverlĂ€ssig, einfach zu konfigurieren und zu erweitern. In den meisten FĂ€llen sollte er ohne spezifische Anforderungen fĂŒr die meisten Cluster/Anwendungen geeignet sein. Aus Ă€hnlichen universellen und relativ einfachen Produkten können Traefik und HAProxy empfohlen werden.

P.S.

Lesen Sie auch in unserem Blog:

Quelle: habr.com

60GB SSD 8Gb DDR4