Kako otvoriti tunel u Kubernetes pod ili kontejneru sa tcpserver i netcat

Bilješka. transl.: Ova praktična napomena kreatora LayerCI je odlična ilustracija takozvanih savjeta i trikova za Kubernetes (i više). Rješenje koje je ovdje predloženo samo je jedno od rijetkih i, možda, ne najočitije (za neke slučajeve bi moglo biti prikladno ono "nativno" za K8s koje je već spomenuto u komentarima kubectl port-forward). Međutim, to vam omogućava da barem sagledate problem iz perspektive korištenja klasičnih uslužnih programa i njihovog daljeg kombiniranja – u isto vrijeme jednostavno, fleksibilno i moćno (pogledajte “druge ideje” na kraju za inspiraciju).

Kako otvoriti tunel u Kubernetes pod ili kontejneru sa tcpserver i netcat

Zamislite tipičnu situaciju: želite da port na vašoj lokalnoj mašini magično prosleđuje saobraćaj na pod/kontejner (ili obrnuto).

Mogući slučajevi upotrebe

  1. Provjerite šta HTTP krajnja tačka vraća /healthz pod u proizvodnom klasteru.
  2. Povežite TCP debugger na pod na lokalnom računalu.
  3. Dobijte pristup proizvodnoj bazi podataka iz lokalnih alata baze podataka bez potrebe da se mučite s provjerom autentičnosti (obično localhost ima root prava).
  4. Pokrenite skriptu za jednokratnu migraciju za podatke u scenskom klasteru bez potrebe za kreiranjem spremnika za to.
  5. Povežite VNC sesiju na pod koji pokreće virtuelnu radnu površinu (pogledajte XVFB).

Nekoliko riječi o potrebnim alatima

Tcpserver — Uslužni program otvorenog koda dostupan u većini skladišta Linux paketa. Omogućava vam da otvorite lokalni port i preusmjerite promet primljen preko stdin/stdout iz bilo koje specificirane komande 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ćava vam da se povežete na otvoreni port i prosledite I/O primljen sa 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 traži stranicu preko HTTP-a. Zastava -C uzrokuje da doda CRLF na kraj reda.

Veza sa kubectl: slušajte na hostu i povežite se na pod

Ako kombiniramo gore navedene alate sa kubectl, dobićemo naredbu poput ove:

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

Po analogiji, za pristup portu 80 unutar modula to će biti dovoljno 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 ili kontejneru sa tcpserver i netcat
Dijagram interakcije komunalnih usluga

U suprotnom smjeru: slušajte u pod i povežite se s domaćinom

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

Ova naredba omogućava pod-u pristup portu 8000 na lokalnom računalu.

Bash skripta

Napisao sam posebnu skriptu za Bash koja vam omogućava da upravljate Kubernetes proizvodnim klasterom LayerCIkoristeć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 dodate ovu funkciju u ~/.bashrc, možete jednostavno otvoriti tunel u pod sa komandom kubetunnel web-pod 8080 i uradi curl localhost:6666.

  • Za tunel unutra doker 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 - promijeni u:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • i tako dalje.

Više ideja

  • Možete preusmjeriti UDP promet pomoću naredbi netcat -l -u -c umjesto tcpserver и netcat -u umjesto netcat respektivno.
  • Pogledajte 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 preko SSH na drugi računar sa 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čite klastere koristeći mkfifo i pokrenite dvije odvojene komande kubectl.

Vozmožnostʹ bezgraničnyj!

PS od prevodioca

Pročitajte i na našem blogu:

izvor: www.habr.com

Dodajte komentar