Nola ireki tcpserver eta netcat-ekin Kubernetes pod edo edukiontzi batean tunel bat

Ohar. itzul.: LayerCI-ren sortzailearen ohar praktiko hau Kubernetes-en (eta gehiago) aholku eta trikimailu izenekoen ilustrazio bikaina da. Hemen proposatzen den irtenbidea bakanetako bat baino ez da eta, beharbada, ez da agerikoena (kasu batzuetan, komenigarria izan daiteke iruzkinetan lehen aipatutako K8entzako "bertakoa" kubectl port-forward). Hala ere, arazoa gutxienez erabilgarritasun klasikoak erabiltzearen eta horiek konbinatzearen ikuspegitik aztertzeko aukera ematen du - aldi berean sinplea, malgua eta indartsua (ikus "beste ideia batzuk" amaieran inspirazio bila).

Nola ireki tcpserver eta netcat-ekin Kubernetes pod edo edukiontzi batean tunel bat

Imajinatu egoera tipiko bat: zure tokiko makinaren ataka bat nahi duzu trafikoa pod/edukiontzi batera (edo alderantziz) era magikoki birbidal dezan.

Erabilera posibleak

  1. Egiaztatu zer itzultzen duen HTTP amaierako puntuak /healthz pod ekoizpen klusterrean.
  2. Konektatu TCP arazketa bat tokiko makinako pod-era.
  3. Lortu ekoizpen datu-baserako sarbidea datu-base lokaleko tresnetatik, autentifikazioarekin trabarik izan gabe (normalean, localhost-ek root eskubideak ditu).
  4. Exekutatu behin-behineko migrazio-script bat eszenatze-kluster batean datuetarako edukiontzirik sortu beharrik gabe.
  5. Konektatu VNC saio bat mahaigain birtual bat exekutatzen duen pod batera (ikus XVFB).

Hitz batzuk beharrezko tresnei buruz

Tcpserver β€” Kode irekiko erabilgarritasun bat Linux paketeen biltegi gehienetan eskuragarri. Tokiko ataka bat irekitzeko eta stdin/stdout bidez jasotako trafikoa berbideratzeko aukera ematen du zehaztutako edozein komandotatik:

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-ek kontrakoa egiten du. Portu ireki batera konektatzeko eta bertatik jasotako I/O-ak stdin/stdout-era pasatzeko aukera ematen du:

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)

Goiko adibidean, netcat-ek orrialdea HTTP bidez eskatzen du. Bandera -C CRLF lerroaren amaieran gehitzea eragiten du.

Kubectl-ekin konexioa: entzun ostalarian eta konektatu pod-era

Goiko tresnak kubectl-ekin konbinatzen baditugu, honelako komando bat jasoko dugu:

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

Analogiaz, 80 portura sartzeko pod barruan nahikoa izango da 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)

Nola ireki tcpserver eta netcat-ekin Kubernetes pod edo edukiontzi batean tunel bat
Erabilgarritasun-interakzio-diagrama

Kontrako norabidean: entzun podan eta konektatu ostalariarekin

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

Komando honi esker, pod-ak 8000 atakarako sarbidea ahalbidetzen du tokiko makinan.

Bash gidoia

Kubernetes produkzio-kluster bat kudeatzeko aukera ematen dizun Bash-erako script berezi bat idatzi nuen GeruzaCIgoian deskribatutako metodoa erabiliz:

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

Funtzio hau gehitzen baduzu ~/.bashrc, erraz ireki dezakezu tunel bat pod batean komandoarekin kubetunnel web-pod 8080 eta egin curl localhost:6666.

  • Tunelerako Docker lerro nagusia ordezkatu dezakezu:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • tunelerako K3ak - aldatu hona:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • eta abar.

Beste ideia batzuk

  • UDP trafikoa birbideratu dezakezu komandoak erabiliz netcat -l -u -c ordez tcpserver ΠΈ netcat -u ordez netcat hurrenez hurren.
  • Ikusi I/O kanalizazio-ikustailearen bidez:

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

  • Bi muturretatik trafikoa konprimitu eta deskonprimitu dezakezu erabiliz gzip.
  • Konektatu SSH bidez beste ordenagailu batera dagokion fitxategiarekin kubeconfig:

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

  • Bi pod konekta ditzakezu multzo ezberdinetan erabiliz mkfifo eta exekutatu bi komando bereizi kubectl.

Aukerak amaigabeak dira!

PS itzultzailetik

Irakurri ere gure blogean:

Iturria: www.habr.com

Gehitu iruzkin berria