Hvordan åpne en tunnel i en Kubernetes pod eller container med tcpserver og netcat

Merk. overs.: Dette praktiske notatet fra skaperen av LayerCI er en utmerket illustrasjon av de såkalte tips og triks for Kubernetes (og ikke bare). Løsningen som foreslås her er bare en av de få og kanskje ikke den mest åpenbare (for noen tilfeller kan den "innfødte" for K8-er som allerede er nevnt i kommentarene være passende kubectl port-forward). Imidlertid lar det deg i det minste se på problemet fra perspektivet om å bruke klassiske verktøy og kombinere dem ytterligere - samtidig enkelt, fleksibelt og kraftig (se "andre ideer" på slutten for inspirasjon).

Hvordan åpne en tunnel i en Kubernetes pod eller container med tcpserver og netcat

Se for deg en typisk situasjon: du vil ha en port på din lokale maskin for å på magisk vis videresende trafikk til en pod/beholder (eller omvendt).

Mulige brukstilfeller

  1. Sjekk hva HTTP-endepunktet returnerer /healthz pod i produksjonsklyngen.
  2. Koble en TCP debugger til poden på den lokale maskinen.
  3. Få tilgang til produksjonsdatabasen fra lokale databaseverktøy uten å måtte bry deg med autentisering (vanligvis har localhost root-rettigheter).
  4. Kjør et engangsmigreringsskript for data i en oppsamlingsklynge uten å måtte opprette en beholder for det.
  5. Koble en VNC-sesjon til en pod som kjører et virtuelt skrivebord (se XVFB).

Noen få ord om nødvendige verktøy

Tcpserver — Et åpen kildekode-verktøy tilgjengelig i de fleste Linux-pakkelager. Den lar deg åpne en lokal port og omdirigere trafikk mottatt via stdin/stdout fra en hvilken som helst spesifisert kommando til den:

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 gjør det motsatte. Den lar deg koble til en åpen port og sende I/O mottatt fra den 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)

I eksemplet ovenfor ber netcat om siden over HTTP. Flagg -C får den til å legge til CRLF på slutten av linjen.

Tilkobling med kubectl: lytt på verten og koble til poden

Hvis vi kombinerer verktøyene ovenfor med kubectl, får vi en kommando som dette:

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

Analogt, for å få tilgang til port 80 inne i poden vil det være nok å gjøre 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)

Hvordan åpne en tunnel i en Kubernetes pod eller container med tcpserver og netcat
Utility interaksjonsdiagram

I motsatt retning: lytt i poden og koble til verten

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

Denne kommandoen lar poden få tilgang til port 8000 på den lokale maskinen.

Bash-manus

Jeg skrev et spesielt skript for Bash som lar deg administrere en Kubernetes-produksjonsklynge LayerCIved å bruke metoden beskrevet ovenfor:

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

Hvis du legger til denne funksjonen til ~/.bashrc, kan du enkelt åpne en tunnel i en pod med kommandoen kubetunnel web-pod 8080 og gjør curl localhost:6666.

  • For tunnelen inn Docker du kan erstatte hovedlinjen med:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • for tunnel inn K3s - endre det til:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • etc.

Flere ideer

  • Du kan omdirigere UDP-trafikk ved å bruke kommandoene netcat -l -u -c i stedet for tcpserver и netcat -u i stedet for netcat henholdsvis.
  • Se I/O via pipe viewer:

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

  • Du kan komprimere og dekomprimere trafikk i begge ender ved å bruke gzip.
  • Koble via SSH til en annen datamaskin med den tilsvarende filen kubeconfig:

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

  • Du kan koble til to poder i forskjellige klynger ved å bruke mkfifo og kjør to separate kommandoer kubectl.

Mulighetene er endeløse!

PS fra oversetter

Les også på bloggen vår:

Kilde: www.habr.com

Legg til en kommentar