ProHoster > Blog > Verwaltung > So öffnen Sie einen Tunnel in einem Kubernetes-Pod oder -Container mit tcpserver und netcat
So öffnen Sie einen Tunnel in einem Kubernetes-Pod oder -Container mit tcpserver und netcat
Notiz. übersetzen: Dieser praktische Hinweis des Erfinders von LayerCI ist eine hervorragende Veranschaulichung der sogenannten Tipps & Tricks für Kubernetes (und mehr). Die hier vorgeschlagene Lösung ist nur eine der wenigen und vielleicht nicht die offensichtlichste (in manchen Fällen könnte die bereits in den Kommentaren erwähnte „native“ Lösung für K8 geeignet sein kubectl port-forward). Es ermöglicht Ihnen jedoch, das Problem zumindest aus der Perspektive der Verwendung klassischer Dienstprogramme und ihrer weiteren Kombination zu betrachten – gleichzeitig einfach, flexibel und leistungsstark (siehe „Andere Ideen“ am Ende für Inspiration).
Stellen Sie sich eine typische Situation vor: Sie möchten, dass ein Port auf Ihrem lokalen Computer den Datenverkehr auf magische Weise an einen Pod/Container weiterleitet (oder umgekehrt).
Mögliche Anwendungsfälle
Überprüfen Sie, was der HTTP-Endpunkt zurückgibt /healthz Pod im Produktionscluster.
Verbinden Sie einen TCP-Debugger mit dem Pod auf dem lokalen Computer.
Erhalten Sie über lokale Datenbanktools Zugriff auf die Produktionsdatenbank, ohne sich um die Authentifizierung kümmern zu müssen (normalerweise verfügt localhost über Root-Rechte).
Führen Sie ein einmaliges Migrationsskript für Daten in einem Staging-Cluster aus, ohne dafür einen Container erstellen zu müssen.
Verbinden Sie eine VNC-Sitzung mit einem Pod, auf dem ein virtueller Desktop ausgeführt wird (siehe XVFB).
Ein paar Worte zu den notwendigen Werkzeugen
Tcpserver – Ein Open-Source-Dienstprogramm, das in den meisten Linux-Paket-Repositorys verfügbar ist. Es ermöglicht Ihnen, einen lokalen Port zu öffnen und den über stdin/stdout empfangenen Datenverkehr von einem beliebigen angegebenen Befehl dorthin umzuleiten:
Netcat macht das Gegenteil. Es ermöglicht Ihnen, eine Verbindung zu einem offenen Port herzustellen und die von ihm empfangenen E/A an stdin/stdout weiterzuleiten:
colin@colin-work:~$ nc -C httpstat.us 80
GET /200 HTTP/1.0
Host: httpstat.us
HTTP/1.1 200 OK
Cache-Control: private
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.1
Access-Control-Allow-Origin: *
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=93fdbab9d364704de8ef77182b4d13811344b7dd1ec45d3a9682bbd6fa154ead;Path=/;HttpOnly;Domain=httpstat.us
Date: Fri, 01 Nov 2019 17:53:04 GMT
Connection: close
Content-Length: 0
^C
colin@colin-work:~$
Mit diesem Befehl kann der Pod auf Port 8000 auf dem lokalen Computer zugreifen.
Bash-Skript
Ich habe ein spezielles Skript für Bash geschrieben, mit dem Sie einen Kubernetes-Produktionscluster verwalten können LayerCImit der oben beschriebenen Methode:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Usage: kubetunnel [pod name] [destination port]"
return 1
fi
pkill -f 'tcpserver 127.0.0.1 6666'
tcpserver 127.0.0.1 6666 kubectl exec -i "$POD" nc 127.0.0.1 "$DESTPORT"&
echo "Connect to 127.0.0.1:6666 to access $POD:$DESTPORT"
}
Wenn Sie diese Funktion hinzufügen ~/.bashrcMit dem Befehl können Sie ganz einfach einen Tunnel in einem Pod öffnen kubetunnel web-pod 8080 und TU curl localhost:6666.
Für den Tunnel hinein Docker Sie können die Hauptzeile ersetzen durch: