Paano magbukas ng tunnel sa isang Kubernetes pod o container na may tcpserver at netcat

Tandaan. transl.: Ang praktikal na tala na ito mula sa lumikha ng LayerCI ay isang mahusay na paglalarawan ng tinatawag na mga tip at trick para sa Kubernetes (at higit pa). Ang solusyon na iminungkahi dito ay isa lamang sa iilan at, marahil, hindi ang pinaka-halata (para sa ilang mga kaso, ang "katutubong" para sa mga K8 na nabanggit na sa mga komento ay maaaring angkop kubectl port-forward). Gayunpaman, pinapayagan ka nitong tingnan ang problema mula sa pananaw ng paggamit ng mga klasikal na kagamitan at higit pang pagsasama-sama ng mga ito - sa parehong oras ay simple, nababaluktot at makapangyarihan (tingnan ang "iba pang mga ideya" sa dulo para sa inspirasyon).

Paano magbukas ng tunnel sa isang Kubernetes pod o container na may tcpserver at netcat

Isipin ang isang tipikal na sitwasyon: gusto mo ng port sa iyong lokal na makina na magically forward ng trapiko sa isang pod/container (o vice versa).

Mga posibleng kaso ng paggamit

  1. Suriin kung ano ang ibinabalik ng HTTP endpoint /healthz pod sa production cluster.
  2. Ikonekta ang isang TCP debugger sa pod sa lokal na makina.
  3. Kumuha ng access sa database ng produksyon mula sa mga lokal na tool sa database nang hindi na kailangang mag-abala sa pagpapatunay (karaniwang ang localhost ay may mga karapatan sa ugat).
  4. Magpatakbo ng isang beses na migration script para sa data sa isang staging cluster nang hindi kinakailangang gumawa ng container para dito.
  5. Ikonekta ang isang VNC session sa isang pod na nagpapatakbo ng virtual desktop (tingnan ang XVFB).

Ang ilang mga salita tungkol sa mga kinakailangang tool

Tcpserver β€” Isang Open Source utility na available sa karamihan ng mga repositoryo ng package ng Linux. Pinapayagan ka nitong magbukas ng lokal na port at mag-redirect ng trapiko na natanggap sa pamamagitan ng stdin/stdout mula sa anumang tinukoy na utos dito:

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)

Kabaligtaran ang ginagawa ng Netcat. Pinapayagan ka nitong kumonekta sa isang bukas na port at ipasa ang I/O na natanggap mula dito sa 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)

Sa halimbawa sa itaas, hinihiling ng netcat ang pahina sa HTTP. Bandila -C nagiging dahilan upang idugtong nito ang CRLF sa dulo ng linya.

Koneksyon sa kubectl: makinig sa host at kumonekta sa pod

Kung pagsasamahin natin ang mga tool sa itaas sa kubectl, makakakuha tayo ng command na tulad nito:

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

Sa pamamagitan ng pagkakatulad, upang ma-access ang port 80 sa loob ng pod ay sapat na itong gawin 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)

Paano magbukas ng tunnel sa isang Kubernetes pod o container na may tcpserver at netcat
Diagram ng pakikipag-ugnayan ng utility

Sa kabilang direksyon: makinig sa pod at kumonekta sa host

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

Ang command na ito ay nagpapahintulot sa pod na ma-access ang port 8000 sa lokal na makina.

Bash script

Sumulat ako ng isang espesyal na script para sa Bash na nagbibigay-daan sa iyong pamahalaan ang isang Kubernetes production cluster LayerCIgamit ang pamamaraang inilarawan sa itaas:

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

Kung idaragdag mo ang function na ito sa ~/.bashrc, madali mong mabubuksan ang isang tunnel sa isang pod gamit ang command kubetunnel web-pod 8080 at gawin curl localhost:6666.

  • Para sa tunnel in Manggagawa sa pantalan maaari mong palitan ang pangunahing linya ng:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • para sa tunnel in K3s - baguhin ito sa:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • at iba pa

Iba pang mga ideya

  • Maaari mong i-redirect ang trapiko ng UDP gamit ang mga command netcat -l -u -c sa halip ng tcpserver ΠΈ netcat -u sa halip ng netcat ayon sa pagkakabanggit.
  • Tingnan ang I/O sa pamamagitan ng pipe viewer:

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

  • Maaari mong i-compress at i-decompress ang trapiko sa magkabilang dulo gamit gzip.
  • Kumonekta sa pamamagitan ng SSH sa isa pang computer na may kaukulang file kubeconfig:

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

  • Maaari mong ikonekta ang dalawang pod sa magkaibang cluster gamit mkfifo at magpatakbo ng dalawang magkahiwalay na utos kubectl.

Ang mga posibilidad ay walang hanggan!

PS mula sa tagasalin

Basahin din sa aming blog:

Pinagmulan: www.habr.com

Magdagdag ng komento