Sut i agor twnnel mewn pod neu gynhwysydd Kubernetes gyda tcpserver a netcat

Nodyn. traws.: Mae'r nodyn ymarferol hwn gan greawdwr LayerCI yn enghraifft wych o'r awgrymiadau a'r triciau fel y'u gelwir ar gyfer Kubernetes (a mwy). Dim ond un o’r ychydig yw’r ateb a gynigir yma ac, efallai, nid yr un mwyaf amlwg (mewn rhai achosion, gall yr un “brodorol” ar gyfer K8 a grybwyllwyd eisoes yn y sylwadau fod yn addas. kubectl port-forward). Fodd bynnag, mae'n caniatáu ichi o leiaf edrych ar y broblem o safbwynt defnyddio cyfleustodau clasurol a'u cyfuno ymhellach - ar yr un pryd yn syml, yn hyblyg ac yn bwerus (gweler "syniadau eraill" ar y diwedd am ysbrydoliaeth).

Sut i agor twnnel mewn pod neu gynhwysydd Kubernetes gyda tcpserver a netcat

Dychmygwch sefyllfa arferol: rydych chi eisiau porthladd ar eich peiriant lleol i anfon traffig ymlaen yn hudol i god/cynhwysydd (neu i'r gwrthwyneb).

Achosion defnydd posibl

  1. Gwiriwch beth mae'r endpoint HTTP yn ei ddychwelyd /healthz pod yn y clwstwr cynhyrchu.
  2. Cysylltwch ddadfygiwr TCP â'r pod ar y peiriant lleol.
  3. Sicrhewch fynediad i'r gronfa ddata gynhyrchu o offer cronfa ddata lleol heb orfod trafferthu â dilysu (fel arfer mae gan localhost hawliau gwraidd).
  4. Rhedeg sgript mudo un-amser ar gyfer data mewn clwstwr llwyfannu heb orfod creu cynhwysydd ar ei gyfer.
  5. Cysylltwch sesiwn VNC i god sy'n rhedeg bwrdd gwaith rhithwir (gweler XVFB).

Ychydig eiriau am yr offer angenrheidiol

Tcpserver — Cyfleustodau Ffynhonnell Agored sydd ar gael yn y mwyafrif o ystorfeydd pecynnau Linux. Mae'n caniatáu ichi agor porthladd lleol ac ailgyfeirio traffig a dderbynnir trwy stdin/stdout o unrhyw orchymyn penodedig iddo:

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)

Mae Netcat yn gwneud y gwrthwyneb. Mae'n caniatáu ichi gysylltu â phorthladd agored a phasio'r I/O a dderbyniwyd ohono i 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)

Yn yr enghraifft uchod, mae netcat yn gofyn am y dudalen dros HTTP. Baner -C yn achosi iddo atodi CRLF at ddiwedd y llinell.

Cysylltiad â kubectl: gwrandewch ar y gwesteiwr a chysylltwch â'r pod

Os byddwn yn cyfuno'r offer uchod â kubectl, rydym yn cael gorchymyn fel hyn:

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

Trwy gyfatebiaeth, bydd mynediad i borthladd 80 y tu mewn i'r pod yn ddigon i'w wneud 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)

Sut i agor twnnel mewn pod neu gynhwysydd Kubernetes gyda tcpserver a netcat
Diagram rhyngweithio cyfleustodau

I'r cyfeiriad arall: gwrandewch yn y pod a chysylltwch â'r gwesteiwr

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

Mae'r gorchymyn hwn yn caniatáu i'r pod gael mynediad i borthladd 8000 ar y peiriant lleol.

Sgript Bash

Ysgrifennais sgript arbennig ar gyfer Bash sy'n eich galluogi i reoli clwstwr cynhyrchu Kubernetes HaenCIgan ddefnyddio’r dull a ddisgrifir uchod:

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

Os ydych chi'n ychwanegu'r swyddogaeth hon i ~/.bashrc, gallwch chi agor twnnel yn hawdd mewn pod gyda'r gorchymyn kubetunnel web-pod 8080 a gwneud curl localhost:6666.

  • Ar gyfer y twnnel yn Docker gallwch ddisodli'r brif linell gyda:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • ar gyfer twnnel yn K3s - ei newid i:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • ac ati

Syniadau eraill

  • Gallwch ailgyfeirio traffig CDU gan ddefnyddio'r gorchmynion netcat -l -u -c yn hytrach na tcpserver и netcat -u yn hytrach na netcat yn y drefn honno.
  • Gweld I/O trwy wyliwr pibellau:

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

  • Gallwch gywasgu a datgywasgu traffig ar y ddau ben gan ddefnyddio gzip.
  • Cysylltwch trwy SSH i gyfrifiadur arall gyda'r ffeil gyfatebol kubeconfig:

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

  • Gallwch gysylltu dau god mewn gwahanol glystyrau gan ddefnyddio mkfifo a rhedeg dau orchymyn ar wahân kubectl.

Mae'r posibiliadau'n ddiddiwedd!

PS gan y cyfieithydd

Darllenwch hefyd ar ein blog:

Ffynhonnell: hab.com

Ychwanegu sylw