Kako otvoriti tunel u Kubernetes podu ili kontejneru pomoću tcpserver i netcat.

Napomena za prijevod.: Ova praktična bilješka od kreatora LayerCI predstavlja izvrsnu ilustraciju takozvanih savjeta i trikova za Kubernetes (i ne samo). Predloženo rješenje ovdje je samo jedno od nekoliko, i možda nije naj očiglednije (u nekim slučajevima mogao bi odgovarati već spomenuti „nativni“ za K8s. kubectl port-forward). Međutim, omogućava barem da se na problem gleda iz perspektive primjene klasičnih alata i njihove daljnje kombinacije — istovremeno jednostavno, fleksibilno i moćno (vidi „druge ideje“ na kraju za inspiraciju).

Kako otvoriti tunel u Kubernetes podu ili kontejneru pomoću tcpserver i netcat.

Zamislite tipičnu situaciju: želite da port na lokalnom računalu magično preusmjeri promet u pod/kontejner (ili obrnuto).

Mogući scenariji korištenja

  1. Provjeriti što vraća HTTP endpoint /healthz pod-a u produkcijskom klasteru.
  2. Povezati TCP debager s pod-om na lokalnom računalu.
  3. Pristupiti produkcijskoj bazi iz lokalnih alata za rad s Baza podataka bez potrebe za rješavanjem autentifikacije (obično localhost ima root privilegije).
  4. Pokrenuti jednokratni skript za migraciju podataka u staging klasteru bez potrebe za stvaranjem kontejnera za to.
  5. Povezati VNC sesiju s pod-om koji ima pokrenutu virtualnu radnu površinu (vidi XVFB).

Nekoliko riječi o potrebnim alatima

Tcpserver — Open Source alat dostupan u većini Linux repozitorija. Omogućava otvaranje lokalnog porta i preusmjeravanje prometa primljenog kroz stdin/stdout s bilo koje navedene komande:

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

(asciinema.org)

Netcat radi obrnuto. Omogućuje povezivanje na otvoreni port i prenosi dobiveni ulaz/izlaz na 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)

U gornjem primjeru netcat traži stranicu putem HTTP-a. Opcija -C zastrašuje da dodaje CRLF na kraj linije.

Povezivanje s kubectl: slušajte na hostu i povežite se s pod-om

Ako kombiniramo predstavljene alate s kubectl, dobit ćemo komandu poput ove:

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

Analogno tome, za pristup portu 80 unutar pod-a bit će dovoljno učiniti 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
Čitanje paketa... Gotovo
Izgradnja stabla zavisnosti
Čitanje informacija o stanju... Gotovo
netcat-openbsd je već najnovija verzija (1.195-2).
0 nadograđeno, 0 novo instalirano, 0 za uklanjanje i 10 neotvorenih.
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)

Kako otvoriti tunel u Kubernetes podu ili kontejneru pomoću tcpserver i netcat.
Shema interakcije alata

U obrnutom smjeru: slušajte unutar pod-a i spojite se na host

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

Ova komanda omogućava pod-u pristup portu 8000 na lokalnoj mašini.

Bash skripta

Napisao sam posebnu Bash skriptu koja omogućava upravljanje produkcijskim Kubernetes klasterom. LayerCI, koristeći gorenavedenu metodu:

kubetunnel() {
    POD="$1"
    DESTPORT="$2"
    if [ -z "$POD" -o -z "$DESTPORT" ]; then
        echo "Korištenje: kubetunnel [ime poda] [odredišni 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 "Povežite se na 127.0.0.1:6666 za pristup $POD:$DESTPORT"
}

Ako dodate ovu funkciju u ~/bashrc, lako možete otvoriti tunel u pod-u komandnom kubetunnel web-pod 8080 i uraditi curl localhost:6666.

  • Za tunel u Docker možete zamijeniti glavnu liniju sa:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • za tunel u K3s — promijenite je na:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • itd.

Druge ideje

  • Preusmjerite UDP promet komandom netcat -l -u -c umjesto tcpserver i netcat -u umjesto netcat odgovarajuće.
  • Pogledajte ulaz/izlaz preko pipe viewer-a:

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

  • Možete komprimirati i raspakirati promet na oba kraja pomoću gzip.
  • Povežite se putem SSH na drugo računalo s odgovarajućim datotekom kubeconfig:

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

  • Možete povezati dva poda u različitim klasterima pomoću mkfifo i pokrenuti dvije odvojene komande kubectl.

Mogućnosti su beskrajne!

P.S. od prevodioca

Pročitajte i na našem blogu:

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster