Jak otevřít tunel v Kubernetes pod nebo kontejneru s tcpserverem a netcat

Poznámka. přel.: Tato praktická poznámka od tvůrce LayerCI je vynikající ilustrací takzvaných tipů a triků pro Kubernetes (a další). Zde navržené řešení je pouze jedním z mála a možná ne nejzřejmějším (pro některé případy může být vhodné „nativní“ řešení pro K8 již zmíněné v komentářích kubectl port-forward). Umožňuje však alespoň podívat se na problém z pohledu využití klasických utilit a jejich dalšího kombinování – zároveň jednoduché, flexibilní a výkonné (pro inspiraci viz „další nápady“ na konci).

Jak otevřít tunel v Kubernetes pod nebo kontejneru s tcpserverem a netcat

Představte si typickou situaci: chcete, aby port na vašem místním počítači magicky přesměroval provoz do pod/kontejneru (nebo naopak).

Možné případy použití

  1. Zkontrolujte, co vrací koncový bod HTTP /healthz pod v produkčním clusteru.
  2. Připojte ladicí program TCP k modulu na místním počítači.
  3. Získejte přístup k produkční databázi z lokálních databázových nástrojů, aniž byste se museli obtěžovat s ověřováním (obvykle má localhost práva root).
  4. Spusťte jednorázový migrační skript pro data v pracovním clusteru, aniž byste pro ně museli vytvářet kontejner.
  5. Připojte relaci VNC k modulu s virtuální plochou (viz XVFB).

Pár slov o potřebných nástrojích

Tcpserver — Nástroj Open Source dostupný ve většině úložišť balíčků Linuxu. Umožňuje vám otevřít místní port a přesměrovat na něj provoz přijatý přes stdin/stdout z libovolného zadaného příkazu:

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 dělá opak. Umožňuje vám připojit se k otevřenému portu a předat z něj přijaté I/O do 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)

Ve výše uvedeném příkladu netcat požaduje stránku přes HTTP. Vlajka -C způsobí připojení CRLF na konec řádku.

Spojení s kubectl: poslouchejte na hostiteli a připojte se k modulu

Pokud zkombinujeme výše uvedené nástroje s kubectl, dostaneme příkaz takto:

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

Analogicky, pro přístup k portu 80 uvnitř modulu to bude stačit 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)

Jak otevřít tunel v Kubernetes pod nebo kontejneru s tcpserverem a netcat
Diagram interakce utility

V opačném směru: poslouchejte v modulu a připojte se k hostiteli

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

Tento příkaz umožňuje modulu přístup k portu 8000 na místním počítači.

Bash skript

Napsal jsem speciální skript pro Bash, který vám umožňuje spravovat produkční cluster Kubernetes VrstvaCIpomocí výše popsané metody:

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

Pokud přidáte tuto funkci do ~/.bashrc, můžete snadno otevřít tunel v podu pomocí příkazu kubetunnel web-pod 8080 a dělej curl localhost:6666.

  • Pro tunel dovnitř přístavní dělník hlavní řádek můžete nahradit:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • pro tunel dovnitř K3 - změnit to na:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • atd.

Další nápady

  • Provoz UDP můžete přesměrovat pomocí příkazů netcat -l -u -c místo tcpserver и netcat -u místo netcat resp.
  • Zobrazení I/O přes prohlížeč potrubí:

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

  • Pomocí můžete komprimovat a dekomprimovat provoz na obou koncích gzip.
  • Připojte se přes SSH k jinému počítači s odpovídajícím souborem kubeconfig:

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

  • Pomocí můžete propojit dva pody v různých shlucích mkfifo a spusťte dva samostatné příkazy kubectl.

Možnosti jsou nekonečné!

PS od překladatele

Přečtěte si také na našem blogu:

Zdroj: www.habr.com

Přidat komentář