Ako otvoriť tunel v Kubernetes pod alebo kontajneri s tcpserverom a netcat

Poznámka. preklad.: Táto praktická poznámka od tvorcu LayerCI je vynikajúcou ilustráciou takzvaných tipov a trikov pre Kubernetes (a ďalšie). Tu navrhované riešenie je len jedným z mála a možno nie najzrejmejším (v niektorých prípadoch môže byť vhodné „natívne“ riešenie pre K8, ktoré už bolo uvedené v komentároch kubectl port-forward). Umožňuje vám to však aspoň pozrieť sa na problém z pohľadu používania klasických utilít a ich ďalšieho kombinovania – zároveň jednoduché, flexibilné a výkonné (pre inšpiráciu pozri „iné nápady“ na konci).

Ako otvoriť tunel v Kubernetes pod alebo kontajneri s tcpserverom a netcat

Predstavte si typickú situáciu: chcete, aby port na vašom lokálnom počítači magicky preposielal prevádzku do pod/kontajnera (alebo naopak).

Možné prípady použitia

  1. Skontrolujte, čo vracia koncový bod HTTP /healthz pod v produkčnom klastri.
  2. Pripojte TCP debugger k podu na lokálnom počítači.
  3. Získajte prístup k produkčnej databáze z lokálnych databázových nástrojov bez toho, aby ste sa museli obťažovať autentifikáciou (zvyčajne má localhost práva root).
  4. Spustite jednorazový migračný skript pre údaje v prípravnom klastri bez toho, aby ste pre ne museli vytvoriť kontajner.
  5. Pripojte reláciu VNC k modulu s virtuálnym desktopom (pozri XVFB).

Niekoľko slov o potrebných nástrojoch

Tcpserver — Nástroj Open Source dostupný vo väčšine repozitárov balíkov Linuxu. Umožňuje vám otvoriť lokálny port a presmerovať naň prevádzku prijatú cez stdin/stdout z ľubovoľného zadaného príkazu:

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 robí opak. Umožňuje vám pripojiť sa k otvorenému portu a odovzdať z neho prijaté I/O do 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)

Vo vyššie uvedenom príklade si netcat vyžiada stránku cez HTTP. Vlajka -C spôsobí, že na koniec riadku pripojí CRLF.

Spojenie s kubectl: počúvajte na hostiteľovi a pripojte sa k modulu

Ak skombinujeme vyššie uvedené nástroje s kubectl, dostaneme príkaz ako je tento:

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

Analogicky, na prístup k portu 80 vo vnútri modulu to bude stačiť 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)

Ako otvoriť tunel v Kubernetes pod alebo kontajneri s tcpserverom a netcat
Diagram interakcie utility

V opačnom smere: počúvajte v module a pripojte sa k hostiteľovi

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

Tento príkaz umožňuje modulu prístup k portu 8000 na lokálnom počítači.

Bash skript

Napísal som špeciálny skript pre Bash, ktorý vám umožňuje spravovať produkčný klaster Kubernetes VrstvaCIpomocou vyššie opísanej metódy:

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

Ak pridáte túto funkciu do ~/.bashrc, môžete jednoducho otvoriť tunel v podu pomocou príkazu kubetunnel web-pod 8080 a robiť curl localhost:6666.

  • Pre tunel v prístavný robotník hlavný riadok môžete nahradiť:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • pre tunel v K3 - zmeniť to na:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • atď

Iné nápady

  • Prevádzku UDP môžete presmerovať pomocou príkazov netcat -l -u -c namiesto tcpserver и netcat -u namiesto netcat resp.
  • Zobrazenie I/O cez prehliadač potrubí:

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

  • Pomocou môžete komprimovať a dekomprimovať prevádzku na oboch koncoch gzip.
  • Pripojte sa cez SSH k inému počítaču s príslušným súborom kubeconfig:

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

  • Pomocou môžete spojiť dva moduly v rôznych zhlukoch mkfifo a spustite dva samostatné príkazy kubectl.

Možnosti sú nekonečné!

PS od prekladateľa

Prečítajte si aj na našom blogu:

Zdroj: hab.com

Pridať komentár