Cum se deschide un tunel într-un pod sau container Kubernetes cu tcpserver și netcat

Notă. transl.: Această notă practică a creatorului LayerCI este o ilustrare excelentă a așa-numitelor sfaturi și trucuri pentru Kubernetes (și nu numai). Soluția propusă aici este doar una dintre puținele și, poate, nu cea mai evidentă (în unele cazuri, cea „nativă” pentru K8-uri deja menționată în comentarii poate fi potrivită kubectl port-forward). Cu toate acestea, vă permite să priviți cel puțin problema din perspectiva utilizării utilităților clasice și a combinării lor în continuare - în același timp simplu, flexibil și puternic (vezi „alte idei” la sfârșit pentru inspirație).

Cum se deschide un tunel într-un pod sau container Kubernetes cu tcpserver și netcat

Imaginați-vă o situație tipică: doriți ca un port pe mașina dvs. locală să redirecționeze magic traficul către un pod/container (sau invers).

Posibile cazuri de utilizare

  1. Verificați ce returnează punctul final HTTP /healthz pod în clusterul de producție.
  2. Conectați un depanator TCP la podul de pe mașina locală.
  3. Obțineți acces la baza de date de producție din instrumentele de bază de date locale fără a fi nevoiți să vă deranjați cu autentificarea (de obicei localhost are drepturi de root).
  4. Rulați un script de migrare unică pentru date dintr-un cluster de procesare fără a fi nevoie să creați un container pentru acesta.
  5. Conectați o sesiune VNC la un pod care rulează un desktop virtual (consultați XVFB).

Câteva cuvinte despre instrumentele necesare

Tcpserver — Un utilitar open source disponibil în majoritatea repozitoriilor de pachete. LinuxÎți permite să deschizi un port local și să redirecționezi traficul primit prin stdin/stdout de la orice comandă specificată către acesta:

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 face opusul. Vă permite să vă conectați la un port deschis și să transmiteți I/O primite de la acesta la 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)

În exemplul de mai sus, netcat solicită pagina prin HTTP. Steag -C determină să atașeze CRLF la sfârșitul liniei.

Conexiune cu kubectl: ascultați pe gazdă și conectați-vă la pod

Dacă combinăm instrumentele de mai sus cu kubectl, obținem o comandă ca aceasta:

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

Prin analogie, pentru a accesa portul 80 din interiorul podului, va fi suficient 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)

Cum se deschide un tunel într-un pod sau container Kubernetes cu tcpserver și netcat
Diagrama de interacțiune cu utilitatea

În direcția opusă: ascultați în pod și conectați-vă la gazdă

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

Această comandă permite podului să acceseze portul 8000 de pe computerul local.

Script Bash

Am scris un script special pentru Bash care vă permite să gestionați un cluster de producție Kubernetes StratCIfolosind metoda descrisă mai sus:

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

Dacă adăugați această funcție la ~/.bashrc, puteți deschide cu ușurință un tunel într-un pod cu comanda kubetunnel web-pod 8080 si fa curl localhost:6666.

  • Pentru tunelul înăuntru Docher puteți înlocui linia principală cu:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • pentru tunel în K3s - schimba-l in:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • etc

Mai multe idei

  • Puteți redirecționa traficul UDP folosind comenzile netcat -l -u -c în loc de tcpserver и netcat -u în loc de netcat respectiv.
  • Vizualizați I/O prin vizualizatorul conductelor:

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

  • Puteți comprima și decomprima traficul la ambele capete folosind gzip.
  • Conectați-vă prin SSH la un alt computer cu fișierul corespunzător kubeconfig:

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

  • Puteți conecta două pod-uri în grupuri diferite folosind mkfifo și rulați două comenzi separate kubectl.

Posibilitățile sunt nesfârșite!

PS de la traducator

Citește și pe blogul nostru:

Sursa: www.habr.com

Cumpărați găzduire de încredere pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără găzduire web fiabilă cu protecție DDoS, servere VPS VDS | ProHoster