Kumaha cara muka torowongan dina pod atanapi wadah Kubernetes nganggo tcpserver sareng netcat

Catetan. narjamahkeun.: Catetan praktis ieu ti panyipta LayerCI mangrupikeun ilustrasi anu saé ngeunaan anu disebut tip & trik pikeun Kubernetes (sareng seueur deui). Solusi anu diusulkeun di dieu ngan ukur salah sahiji ti saeutik sareng, sigana, sanés anu paling atra (pikeun sababaraha kasus, "pribumi" pikeun K8 anu parantos disebatkeun dina koméntar tiasa cocog. kubectl port-forward). Nanging, éta ngamungkinkeun anjeun sahenteuna ningali masalah tina sudut pandang ngagunakeun utilitas klasik sareng salajengna ngagabungkeun aranjeunna - dina waktos anu sami sederhana, fleksibel sareng kuat (tingali "ideu sanésna" dina tungtungna pikeun inspirasi).

Kumaha cara muka torowongan dina pod atanapi wadah Kubernetes nganggo tcpserver sareng netcat

Ngabayangkeun kaayaan has: rék a port dina mesin lokal anjeun magically maju lalulintas keur pod a / wadahna (atawa sabalikna).

Kasus pamakéan mungkin

  1. Pariksa naon titik tungtung HTTP mulih /healthz pod dina klaster produksi.
  2. Sambungkeun debugger TCP kana pod dina mesin lokal.
  3. Meunangkeun aksés ka database produksi tina parabot database lokal tanpa kudu repot jeung auténtikasi (biasana localhost boga hak root).
  4. Jalankeun skrip migrasi hiji-waktos pikeun data dina klaster pementasan tanpa kudu nyieun wadahna.
  5. Sambungkeun sési VNC ka pod ngajalankeun desktop virtual (tingali XVFB).

Sababaraha kecap ngeunaan parabot diperlukeun

Tcpserver - Utiliti Open Source sayogi dina kalolobaan repositori pakét Linux. Éta ngamungkinkeun anjeun muka port lokal sareng alihan lalu lintas anu ditampi via stdin / stdout tina paréntah anu ditangtukeun kana éta:

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 ngalakukeun sabalikna. Eta ngidinan Anjeun pikeun nyambung ka port kabuka sarta lulus I / O narima ti eta ka 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)

Dina conto di luhur, netcat requests kaca leuwih HTTP. Bandéra -C ngabalukarkeun eta append CRLF ka tungtung jalur.

Sambungan sareng kubectl: ngadangukeun host sareng sambungkeun kana pod

Upami urang ngagabungkeun alat di luhur sareng kubectl, urang nampi paréntah sapertos kieu:

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

Ku analogi, pikeun ngakses port 80 jero pod éta bakal cukup pikeun ngalakukeun 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)

Kumaha cara muka torowongan dina pod atanapi wadah Kubernetes nganggo tcpserver sareng netcat
Diagram interaksi utiliti

Dina arah nu lalawanan: ngadangukeun di pod tur sambungkeun ka host

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

Paréntah ieu ngamungkinkeun pod pikeun ngakses port 8000 dina mesin lokal.

Aksara Bash

Kuring nulis naskah husus pikeun Bash nu ngidinan Anjeun pikeun ngatur hiji klaster produksi Kubernetes LapisanCIngagunakeun métode ditétélakeun di luhur:

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

Upami anjeun nambihan fungsi ieu kana ~/.bashrc, anjeun tiasa kalayan gampang muka torowongan dina pod kalayan paréntah kubetunnel web-pod 8080 jeung ngalakukeun curl localhost:6666.

  • Pikeun torowongan di Docker Anjeun tiasa ngagentos jalur utama ku:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • pikeun torowongan K3s - robah jadi:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • jeung sajabana

Gagasan sanésna

  • Anjeun tiasa alihan lalu lintas UDP nganggo paréntah netcat -l -u -c tibatan tcpserver и netcat -u tibatan netcat sasuai.
  • Ningali I/O via pipe viewer:

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

  • Anjeun tiasa niiskeun na decompress lalulintas dina duanana tungtung ngagunakeun gzip.
  • Sambungkeun via SSH ka komputer anu sanés nganggo file anu aya kubeconfig:

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

  • Anjeun tiasa nyambungkeun dua pods dina klaster béda ngagunakeun mkfifo tur ngajalankeun dua Paréntah misah kubectl.

Во!

PS ti penerjemah

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar