Anmerkung des Übersetzers.: Diese praktische Notiz vom Schöpfer 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 wohl nicht die offensichtlichste (in einigen Fällen könnte die bereits in den Kommentaren erwähnte „native“ Lösung für K8s passend sein. ). Sie ermöglicht es jedoch, das Problem mindestens aus der Perspektive klassischer Tools 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 dem lokalen Computer magisch den Verkehr in ein Pod/Container (oder umgekehrt) umleitet.
Mögliche Nutzungsszenarien
- Überprüfen, was der HTTP-Endpunkt zurückgibt
/healthzdes Pods im Produktionscluster. - Einen TCP-Debugger mit dem Pod auf dem lokalen Computer verbinden.
- Zugriff auf die Produktionsdatenbank von lokalen Datenbanktools erhalten, ohne sich um die Authentifizierung kümmern zu müssen (gewöhnlich hat der localhost Root-Rechte).
- Ein einmaliges Migrationsskript für Daten im Staging-Cluster ausführen, ohne dafür einen Container erstellen zu müssen.
- Eine VNC-Sitzung mit dem Pod verbinden, in dem ein virtueller Desktop läuft (siehe XVFB).
Einige Worte zu den benötigten Tools
– Ein Open Source-Tool, das in den meisten Paket-Repositories von Linux verfügbar ist. Es ermöglicht, einen lokalen Port zu öffnen und den darüber empfangenen Verkehr von jedem angegebenen Befehl über stdin/stdout umzuleiten:
colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>Hallo!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>Hallo!</body>colin@colin-work:~$()
Netcat macht das Gegenteil. Es erlaubt, sich mit einem offenen Port zu verbinden und die erhaltene Eingabe/Ausgabe über stdin/stdout zu übertragen:
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:~$()
Im oben genannten Beispiel fordert Netcat eine Seite über HTTP an. Das Flag -C lässt ihn CRLF am Ende der Zeile hinzufügen.
Kombination mit kubectl: hören Sie auf dem Host und verbinden Sie sich mit dem Pod
Wenn man die oben genannten Tools mit kubectl kombiniert, erhalten wir einen Befehl wie diesen:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 Analog, um auf Port 80 innerhalb des Pods zugreifen, genügt es. 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 aufgebaut
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()

Schema der Interaktion von Dienstprogrammen
In umgekehrter Richtung: Hören Sie im Pod und verbinden Sie sich mit dem Host
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catDieser Befehl ermöglicht es dem Pod, auf Port 8000 auf dem lokalen Rechner zuzugreifen.
Bash-Skript
Ich habe ein spezielles Bash-Skript geschrieben, um einen Produktions-Kubernetes-Cluster zu verwalten. , unter Verwendung der oben beschriebenen Methode:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Verwendung: 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 "Verbinden Sie sich mit 127.0.0.1:6666, um auf $POD:$DESTPORT zuzugreifen"
} Wenn Sie diese Funktion hinzufügen ~/.bashrc, können Sie leicht einen Tunnel im Pod mit dem Befehl kubetunnel web-pod 8080 erstellen und curl localhost:6666.
- Für den Tunnel 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 den Tunnel in K3s — ändern Sie es in:
tcpserver 127.0.0.1 6666 k3s kubectl exec … - usw.
Weitere Ideen
- UDP-Verkehr kann mit den Befehlen umgeleitet werden
netcat -l -u -canstatttcpserverundnetcat -uanstattnetcatentsprechend. - Eingaben/Ausgaben über den 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 komprimiertem und entpacktem Eingang behandelt werden
gzip. - SSH-Verbindung zu einem anderen Computer mit der entsprechenden Datei
kubeconfig:tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80" - Zwei Pods in verschiedenen Clustern können verbunden werden mit
mkfifound zwei separate Befehle gestartet werdenkubectl.
Die Möglichkeiten sind grenzenlos!
P.S. vom Übersetzer
Lesen Sie auch in unserem Blog:
- «»;
- «»;
- «»;
- «».
Quelle: habr.com
