Kuidas avada tunnel tcpserveri ja netcatiga Kubernetes podis vÔi konteineris

MĂ€rk. tĂ”lge.: See on LayerCI looja praktiline mĂ€rkused — suurepĂ€rane nĂ€ide nn Kubernetes'i (ja muude) nipi ja trikkide puhul. Siin pakutud lahendus on vaid ĂŒks vĂ€hestest ja vĂ”ib-olla mitte kĂ”ige ilmsem (mĂ”nes arengus vĂ”iks sobida ka varem mainitud 'kodune' K8s jaoks. kubectl port-forward). Kuid see vĂ”imaldab vĂ€hemalt vaadata probleemi klassikaliste utiliitide rakendamise ja nende edasise kombineerimise perspektiivist — samal ajal lihtsast, paindlikust ja vĂ”imsast (vt „teised ideed” allpool inspiratsiooni saamiseks).

Kuidas avada tunnel tcpserveri ja netcatiga Kubernetes podis vÔi konteineris

Kujutage ette tĂŒĂŒpilist olukorda: soovite, et teie kohalikul arvutil port maagiliselt suunaks liikluse pod/konteinerisse (vĂ”i vastupidi).

VÔimalikud kasutusstsenaariumid

  1. Kontrollige, mida HTTP lÔpp-punkt tagastab /healthz pod'i tootmisklastri.
  2. Ühendage kohalikul masinal TCP-debbuger pod'iga.
  3. Saada tootmisandmebaasi ligipÀÀs kohalike andmebaasitööriistade kaudu ilma autentimisega vaevlemata (tavaliselt on localhost'il juurÔigused).
  4. KĂ€itage ĂŒhekordset migratsiooniskeemi andmete jaoks staging-klastri jaoks ilma vajaduseta sellele konteinerit luua.
  5. Ühendage VNC seanss pod’iga, kus on töötav virtuaalne töölaua (vt XVFB).

MÔned sÔnad vajalike tööriistade kohta

Tcpserver — avatud lĂ€htekoodiga tööriist, mis on saadaval enamikus Linuxi pakettide hoidlatest. See vĂ”imaldab avada kohaliku pordi ja suunata sinna liiklust, mis saadakse stdin/stdout kaudu mis tahes mÀÀratud kĂ€sult:

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

(asciinema.org)

Netcat teeb vastupidist. See vĂ”imaldab ĂŒhendada avatud pordiga ja edastada sealt saadud sisend/vĂ€ljund 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)

Ülaltoodud nĂ€ites kĂŒsib netcat lehte HTTP kaudu. Lipp -C sunub sellele jĂ€rjestusele CRLF-i.

Koostöö kubectl-iga: kuulake hostis ja ĂŒhendage pod’iga

Kui ĂŒhendame ĂŒlaltoodud tööriistad kubectl-iga, saame jĂ€rgmise kĂ€su:

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

Sarnaselt piisab 80. pordi juurde pÀÀsemiseks pod’is, kui teha 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)

Kuidas avada tunnel tcpserveri ja netcatiga Kubernetes podis vÔi konteineris
Utiliitide koostöö skeem

Tagasi: kuulake pod'is ja ĂŒhendage see hostiga

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

See kÀsk vÔimaldab pod'il pÀÀseda ligi port 8000 kohalikule masinale.

Bash'i skript

Olen kirjutanud spetsiaalse Bash skripti, mis vÔimaldab hallata tootmisklastrit Kubernetes LayerCI, kasutades eespool kirjeldatud meetodit:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Kasutamine: kubetunnel [pod'i nimi] [sihtport]"
        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 "Ühendu 127.0.0.1:6666, et pÀÀseda ligi $POD:$DESTPORT"
}

Kui lisate selle funktsiooni ~/.bashrc, saab hÔlpsasti avada tunneli pod'i kÀsklusega kubetunnel web-pod 8080 ja teha curl localhost:6666.

  • Tunneliks Docker saab pĂ”hirea asendada:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • tunneli jaoks K3s — vahetage see vĂ€lja:
    tcpserver 127.0.0.1 6666 k3s kubectl exec 

  • Kui kaua aega kulub vĂ€ljastamiseks?

Teised ideed

  • UDP-liiklust saab suunata kĂ€skudega netcat -l -u -c asetatakse tcpserver ja netcat -u asetatakse netcat vastavalt.
  • Vaadake sisend/vĂ€ljund pipe vieweriga:

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

  • Saate komprimeerida ja dekomprimeerida liiklust mĂ”lemal pool kasutades gzip.
  • Ühenduge SSH kaudu teise arvuti juurde koos vastava failiga kubeconfig:

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

  • Saate ĂŒhendada kaks pod'i erinevates klastrites kasutades mkfifo ja kĂ€ivitada kaks eraldi kĂ€sku kubectl.

VÔimalused on piiritud!

P.S. tÔlkija mÀrkused

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster