So öffnen Sie mit tcpserver und netcat einen Tunnel in ein Kubernetes-Pod oder einen Container

Hinweis.: Diese praktische Notiz vom Ersteller von LayerCI ist eine hervorragende Illustration der sogenannten Tipps & Tricks für Kubernetes (und nicht nur). Die hier vorgeschlagene Lösung ist nur eine von wenigen und vielleicht nicht die offensichtlichste (in einigen Fällen könnte der bereits in den Kommentaren erwähnte „native“ K8s-Ansatz besser geeignet sein. kubectl port-forward). Dennoch ermöglicht sie mindestens einen Blick auf das Problem aus der Perspektive klassischer Tools und deren Kombination – gleichzeitig einfach, flexibel und leistungsstark (siehe „weitere Ideen“ am Ende zur Inspiration).

So öffnen Sie mit tcpserver und netcat einen Tunnel in ein Kubernetes-Pod oder einen Container

Stellen Sie sich eine typische Situation vor: Sie möchten, dass ein Port auf dem lokalen Computer den Traffic magisch in ein Pod/Container weiterleitet (oder umgekehrt).

Mögliche Anwendungsszenarien

  1. Überprüfen, was der HTTP-Endpunkt zurückgibt /healthz des Pods im Produktionscluster.
  2. Einen TCP-Debugger mit dem Pod auf dem lokalen Rechner verbinden.
  3. Auf die Produktionsdatenbank mit lokalen Tools zugreifen, ohne sich mit der Authentifizierung herumschlagen zu müssen (normalerweise hat localhost Root-Rechte).
  4. Führen Sie ein einmaliges Migrationsskript für Daten im Staging-Cluster aus, ohne einen Container dafür erstellen zu müssen.
  5. Stellen Sie eine VNC-Sitzung zu einem Pod mit einer laufenden virtuellen Desktop-Anwendung her (siehe XVFB).

Einige Worte zu den erforderlichen Werkzeugen

Tcpserver — Eine Open-Source-Anwendung, die in den meisten Linux-Paket-Repositories verfügbar ist. Sie ermöglicht es, einen lokalen Port zu öffnen und den über stdin/stdout von einem angegebenen Befehl empfangenen Datenverkehr umzuleiten:

colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OK
Content-Length: 19<body>Hallo!</body>'&amp;
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>Hallo!</body>colin@colin-work:~$

(asciinema.org)

Netcat macht das Gegenteil. Es ermöglicht Ihnen, sich mit einem offenen Port zu verbinden und den empfangenen Input/Output über stdin/stdout weiterzugeben:

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:~$

(asciinema.org)

Im obigen Beispiel fordert netcat eine HTTP-Seite an. Das Flag -C zwang ihn, CRLF ans Ende der Zeile anzufügen.

Verknüpfung mit kubectl: Hören Sie auf dem Host und verbinden Sie sich mit dem Pod.

Kombinieren wir die oben genannten Werkzeuge mit kubectl, erhalten wir einen Befehl wie diesen:

tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080

Analog dazu reicht es, um auf den Port 80 innerhalb des Pods zuzugreifen, einfach curl "127.0.0.1:80":

colin@colin-work:~$ sanic kubectl exec -it web-54dfb667b6-28n85 bash
root@web-54dfb667b6-28n85:/web# apt-get -y install netcat-openbsd
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird erstellt
Statusinformationen werden gelesen... Fertig
netcat-openbsd ist bereits die neueste Version (1.195-2).
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 10 nicht aktualisiert.
root@web-54dfb667b6-28n85:/web# exit
colin@colin-work:~$ tcpserver 127.0.0.1 8000 sanic kubectl exec -i web-54dfb667b6-28n85 nc 127.0.0.1 8080&
[1] 3232
colin@colin-work:~$ curl localhost:8000/healthz
{"status":"ok"}colin@colin-work:~$ exit

(asciinema.org)

So öffnen Sie mit tcpserver und netcat einen Tunnel in ein Kubernetes-Pod oder einen Container
Schema der Interaktion der Tools

In umgekehrter Richtung: Im Pod lauschen und sich mit dem Host verbinden

nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat

Dieser Befehl ermöglicht es dem Pod, auf den Port 8000 der lokalen Maschine zuzugreifen.

Bash-Skript

Ich habe ein spezielles Bash-Skript geschrieben, um einen Produktions-Kubernetes-Cluster zu verwalten LayerCI, unter Verwendung der oben beschriebenen Methode:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Verwendung: kubetunnel [Pod-Name] [Zielport]"
        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 "Verbinden Sie sich mit 127.0.0.1:6666, um auf $POD:$DESTPORT zuzugreifen"
}

Wenn Sie diese Funktion zu ~/.bashrchinzufügen, können Sie ganz einfach einen Tunnel im Pod mit dem Befehl kubetunnel web-pod 8080 öffnen und curl localhost:6666.

  • Für das Tunnel-Setup in Docker kann die Hauptzeile ersetzt werden durch:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • für das Tunnel-Setup in K3s — ändern Sie sie auf:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • usw.

Weitere Ideen

  • UDP-Verkehr kann mit den folgenden Befehlen umgeleitet werden: netcat -l -u -c statt tcpserver und netcat -u statt netcat entsprechend.
  • Eingabe/Ausgabe über Pipe Viewer anzeigen:

    nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat

  • Verkehr kann an beiden Enden mit Hilfe von gzip.
  • SSH zu einem anderen Computer mit der entsprechenden Datei verbinden kubeconfig:

    tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"

  • Zwei Pods in verschiedenen Clustern können mit mkfifo verbunden werden und zwei separate Befehle ausgeführt werden kubectl.

Die Möglichkeiten sind grenzenlos!

P.S. vom Übersetzer

Lesen Sie auch in unserem Blog:

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster