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).

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

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

  1. Überprüfen Sie, was der HTTP-Endpunkt zurückgibt /healthz Pod im Produktionscluster.
  2. Verbinden Sie einen TCP-Debugger mit dem Pod auf dem lokalen Computer.
  3. 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).
  4. Führen Sie ein einmaliges Migrationsskript für Daten in einem Staging-Cluster aus, ohne dafür einen Container erstellen zu müssen.
  5. 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:

colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>hello!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>hello!</body>colin@colin-work:~$

(asciinema.org)

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

(asciinema.org)

Im obigen Beispiel fordert Netcat die Seite über HTTP an. Flagge -C bewirkt, dass CRLF an das Ende der Zeile angehängt wird.

Verbindung mit kubectl: Hören Sie auf dem Host und stellen Sie eine Verbindung zum Pod her

Wenn wir die oben genannten Tools mit kubectl kombinieren, 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 aus, auf Port 80 im Pod zuzugreifen 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
Reading package lists... Done
Building dependency tree
Reading state information... Done
netcat-openbsd is already the newest version (1.195-2).
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
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 einen Tunnel in einem Kubernetes-Pod oder -Container mit tcpserver und netcat
Diagramm der Versorgungsinteraktion

In die entgegengesetzte Richtung: Hören Sie im Pod zu und stellen Sie eine Verbindung zum Host her

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

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:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • für den Tunneleinbau K3s - ändern Sie es in:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • usw.

Andere Ideen

  • Mit den Befehlen können Sie den UDP-Verkehr umleiten netcat -l -u -c statt tcpserver и netcat -u statt netcat jeweils.
  • E/A über Pipe Viewer anzeigen:

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

  • Sie können den Datenverkehr auf beiden Seiten mit komprimieren und dekomprimieren gzip.
  • Stellen Sie über SSH eine Verbindung zu einem anderen Computer mit der entsprechenden Datei her kubeconfig:

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

  • Sie können zwei Pods in verschiedenen Clustern mit verbinden mkfifo und führen Sie zwei separate Befehle aus kubectl.

озможности езграничны!

PS vom Übersetzer

Lesen Sie auch auf unserem Blog:

Source: habr.com

Kommentar hinzufügen