Kako otvoriti tunel u Kubernetes podu ili kontejneru pomoću tcpservera i netcata

Op. prev.: Ova praktična beleška od kreatora LayerCI - odlična je ilustracija takozvanih praktičnih saveta i trikova za Kubernetes (i ne samo). Predloženo rešenje ovde je samo jedno od nekoliko, i možda ne i naj očiglednije (za neke slučajeve može se koristiti kao što je pomenuto u komentarima "nativno" rešenje za K8s kubectl port-forward). Ipak, omogućava vam da bar sagledate problem iz perspektive korišćenja klasičnih alata i njihove daljnje kombinacije - istovremeno jednostavno, fleksibilno i moćno (vidi "druge ideje" na kraju za inspiraciju).

Kako otvoriti tunel u Kubernetes podu ili kontejneru pomoću tcpservera i netcata

Zamislite tipičnu situaciju: želite da port na lokalnom računaru magično preusmeri saobraćaj u pod/kontejner (ili obrnuto).

Mogući scenariji upotrebe

  1. Proverite šta vraća HTTP endpoint /healthz poda u produkcijskom klasteru.
  2. Povezivanje TCP debagera sa podom na lokalnom računaru.
  3. Pristupiti produkcijskoj bazi iz lokalnih alata za rad sa bazama podataka bez potrebe da se mučite sa autentifikacijom (obično localhost ima root privilegije).
  4. Pokrenuti jednokratni migracijski skript za podatke u staging klasteru bez potrebe za kreiranjem kontejnera.
  5. Povezati VNC sesiju sa podom na kojem je pokrenuta virtuelna radna površina (vidi XVFB).

Nekoliko reči o potrebnim alatima

Tcpserver — Open Source alat dostupan u većini Linux repozitorijuma. Omogućava otvaranje lokalnog porta i preusmeravanje saobraćaja na njega dobijenog preko stdin/stdout iz bilo koje navedene komande:

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

(asciinema.org)

Netcat radi obrnuto. Omogućava povezivanje na otvoren port i prenos dobijenog unosa/izlaza na stdin/stdout:

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)

U gornjem primeru netcat traži stranicu putem HTTP-a. Flag -C naterava ga da dodaje CRLF na kraj reda.

Kombinacija sa kubectl: slušajte na hostu i povežite se sa podom

Ako spojimo prethodno predstavljene alate sa kubectl, dobijamo komandu poput ove:

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

Slično, za pristup portu 80 unutar poda, dovoljno je uraditi 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)

Kako otvoriti tunel u Kubernetes podu ili kontejneru pomoću tcpservera i netcata
Shema sodelovanja orodij

V nasprotni smeri: poslušajte v podu in se povezujte na gostitelja

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

Ta ukaz omogoča podu dostop do porta 8000 na lokalnem računalniku.

Bash skript

Napisal sem posebno Bash skripto, ki omogoča upravljanje produkcijskih grozdov Kubernetes LayerCI, z uporabo zgoraj omenjene metode:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Uporaba: kubetunnel [ime poda] [ciljni 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 "Povežite se na 127.0.0.1:6666 za dostop do $POD:$DESTPORT"
}

Če to funkcijo dodate v ~/.bashrc, lahko zlahka odprete tunel v pod z ukazom kubetunnel web-pod 8080 in izvedete curl localhost:6666.

  • Za tunel v Docker lahko glavno vrstico zamenjate z:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • za tunel v K3s — spremenite jo v:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • itd.

Druge ideje

  • Preusmerjanje UDP prometa je mogoče z ukazi netcat -l -u -c namesto tcpserver in netcat -u namesto netcat ustrezno.
  • Poglejte vhod/izhod prek pipe viewerja:

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

  • Lahko stisnete in razpakirate promet na obeh koncih s pomočjo gzip.
  • Povežite se preko SSH do drugega računalnika s pripadajočo datoteko kubeconfig:

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

  • Lahko povežete dva poda v različnih grozdih s pomočjo mkfifo in zaženeš dve ločeni ukazi kubectl.

Možnosti so neomejene!

P.S. od prevajalca

Preberite tudi na našem blogu:

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster