Com obrir un túnel en un pod o contenidor de Kubernetes amb tcpserver i netcat

Nota. transl.: Aquesta nota pràctica del creador de LayerCI és una excel·lent il·lustració dels anomenats trucs i trucs per a Kubernetes (i més). La solució proposada aquí és només una de les poques i, potser, no la més òbvia (en alguns casos, la "nativa" per als K8 ja esmentada als comentaris pot ser adequada). kubectl port-forward). Tanmateix, us permet, almenys, mirar el problema des de la perspectiva d'utilitzar les utilitats clàssiques i combinar-les més, alhora que senzilles, flexibles i potents (vegeu "altres idees" al final per inspirar-vos).

Com obrir un túnel en un pod o contenidor de Kubernetes amb tcpserver i netcat

Imagineu una situació típica: voleu que un port de la vostra màquina local reenviï el trànsit de manera màgica a un pod/contenidor (o viceversa).

Casos d'ús possibles

  1. Comproveu què retorna el punt final HTTP /healthz pod al clúster de producció.
  2. Connecteu un depurador TCP al pod de la màquina local.
  3. Obteniu accés a la base de dades de producció des d'eines de bases de dades locals sense haver de preocupar-vos amb l'autenticació (normalment, localhost té drets d'arrel).
  4. Executeu un script de migració únic per a dades en un clúster de prova sense haver de crear-ne un contenidor.
  5. Connecteu una sessió VNC a un pod que executa un escriptori virtual (vegeu XVFB).

Unes paraules sobre les eines necessàries

Tcpserver — Una utilitat de codi obert disponible a la majoria dels dipòsits de paquets de Linux. Us permet obrir un port local i redirigir el trànsit rebut mitjançant stdin/stdout des de qualsevol ordre especificada:

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 fa el contrari. Us permet connectar-vos a un port obert i passar l'E/S rebuda d'ell a 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)

A l'exemple anterior, netcat sol·licita la pàgina mitjançant HTTP. Bandera -C fa que s'afegeixi CRLF al final de la línia.

Connexió amb kubectl: escolteu a l'amfitrió i connecteu-vos al pod

Si combinem les eines anteriors amb kubectl, obtenim una ordre com aquesta:

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

Per analogia, per accedir al port 80 dins del pod n'hi haurà prou 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)

Com obrir un túnel en un pod o contenidor de Kubernetes amb tcpserver i netcat
Diagrama d'interacció d'utilitat

En sentit contrari: escolteu al pod i connecteu-vos a l'amfitrió

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

Aquesta ordre permet que el pod accedeixi al port 8000 de la màquina local.

Guió Bash

Vaig escriure un script especial per a Bash que us permet gestionar un clúster de producció de Kubernetes CapaCIutilitzant el mètode descrit anteriorment:

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

Si afegiu aquesta funció a ~/.bashrc, podeu obrir fàcilment un túnel en un pod amb l'ordre kubetunnel web-pod 8080 i fer curl localhost:6666.

  • Per al túnel d'entrada estibador podeu substituir la línia principal per:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • per al túnel K3 - Canvia-ho a:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • etcètera

Més idees

  • Podeu redirigir el trànsit UDP mitjançant les ordres netcat -l -u -c en comptes de tcpserver и netcat -u en comptes de netcat respectivament.
  • Veure E/S mitjançant el visualitzador de canonades:

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

  • Podeu comprimir i descomprimir el trànsit als dos extrems utilitzant gzip.
  • Connecteu-vos mitjançant SSH a un altre ordinador amb el fitxer corresponent kubeconfig:

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

  • Podeu connectar dos pods en grups diferents mitjançant mkfifo i executeu dues ordres separades kubectl.

Les possibilitats són infinites!

PS del traductor

Llegeix també al nostre blog:

Font: www.habr.com

Afegeix comentari