Si të hapni një tunel në Kubernetes pod ose kontejner me tcpserver dhe netcat

Shën. përkth.: Ky kjo shënim praktik nga krijuesi i LayerCI është një ilustërim i shkëlqyer i ashtuquajturave këshilla dhe trika për Kubernetes (dhe më shumë). Zgjidhja e propozuar këtu është vetëm një nga të paktat dhe ndoshta e pamundshme (në disa raste, zgjidhja e përmendur në komente "prapamendore" për K8s mund të jetë e përshtatshme) kubectl port-forward). Sidoqoftë, ajo ofron të paktën mundësinë për të parë problemin nga pozita e përdorimit të utilitarëve klasikë dhe kombinimit të tyre më tej - të thjeshtë, fleksibël dhe të fuqishëm (shih "ide të tjera" në fund për frymëzim).

Si të hapni një tunel në Kubernetes pod ose kontejner me tcpserver dhe netcat

Imagjinoni një situatë tipike: dëshironi që një port në kompjuterin lokal të drejtojë magjikisht trafikun në pod/konteiner (ose anasjelltas).

Skenarët e mundshëm të përdorimit

  1. Kontrolloni se çfarë kthen HTTP endpoint /healthz pod-it në klasterin e prodhimit.
  2. Për të lidhur një debugger TCP me pod-in në kompjuterin lokal.
  3. Të qasni bazën e të dhënave të prodhimit nga mjetet lokale për punë me Baza të Dhënash pa pasur nevojë të merremi me autentifikimin (zakonisht localhost ka të drejta root).
  4. Të ekzekutoni një skenar migrimi një herë për të dhënat në klasterin e staging pa qënë nevoja të krijoni një kontejner për të.
  5. Të lidhni një sesion VNC me pod-in që ka një tryezë virtuale të aktivizuar (shih XVFB).

Disa fjalë për mjetet e nevojshme

Tcpserver — NjĂ« utilitar Open Source, i cili Ă«shtĂ« i disponueshĂ«m nĂ« shumicĂ«n e repozitorĂ«ve tĂ« paketave Linux. Ai mundĂ«son hapjen e njĂ« porti lokal dhe tĂ« drejtojĂ« trafikun nĂ« tĂ« nga stdin/stdout nga çdo komandĂ« tĂ« specifikuar:

colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>përshëndetje!</body>'&amp;
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>përshëndetje!</body>colin@colin-work:~$

(asciinema.org)

Netcat bën të kundërtën. Ai lejon lidhjen me një port të hapur dhe të dërgojë input/output nga ai në 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ë shembullin e mësipërm, netcat bën një kërkesë HTTP. Flamuri -C bën që ai të shtojë CRLF në fund të rreshtit.

Kombinimi me kubectl: dëgjoni në host dhe lidheni me pod-in

Nëse bashkojmë mjetet e paraqitura me kubectl, do të marrim një komandë si kjo:

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

Po ashtu, për të qasur portin 80 brenda pod-it, mjafton të bëni 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)

Si të hapni një tunel në Kubernetes pod ose kontejner me tcpserver dhe netcat
Skema e bashkëveprimit të utilitarëve

Në anën tjetër: dëgjoni në pod dhe lidheni me hostin

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

Ky komandë lejon pod-in të qaset në portin 8000 në makinë lokale.

Skripti për Bash

Kisha shkruar një skript të veçantë për Bash, që lejon menaxhimin e klasterit të prodhimit Kubernetes LayerCI, duke përdorur metodën e përshkruar më sipër:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Përdorimi: kubetunnel [emri i pod-it] [porti destinacion]"
        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 "Lidheni me 127.0.0.1:6666 për të qasur $POD:$DESTPORT"
}

Nëse e shton këtë funksion në ~/ .bashrc, mund të hapësh lehtësisht një tunel në pod me komandën kubetunnel web-pod 8080 dhe bëj curl localhost:6666.

  • PĂ«r tunelin nĂ« Docker mund tĂ« zĂ«vendĂ«sosh rreshtin kryesor me:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • pĂ«r tunelin nĂ« K3s — ndrysho atĂ« nĂ«:
    tcpserver 127.0.0.1 6666 k3s kubectl exec 

  • etj.

Ide të tjera

  • RĂ«ndimi i trafik UDP mund tĂ« bĂ«het me komandat netcat -l -u -c nĂ« vend tĂ« tcpserver dhe netcat -u nĂ« vend tĂ« netcat pĂ«rkatĂ«sisht.
  • Shiko tĂ« dhĂ«nat hyrĂ«se/dalĂ«se pĂ«rmes viewer-it tĂ« pipĂ«s:

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

  • Mund tĂ« kompresosh dhe dekompresosh trafik nĂ« tĂ« dy anĂ«t me anĂ« tĂ« gzip.
  • Lidhu pĂ«r SSH me njĂ« kompjuter tjetĂ«r me skedarin pĂ«rkatĂ«s kubeconfig:

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

  • Mund tĂ« lidhĂ«sh dy pod-a nĂ« klastere tĂ« ndryshme me anĂ« tĂ« mkfifo dhe tĂ« ekzekutosh dy komanda tĂ« veçanta kubectl.

Mundësitë janë të pafundme!

P.S. nga përkthyesi

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Blini hosting tĂ« besueshĂ«m pĂ«r faqe interneti me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster