Si të hapni një tunel në Kubernetes pod ose kontejner me tcpserver dhe netcat

ShĂ«n. pĂ«rk.: Ky kjo shĂ«nim praktik nga krijuesi i LayerCI Ă«shtĂ« njĂ« ilustĂ«rim i shkĂ«lqyer i asaj qĂ« quhet tips & tricks pĂ«r Kubernetes (dhe jo vetĂ«m). Zgjidhja e propozuar kĂ«tu Ă«shtĂ« vetĂ«m njĂ« nga pak tĂ« tilla dhe ndoshta nuk Ă«shtĂ« mĂ« e dukshme (pĂ«r disa raste, mund tĂ« funksionojĂ« port-forward qĂ« Ă«shtĂ« pĂ«rmendur nĂ« komente si 'nativ' pĂ«r K8s kubectl port-forward). MegjithatĂ«, ajo lejon sĂ« paku qĂ« tĂ« shikohet problemi nga pikĂ«pamja e pĂ«rdorimit tĂ« mjeteve klasike dhe kombinimit tĂ« tyre — njĂ«kohĂ«sisht e thjeshtĂ«, fleksibile dhe e fuqishme (shih 'ide tĂ« tjera' nĂ« fund pĂ«r frymĂ«zim).

Si të hapni një tunel në Kubernetes pod ose kontejner me tcpserver dhe netcat

Imagjinoni një situatë tipike: dëshironi që porta në kompjuterin tuaj lokal të drejtojë magjikisht trafik në pod/kontainer (ose anasjelltas).

Scenarët e mundshëm të përdorimit

  1. Kontrolloni çfarë kthen HTTP endpoint /healthz pod në klasterin production.
  2. Lidhni një debugguer TCP në pod në makinën lokale.
  3. Qasuni database në production nga mjetet lokale për punë me databaza pa pasur nevojë të merremi me autentikimin (zakonisht localhost ka të drejta root).
  4. Lëshoni një skript migrimi njëherësh për të dhënat në klasterin staging pa pasur nevojë të krijoni një kontenier për të.
  5. Lidhni një sesion VNC me pod-in me një desktop virtual të hapur (shih XVFB).

Disa fjalë për mjetet e nevojshme

Tcpserver — njĂ« utilitar Open Source, i disponueshĂ«m nĂ« shumicĂ«n e repozitorive tĂ« pakove Linux. Ai lejon hapjen e njĂ« porte lokale dhe drejtimin e trafikut nĂ« tĂ« nga stdin/stdout nga çdo komandĂ« tĂ« caktuar:

colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>hello!</body>'&amp;
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>hello!</body>colin@colin-work:~$

(asciinema.org)

Netcat bën inverse. Ai lejon që të lidheni me një port të hapur dhe të transmetoni inputin/outputin e marrë në 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)

Në shembullin e mësipërm, netcat kërkon një faqe përmes HTTP. Flagi -C bën që ai të shtojë CRLF në fund të vargut.

Për trajtimin me kubectl: dëgjoni në host dhe lidheni me pod-in

Nëse kombinoni mjetet e paraqitura me kubectl, do të merrni një komandë si kjo:

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

Analogjisht, për qasjen në portin 80 brenda pod-it, mjafton të bëni 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)

Si të hapni një tunel në Kubernetes pod ose kontejner me tcpserver dhe netcat
Skema e ndërveprimit të mjeteve

Në anën tjetër: dëgjoni në pod dhe lidheni me hostin

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

Kjo komandë lejon që pod-i të ketë akses në portin 8000 në makinën lokale.

Një skript për Bash

Kam shkruar një skript të veçantë për Bash, që lejon menaxhimin e klasterit production të Kubernetes LayerCI, duke përdorur metodën e përshkruar më sipër:

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 "Lidhu në 127.0.0.1:6666 për të aksesuar $POD:$DESTPORT"
}

Nëse e shtoni këtë funksion në ~/.bashrc, mund të hapni lehtësisht një tunel në pod me komandën kubetunnel web-pod 8080 dhe të bëni curl localhost:6666.

  • PĂ«r tunelin nĂ« Docker mund tĂ« zĂ«vendĂ«soni vargun kryesor me:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • pĂ«r tunelin nĂ« K3s — zĂ«vendĂ«soni atĂ« me:
    tcpserver 127.0.0.1 6666 k3s kubectl exec 

  • etj.

Ide të tjera

  • Mund tĂ« drejtoni trafikun UDP me komandat netcat -l -u -c nĂ« vend tĂ« tcpserver dhe netcat -u nĂ« vend tĂ« netcat pĂ«rkatĂ«sisht.
  • Shikoni input/output pĂ«rmes shikuesit tĂ« tubave:

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

  • Mund tĂ« kompresoni dhe zgjidhni trafik nĂ« tĂ« dy anĂ«t me gzip.
  • Lidhuni pĂ«rmes SSH me njĂ« kompjuter tjetĂ«r me skedarin pĂ«rkatĂ«s kubeconfig:

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

  • Mund tĂ« lidhni dy pod-a nĂ« klastere tĂ« ndryshme me mkfifo dhe tĂ« filloni dy komanda tĂ« veçanta kubectl.

Mundësitë janë të pafundme!

P.S. nga përkthyesi

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster