Alagút megnyitása Kubernetes podban vagy tárolóban tcpserver és netcat segítségével

Jegyzet. ford.: A LayerCI készítőjének ez a praktikus megjegyzése kiválóan illusztrálja az úgynevezett tippeket és trükköket a Kubernetes számára (és nem csak). Az itt javasolt megoldás csak egy a kevés közül, és talán nem a legkézenfekvőbb (bizonyos esetekben a megjegyzésekben már említett „natív” a K8-asokhoz megfelelő lehet kubectl port-forward). Lehetővé teszi azonban, hogy legalább a klasszikus segédprogramok használatának és további kombinálásának szemszögéből nézze meg a problémát - ugyanakkor egyszerű, rugalmas és hatékony (inspirációért lásd a végén az „egyéb ötletek” részt).

Alagút megnyitása Kubernetes podban vagy tárolóban tcpserver és netcat segítségével

Képzeljünk el egy tipikus helyzetet: azt szeretnénk, hogy egy port a helyi gépünkön varázsütésre továbbítsa a forgalmat egy podba/tárolóba (vagy fordítva).

Lehetséges használati esetek

  1. Ellenőrizze, hogy mit ad vissza a HTTP-végpont /healthz pod a termelési klaszterben.
  2. Csatlakoztasson egy TCP hibakeresőt a helyi gép podjához.
  3. Hozzáférhet az éles adatbázishoz a helyi adatbázis-eszközökből anélkül, hogy a hitelesítéssel bajlódnia kellene (általában a localhost root jogokkal rendelkezik).
  4. Futtasson egyszeri áttelepítési parancsfájlt egy átmeneti fürtben lévő adatokhoz anélkül, hogy tárolót kellene létrehoznia hozzá.
  5. Csatlakoztasson egy VNC-munkamenetet egy virtuális asztalt futtató podhoz (lásd: XVFB).

Néhány szó a szükséges eszközökről

Tcpserver — Nyílt forráskódú segédprogram, amely a legtöbb Linux-csomag tárolójában elérhető. Lehetővé teszi egy helyi port megnyitását és az stdin/stdout-on keresztül fogadott forgalom átirányítását bármely megadott parancsból arra:

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)

A Netcat ennek az ellenkezőjét teszi. Lehetővé teszi, hogy csatlakozzon egy nyitott porthoz, és az onnan kapott I/O-t továbbítsa az stdin/stdout felé:

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)

A fenti példában a netcat HTTP-n keresztül kéri le az oldalt. Zászló -C azt okozza, hogy hozzáfűzi a CRLF-et a sor végéhez.

Csatlakozás a kubectl-lel: hallgassa meg a gazdagépen, és csatlakozzon a podhoz

Ha a fenti eszközöket a kubectl-lel kombináljuk, egy ilyen parancsot kapunk:

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

Hasonlatosan, elég lesz elérni a 80-as portot a pod belsejében 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)

Alagút megnyitása Kubernetes podban vagy tárolóban tcpserver és netcat segítségével
Hasznossági kölcsönhatás diagram

Ellenkező irányban: hallgassa a podban, és csatlakozzon a gazdagéphez

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

Ez a parancs lehetővé teszi, hogy a pod hozzáférjen a helyi gép 8000-es portjához.

Bash script

Írtam egy speciális szkriptet a Bash számára, amely lehetővé teszi egy Kubernetes éles fürt kezelését LayerCIa fent leírt módszerrel:

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

Ha hozzáadja ezt a funkciót a ~/.bashrc, a paranccsal könnyedén megnyithat egy alagutat egy podban kubetunnel web-pod 8080 és csináld curl localhost:6666.

  • Az alagúthoz Dokkmunkás a fősort a következőre cserélheti:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • alagúthoz K3s - módosítsa a következőre:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • stb

Egyéb ötletek

  • A parancsok segítségével átirányíthatja az UDP forgalmat netcat -l -u -c helyett tcpserver и netcat -u helyett netcat volt.
  • I/O megtekintése csőnézegetőn keresztül:

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

  • Mindkét oldalon tömörítheti és kibonthatja a forgalmat a használatával gzip.
  • Csatlakozzon SSH-n keresztül egy másik számítógéphez a megfelelő fájllal kubeconfig:

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

  • A segítségével két pod-ot csatlakoztathat különböző klaszterekbe mkfifo és futtasson két külön parancsot kubectl.

A lehetőségek végtelenek!

PS a fordítótól

Olvassa el blogunkon is:

Forrás: will.com

Hozzászólás