Kuidas avada tunnel Kubernetese podis või konteineris tcpserveri ja netcatiga

Märge. tõlge: See praktiline märkus LayerCI loojalt on suurepärane näide Kubernetese (ja mitte ainult) nn näpunäidetest ja näpunäidetest. Siin pakutud lahendus on vaid üks vähestest ja võib-olla mitte kõige ilmsem (mõnel juhul võib kommentaarides juba mainitud K8-de jaoks sobida “native” kubectl port-forward). Kuid see võimaldab teil vähemalt vaadata probleemi klassikaliste utiliitide kasutamise ja nende edasise kombineerimise vaatenurgast - samal ajal lihtne, paindlik ja võimas (inspiratsiooni saamiseks vaadake "muud ideed" lõpus).

Kuidas avada tunnel Kubernetese podis või konteineris tcpserveri ja netcatiga

Kujutage ette tüüpilist olukorda: soovite, et teie kohalikus masinas oleks port, mis suunaks liikluse võluväel kaustasse/konteinerisse (või vastupidi).

Võimalikud kasutusjuhud

  1. Kontrollige, mida HTTP lõpp-punkt tagastab /healthz pod tootmisklastris.
  2. Ühendage TCP silur kohaliku masina podiga.
  3. Hankige juurdepääs tootmisandmebaasile kohalikest andmebaasitööriistadest, ilma et peaksite autentimisega vaeva nägema (tavaliselt on localhostil juurõigused).
  4. Käivitage etapiklastri andmete jaoks ühekordne migreerimisskript, ilma et peaksite selle jaoks konteinerit looma.
  5. Ühendage VNC-seanss virtuaalset töölauda käitava podiga (vt XVFB).

Paar sõna vajalike tööriistade kohta

Tcpserver — Avatud lähtekoodiga utiliit, mis on saadaval enamikus Linuxi pakettide hoidlates. See võimaldab teil avada kohaliku pordi ja suunata mis tahes määratud käsust stdin/stdout kaudu vastuvõetud liiklus sellele ümber:

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:~$

(ascinema.org)

Netcat teeb vastupidist. See võimaldab teil luua ühenduse avatud pordiga ja edastada sealt saadud I/O 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:~$

(ascinema.org)

Ülaltoodud näites küsib netcat lehte HTTP kaudu. Lipp -C põhjustab selle CRLF-i lisamise rea lõppu.

Ühendus kubectliga: kuulake hostis ja looge ühendus podiga

Kui kombineerime ülaltoodud tööriistad kubectliga, saame järgmise käsu:

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

Analoogia põhjal piisab sellest, kui pääsete juurde pesa sees olevale pordile 80 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

(ascinema.org)

Kuidas avada tunnel Kubernetese podis või konteineris tcpserveri ja netcatiga
Kasuliku interaktsiooni diagramm

Vastupidises suunas: kuulake podis ja ühendage hostiga

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

See käsk võimaldab podil juurdepääsu kohaliku masina pordile 8000.

Bashi skript

Kirjutasin Bashi jaoks spetsiaalse skripti, mis võimaldab teil hallata Kubernetese tootmisklastrit LayerCIkasutades ülalkirjeldatud meetodit:

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

Kui lisate selle funktsiooni ~/.bashrc, saate käsuga hõlpsasti avada tunneli kaustas kubetunnel web-pod 8080 ja teha curl localhost:6666.

  • Tunneli jaoks laevalaadija saate põhirea asendada järgmisega:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • tunneli jaoks K3s - muutke see järgmiseks:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • jne

Muud ideed

  • UDP liiklust saate käskude abil ümber suunata netcat -l -u -c asemel tcpserver и netcat -u asemel netcat võrra.
  • Vaadake I/O-d toruvaaturi kaudu:

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

  • Saate mõlemas otsas liiklust tihendada ja lahti pakkida, kasutades gzip.
  • Ühendage SSH kaudu teise arvutiga vastava failiga kubeconfig:

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

  • Kasutades saate ühendada kaks kausta erinevatesse klastritesse mkfifo ja käivitage kaks eraldi käsku kubectl.

Võimalusi on lõputult!

PS tõlkijalt

Loe ka meie blogist:

Allikas: www.habr.com

Lisa kommentaar