OpenNJet KIC V2.0 veröffentlicht!

NGINX entwickelt sich zu Cloud Native weiter, alles in  OpenNJet 


Überblick

OpenNJet KIC (Kubernetes Ingress Controller) basiert auf den dynamischen Eigenschaften und der leistungsstarken Implementierung des OpenNJet-Proxys. Machen Sie die Mängel von Nginx in Cloud-nativen Szenarien wett. Bietet umfassende Funktionen zur Verkehrsverwaltung, wie z. B. dynamischer Standort, Host-/Pfad-Routing, Lastausgleich, dynamischer Upstream, Canary-Publishing, TLS-Terminierung/SNI, TCP/UDP, WebSocket usw.

Hauptmerkmale dieser Version:

  • Unterstützt die Sharding-Verarbeitung von Ingress/VS CR

  • Unterstützt die Integration mit ADC

  • Unterstützt HTTP-Header-Operationen

  • Unterstützt TCP-Proxy

  • Unterstützt Cross-Namespace

  • Unterstützt WebSocket-Proxy

  • Unterstützt UDP-Proxy

  • Unterstützt dynamisches NJet VS/Accesslog

  • Unterstützt die aktive TCP-Gesundheitsprüfung

  • Unterstützen Sie die dynamische Anpassung der Anzahl der Worker-Prozesse

Dieser Artikel bietet eine kurze Einführung in diese neuen Funktionen.

Das Architekturdiagramm sieht wie folgt aus:

Übersicht über neue Funktionen

Sharding-Verarbeitung Ingress/VS CR

Es gibt spezielle KICs für die Verarbeitung verschiedener Ingress-/VS-Ressourcen. Dies ist der KIC-Sharding-Mechanismus.

Verschiedene Ingress-/VS-Ressourcen werden durch ingressClass identifiziert. Ingress-Ressourcen können durch die Annotation kubernetes.io/ingress.class oder spec.ingressClassName identifiziert werden, und VS-Ressourcen können durch spec.ingressClassName identifiziert werden.

Beachten Sie, dass jeder KIC in diesem Sharding-Mechanismus als KIC-Typ bezeichnet wird und IngressClass eins zu eins entspricht. Wenn in einem k8s-Cluster mehrere Njet-KICs vorhanden sind, müssen mehrere IngressClass-Objekte erstellt werden. Jeder KIC-Typ kann mehrere Kopien haben (entsprechend mehreren Pods in der k8s-Architektur).

Der Sharding-Mechanismus bewirkt, dass jeder KIC über seine eigenen Ingress-/VS-Ressourcen verfügt, an denen er interessiert ist, und nicht über alle Ingress-/VS-Ressourcen im k8s-Cluster. Ziel ist es, das Problem zu lösen, dass ein einzelner KIC-Typ dem Druck einer vollständigen Konfiguration nicht standhalten kann.

Integrieren Sie mit ADC

Nach der Integration von KIC in ADC kann ADC als Front-End-LB von KIC dienen, den Client-Verkehr über ADC verwalten und letztendlich den Lastausgleich für KIC-Dienste durchführen. KIC hat die folgenden Funktionen erfüllt:

  • Registrierung von ADC-Domänennamen: KIC registriert bei ADC die Domänennamen von Diensten im von KIC verwalteten k8s-Cluster, z. B. Dienste, die über k8s-Ingress und vs CR verwaltet werden. Mit dieser Funktion können Clients Anfragen direkt über Domänennamen stellen (der DNS-Server des ADC muss als Standard-DNS-Server konfiguriert werden).

  • ADC SlbPool-Registrierung: KIC registriert den mit dem KIC-Dienst verbundenen Anwendungspool (nodeIP+nodePort) mit ADC. Diese Funktion ermöglicht ADC die Weiterleitung an den KIC-Dienst.

  • ADC VS-Registrierung: KIC registriert einen VS bei ADC und ordnet ihn dem im zweiten Schritt erstellten Anwendungspool zu. Diese Funktion ermöglicht dem Client den direkten Zugriff auf den VS, sodass ADC als Front-End-LB von KIC dienen kann.

Die VIP in ADC VS entspricht dem Domänennamen des von KIC verwalteten Dienstes.
Die VIP in ADC VS ist eine öffentliche Netzwerk-IP, auf die externe Clients direkt zugreifen können.

Gesamtstruktur

Szenendiagramm:

Diagramm der Interaktionsarchitektur:

Manipulation des HTTP-Headers

Der OpenNJet KIC-Header-Vorgang kann den Client-Anforderungsheader ändern und den Antwortheader des Proxy-Dienstes bearbeiten. Einschließlich benutzerdefinierter Header und Header, die in der HTTP-Spezifikation definiert sind.

TCP-Proxy

Der KIC TCP-Proxy kann Upstream-TCP-Dienste weiterleiten. Der TCP-Proxy bietet Lastausgleichsfunktionen. Der TCP-Proxy ist vollständig dynamisch implementiert und erfordert keinen Neuladevorgang durch OpenNJet.

Der Proxy-TCP-Dienst verfügt über einen eigenen Überwachungsport, desto mehr Ports müssen überwacht werden. Bei der herkömmlichen Nginx-Implementierung ist eine Neuladekonfiguration erforderlich. Um das Neuladeproblem zu lösen, verwenden wir die Portweiterleitung . Die Methode implementiert den Proxy des TCP-Dienstes. Das konkrete Design ist wie folgt:

  • Die OpenNJet-Stream-Konfiguration überwacht einen 12003-Port vorab (der vom Proxy-TCP-Dienst überwachte Port wird auf 12003 umgeleitet).

  • KIC generiert iptables-Regeln über die vom Kunden definierte API und leitet den angeforderten TCP-Dienst-Port über die iptables-Regeln an Port 12003 um.

  • Der „TCP-Service-Port“, auf den der OpenNJet-Stream über den Client zugreift, stimmt mit dem Upstream überein, der vom Kunden vorab über die API konfiguriert wurde. Dieser Prozess wird durch die Stream-Map abgeglichen.

  • Der OpenNJet-Stream sendet die Client-Anfrage an den Server im Upstream, der erfolgreich übereinstimmt (der Lastausgleich wird durch Stream-LUA implementiert).

    iptables-Regeln und Karteninhaltsaktualisierungen werden mithilfe der API dynamisch aktualisiert, wodurch Neuladevorgänge vermieden werden.

Die OpenNJet-Konfiguration wird wie folgt implementiert:

 map $njtmesh_port \$stream_upstream {
 }
 
 server {
 listen 12003 mesh;
 set $proxy_upstream_name \$stream_upstream;
 proxy_pass upstream_balancer;
 }

Der vom Client angeforderte Port ist immer der Port des Listeners im TransportServer.
Der Port kann vom Proxy-Dienst nicht verwendet werden, da er intern von KIC verwendet wird. Die Beschreibung ist in der folgenden Tabelle beschrieben:

Hafen veranschaulichen
80 HTTP-Proxy
443 https-Proxy
12001 OpenNJet-Steuerungsebene
12002 TCP Lua Upstream
12003 TCP-Proxy-Port
12004 UDP-Proxy-Port
8080 stub_status und http lua upstream
8081 KIC-Pod-Bereitschaftsport

Über Namensräume hinweg

Der integrierte Ingress von K8s kann nur das Routing von Diensten im selben NS verarbeiten und keine Cross-NS-Vorgänge ausführen. Die Funktion zur namensraumübergreifenden Konfiguration behebt diese Einschränkung.

Zusätzlich zur Unterstützung der Cross-Namespace-Konfiguration durch Ingress unterstützt VS auch die Cross-NS-Konfiguration. Benutzer können entsprechend ihren eigenen Umständen wählen.

Ingress implementiert diese Funktion über verschiedene Ingress-Typen. Ingress selbst hat kein Typkonzept. Wir drücken es aus, indem wir die Anmerkung „njet.org.cn/mergeable-ingress-type“ hinzufügen. Anmerkungen können Werte aus der folgenden Tabelle annehmen:

Wert veranschaulichen Anmerkung
Meister Haupteingang eins
Günstling FromIngress Kann mehrere sein und dem Master-Ingress über den Host zugeordnet sein

 

Der Master und der Minion desselben Hosts können sich im selben NS oder in unterschiedlichen NS befinden.

Zusätzlich zur Cross-NS-Konfiguration können Sie diese Funktion auswählen. Wenn ein Host über eine große Anzahl von Pfaden verfügt und die Wartung eines einzelnen Ingress kompliziert ist, können Sie diese Funktion auch zum Verwalten von Pfaden auswählen.

VS CR hat die gleiche Funktion wie Ingress, die Implementierungsmethode ist jedoch unterschiedlich, indem es auf eine Sub-Routing-Ressource verweist. Die Sub-Route ist eine Zeichenfolge im NS/Name-Format, die zur Darstellung von VSR verwendet wird VSR ist ein K8s CR, ein neuer CR, der für diese Funktion eingeführt wurde.

WebSocket-Proxy

WebSocket ist ein unabhängiges TCP-basiertes Anwendungsschichtprotokoll und ein Vollduplex-Kommunikationsprotokoll. Seine einzige Beziehung zu HTTP besteht darin, dass sein Handshake vom HTTP-Server als HTTP-Upgrade-Anfrage interpretiert wird. Wenn der Handshake endet, hat er nichts mit HTTP zu tun. Das Protokoll besteht aus zwei Teilen: Handshake und Datenübertragung. Die Handshake-Phase ist in der folgenden Abbildung dargestellt:

Ingress implementiert diese Funktion durch das Hinzufügen von Annotationen, die wir durch das Hinzufügen der Annotation „njet.org.cn/websocket-services“ ausdrücken.

Anmerkungsname Wertformat beschreiben
njet.org.cn/websocket-services service,service2 (durch Kommas getrennte Dienstnamen) Websocket-Unterstützung

VS erfordert keine Konfiguration.

UDP-Proxy

Der KIC UDP-Proxy kann Upstream-UDP-Dienste vertreten. Der UDP-Proxy bietet Lastausgleichsfunktionen. Der UDP-Proxy ist vollständig dynamisch implementiert und erfordert keinen Neuladevorgang durch OpenNJet.

Die Implementierung des UDP-Dienst-Proxys ist grundsätzlich dieselbe wie die des TCP-Dienst-Proxys, außer dass die OpenNJet-Stream-Konfiguration einen 12004-Port vorab abhört (der vom Proxy-UDP-Dienst überwachte Port wird auf 12004 umgeleitet), während TCP vorab abhört ein 12003-Port. Ausführliche Anweisungen finden Sie unter TCP-Proxy.

Die OpenNJet-Konfiguration wird wie folgt implementiert:

map $njtmesh_port \$stream_upstream_udp {
}

server {
listen 12004 udp mesh;
set $proxy_upstream_name $stream_upstream_udp;
proxy_pass upstream_balancer;
}

Dynamischer NJet VS

Im Vergleich zur ersten Version haben wir den Ansatz für einen einzelnen Server und mehrere Standorte geändert, um einen HTTP-Host-Header-Abgleich und einen Pfadabgleich zu erreichen. Wir haben den Nginx-Standardservername verwendet, um den Host-Header-Abgleich zu implementieren Die Konfiguration wurde dynamisch aktualisiert. Ja, es ist kein Neuladevorgang erforderlich. Die zweite Version fügt keine zusätzlichen Funktionen für Ingress und VirtualServer hinzu.

DynamicAccesslog

Mit der KIC-Accesslog-Funktion können Sie Accesslog-Richtlinien (einschließlich Switch-Status und Accesslog-Dateipfad) individuell auf eine bestimmte Anwendung anwenden. Globale Einstellungen können auch über njet-config ConfigMap vorgenommen werden, allerdings hat das „individuelle Anwenden der Accesslog-Richtlinie auf eine Anwendung“ eine höhere Priorität.

Proaktive TCP-Gesundheitsprüfung

Für Transportserver-Ressourcen wird die Konfiguration eines TCP-Ports unterstützt. Die aktive Integritätsprüfung erkennt, ob der TCP-Port gemäß dem konfigurierten Prüfintervall normal lauscht, und das Backend wird basierend auf den Prüfergebnissen online und offline sein.

apiVersion: k8s.njet.org/v1alpha1
 kind: TransportServer
 metadata:
 name: testapp-tcp
 spec:
 listener:
 name: test-tcp
 protocol: TCP
 upstreams:
 - name: testapp1
 service: testapp
 port: 80
 healthCheck:
 enable: true
 interval: 20s
 timeout: 5s
 fails: 1
 passes: 1
 port: 83
 action:
 pass: testapp1

Die Konfigurationsanweisungen lauten wie folgt:

 

Feld beschreiben Typ Ist es erforderlich?
aktivieren Ob die Integritätsprüfung aktiviert werden soll, Standardeinstellung ist „false“. Boolescher Wert NEIN
Intervall Das Intervall zwischen den Prüfungen. Der Standardwert ist 5 Zeichenfolge NEIN
scheitert Nach einigen Fehlern gelten Sie als offline. Standard 1 Mal ganze Zahl NEIN
geht vorbei Nach mehreren Erfolgen wird es online geprüft. Standard 1 Mal ganze Zahl NEIN
Hafen Der Port, an dem sich der Gesundheitsprüfungsdienst befindet ganze Zahl NEIN
Auszeit Zeitüberschreitung bei der Integritätsprüfung der Verbindung Zeichenfolge NEIN

Dynamische Anpassung der Worker-Prozessnummer

Unterstützt die Konfiguration der Anzahl der Arbeitsprozesse von njet-Instanzen über ConfigMap-Ressourcen. Nachdem die Konfigurationselemente in ConfigMap aktualisiert wurden, wird die Anzahl der Arbeitsprozesse dynamisch geändert.

Konfigurationselemente veranschaulichen Feldtyp Standardwert Anmerkung
Arbeitsprozesse Anzahl der Worker-Prozesse (erlaubte Werte 1 – 512) Zeichenfolge Der Standardwert ist die Anzahl der automatisch generierten Prozesse basierend auf der Anzahl der CPU-Kerne.  

Referenzlink

OpenNJetKIC-Benutzerhandbuch

OpenNJet KIC-Quellcodeadresse

Die NJet  -Anwendungs-Engine erreicht durch Kernel-Rekonstruktion einzigartige Funktionen zum dynamischen Laden von Konfigurationen zur Laufzeit und ist eine neue Generation leistungsstarker Web-Anwendungs-Engines . NJet verfügt über leistungsstarke Datenebenenverarbeitungsfunktionen und plant mehrere Hilfsfunktionen wie Clustering, Hochverfügbarkeit, aktive Zustandsprüfungen und deklarative APIs über das einzigartige Co-Pilot-Service-Framework von NJet, um Funktionserweiterungen zu erleichtern und fällige Verwaltungs-/Kontrollfunktionspaare zu isolieren Aufgrund der Auswirkungen auf die Datenebene ist die Leistung der NJet-Anwendungs-Engine dreimal so hoch wie die der von CNCF empfohlenen Envoy-Anwendungs-Engine. Offizielle Website der Mail-Gruppe    

Die Raubkopien von „Qing Yu Nian 2“ wurden auf npmror hochgeladen, was dazu führte, dass npmmirror den Unpkg-Dienst einstellen musste: Es bleibt nicht mehr viel Zeit für Google. Ich schlage vor, dass alle Produkte Open Source sind . time.sleep(6) spielt hier eine Rolle. Linus ist am aktivsten beim „Hundefutter fressen“! Das neue iPad Pro verwendet 12 GB Speicherchips, behauptet jedoch, über 8 GB Speicher zu verfügen. People’s Daily Online bewertet die Aufladung im Matroschka-Stil: Nur durch aktives Lösen des „Sets“ können wir eine Zukunft haben Neues Entwicklungsparadigma für Vue3, ohne die Notwendigkeit von „ref/reactive“ und ohne die Notwendigkeit von „ref.value“. MySQL 8.4 LTS Chinesisches Handbuch veröffentlicht: Hilft Ihnen, den neuen Bereich der Datenbankverwaltung zu meistern Tongyi Qianwen GPT-4-Level-Hauptmodellpreis reduziert um 97 %, 1 Yuan und 2 Millionen Token
{{o.name}}
{{m.name}}

Ich denke du magst

Origin my.oschina.net/u/6606114/blog/11184963
Empfohlen
Rangfolge