Kiel malfermi tunelon en Kubernetes-podo aŭ ujo kun tcpserver kaj netcat

Notu. transl.: Ĉi tiu praktika noto de la kreinto de LayerCI estas bonega ilustraĵo de la tiel nomataj konsiletoj kaj lertaĵoj por Kubernetes (kaj pli). La solvo ĉi tie proponita estas nur unu el la malmultaj kaj, eble, ne la plej evidenta (por iuj kazoj, la "denaska" por K8-oj jam menciita en la komentoj eble taŭgas. kubectl port-forward). Tamen ĝi permesas al vi almenaŭ rigardi la problemon el la perspektivo uzi klasikajn utilecojn kaj plu kombini ilin - samtempe simpla, fleksebla kaj potenca (vidu "aliajn ideojn" fine por inspiro).

Kiel malfermi tunelon en Kubernetes-podo aŭ ujo kun tcpserver kaj netcat

Imagu tipan situacion: vi volas ke haveno sur via loka maŝino magie plusendi trafikon al pod/ujo (aŭ inverse).

Eblaj uzkazoj

  1. Kontrolu, kion redonas la HTTP-finpunkto /healthz pod en la produktada areto.
  2. Konektu TCP-erarsermilon al la pod sur la loka maŝino.
  3. Akiru aliron al la produktada datumbazo de lokaj datumbazaj iloj sen devi ĝeni per aŭtentikigo (kutime localhost havas radikrajtojn).
  4. Rulu unufojan migradan skripton por datumoj en sursceniga areto sen devi krei ujon por ĝi.
  5. Konektu VNC-sesion al pod, kiu funkcias per virtuala labortablo (vidu XVFB).

Kelkajn vortojn pri la necesaj iloj

Tcpserver — Malfermfonta ilo havebla en la plej multaj Linukso-pakaĵdeponejoj. Ĝi permesas vin malfermi lokan havenon kaj redirekti trafikon ricevitan per stdin/stdout de iu ajn specifita komando al ĝi:

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 faras la malon. Ĝi permesas vin konekti al malfermita haveno kaj transdoni la I/O ricevitan de ĝi al 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)

En la supra ekzemplo, netcat petas la paĝon per HTTP. Flago -C igas ĝin almeti CRLF al la fino de la linio.

Konekto kun kubectl: aŭskultu ĉe la gastiganto kaj konektu al la pod

Se ni kombinas ĉi-suprajn ilojn kun kubectl, ni ricevas komandon kiel ĉi tio:

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

Analogie, por aliri la havenon 80 ene de la pod sufiĉos fari 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)

Kiel malfermi tunelon en Kubernetes-podo aŭ ujo kun tcpserver kaj netcat
Diagramo de interagado de utileco

En la kontraŭa direkto: aŭskultu en la pod kaj konektu al la gastiganto

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

Ĉi tiu komando permesas al la pod aliri la havenon 8000 sur la loka maŝino.

Bash-skripto

Mi skribis specialan skripton por Bash, kiu ebligas al vi administri Kubernetes-produktadgrupon TavoloCIuzante la metodon priskribitan supre:

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

Se vi aldonas ĉi tiun funkcion al ~/.bashrc, vi povas facile malfermi tunelon en pod kun la komando kubetunnel web-pod 8080 kaj faru curl localhost:6666.

  • Por la tunelo en Docker vi povas anstataŭigi la ĉefan linion per:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • por tunelo en K3s - ŝanĝu ĝin al:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • kaj tiel plu.

Aliaj ideoj

  • Vi povas redirekti UDP-trafikon uzante la komandojn netcat -l -u -c anstataŭ tcpserver и netcat -u anstataŭ netcat laŭe.
  • Rigardu I/O per tubo-spektilo:

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

  • Vi povas kunpremi kaj malkunpremi trafikon ambaŭflanke uzante gzip.
  • Konekti per SSH al alia komputilo kun la responda dosiero kubeconfig:

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

  • Vi povas konekti du podojn en malsamaj aretoj uzante mkfifo kaj rulu du apartajn komandojn kubectl.

La eblecoj estas senfinaj!

PS de tradukisto

Legu ankaŭ en nia blogo:

fonto: www.habr.com

Aldoni komenton