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
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.yamlEXPOSE 80/tcp
EXPOSE 443/tcp
#Educated Vermutung, dass dies TCP ist
EXPOSE 9901/tcpLABEL 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
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.
Abgesandter Upstream-Verbindungsfehler oder Trennen/Zurücksetzen vor Headern Fehler
Versuchen Sie entfernen
http2_protocol_options: {}
aus Ihrer envoy.yaml
Nützliche Ressourcen
- https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/http_connection_management
- https://runnable.com/docker/basic-docker-networking
- https://docs.docker.com/engine/reference/commandline/network_create/
- https://docs.docker.com/v17.09/engine/userguide/networking/
- https://github.com/envoyproxy/envoy/tree/master/examples/front-proxy
- https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/http_routing
- https://www.envoyproxy.io/docs/envoy/latest/configuration/http_conn_man/header_sanitizing
- https://www.envoyproxy.io/docs/envoy/latest/api-v2/api/v2/route/route.proto#envoy-api-field-route-routeaction-host-rewrite
- prefix_rewrite sieht interessant aus - es ermöglicht die Änderung von Anwendungs-URLs in einen anderen Pfad als den, der auf der Reverse-Proxy-Schicht angezeigt wird
- https://www.envoyproxy.io/docs/envoy/latest/api-v2/config/filter/network/http_connection_manager/v2/http_connection_manager.proto#envoy-api-enum-config-filter-network-http-connection-manager-v2-httpconnectionmanager-codectype
- Es gibt integrierte Filter
- https://www.envoyproxy.io/docs/envoy/latest/configuration/http_filters/router_filter#config-http-filters-router
- "Der Router-Filter implementiert die HTTP-Weiterleitung. Er wird in fast allen HTTP-Proxy-Szenarien verwendet, für die Envoy eingesetzt wird."
- https://blog.turbinelabs.io/setting-up-ssl-with-envoy-f7c5aa06a5ce
- hat einen Abschnitt über die Umleitung von unsicherem Verkehr
- https://www.envoyproxy.io/try/migrating-from-nginx-to-envoy
- auch als Einführung in Envoy nützlich
- https://www.envoyproxy.io/docs/envoy/latest/configuration/access_log#config-access-log-format-dictionaries