Einrichten von envoy als Front-Proxy auf Docker mit Kommunikation zu anderen Docker-Containern

Ich habe bereits bestehende Container, die ich envoy als Proxy & https-Manager vor verwenden möchten. Ich lerne gerade, envoy zu benutzen, und teile hier einige meiner Erkenntnisse, da die Dokumentation zu Beginn etwas verwirrend ist.

Mein bereits vorhandener Container heißt "taxgod" - er führt eine Crystal-Anwendung auf Port 3000 (http) aus. Ich möchte es auf Port 80 auf dem Host für http und Port 443 für https proxy.

Zu Demonstrationszwecken werde ich ein gefälschtes Zertifikat verwenden. Die Erstellung von Zertifikaten liegt außerhalb des Rahmens dieses Artikels.

Der Abgesandte-Container wird penvoyage heißen (picockpit Abgesandter )

Gebäude penvoyage

Bild

Der für die Erstellung verwendete penvoyage-Ordner enthält

  • Dockerdatei
  • envoy.yaml
  • example.crt (Zertifikat)
  • example.key (Schlüssel für das Zertifikat)

Dockerdatei

FROM envoyproxy/envoy:latest
COPY envoy.yaml /etc/envoy/envoy.yaml
COPY example.crt /etc/example-com.crt
COPY example.key /etc/example-com.key
#VOLUME /etc/envoy/envoy.yaml

EXPOSE 80/tcp
EXPOSE 443/tcp
#Educated Vermutung, dass dies TCP ist
EXPOSE 9901/tcp

LABEL version="0.2.0″ \
       description="penvoyage ist ein Envoy-Proxy für PiCockpit" \
       maintainer=""

Seien Sie vorsichtig mit den " Zeichen, WordPress könnte sie durcheinander bringen!

Auf die envoy.yaml werde ich demnächst etwas ausführlicher eingehen. Es genügt zu sagen, dass sie sich in diesem Ordner befindet und in das neu erstellte Container-Image kopiert wird.

Um den Container zu erstellen, führen Sie (von dem Verzeichnis aus, das das penvoyage-Verzeichnis enthält):

docker build -t jasmine/penvoyage:0.2.0 -t jasmine/penvoyage:latest penvoyage

Ihre Ausgabe sollte mit den folgenden Zeilen enden

Erfolgreich getaggt jasmine/penvoyage:0.2.0
Erfolgreich getaggt jasmine/penvoyage:latest

Erstellen Sie das Docker-Netzwerk

docker network create -d bridge my-bridge-network

Wir werden dieses Netzwerk nutzen, um beide Container miteinander zu verbinden, so dass sie sich gegenseitig sehen können.

Container können über ihre Containernamen miteinander kommunizieren, wenn sie sich im selben Containernetzwerk befinden.

Sie können z. B. Folgendes tun

Klingeln Steuergott

wobei taxgod der Name des Containers ist.

Um einen Container zu einem Netzwerk hinzuzufügen, nachdem er ausgeführt wurde, gehen Sie wie folgt vor:

docker network connect my-bridge-network taxgod

In diesem Fall ist my-bridge-network das Netz, und taxgod ist der Container, der mit diesem Netz verbunden werden soll.

Wie ein ausgeführter Container mit einem bestimmten Netz verbunden ist, ist weiter unten zu sehen.

Um zu sehen, welche Container sich in einem bestimmten Docker-Netzwerk befinden, führen Sie den folgenden Befehl aus:

docker network inspect my-bridge-network

Starten Sie das penvoyage-Container-Image

docker run -rm -it -p 80:80 -p 443:443 -p 9901:9901 -network=my-bridge-network jasmine/penvoyage

Dies wird:

  • -rm den Container nach dem Herunterfahren entfernen
  • -it an den Container anhängen (damit Sie die Ausgabe von envoy sehen können)
  • -p 80:80 mappen Port 80 auf Port 80 innerhalb des Containers (in der Docker-Datei habe ich dies als tcp-Port definiert)
  • Wiederholung für Port 443 und Port 9901
  • den Container an das my-bridge-network anschließen
  • den Container aus dem jasmine/penvoyage:latest-Image bauen (:latest ist hier implizit)

Was soll dieser Container?

Er stellt Verbindungen zum Host (in meinem Fall mit der IP 192.168.1.2) an den Taxgod-Container auf Port 3000 her.

Es wird als https-Proxy mit den Beispielzertifikaten fungieren und die Verbindungen zum gleichen taxgod-Container auf Port 3000 weiterleiten.

envoy.yaml

Bitte beachten Sie: yaml verwendet Leerzeichen für die Struktur, höchstwahrscheinlich wird WordPress dies vermasseln. Verwenden Sie dies also als Referenz und nicht zum Kopieren und Einfügen!


statische_Ressourcen:
   Hörer:
   - Adresse:
       socket_address:
         Adresse: 0.0.0.0
         port_wert: 80
     filter_chains:
     - Filter:
       - Name: envoy.http_connection_manager
         Konfiguration:
           codec_type: auto
           stat_prefix: ingress_http
           route_config:
             Name: lokale_Route
             virtuelle_hosts:
             - Name: local_service
               Domänen: ["*"]
               Routen:
               - übereinstimmen: { prefix: "/" }
                 Route: { cluster: target_taxgod }
           http_filters:
           - Name: envoy.router
   - Adresse:
       socket_address:
         Adresse: 0.0.0.0
         port_wert: 443
     filter_chains:
     - tls_context:
         common_tls_context:
           tls_zertifikate:
           - certificate_chain: { filename: "/etc/example-com.crt" }
             private_key: { Dateiname: "/etc/example-com.key" }
       Filter:
       - Name: envoy.http_connection_manager
         Konfiguration:
           stat_prefix: ingress_https
           route_config:
             virtuelle_hosts:
             - Name: Standard
               Domänen: ["*"]
               Routen:
               - übereinstimmen: { prefix: "/" }
                 Route: { cluster: target_taxgod }
           http_filters:
           - Name: envoy.router
   Clustern:
   - Name: target_taxgod
     connect_timeout: 0.25s
     Typ: strict_dns
     lb_policy: round_robin
     Gastgeber:
     - socket_address:
         Anschrift: taxgod
         port_value: 3000
admin:
   access_log_path: "/tmp/envoy.log"
   Adresse:
     socket_address:
       Adresse: 0.0.0.0
       port_wert: 9901


Kurze Erklärung der envoy yaml Datei:

Es gibt zwei Hauptabschnitte, static_resources und admin

admin ist für die Verwaltung von envoy gedacht und liegt außerhalb des Rahmens dieses Artikels. In einer Produktionsumgebung müssen Sie es wahrscheinlich entsprechend absichern. DIESEN TEIL NICHT KOPIEREN UND EINFÜGEN!!!

static_resources definiert eine statische Konfiguration für envoy (envoy kann auch über seine API eingerichtet werden)

in Listeners legen wir fest, welche Ports wir abhören wollen und was mit den Verbindungen geschehen soll.

  • address - legt die Adresse und den Port fest, an dem gelauscht werden soll
    • envoy.http_connection_manager - verwaltet http-Verbindungen, liest Header usw. Es ist ein vordefinierter Filter
    • stat_prefix: definiert einen menschenlesbaren Namen für Protokolle/Statistiken
    • Domains: ["*"] - entspricht allen Domänen
    • Route: { cluster: target_taxgod } - leitet den Verkehr zu unserem Cluster target_taxgod um (passt zu /, also zu allem auf der Website)

die Adresse und ihre Unterkonfiguration wird zweimal wiederholt, einmal für Port 80 und einmal für Port 443. Für Port 443 fügen wir auch tls_context und common_tls_context in die filter_chains ein, um die Zertifikate zu injizieren.

Beachten Sie, dass es sich immer noch um envoy.http_connection_manager, NOT https_connection_manager für Port 443.

In Clustern definieren wir unsere Endpunkte, mit denen wir eine Verbindung herstellen bzw. an die wir Datenverkehr weiterleiten möchten.

  • der Cluster hat einen Namen
  • eine Zeitüberschreitung der Verbindung
  • lb_policy - die Lastausgleichspolitik. Es gibt nur einen Host, der den gesamten Datenverkehr erhält (round_robin bedeutet, dass jeder Host abwechselnd Daten erhält)
  • in den Hosts wird die socket_address als Adresse taxgod - dies ist der Docker-Name des Containers - und der port als port_value gesetzt 3000

Der Port 3000 ist der interne Port des Containers taxgod, es ist nicht der Port, an den Sie ihn auf dem externen Host binden!

Ich hoffe, dass dieser Blog-Beitrag denjenigen hilft, die versuchen, ein https:// Setup in envoy einzurichten.

Fehlermeldungen

Bild

Abgesandter kein gesunder Upstream Fehlermeldung

der Abgesandten-Container sich nicht im selben Docker-Netzwerk befindet als Ihren Zielcontainer, da er ihn nicht sehen kann, kann er sich nicht mit ihm verbinden.

Bild

Abgesandter Upstream-Verbindungsfehler oder Trennen/Zurücksetzen vor Headern Fehler

Versuchen Sie entfernen

http2_protocol_options: {}

aus Ihrer envoy.yaml

Nützliche Ressourcen