Kako otvoriti tunel u Kubernetes pod-u ili kontejneru s tcpserverom i netcat-om

Bilješka. prev.: Ova praktična bilješka kreatora LayerCI-ja izvrsna je ilustracija takozvanih savjeta i trikova za Kubernetes (i više). Ovdje predloženo rješenje samo je jedno od rijetkih i možda nije najočitije (za neke slučajeve može biti prikladno ono "nativno" za K8s koje je već spomenuto u komentarima kubectl port-forward). Međutim, omogućuje vam da barem sagledate problem iz perspektive korištenja klasičnih uslužnih programa i njihovog daljnjeg kombiniranja - u isto vrijeme jednostavnih, fleksibilnih i moćnih (pogledajte "ostale ideje" na kraju za inspiraciju).

Kako otvoriti tunel u Kubernetes pod-u ili kontejneru s tcpserverom i netcat-om

Zamislite tipičnu situaciju: želite da port na vašem lokalnom računalu magično prosljeđuje promet u pod/kontejner (ili obrnuto).

Mogući slučajevi upotrebe

  1. Provjerite što HTTP krajnja točka vraća /healthz pod u proizvodnom klasteru.
  2. Spojite TCP debugger na modul na lokalnom računalu.
  3. Dobijte pristup produkcijskoj bazi podataka iz alata lokalne baze podataka bez potrebe za provjerom autentičnosti (obično localhost ima root prava).
  4. Pokrenite jednokratnu migracijsku skriptu za podatke u pripremnom klasteru bez potrebe za stvaranjem spremnika za njih.
  5. Povežite VNC sesiju s modulom koji pokreće virtualnu radnu površinu (pogledajte XVFB).

Nekoliko riječi o potrebnim alatima

Tcpserver — Uslužni program otvorenog koda dostupan u većini Linux spremišta paketa. Omogućuje vam da otvorite lokalni port i preusmjerite promet primljen putem stdin/stdout s bilo koje navedene naredbe na njega:

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 radi suprotno. Omogućuje vam povezivanje s otvorenim portom i prosljeđivanje I/O primljenog s njega 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 primjeru, netcat zahtijeva stranicu preko HTTP-a. Zastava -C uzrokuje dodavanje CRLF-a na kraj retka.

Povezivanje s kubectl: slušajte na glavnom računalu i povežite se s modulom

Ako gore navedene alate kombiniramo s kubectl-om, dobit ćemo naredbu poput ove:

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

Analogno tome, za pristup priključku 80 unutar mahune bit će dovoljno učiniti 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 pod-u ili kontejneru s tcpserverom i netcat-om
Dijagram interakcije komunalnih usluga

U suprotnom smjeru: slušajte u modulu i povežite se s hostom

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

Ova naredba omogućuje modulu pristup priključku 8000 na lokalnom računalu.

Bash skripta

Napisao sam posebnu skriptu za Bash koja vam omogućuje upravljanje Kubernetes proizvodnim klasterom SlojCIkoristeći gore opisanu metodu:

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"
}

Ako ovu funkciju dodate u ~/.bashrc, možete jednostavno otvoriti tunel u mahuni s naredbom kubetunnel web-pod 8080 i učiniti curl localhost:6666.

  • Za tunel u Lučki radnik možete zamijeniti glavnu liniju sa:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • za tunel u K3 - promijenite u:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • itd.

Više ideja

  • UDP promet možete preusmjeriti pomoću naredbi netcat -l -u -c umjesto tcpserver и netcat -u umjesto netcat respektivno.
  • Pregledajte I/O putem preglednika cijevi:

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

  • Možete komprimirati i dekomprimirati promet na oba kraja koristeći gzip.
  • Povežite se putem SSH-a na drugo računalo s odgovarajućom datotekom kubeconfig:

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

  • Možete povezati dvije mahune u različitim klasterima pomoću mkfifo i pokrenite dvije odvojene naredbe kubectl.

Vozmožnosti bezgraničen!

PS od prevoditelja

Pročitajte i na našem blogu:

Izvor: www.habr.com

Dodajte komentar