Ü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 spezifische Anwendung ist es wichtig, die Anforderungen zu verstehen, die die Anwendung sowie das Geschäft und die Entwickler an diese Ressource stellen. Mit diesen Informationen kann man mit der architektonischen Entscheidung beginnen und insbesondere den passenden Ingress-Controller auswählen, von denen es mittlerweile eine Vielzahl gibt. Um einen grundlegenden Überblick über die verfügbaren Optionen zu erhalten, ohne zahlreiche Artikel/Dokumentationen und Ähnliches durchforsten zu müssen, haben wir diesen Überblick erstellt, der die wichtigsten (produktionsbereiten) Ingress-Controller umfasst.

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. Zuvor haben wir ähnliche Materialien im Netz untersucht und erstaunlicherweise kein einziges umfassendes und vor allem strukturiertes Review gefunden. Lassen Sie uns also diese Lücke schließen!

Kriterien

Um überhaupt einen sinnvollen Vergleich anstellen zu können, ist es wichtig, nicht nur das Fachgebiet zu verstehen, sondern auch eine spezifische Liste von Kriterien zu haben, die die Richtung der Untersuchung vorgeben. Ohne den Anspruch, alle möglichen Anwendungsfälle von Ingress/Kubernetes zu analysieren, haben wir versucht, die wichtigsten Anforderungen an die Controller herauszustellen — seien Sie darauf vorbereitet, dass Sie alle spezifischen Besonderheiten in jedem Fall separat untersuchen müssen.

Ich beginne jedoch mit Merkmalen, die so vertraut geworden sind, dass sie in allen Lösungen implementiert werden und daher nicht in Betracht gezogen werden:

  • dynamisches Service-Discovery;
  • SSL-Terminierung;
  • Arbeiten mit WebSockets.

Nun zu den Vergleichspunkten:

Unterstützte Protokolle

Eines der grundlegendsten Kriterien für die Auswahl. Ihre Software könnte nicht im Standard-HTTP arbeiten oder die gleichzeitige Verarbeitung mehrerer Protokolle erfordern. Wenn Ihr Fall nicht standardisiert ist, sollten Sie diesen Faktor unbedingt berücksichtigen, damit Sie das Cluster später nicht neu konfigurieren müssen. Bei allen Controllern variiert die Liste der unterstützten Protokolle.

Software im Hintergrund

Es gibt mehrere Arten von Anwendungen, auf denen der Controller basiert. Zu den beliebtesten gehören nginx, traefik, haproxy und envoy. Im Allgemeinen hat dies möglicherweise keinen großen Einfluss darauf, wie der Datenverkehr empfangen und übertragen wird, aber es ist immer nützlich, die potenziellen Nuancen und Besonderheiten des „Unter der Haube“ zu kennen.

Traffic-Routing

Worauf kann man basierend entscheiden, wohin der Datenverkehr in einen bestimmten Service geleitet wird? Normalerweise sind das Host und Pfad, aber es gibt auch zusätzliche Möglichkeiten.

Namespace innerhalb des Clusters

Ein Namespace bietet die Möglichkeit, Ressourcen in Kubernetes logisch zu gliedern (zum Beispiel in Stage, Produktion usw.). Es gibt Ingress-Controller, die separat in jedem Namespace installiert werden müssen (und dann den Verkehr nur in die Pods dieses Namespace leiten können). Es gibt jedoch auch solche (und das sind eindeutig die meisten), die global für das gesamte Cluster arbeiten – hierbei wird der Verkehr in jeden Pod des Clusters geleitet, unabhängig vom Namespace.

Health Checks für Upstreams

Wie wird sichergestellt, dass der Verkehr an gesunde Instanzen von Anwendungen oder Diensten weitergeleitet wird? Es gibt Optionen mit aktiven und passiven Prüfungen, erneuten Versuchen (Retries) und Circuit Breakers. (weitere Informationen finden Sie beispielsweise in dem Artikel über Istio), eigene Implementierungen von Gesundheitsprüfungen (custom health checks) usw. Dies ist ein sehr wichtiger Parameter, wenn Sie hohe Anforderungen an die Verfügbarkeit und an das zeitnahe Herausnehmen ausgefallener Dienste aus der Lastverteilung haben.

Lastverteilungsalgorithmen

Es gibt viele Optionen: von traditionellen Round-Robin bis hin zu exotischen wie RDP-Cookie, sowie spezielle Optionen wie Sticky Sessions.

Authentifizierung

Welche Authentifizierungsschemata unterstützt der Controller? Basic, Digest, OAuth, External-Auth – ich denke, diese Optionen sollten vertraut sein. Dies ist ein wichtiges Kriterium, wenn viele Kanäle für Entwickler (und/oder einfach geschützte) verwendet werden, auf die über Ingress zugegriffen wird.

Trafficverteilung

Unterstützt der Controller gängige Mechanismen zur Trafficverteilung, wie Canary-Deployments, A/B-Tests, Traffic-Mirroring/Shadowing? Dies ist ein wirklich sensibles Thema für Anwendungen, die eine sorgfältige und präzise Steuerung des Traffics für produktives Testen, das Debuggen von Produkfehlern ohne Ausfall (oder mit minimalen Verlusten), Traffic-Analyse usw. benötigen.

Bezahltes Abonnement

Gibt es eine kostenpflichtige Version des Controllers mit erweiterten Funktionen und/oder technischer Unterstützung?

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öchten, aber mit 'rohen' Vorlagen nicht zurechtkommen. Dies könnte nützlich sein, wenn Entwickler Experimente mit dem Datenverkehr durchführen wollen.

JWT-Validierung

Vorhandensein einer integrierten Überprüfung von JSON-Web-Token zur Autorisierung und Validierung von Benutzern in der Anwendung.

Anpassungsmöglichkeiten des Konfigs

Erweiterbarkeit der Vorlagen hinsichtlich der Verfügbarkeit von Mechanismen, die es ermöglichen, eigene Direktiven, Flags usw. in die Standardkonfigurationsvorlagen einzufügen.

Grundlegende Schutzmechanismen gegen DDoS

Einfache Rate-Limit-Algorithmen oder komplexere Varianten zur Filterung von Datenverkehr basierend auf Adressen, Whitelists, Ländern usw.

Anfragenverfolgung

Überwachungs-, Verfolgungs- und Debuggingmöglichkeiten von Anfragen von Ingress zu bestimmten Services/Pods und idealerweise auch zwischen den Services/Pods.

WAF

Support Anwendungsfirewall.

Ingress-Controller

Die Liste der Controller wurde basierend auf der offiziellen Kubernetes-Dokumentation und dieser Tabelle. Einige von ihnen haben wir aufgrund ihrer Spezifität oder geringen Verbreitung (frühe Entwicklungsphase) aus der Übersicht ausgeschlossen. Die verbleibenden werden im Folgenden betrachtet. Wir beginnen mit einer allgemeinen Beschreibung der Lösungen und fahren mit einer zusammenfassenden 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 basierend auf nginx, ist er um eine Vielzahl von Lua-Plugins ergänzt, die zur Implementierung zusätzlicher Funktionen verwendet werden. Dank der Popularität von nginx und der minimalen Modifikationen bei seiner Verwendung als Controller kann diese Option die einfachste und verständlichste для einen durchschnittlichen Ingenieur (mit Erfahrung im Web) sein.

Ingress von NGINX Inc

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

Ein offizielles Produkt der nginx-Entwickler. Es gibt eine kostenpflichtige Version, die auf NGINX Plus basiert.. Die Hauptidee ist ein hohes Maß an Stabilität, ständige Abwärtskompatibilität, das Fehlen jeglicher externen Module und die angegebene höhere Geschwindigkeit (im Vergleich zum offiziellen Controller), erreicht durch den Verzicht auf Lua.

Die kostenlose Version ist stark eingeschränkt, selbst im Vergleich zum offiziellen Controller (aufgrund des Fehlens derselben Lua-Module). Die kostenpflichtige Version bietet hingegen eine recht umfangreiche zusätzliche Funktionalität: Echtzeitmetriken, JWT-Validierung, aktive Health Checks und mehr. Ein wichtiges Plus gegenüber NGINX Ingress ist die vollständige Unterstützung für TCP/UDP-Verkehr (auch in der Community-Version!). Nachteil ist das Fehlen die begrenzte Funktionalität zur Lastverteilung, was jedoch 'oberste Priorität für die Entwickler hat', jedoch Zeit für die Implementierung benötigt.

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. Basierend auf Nginx, dessen Möglichkeiten durch eine Vielzahl von Lua-Modulen erweitert werden.

Ursprünglich war es auf die Verarbeitung und Weiterleitung von API-Anfragen ausgerichtet, also als API-Gateway, hat sich jedoch mittlerweile zu einem vollwertigen Ingress-Controller entwickelt. Zu den Hauptvorteilen gehören zahlreiche zusätzliche Module (auch von Drittanbietern), die sich leicht installieren und konfigurieren lassen und mit denen eine breite Palette an zusätzlichen Funktionen realisiert werden kann. Dennoch bieten die integrierten Funktionen bereits viele Möglichkeiten.

Ein wichtiges Merkmal des Produkts ist die Funktionsweise innerhalb eines einzelnen Kontextes (anstatt cross-namespaced), was ein umstrittenes Thema darstellt: Für einige ist es ein Nachteil (man muss Entities für jeden Kontext schaffen), für andere ist es eine nützliche Funktion (höhere Isolationsstufe, da, wenn ein Controller ausfällt, das Problem auf nur einen Kontext beschränkt ist).größtenTraefik

github.com/containous/traefik

Website: Lizenz: MIT
Lizenz: MIT

Ein Proxy, der ursprünglich für die Anfragenweiterleitung in Mikrodiensten und deren dynamischer Umgebung entwickelt wurde. Dies bringt eine Vielzahl nützlicher Funktionen mit sich: Konfigurationsupdates ohne Neustarts, Unterstützung für zahlreiche Lastverteilungs-Methoden, eine Weboberfläche, Metriken-Transparenz, Unterstützung verschiedener Protokolle, REST API, Canary Releases und vieles mehr. Ein weiterer Vorteil ist die native Unterstützung von Let's Encrypt-Zertifikaten. Ein Nachteil ist, dass zur Gewährleistung hoher Verfügbarkeit (HA) ein eigenes KV-Speicher eingerichtet und angeschlossen werden muss.

HAProxy

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

HAProxy ist seit langem als Proxy und Lastenausgleich bekannt. Innerhalb eines Kubernetes-Clusters bietet es ein "sanftes" Update der Konfiguration (ohne Verkehrsverlust), DNS-basierte Service-Discovery und dynamische Konfiguration über die API. Die vollständige Anpassbarkeit der Konfigurationsvorlagen durch die Ersetzung des CM sowie die Nutzung der Funktionen der Sprig-Bibliothek sind ebenfalls attraktiv. Insgesamt liegt der Hauptfokus der Lösung auf hoher Arbeitsgeschwindigkeit, Optimierung und Ressourceneffizienz. Ein Vorteil des Controllers ist die Unterstützung einer rekordverdächtigen Anzahl verschiedener Lastenausgleichsverfahren.

Voyager

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

Ein auf HAProxy basierender Controller, der als universelle Lösung positioniert wird und umfangreiche Möglichkeiten bei einer Vielzahl von Anbietern unterstützt. Es wird die Möglichkeit geboten, den Datenverkehr auf L7 und L4 auszugleichen, wobei der TCP L4-Datenverkehr insgesamt als eine der Hauptfunktionen 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 gemeinsam entwickelt mit den Entwicklern dieses beliebten Proxys. Eine wichtige Funktion ist die Möglichkeit, das Management der Ingress-Ressourcen mithilfe von CRD-Ressourcen IngressRoute zu teilen. Für Organisationen mit vielen Entwicklungsteams, die denselben Cluster nutzen, hilft dies, den Datenverkehr in benachbarten Umgebungen maximal abzusichern und sie vor Fehlern bei der Änderung der Ingress-Ressourcen zu schützen.

Es wird auch ein erweitertes Set an Balancierungsmethoden angeboten (einschließlich Anfragen-Spiegelung, automatische Wiederholungen, Limitierung der Anfrage-Rate und vieles mehr), detailliertes Monitoring des Datenverkehrs und von Ausfällen. Vielleicht wird das Fehlen von Sticky Sessions für einige ein wesentlicher Nachteil sein (obwohl die Arbeiten daran bereits im Gange sind).

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 Datenverkehr von außen verwaltet, sondern auch den gesamten Datenverkehr innerhalb des Clusters kontrolliert. ‘Unter der Haube’ wird Envoy als Sidecar-Proxy für jeden Dienst verwendet. Im Grunde genommen handelt es sich um eine große Kombination, die ‘alles kann’, wobei der Hauptgedanke maximale Steuerbarkeit, Erweiterbarkeit, Sicherheit und Transparenz ist. Mit seiner Hilfe können Sie die Verkehrsrouting, die Zugriffautorisierung zwischen den Diensten, Lastverteilung, Überwachung, Canary-Releases und vieles mehr im Detail anpassen. Weitere Informationen über Istio finden Sie in einer Reihe von Artikeln.Zurück zu Microservices mit Istio».

Ambassador

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

Eine weitere Lösung, die auf Envoy basiert. Sie bietet sowohl kostenlose als auch kommerzielle Versionen und wird als ‘vollständig identisch mit Kubernetes’ positioniert, was entsprechende Vorteile mit sich bringt (enge Integration mit den Methoden und Entitäten des K8s-Clusters).

Vergleichstabelle

Die Kulmination des Artikels ist diese umfangreiche Tabelle:

Überblick und Vergleich von Ingress-Controllern für Kubernetes

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

Zusammenfassend

Das Ziel dieses Artikels ist es, ein umfassenderes Verständnis dafür zu bieten, welche Wahl in Ihrem speziellen Fall getroffen werden sollte. Wie so oft hat jeder Controller seine eigenen Vorzüge und Nachteile...

Der klassische Ingress von Kubernetes überzeugt durch seine Verfügbarkeit und Zuverlässigkeit sowie durch ein reichhaltiges Funktionsspektrum — im Regelfall sollte er vollkommen ausreichend sein. Wenn jedoch höhere Anforderungen an Stabilität, Feature-Level und Entwicklung gestellt werden, lohnt es sich, Ingress mit NGINX Plus und einem kostenpflichtigen Abonnement in Betracht zu ziehen. Kong bietet eine Vielzahl an Plugins (und somit an Funktionen), wobei in der kostenpflichtigen Version sogar noch mehr zur Verfügung stehen. Zudem bietet es umfassende Möglichkeiten, als API Gateway zu fungieren, dynamische Konfigurationen auf der Basis von CRD-Ressourcen durchzuführen und grundlegende Kubernetes-Dienste anzubieten.

Wenn Sie hohe Anforderungen an das Load Balancing und die Autorisierungsmethoden haben, sollten Sie sich Traefik und HAProxy ansehen. Diese Open Source-Projekte sind jahrzehntelang erprobt, äußerst stabil und entwickeln sich aktiv weiter. Contour ist seit ein paar Jahren auf dem Markt, wirkt jedoch noch ziemlich jung und bietet nur grundlegende Funktionen, die auf Envoy aufgebaut sind. Wenn es Anforderungen an das Vorhandensein/Einschließen eines WAF vor der Anwendung gibt, sollten Sie auch das Ingress von Kubernetes oder HAProxy in Betracht ziehen.

Die funktional reichhaltigsten Produkte sind die, die auf Envoy basieren, insbesondere Istio. Es stellt eine umfassende Lösung dar, die „alles kann“, was jedoch auch bedeutet, dass der Einstieg hinsichtlich Konfiguration/Start/Administration deutlich komplexer ist als bei anderen Lösungen.

Wir haben als Standard-Controller Ingress von Kubernetes ausgewählt, der nach wie vor verwendet wird und etwa 80–90 % der Anforderungen abdeckt. Er ist zuverlässig, einfach zu konfigurieren und skalierbar. Im Allgemeinen sollte er den meisten Clustern/Aus Anwendungen genügen, wenn keine spezifischen Anforderungen bestehen. Als weitere universelle und relativ einfache Produkte können Traefik und HAProxy empfohlen werden.

P.S.

Lesen Sie auch in unserem Blog:

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster