Kā atvērt tuneli Kubernetes podā vai konteinerā ar tcpserver un netcat

Piezīme. tulk.: Šī LayerCI izveidotāja praktiskā piezīme lieliski ilustrē tā sauktos padomus un trikus par Kubernetes (un citiem). Šeit piedāvātais risinājums ir tikai viens no retajiem un, iespējams, ne pats acīmredzamākais (dažos gadījumos var būt piemērots komentāros jau minētais “native” K8s kubectl port-forward). Tomēr tas ļauj vismaz paskatīties uz problēmu no klasisko utilītu izmantošanas un tālākas kombinēšanas perspektīvas - tajā pašā laikā vienkārši, elastīgi un spēcīgi (iedvesmai skatiet "citas idejas" beigās).

Kā atvērt tuneli Kubernetes podā vai konteinerā ar tcpserver un netcat

Iedomājieties tipisku situāciju: vēlaties, lai jūsu vietējās mašīnas ports maģiski pārsūtītu trafiku uz podiņu/konteineru (vai otrādi).

Iespējamie lietošanas gadījumi

  1. Pārbaudiet, ko HTTP galapunkts atgriež /healthz pod ražošanas klasterī.
  2. Pievienojiet TCP atkļūdotāju lokālās mašīnas podam.
  3. Iegūstiet piekļuvi ražošanas datu bāzei no vietējiem datu bāzes rīkiem, neapgrūtinot autentifikāciju (parasti vietējam resursdatoram ir root tiesības).
  4. Palaidiet vienreizēju migrācijas skriptu datiem izstādīšanas klasterī, neizveidojot tam konteineru.
  5. Savienojiet VNC sesiju ar podiņu, kurā darbojas virtuālā darbvirsma (skatiet XVFB).

Daži vārdi par nepieciešamajiem instrumentiem

Tcpserver — Atvērtā koda utilīta, kas pieejama lielākajā daļā Linux pakotņu krātuvju. Tas ļauj atvērt vietējo portu un novirzīt trafiku, kas saņemts, izmantojot stdin/stdout, no jebkuras norādītās komandas uz to:

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:~$

(ascinema.org)

Netcat rīkojas pretēji. Tas ļauj izveidot savienojumu ar atvērtu portu un nosūtīt no tā saņemto I/O uz 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:~$

(ascinema.org)

Iepriekš minētajā piemērā netcat pieprasa lapu, izmantojot HTTP. Karogs -C liek tai pievienot CRLF rindas beigās.

Savienojums ar kubectl: klausieties resursdatorā un izveidojiet savienojumu ar podziņu

Ja mēs apvienojam iepriekš minētos rīkus ar kubectl, mēs saņemam šādu komandu:

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

Pēc analoģijas ar to pietiks, lai piekļūtu portam 80 podā 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

(ascinema.org)

Kā atvērt tuneli Kubernetes podā vai konteinerā ar tcpserver un netcat
Lietderības mijiedarbības diagramma

Pretējā virzienā: klausieties podā un izveidojiet savienojumu ar saimniekdatoru

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

Šī komanda ļauj podam piekļūt portam 8000 vietējā datorā.

Bash skripts

Es uzrakstīju īpašu Bash skriptu, kas ļauj pārvaldīt Kubernetes ražošanas kopu LayerCIizmantojot iepriekš aprakstīto metodi:

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

Ja pievienojat šo funkciju ~/.bashrc, jūs varat viegli atvērt tuneli podā ar komandu kubetunnel web-pod 8080 un darīt curl localhost:6666.

  • Par tuneli iekšā dokers jūs varat aizstāt galveno līniju ar:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • tunelim iekšā K3s - mainiet to uz:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • uc

Citas idejas

  • Varat novirzīt UDP trafiku, izmantojot komandas netcat -l -u -c nevis tcpserver и netcat -u nevis netcat attiecīgi.
  • Skatīt I/O, izmantojot cauruļu skatītāju:

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

  • Varat saspiest un atspiest trafiku abos galos, izmantojot gzip.
  • Savienojiet, izmantojot SSH, ar citu datoru, izmantojot atbilstošo failu kubeconfig:

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

  • Varat savienot divus pākstis dažādās kopās, izmantojot mkfifo un palaidiet divas atsevišķas komandas kubectl.

Iespējas ir bezgalīgas!

PS no tulka

Lasi arī mūsu emuārā:

Avots: www.habr.com

Pievieno komentāru