Kako odpreti tunel v Kubernetes pod ali vsebniku s tcpserver in netcat

Opomba. prevod: Ta praktična opomba ustvarjalca LayerCI je odlična ilustracija tako imenovanih nasvetov in zvijač za Kubernetes (in več). Predlagana rešitev je le ena od redkih in morda ne najbolj očitna (v nekaterih primerih je morda primerna "domača" za K8, ki je že omenjena v komentarjih kubectl port-forward). Vendar pa vam omogoča, da na težavo vsaj pogledate z vidika uporabe klasičnih pripomočkov in njihovega nadaljnjega kombiniranja - hkrati preprostega, prilagodljivega in zmogljivega (za navdih glejte "druge ideje" na koncu).

Kako odpreti tunel v Kubernetes pod ali vsebniku s tcpserver in netcat

Predstavljajte si tipično situacijo: želite, da vrata na vašem lokalnem računalniku čarobno posredujejo promet v pod/vsebnik (ali obratno).

Možni primeri uporabe

  1. Preverite, kaj vrne končna točka HTTP /healthz pod v proizvodnem grozdu.
  2. Povežite razhroščevalnik TCP s podom na lokalnem računalniku.
  3. Pridobite dostop do produkcijske baze podatkov z lokalnimi orodji za bazo podatkov, ne da bi se morali ukvarjati s preverjanjem pristnosti (običajno ima lokalni gostitelj korenske pravice).
  4. Zaženite enkratni selitveni skript za podatke v uprizoritveni gruči, ne da bi morali ustvariti vsebnik zanje.
  5. Povežite sejo VNC s podom, ki izvaja virtualno namizje (glejte XVFB).

Nekaj ​​besed o potrebnih orodjih

Tcpserver — Odprtokodni pripomoček, ki je na voljo v večini skladišč paketov Linux. Omogoča vam, da odprete lokalna vrata in vanj preusmerite promet, prejet prek stdin/stdout iz katerega koli podanega ukaza:

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 dela nasprotno. Omogoča vam, da se povežete z odprtimi vrati in prejete V/I posredujete 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)

V zgornjem primeru netcat zahteva stran prek HTTP-ja. Zastava -C povzroči, da doda CRLF na konec vrstice.

Povezava s kubectl: poslušajte na gostitelju in se povežite s podom

Če zgornja orodja združimo s kubectl, dobimo tak ukaz:

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

Po analogiji bo za dostop do vrat 80 znotraj sklopa dovolj 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 odpreti tunel v Kubernetes pod ali vsebniku s tcpserver in netcat
Diagram interakcije pripomočkov

V nasprotni smeri: poslušajte v modulu in se povežite z gostiteljem

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 vrat 8000 na lokalnem računalniku.

Bash skript

Napisal sem poseben skript za Bash, ki vam omogoča upravljanje produkcijske gruče Kubernetes LayerCIz uporabo zgoraj opisane metode:

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

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

  • Za tunel v Lučki delavec glavno vrstico lahko nadomestite z:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • za tunel v K3s - spremenite v:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • itd

Druge ideje

  • Promet UDP lahko preusmerite z ukazi netcat -l -u -c namesto tcpserver и netcat -u namesto netcat zaporedju.
  • Ogled V/I prek pregledovalnika cevi:

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

  • Z uporabo lahko stisnete in raztegnete promet na obeh koncih gzip.
  • Povežite se prek SSH z drugim računalnikom z ustrezno datoteko kubeconfig:

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

  • Z uporabo lahko povežete dva sklopa v različnih grozdih mkfifo in zaženite dva ločena ukaza kubectl.

Možnosti so neskončne!

PS od prevajalca

Preberite tudi na našem blogu:

Vir: www.habr.com

Dodaj komentar