Hvernig á að opna göng í Kubernetes belg eða ílát með tcpserver og netcat

Athugið. þýð.: Þessi hagnýta athugasemd frá höfundi LayerCI er frábær mynd af svokölluðum ráðum og brellum fyrir Kubernetes (og fleira). Lausnin sem hér er lögð til er aðeins ein af fáum og kannski ekki sú augljósasta (í sumum tilfellum gæti sú „innfædda“ fyrir K8 sem þegar er nefnd í athugasemdunum hentað kubectl port-forward). Hins vegar gerir það þér kleift að skoða vandamálið að minnsta kosti út frá því að nota klassísk tól og sameina þau frekar - á sama tíma einfalt, sveigjanlegt og öflugt (sjá „aðrar hugmyndir“ í lokin til að fá innblástur).

Hvernig á að opna göng í Kubernetes belg eða ílát með tcpserver og netcat

Ímyndaðu þér dæmigert ástand: þú vilt hafa höfn á staðbundinni vél til að framsenda umferð á töfrandi hátt í belg/ílát (eða öfugt).

Möguleg notkunartilvik

  1. Athugaðu hverju HTTP endapunkturinn skilar /healthz fræbelgur í framleiðsluklasanum.
  2. Tengdu TCP kembiforrit við pod á staðbundinni vél.
  3. Fáðu aðgang að framleiðslugagnagrunninum frá staðbundnum gagnagrunnsverkfærum án þess að þurfa að skipta sér af auðkenningu (venjulega hefur localhost rótarréttindi).
  4. Keyra einu sinni flutningsskriftu fyrir gögn í sviðsetningarklasa án þess að þurfa að búa til gám fyrir það.
  5. Tengdu VNC lotu við belg sem keyrir sýndarskjáborð (sjá XVFB).

Nokkur orð um nauðsynleg verkfæri

Tcpþjónn — Opinn uppspretta tól sem er fáanlegt í flestum Linux pakkageymslum. Það gerir þér kleift að opna staðbundna höfn og beina umferð sem berast í gegnum stdin/stdout frá hvaða tilteknu skipun sem er til hennar:

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 gerir hið gagnstæða. Það gerir þér kleift að tengjast opnu tengi og senda I/O móttekið frá því til 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)

Í dæminu hér að ofan biður netcat um síðuna yfir HTTP. Fáni -C veldur því að það bætir CRLF við enda línunnar.

Tenging við kubectl: hlustaðu á gestgjafann og tengdu við hólfið

Ef við sameinum ofangreind verkfæri við kubectl fáum við skipun eins og þessa:

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

Á hliðstæðan hátt er nóg að gera til að fá aðgang að port 80 inni í belgnum 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)

Hvernig á að opna göng í Kubernetes belg eða ílát með tcpserver og netcat
Samspil gagnsemi skýringarmynd

Í gagnstæða átt: hlustaðu í belgnum og tengdu við gestgjafann

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

Þessi skipun gerir belgnum kleift að fá aðgang að port 8000 á staðbundinni vél.

Bash handrit

Ég skrifaði sérstakt handrit fyrir Bash sem gerir þér kleift að stjórna Kubernetes framleiðsluklasa LayerCImeð því að nota aðferðina sem lýst er hér að ofan:

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

Ef þú bætir þessari aðgerð við ~/.bashrc, þú getur auðveldlega opnað göng í belg með skipuninni kubetunnel web-pod 8080 og gera curl localhost:6666.

  • Fyrir göngin inn Docker þú getur skipt út aðallínunni fyrir:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • fyrir göng inn K3s - breyta því í:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • o.fl.

Fleiri hugmyndir

  • Þú getur beint UDP umferð með skipunum netcat -l -u -c í staðinn fyrir tcpserver и netcat -u í staðinn fyrir netcat sig.
  • Skoða I/O í gegnum pípuskoðara:

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

  • Þú getur þjappað og þjappað niður umferð á báðum endum með því að nota gzip.
  • Tengstu í gegnum SSH við aðra tölvu með samsvarandi skrá kubeconfig:

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

  • Þú getur tengt tvo belg í mismunandi klösum með því að nota mkfifo og keyra tvær aðskildar skipanir kubectl.

Möguleikarnir eru endalausir!

PS frá þýðanda

Lestu líka á blogginu okkar:

Heimild: www.habr.com

Bæta við athugasemd