Hoe om 'n tonnel oop te maak in 'n Kubernetes-peul of -houer met tcpserver en netcat

Let wel. vertaal.: Hierdie praktiese nota van die skepper van LayerCI is 'n uitstekende illustrasie van die sogenaamde tips & tricks vir Kubernetes (en meer). Die oplossing wat hier voorgestel word is slegs een van die min en miskien nie die mees voor die hand liggende nie (vir sommige gevalle kan die "inheemse" een vir K8's wat reeds in die kommentaar genoem is, geskik wees kubectl port-forward). Dit laat jou egter toe om ten minste na die probleem te kyk vanuit die perspektief van die gebruik van klassieke nutsprogramme en verder te kombineer - terselfdertyd eenvoudig, buigsaam en kragtig (sien "ander idees" aan die einde vir inspirasie).

Hoe om 'n tonnel oop te maak in 'n Kubernetes-peul of -houer met tcpserver en netcat

Stel jou 'n tipiese situasie voor: jy wil 'n poort op jou plaaslike masjien hΓͺ om verkeer magies aan te stuur na 'n peul/houer (of andersom).

Moontlike gebruiksgevalle

  1. Kyk wat die HTTP-eindpunt gee /healthz peul in die produksiekluster.
  2. Koppel 'n TCP-ontfouter aan die pod op die plaaslike masjien.
  3. Kry toegang tot die produksiedatabasis vanaf plaaslike databasisnutsgoed sonder om met verifikasie te steur (gewoonlik het localhost wortelregte).
  4. Begin 'n eenmalige migrasieskrip vir data in 'n opstelkluster sonder om 'n houer daarvoor te skep.
  5. Koppel 'n VNC-sessie aan 'n pod wat 'n virtuele lessenaar bestuur (sien XVFB).

'n Paar woorde oor die nodige gereedskap

Tcpbediener - 'n Oopbron-hulpmiddel beskikbaar in die meeste Linux-pakketbewaarplekke. Dit laat jou toe om 'n plaaslike poort oop te maak en verkeer wat ontvang word via stdin/stdout van enige gespesifiseerde opdrag na dit te herlei:

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 doen die teenoorgestelde. Dit laat jou toe om aan 'n oop poort te koppel en die I/O wat daaruit ontvang word na stdin/stdout deur te gee:

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)

In die voorbeeld hierbo versoek netcat die bladsy oor HTTP. Vlag -C veroorsaak dat dit CRLF aan die einde van die reΓ«l toevoeg.

Verbinding met kubectl: luister na die gasheer en koppel aan die pod

As ons die bogenoemde gereedskap met kubectl kombineer, kry ons 'n opdrag soos hierdie:

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

In analogie, om toegang tot poort 80 binne die peul te kry, sal dit genoeg wees om te doen 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)

Hoe om 'n tonnel oop te maak in 'n Kubernetes-peul of -houer met tcpserver en netcat
Nut interaksie diagram

In die teenoorgestelde rigting: luister in die pod en koppel aan die gasheer

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

Hierdie opdrag laat die pod toe om toegang tot poort 8000 op die plaaslike masjien te kry.

Bash script

Ek het 'n spesiale draaiboek vir Bash geskryf waarmee jy 'n Kubernetes-produksiekluster kan bestuur LaagCIgebruik die metode hierbo beskryf:

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

As jy hierdie funksie byvoeg ~/.bashrc, jy kan maklik 'n tonnel in 'n peul oopmaak met die opdrag kubetunnel web-pod 8080 en doen curl localhost:6666.

  • Vir die tonnel in Docker jy kan die hooflyn vervang met:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • vir tonnel in K3's - verander dit na:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • ens.

Meer idees

  • U kan UDP-verkeer herlei deur die opdragte te gebruik netcat -l -u -c in plaas van tcpserver ΠΈ netcat -u in plaas van netcat onderskeidelik.
  • Bekyk I/O via pypkyker:

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

  • U kan verkeer aan beide kante saamdruk en dekomprimeer met behulp van gzip.
  • Koppel via SSH aan 'n ander rekenaar met die ooreenstemmende lΓͺer kubeconfig:

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

  • Jy kan twee peule in verskillende trosse verbind met behulp van mkfifo en voer twee afsonderlike opdragte uit kubectl.

Die moontlikhede is eindeloos!

PS van vertaler

Lees ook op ons blog:

Bron: will.com

Voeg 'n opmerking