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

Shënim. përkth.: Ky shënim praktik nga krijuesi i LayerCI është një ilustrim i shkëlqyer i të ashtuquajturave këshilla dhe truket për Kubernetes (dhe më shumë). Zgjidhja e propozuar këtu është vetëm një nga të paktat dhe, ndoshta, jo më e dukshme (për disa raste, ajo "vendase" për K8 e përmendur tashmë në komente mund të jetë e përshtatshme kubectl port-forward). Sidoqoftë, ju lejon të paktën ta shikoni problemin nga këndvështrimi i përdorimit të shërbimeve klasike dhe kombinimit të mëtejshëm të tyre - në të njëjtën kohë të thjeshta, fleksibël dhe të fuqishëm (shih "idetë e tjera" në fund për frymëzim).

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

Imagjinoni një situatë tipike: dëshironi një port në makinën tuaj lokale për të përcjellë trafikun në mënyrë magjike në një pod/konteiner (ose anasjelltas).

Rastet e mundshme të përdorimit

  1. Kontrolloni se çfarë kthen pika përfundimtare HTTP /healthz pod në grupin e prodhimit.
  2. Lidhni një korrigjues TCP me podin në makinën lokale.
  3. Merrni akses në bazën e të dhënave të prodhimit nga mjetet lokale të bazës së të dhënave pa pasur nevojë të shqetësoheni me vërtetimin (zakonisht localhost ka të drejta rrënjësore).
  4. Ekzekutoni një skript migrimi një herë për të dhënat në një grupim skenik pa pasur nevojë të krijoni një kontejner për të.
  5. Lidhni një sesion VNC me një pod që drejton një desktop virtual (shih XVFB).

Disa fjalë për mjetet e nevojshme

Tcpserver — Një mjet me burim të hapur i disponueshëm në shumicën e depove të paketave Linux. Kjo ju lejon të hapni një port lokal dhe të ridrejtoni trafikun e marrë nëpërmjet stdin/stdout nga çdo komandë e specifikuar në të:

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 bën të kundërtën. Ju lejon të lidheni me një port të hapur dhe të kaloni hyrjen/daljen e marrë prej saj te 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 kërkon faqen mbi HTTP. Flamuri -C bën që ajo të shtojë CRLF në fund të rreshtit.

Lidhja me kubectl: dëgjoni hostin dhe lidheni me podin

Nëse kombinojmë mjetet e mësipërme me kubectl, marrim një komandë si kjo:

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

Për analogji, për të hyrë në portin 80 brenda pod do të jetë e mjaftueshme për të bërë 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ë një pod ose enë Kubernetes me tcpserver dhe netcat
Diagrami i ndërveprimit të shërbimeve

Në drejtim të kundërt: 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

Kjo komandë lejon podin të hyjë në portin 8000 në makinën lokale.

Skenari Bash

Unë shkrova një skenar të veçantë për Bash që ju lejon të menaxhoni një grup prodhimi Kubernetes ShtresaCIduke përdorur metodën e përshkruar më sipër:

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

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

  • Për tunelin në prerës ju mund të zëvendësoni linjën kryesore me:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • për tunelin në K3s - ndryshojeni në:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • etj

Më shumë ide

  • Ju mund të ridrejtoni trafikun UDP duke përdorur komandat netcat -l -u -c në vend të tcpserver и netcat -u në vend të netcat respektivisht.
  • Shiko I/O përmes shikuesit të tubave:

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

  • Ju mund të kompresoni dhe dekompresoni trafikun në të dy skajet duke përdorur gzip.
  • Lidhu nëpërmjet 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"

  • Ju mund të lidhni dy pods në grupe të ndryshme duke përdorur mkfifo dhe ekzekutoni dy komanda të veçanta kubectl.

Возможности pa kufij!

PS nga përkthyesi

Lexoni edhe në blogun tonë:

Burimi: www.habr.com

Shto një koment