Hogyan lehet tcpserver és netcat segítségével alagutat nyitni egy Kubernetes podhoz vagy konténerhez?

Megjegyzés fordítás.: Ez a praktikus megjegyzés a LayerCI alkotójától nagyszerű példája a Kubernetes (és még sok más) úgynevezett tippeinek és trükkjeinek. Az itt javasolt megoldás csupán egy a néhány közül, és valószínűleg nem a legnyilvánvalóbb (néhány esetben megfelelő lehet a már említett 'natív' K8s is). kubectl port-forward). Mindazonáltal lehetővé teszi, hogy legalább a klasszikus eszközök alkalmazásának szempontjából nézzük meg a problémát, és azokat további kombinálásra — egyszerre egyszerű, rugalmas és hatékony (lásd a 'további ötletek' részt a végén inspirációért).

Hogyan lehet tcpserver és netcat segítségével alagutat nyitni egy Kubernetes podhoz vagy konténerhez?

Képzelje el a tipikus helyzetet: azt szeretné, ha a helyi számítógépen egy port varázsütésre átirányítaná a forgalmat a podra/kontejnerre (vagy fordítva).

Lehetséges felhasználási forgatókönyvek

  1. Ellenőrizze, hogy mit ad vissza a HTTP végpont /healthz a pod-ra a production klaszterben.
  2. Csatlakoztassa a TCP hibakeresőt a pod-hoz a helyi gépen.
  3. Jusson hozzá a production adatbázishoz helyi báziskezelő eszközökből anélkül, hogy a hitelesítéssel bajlódna (általában a localhost-nak root jogosultságai vannak).
  4. Futtasson egy egyszeri migráló szkriptet az adatok számára a staging klaszterben anélkül, hogy új konténert kellene létrehozni hozzá.
  5. Csatlakoztasson egy VNC munkamenetet a pod-hoz, amely virtuális asztalt futtat (lásd: XVFB).

Néhány szó a szükséges eszközökről

Tcpserver — Egy nyílt forráskódú eszköz, amely a Linux csomagkezelői közül a legtöbbben elérhető. Lehetővé teszi, hogy helyi portot nyisson meg, és ráirányítsa a forgalmat a stdin/stdout-ból bármely megadott parancsnak.

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

(asciinema.org)

A Netcat a fordítottját teszi. Lehetővé teszi, hogy csatlakozzon egy nyitott portra és átadja az onnan kapott bemenetet/kimenetet a stdin/stdout-ra:

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)

A fenti példában a netcat HTTP-n kérdezi le az oldalt. A -C kapcsoló -C arra kényszeríti, hogy CRLF-t adjon a sor végére.

Kapcsolódás a kubectl-hez: hallgassa a gazdagépen, és csatlakozzon a pod-hoz

Ha a fenti eszközöket összekapcsoljuk a kubectl-lel, akkor egy ilyen parancsot kapunk:

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

Hasonlóképpen, a 80-as port eléréséhez a pod-on belül elegendő lenne megtenni 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
Csomaglisták olvasása... Kész
Függőségi fa felépítése
Állapot információ olvasása... Kész
netcat-openbsd már a legújabb verzió (1.195-2).
0 frissítve, 0 új telepítve, 0 eltávolítva és 10 nem frissítve.
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)

Hogyan lehet tcpserver és netcat segítségével alagutat nyitni egy Kubernetes podhoz vagy konténerhez?
A segédprogramok interakciós sémája

A fordított irányba: hallgasson a podban és csatlakozzon a hoszthez

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

Ez a parancs lehetővé teszi a pod számára, hogy hozzáférjen a 8000-es porthoz a helyi gépen.

Bash szkript

Írtam egy speciális Bash szkriptet, amely lehetővé teszi a Kubernetes production klaszterének kezelését LayerCI, a fentebb leírt módszerrel:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Használat: kubetunnel [pod név] [célport]"
        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 "Csatlakozzon a 127.0.0.1:6666-hoz, hogy hozzáférjen a $POD:$DESTPORT-hoz"
}

Ha ezt a funkciót hozzáadja a ~/.bashrc, akkor könnyen megnyithat egy alagutat a podban a parancs használatával kubetunnel web-pod 8080 és használhatja a curl localhost:6666.

  • Az alagútnál Docker a fő sort helyettesítheti a következővel:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • az alagútnál a K3s — módosítsa a következőre:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • stb.

További ötletek

  • UDP-forgalom irányítása a következő parancsokkal lehetséges netcat -l -u -c $CI_COMMIT_TAG tcpserver és netcat -u $CI_COMMIT_TAG netcat vagy.
  • Bemenet/kimenet megtekintése pipe viewer segítségével:

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

  • A forgalom tömörítésére és kicsomagolására mindkét végén van lehetőség gzip.
  • Csatlakozás SSH-n keresztül egy másik számítógéphez a megfelelő fájl használatával kubeconfig:

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

  • Két pod összekapcsolása különböző klaszterekből a következőképpen lehetséges mkfifo és két külön parancs futtatása kubectl.

A lehetőségek végtelenek!

Fejlesztési eszközök, amelyek Kubernetesben futnak

Olvasson további információkat a blogunkban:

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster